]> git.hungrycats.org Git - linux/commitdiff
[PATCH] add function to set q->merge_bvec_fn
authorJens Axboe <axboe@suse.de>
Mon, 30 Sep 2002 05:33:53 +0000 (22:33 -0700)
committerLinus Torvalds <torvalds@penguin.transmeta.com>
Mon, 30 Sep 2002 05:33:53 +0000 (22:33 -0700)
Add a function to set queue merge_bvec_fn to mimic the rest of the api,
and also add documentation for that and blk_queue_prep_rq().

drivers/block/ll_rw_blk.c
include/linux/blkdev.h

index 13f769d27a5dfcd82591ea3ce2be4793fac984be..985a1dd6f8693778a85301bdb8f57ef1f2b469a2 100644 (file)
@@ -151,11 +151,41 @@ struct backing_dev_info *blk_get_backing_dev_info(struct block_device *bdev)
        return ret;
 }
 
+/**
+ * blk_queue_prep_rq - set a prepare_request function for queue
+ * @q:         queue
+ * @pfn:       prepare_request function
+ *
+ * It's possible for a queue to register a prepare_request callback which
+ * is invoked before the request is handed to the request_fn. The goal of
+ * the function is to prepare a request for I/O, it can be used to build a
+ * cdb from the request data for instance.
+ *
+ */
 void blk_queue_prep_rq(request_queue_t *q, prep_rq_fn *pfn)
 {
        q->prep_rq_fn = pfn;
 }
 
+/**
+ * blk_queue_merge_bvec - set a merge_bvec function for queue
+ * @q:         queue
+ * @mbfn:      merge_bvec_fn
+ *
+ * Usually queues have static limitations on the max sectors or segments that
+ * we can put in a request. Stacking drivers may have some settings that
+ * are dynamic, and thus we have to query the queue whether it is ok to
+ * add a new bio_vec to a bio at a given offset or not. If the block device
+ * has such limitations, it needs to register a merge_bvec_fn to control
+ * the size of bio's sent to it. Per default now merge_bvec_fn is defined for
+ * a queue, and only the fixed limits are honored.
+ *
+ */
+void blk_queue_merge_bvec(request_queue_t *q, merge_bvec_fn *mbfn)
+{
+       q->merge_bvec_fn = mbfn;
+}
+
 /**
  * blk_queue_make_request - define an alternate make_request function for a device
  * @q:  the request queue for the device to be affected
@@ -2057,6 +2087,7 @@ EXPORT_SYMBOL(blk_put_request);
 EXPORT_SYMBOL(blk_insert_request);
 
 EXPORT_SYMBOL(blk_queue_prep_rq);
+EXPORT_SYMBOL(blk_queue_merge_bvec);
 
 EXPORT_SYMBOL(blk_queue_find_tag);
 EXPORT_SYMBOL(blk_queue_init_tags);
index 255001f6f4331e814371162de67d070dda932a4b..b64f24427f6a1f943d863388216d1c6167576b6c 100644 (file)
@@ -326,6 +326,7 @@ extern void blk_queue_hardsect_size(request_queue_t *, unsigned short);
 extern void blk_queue_segment_boundary(request_queue_t *, unsigned long);
 extern void blk_queue_assign_lock(request_queue_t *, spinlock_t *);
 extern void blk_queue_prep_rq(request_queue_t *, prep_rq_fn *pfn);
+extern void blk_queue_merge_bvec(request_queue_t *, merge_bvec_fn *);
 extern struct backing_dev_info *blk_get_backing_dev_info(struct block_device *bdev);
 
 extern int blk_rq_map_sg(request_queue_t *, struct request *, struct scatterlist *);