linux/drivers/md/dm-bio-record.h
<<
>>
Prefs
   1/*
   2 * Copyright (C) 2004-2005 Red Hat, Inc. All rights reserved.
   3 *
   4 * This file is released under the GPL.
   5 */
   6
   7#ifndef DM_BIO_RECORD_H
   8#define DM_BIO_RECORD_H
   9
  10#include <linux/bio.h>
  11
  12/*
  13 * There are lots of mutable fields in the bio struct that get
  14 * changed by the lower levels of the block layer.  Some targets,
  15 * such as multipath, may wish to resubmit a bio on error.  The
  16 * functions in this file help the target record and restore the
  17 * original bio state.
  18 */
  19
  20struct dm_bio_vec_details {
  21#if PAGE_SIZE < 65536
  22        __u16 bv_len;
  23        __u16 bv_offset;
  24#else
  25        unsigned bv_len;
  26        unsigned bv_offset;
  27#endif
  28};
  29
  30struct dm_bio_details {
  31        sector_t bi_sector;
  32        struct block_device *bi_bdev;
  33        unsigned int bi_size;
  34        unsigned short bi_idx;
  35        unsigned long bi_flags;
  36        struct dm_bio_vec_details bi_io_vec[BIO_MAX_PAGES];
  37};
  38
  39static inline void dm_bio_record(struct dm_bio_details *bd, struct bio *bio)
  40{
  41        unsigned i;
  42
  43        bd->bi_sector = bio->bi_sector;
  44        bd->bi_bdev = bio->bi_bdev;
  45        bd->bi_size = bio->bi_size;
  46        bd->bi_idx = bio->bi_idx;
  47        bd->bi_flags = bio->bi_flags;
  48
  49        for (i = 0; i < bio->bi_vcnt; i++) {
  50                bd->bi_io_vec[i].bv_len = bio->bi_io_vec[i].bv_len;
  51                bd->bi_io_vec[i].bv_offset = bio->bi_io_vec[i].bv_offset;
  52        }
  53}
  54
  55static inline void dm_bio_restore(struct dm_bio_details *bd, struct bio *bio)
  56{
  57        unsigned i;
  58
  59        bio->bi_sector = bd->bi_sector;
  60        bio->bi_bdev = bd->bi_bdev;
  61        bio->bi_size = bd->bi_size;
  62        bio->bi_idx = bd->bi_idx;
  63        bio->bi_flags = bd->bi_flags;
  64
  65        for (i = 0; i < bio->bi_vcnt; i++) {
  66                bio->bi_io_vec[i].bv_len = bd->bi_io_vec[i].bv_len;
  67                bio->bi_io_vec[i].bv_offset = bd->bi_io_vec[i].bv_offset;
  68        }
  69}
  70
  71#endif
  72