Merge tag 'for-linus-5.12b-rc1-tag' of git://git.kernel.org/pub/scm/linux/kernel...
[linux-2.6-microblaze.git] / include / linux / bio.h
index 1edda61..5b468f2 100644 (file)
@@ -10,6 +10,7 @@
 #include <linux/ioprio.h>
 /* struct bio, bio_vec and BIO_* flags are defined in blk_types.h */
 #include <linux/blk_types.h>
+#include <linux/uio.h>
 
 #define BIO_DEBUG
 
@@ -328,7 +329,6 @@ struct bio_integrity_payload {
 
        struct bvec_iter        bip_iter;
 
-       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 */
        unsigned short          bip_flags;      /* control flags */
@@ -406,7 +406,9 @@ extern void bioset_exit(struct bio_set *);
 extern int biovec_init_pool(mempool_t *pool, int pool_entries);
 extern int bioset_init_from_src(struct bio_set *bs, struct bio_set *src);
 
-extern struct bio *bio_alloc_bioset(gfp_t, unsigned int, struct bio_set *);
+struct bio *bio_alloc_bioset(gfp_t gfp, unsigned short nr_iovecs,
+               struct bio_set *bs);
+struct bio *bio_kmalloc(gfp_t gfp_mask, unsigned short nr_iovecs);
 extern void bio_put(struct bio *);
 
 extern void __bio_clone_fast(struct bio *, struct bio *);
@@ -414,16 +416,11 @@ extern struct bio *bio_clone_fast(struct bio *, gfp_t, struct bio_set *);
 
 extern struct bio_set fs_bio_set;
 
-static inline struct bio *bio_alloc(gfp_t gfp_mask, unsigned int nr_iovecs)
+static inline struct bio *bio_alloc(gfp_t gfp_mask, unsigned short nr_iovecs)
 {
        return bio_alloc_bioset(gfp_mask, nr_iovecs, &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);
-}
-
 extern blk_qc_t submit_bio(struct bio *);
 
 extern void bio_endio(struct bio *);
@@ -441,6 +438,18 @@ static inline void bio_wouldblock_error(struct bio *bio)
        bio_endio(bio);
 }
 
+/*
+ * Calculate number of bvec segments that should be allocated to fit data
+ * pointed by @iter. If @iter is backed by bvec it's going to be reused
+ * instead of allocating a new one.
+ */
+static inline int bio_iov_vecs_to_alloc(struct iov_iter *iter, int max_segs)
+{
+       if (iov_iter_is_bvec(iter))
+               return 0;
+       return iov_iter_npages(iter, max_segs);
+}
+
 struct request_queue;
 
 extern int submit_bio_wait(struct bio *bio);
@@ -455,6 +464,8 @@ void bio_chain(struct bio *, struct bio *);
 extern int bio_add_page(struct bio *, struct page *, unsigned int,unsigned int);
 extern int bio_add_pc_page(struct request_queue *, struct bio *, struct page *,
                           unsigned int, unsigned int);
+int bio_add_zone_append_page(struct bio *bio, struct page *page,
+                            unsigned int len, unsigned int offset);
 bool __bio_try_merge_page(struct bio *bio, struct page *page,
                unsigned int len, unsigned int off, bool *same_page);
 void __bio_add_page(struct bio *bio, struct page *page,
@@ -478,29 +489,26 @@ static inline void zero_fill_bio(struct bio *bio)
        zero_fill_bio_iter(bio, bio->bi_iter);
 }
 
-extern struct bio_vec *bvec_alloc(gfp_t, int, unsigned long *, mempool_t *);
-extern void bvec_free(mempool_t *, struct bio_vec *, unsigned int);
-extern unsigned int bvec_nr_vecs(unsigned short idx);
 extern const char *bio_devname(struct bio *bio, char *buffer);
 
-#define bio_set_dev(bio, bdev)                         \
-do {                                           \
-       if ((bio)->bi_disk != (bdev)->bd_disk)  \
-               bio_clear_flag(bio, BIO_THROTTLED);\
-       (bio)->bi_disk = (bdev)->bd_disk;       \
-       (bio)->bi_partno = (bdev)->bd_partno;   \
-       bio_associate_blkg(bio);                \
+#define bio_set_dev(bio, bdev)                                 \
+do {                                                   \
+       bio_clear_flag(bio, BIO_REMAPPED);              \
+       if ((bio)->bi_bdev != (bdev))                   \
+               bio_clear_flag(bio, BIO_THROTTLED);     \
+       (bio)->bi_bdev = (bdev);                        \
+       bio_associate_blkg(bio);                        \
 } while (0)
 
 #define bio_copy_dev(dst, src)                 \
 do {                                           \
-       (dst)->bi_disk = (src)->bi_disk;        \
-       (dst)->bi_partno = (src)->bi_partno;    \
+       bio_clear_flag(dst, BIO_REMAPPED);              \
+       (dst)->bi_bdev = (src)->bi_bdev;        \
        bio_clone_blkg_association(dst, src);   \
 } while (0)
 
 #define bio_dev(bio) \
-       disk_devt((bio)->bi_disk)
+       disk_devt((bio)->bi_bdev->bd_disk)
 
 #ifdef CONFIG_BLK_CGROUP
 void bio_associate_blkg(struct bio *bio);
@@ -703,6 +711,7 @@ struct bio_set {
        mempool_t bvec_integrity_pool;
 #endif
 
+       unsigned int back_pad;
        /*
         * Deadlock avoidance for stacking block drivers: see comments in
         * bio_alloc_bioset() for details
@@ -713,12 +722,6 @@ struct bio_set {
        struct workqueue_struct *rescue_workqueue;
 };
 
-struct biovec_slab {
-       int nr_vecs;
-       char *name;
-       struct kmem_cache *slab;
-};
-
 static inline bool bioset_initialized(struct bio_set *bs)
 {
        return bs->bio_slab != NULL;