|
Packit Service |
d40955 |
/*
|
|
Packit Service |
d40955 |
* Copyright (c) 2020 Red Hat, Inc.
|
|
Packit Service |
d40955 |
*
|
|
Packit Service |
d40955 |
* This program is free software; you can redistribute it and/or
|
|
Packit Service |
d40955 |
* modify it under the terms of the GNU General Public License
|
|
Packit Service |
d40955 |
* as published by the Free Software Foundation; either version 2
|
|
Packit Service |
d40955 |
* of the License, or (at your option) any later version.
|
|
Packit Service |
d40955 |
*
|
|
Packit Service |
d40955 |
* This program is distributed in the hope that it will be useful,
|
|
Packit Service |
d40955 |
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
Packit Service |
d40955 |
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
Packit Service |
d40955 |
* GNU General Public License for more details.
|
|
Packit Service |
d40955 |
*
|
|
Packit Service |
d40955 |
* You should have received a copy of the GNU General Public License
|
|
Packit Service |
d40955 |
* along with this program; if not, write to the Free Software
|
|
Packit Service |
d40955 |
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
|
|
Packit Service |
d40955 |
* 02110-1301, USA.
|
|
Packit Service |
d40955 |
*
|
|
Packit Service |
d40955 |
* $Id: //eng/vdo-releases/aluminum/src/c++/vdo/kernel/bioIterator.h#1 $
|
|
Packit Service |
d40955 |
*/
|
|
Packit Service |
d40955 |
|
|
Packit Service |
d40955 |
#ifndef BIO_ITERATOR_H
|
|
Packit Service |
d40955 |
#define BIO_ITERATOR_H
|
|
Packit Service |
d40955 |
|
|
Packit Service |
d40955 |
#include <linux/bio.h>
|
|
Packit Service |
d40955 |
|
|
Packit Service |
d40955 |
#include "bio.h"
|
|
Packit Service |
d40955 |
#include "kernelTypes.h"
|
|
Packit Service |
d40955 |
|
|
Packit Service |
d40955 |
typedef struct {
|
|
Packit Service |
d40955 |
BIO *bio;
|
|
Packit Service |
d40955 |
#ifdef USE_BI_ITER
|
|
Packit Service |
d40955 |
struct bvec_iter iter;
|
|
Packit Service |
d40955 |
// Needed so we can store the return value of bio_iter_iovec.
|
|
Packit Service |
d40955 |
struct bio_vec temp;
|
|
Packit Service |
d40955 |
#else
|
|
Packit Service |
d40955 |
int index;
|
|
Packit Service |
d40955 |
#endif
|
|
Packit Service |
d40955 |
} BioIterator;
|
|
Packit Service |
d40955 |
|
|
Packit Service |
d40955 |
/**
|
|
Packit Service |
d40955 |
* Create an iterator over a bio's data.
|
|
Packit Service |
d40955 |
*
|
|
Packit Service |
d40955 |
* @param bio The bio to iterate over
|
|
Packit Service |
d40955 |
*
|
|
Packit Service |
d40955 |
* @return An iterator over a bio
|
|
Packit Service |
d40955 |
**/
|
|
Packit Service |
d40955 |
static BioIterator createBioIterator(BIO *bio)
|
|
Packit Service |
d40955 |
{
|
|
Packit Service |
d40955 |
BioIterator iterator = {
|
|
Packit Service |
d40955 |
.bio = bio,
|
|
Packit Service |
d40955 |
#ifdef USE_BI_ITER
|
|
Packit Service |
d40955 |
.iter = bio->bi_iter,
|
|
Packit Service |
d40955 |
#else
|
|
Packit Service |
d40955 |
.index = bio->bi_idx,
|
|
Packit Service |
d40955 |
#endif
|
|
Packit Service |
d40955 |
};
|
|
Packit Service |
d40955 |
return iterator;
|
|
Packit Service |
d40955 |
}
|
|
Packit Service |
d40955 |
|
|
Packit Service |
d40955 |
/**
|
|
Packit Service |
d40955 |
* Get the next biovec from the iterator, or NULL if there are no more.
|
|
Packit Service |
d40955 |
*
|
|
Packit Service |
d40955 |
* @param iterator The iterator from which to get data
|
|
Packit Service |
d40955 |
*
|
|
Packit Service |
d40955 |
* @return The next biovec from the iterator, or NULL.
|
|
Packit Service |
d40955 |
**/
|
|
Packit Service |
d40955 |
static struct bio_vec *getNextBiovec(BioIterator *iterator)
|
|
Packit Service |
d40955 |
{
|
|
Packit Service |
d40955 |
BIO *bio = iterator->bio;
|
|
Packit Service |
d40955 |
#ifdef USE_BI_ITER
|
|
Packit Service |
d40955 |
if (iterator->iter.bi_size == 0) {
|
|
Packit Service |
d40955 |
return NULL;
|
|
Packit Service |
d40955 |
}
|
|
Packit Service |
d40955 |
|
|
Packit Service |
d40955 |
iterator->temp = bio_iter_iovec(bio, iterator->iter);
|
|
Packit Service |
d40955 |
return &iterator->temp;
|
|
Packit Service |
d40955 |
#else
|
|
Packit Service |
d40955 |
if (iterator->index >= bio->bi_vcnt) {
|
|
Packit Service |
d40955 |
return NULL;
|
|
Packit Service |
d40955 |
}
|
|
Packit Service |
d40955 |
return bio_iovec_idx(bio, iterator->index);
|
|
Packit Service |
d40955 |
#endif
|
|
Packit Service |
d40955 |
}
|
|
Packit Service |
d40955 |
|
|
Packit Service |
d40955 |
/**
|
|
Packit Service |
d40955 |
* Advance the iterator to the next biovec in the bio.
|
|
Packit Service |
d40955 |
*
|
|
Packit Service |
d40955 |
* @param [in,out] iterator The iterator to advance
|
|
Packit Service |
d40955 |
**/
|
|
Packit Service |
d40955 |
static void advanceBioIterator(BioIterator *iterator)
|
|
Packit Service |
d40955 |
{
|
|
Packit Service |
d40955 |
#ifdef USE_BI_ITER
|
|
Packit Service |
d40955 |
bio_advance_iter(iterator->bio, &iterator->iter, iterator->temp.bv_len);
|
|
Packit Service |
d40955 |
#else
|
|
Packit Service |
d40955 |
iterator->index++;
|
|
Packit Service |
d40955 |
#endif
|
|
Packit Service |
d40955 |
}
|
|
Packit Service |
d40955 |
|
|
Packit Service |
d40955 |
#endif /* BIO_ITERATOR_H */
|