|
@@ -2243,6 +2243,40 @@ out:
|
|
}
|
|
}
|
|
EXPORT_SYMBOL(generic_make_request);
|
|
EXPORT_SYMBOL(generic_make_request);
|
|
|
|
|
|
|
|
+/**
|
|
|
|
+ * direct_make_request - hand a buffer directly to its device driver for I/O
|
|
|
|
+ * @bio: The bio describing the location in memory and on the device.
|
|
|
|
+ *
|
|
|
|
+ * This function behaves like generic_make_request(), but does not protect
|
|
|
|
+ * against recursion. Must only be used if the called driver is known
|
|
|
|
+ * to not call generic_make_request (or direct_make_request) again from
|
|
|
|
+ * its make_request function. (Calling direct_make_request again from
|
|
|
|
+ * a workqueue is perfectly fine as that doesn't recurse).
|
|
|
|
+ */
|
|
|
|
+blk_qc_t direct_make_request(struct bio *bio)
|
|
|
|
+{
|
|
|
|
+ struct request_queue *q = bio->bi_disk->queue;
|
|
|
|
+ bool nowait = bio->bi_opf & REQ_NOWAIT;
|
|
|
|
+ blk_qc_t ret;
|
|
|
|
+
|
|
|
|
+ if (!generic_make_request_checks(bio))
|
|
|
|
+ return BLK_QC_T_NONE;
|
|
|
|
+
|
|
|
|
+ if (unlikely(blk_queue_enter(q, nowait))) {
|
|
|
|
+ if (nowait && !blk_queue_dying(q))
|
|
|
|
+ bio->bi_status = BLK_STS_AGAIN;
|
|
|
|
+ else
|
|
|
|
+ bio->bi_status = BLK_STS_IOERR;
|
|
|
|
+ bio_endio(bio);
|
|
|
|
+ return BLK_QC_T_NONE;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ ret = q->make_request_fn(q, bio);
|
|
|
|
+ blk_queue_exit(q);
|
|
|
|
+ return ret;
|
|
|
|
+}
|
|
|
|
+EXPORT_SYMBOL_GPL(direct_make_request);
|
|
|
|
+
|
|
/**
|
|
/**
|
|
* submit_bio - submit a bio to the block device layer for I/O
|
|
* submit_bio - submit a bio to the block device layer for I/O
|
|
* @bio: The &struct bio which describes the I/O
|
|
* @bio: The &struct bio which describes the I/O
|