]> git.kernelconcepts.de Git - karo-tx-linux.git/blobdiff - include/linux/bio.h
bio-integrity: stop abusing bi_end_io
[karo-tx-linux.git] / include / linux / bio.h
index a7e29fa0981f148602dcb11dd53e07e1c46147d3..7b1cf4ba090291af59e904dc1c59d8196ab88d3d 100644 (file)
@@ -118,7 +118,6 @@ static inline void *bio_data(struct bio *bio)
 /*
  * will die
  */
-#define bio_to_phys(bio)       (page_to_phys(bio_page((bio))) + (unsigned long) bio_offset((bio)))
 #define bvec_to_phys(bv)       (page_to_phys((bv)->bv_page) + (unsigned long) (bv)->bv_offset)
 
 /*
@@ -166,10 +165,27 @@ static inline void bio_advance_iter(struct bio *bio, struct bvec_iter *iter,
 {
        iter->bi_sector += bytes >> 9;
 
-       if (bio_no_advance_iter(bio))
+       if (bio_no_advance_iter(bio)) {
                iter->bi_size -= bytes;
-       else
+               iter->bi_done += bytes;
+       } else {
                bvec_iter_advance(bio->bi_io_vec, iter, bytes);
+               /* TODO: It is reasonable to complete bio with error here. */
+       }
+}
+
+static inline bool bio_rewind_iter(struct bio *bio, struct bvec_iter *iter,
+               unsigned int bytes)
+{
+       iter->bi_sector -= bytes >> 9;
+
+       if (bio_no_advance_iter(bio)) {
+               iter->bi_size += bytes;
+               iter->bi_done -= bytes;
+               return true;
+       }
+
+       return bvec_iter_rewind(bio->bi_io_vec, iter, bytes);
 }
 
 #define __bio_for_each_segment(bvl, bio, iter, start)                  \
@@ -304,8 +320,6 @@ struct bio_integrity_payload {
 
        struct bvec_iter        bip_iter;
 
-       bio_end_io_t            *bip_end_io;    /* saved I/O completion fn */
-
        unsigned short          bip_slab;       /* slab the bip came from */
        unsigned short          bip_vcnt;       /* # of integrity bio_vecs */
        unsigned short          bip_max_vcnt;   /* integrity bio_vec slots */
@@ -373,8 +387,11 @@ static inline struct bio *bio_next_split(struct bio *bio, int sectors,
        return bio_split(bio, sectors, gfp, bs);
 }
 
-extern struct bio_set *bioset_create(unsigned int, unsigned int);
-extern struct bio_set *bioset_create_nobvec(unsigned int, unsigned int);
+extern struct bio_set *bioset_create(unsigned int, unsigned int, int flags);
+enum {
+       BIOSET_NEED_BVECS = BIT(0),
+       BIOSET_NEED_RESCUER = BIT(1),
+};
 extern void bioset_free(struct bio_set *);
 extern mempool_t *biovec_create_pool(int pool_entries);
 
@@ -392,11 +409,6 @@ static inline struct bio *bio_alloc(gfp_t gfp_mask, unsigned int nr_iovecs)
        return bio_alloc_bioset(gfp_mask, nr_iovecs, fs_bio_set);
 }
 
-static inline struct bio *bio_clone(struct bio *bio, gfp_t gfp_mask)
-{
-       return bio_clone_bioset(bio, gfp_mask, fs_bio_set);
-}
-
 static inline struct bio *bio_kmalloc(gfp_t gfp_mask, unsigned int nr_iovecs)
 {
        return bio_alloc_bioset(gfp_mask, nr_iovecs, NULL);
@@ -414,7 +426,13 @@ extern void bio_endio(struct bio *);
 
 static inline void bio_io_error(struct bio *bio)
 {
-       bio->bi_error = -EIO;
+       bio->bi_status = BLK_STS_IOERR;
+       bio_endio(bio);
+}
+
+static inline void bio_wouldblock_error(struct bio *bio)
+{
+       bio->bi_status = BLK_STS_AGAIN;
        bio_endio(bio);
 }
 
@@ -719,13 +737,10 @@ struct biovec_slab {
                bip_for_each_vec(_bvl, _bio->bi_integrity, _iter)
 
 extern struct bio_integrity_payload *bio_integrity_alloc(struct bio *, gfp_t, unsigned int);
-extern void bio_integrity_free(struct bio *);
 extern int bio_integrity_add_page(struct bio *, struct page *, unsigned int, unsigned int);
-extern bool bio_integrity_enabled(struct bio *bio);
-extern int bio_integrity_prep(struct bio *);
-extern void bio_integrity_endio(struct bio *);
+extern bool bio_integrity_prep(struct bio *);
 extern void bio_integrity_advance(struct bio *, unsigned int);
-extern void bio_integrity_trim(struct bio *, unsigned int, unsigned int);
+extern void bio_integrity_trim(struct bio *);
 extern int bio_integrity_clone(struct bio *, struct bio *, gfp_t);
 extern int bioset_integrity_create(struct bio_set *, int);
 extern void bioset_integrity_free(struct bio_set *);
@@ -738,11 +753,6 @@ static inline void *bio_integrity(struct bio *bio)
        return NULL;
 }
 
-static inline bool bio_integrity_enabled(struct bio *bio)
-{
-       return false;
-}
-
 static inline int bioset_integrity_create(struct bio_set *bs, int pool_size)
 {
        return 0;
@@ -753,14 +763,9 @@ static inline void bioset_integrity_free (struct bio_set *bs)
        return;
 }
 
-static inline int bio_integrity_prep(struct bio *bio)
+static inline bool bio_integrity_prep(struct bio *bio)
 {
-       return 0;
-}
-
-static inline void bio_integrity_free(struct bio *bio)
-{
-       return;
+       return true;
 }
 
 static inline int bio_integrity_clone(struct bio *bio, struct bio *bio_src,
@@ -775,8 +780,7 @@ static inline void bio_integrity_advance(struct bio *bio,
        return;
 }
 
-static inline void bio_integrity_trim(struct bio *bio, unsigned int offset,
-                                     unsigned int sectors)
+static inline void bio_integrity_trim(struct bio *bio)
 {
        return;
 }