> Le Tue, 19 Feb 2008 14:48:18 +0900, > "Kyungmin Park" <[EMAIL PROTECTED]> a écrit : > > > + /* Write synchronous */ > > + bio->bi_rw |= (1 << BIO_RW_SYNC); > > Adding BIO_RW_SYNC doesn't make generic_make_request() synchronous as > in "generic_make_request() returns only after write completion". > BIO_RW_SYNC only asks the I/O layer to unplug immediatly. But > generic_make_request() still returns before the completion of the I/O, > and the completion is notified asynchronously. >
Agree, however see the following sequence. __generic_make_request call q->make_request_fn(q, bio); It was set by blk_init_queue_node with __make_request. There are two ways in __make_request. Case 1, get_rq Case 2, out or merged (otherwise you mean unplug case) In case 1, if the BIO_RW_SYNC is set, the request gets the REQ_RW_SYNC And REQ_RW_SYNC says "include/linux/blkdev.h":112: __REQ_RW_SYNC, /* request is sync (O_DIRECT) */ It means it acts as O_DIRECT flag. Is it right? And it also is same as case 2. Unplug the device. So next time it hasn't chance to merge??? Is it right? BR, Kyungmin Park -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/