On 04/27/2009 09:24 PM, Jens Axboe wrote: > On Mon, Apr 27 2009, Boaz Harrosh wrote: Jens Hi, Thanks for your reply. Please I need some help with this. >>> +static struct bio *bio_chain_clone(struct bio *old_chain, gfp_t gfpmask) >>> +{ >>> + struct bio *tmp, *new_chain = NULL, *tail = NULL; >>> + >>> + while (old_chain) { >>> + tmp = bio_clone(old_chain, gfpmask); >>> + if (!tmp) >>> + goto err_out; >>> + >>> + tmp->bi_next = NULL; >>> + if (!new_chain) >>> + new_chain = tail = tmp; >>> + else { >>> + tail->bi_next = tmp; >>> + tail = tmp; >>> + } >>> + >>> + old_chain = old_chain->bi_next; >>> + } >>> + >>> + return new_chain; >>> + >>> +err_out: >>> + bio_chain_put(new_chain); >>> + return NULL; >>> +} >>> + >> NOTE-TO-ME: >> blk_bio_clone() > > Note to Boaz - this is illegal, unless gfp_mask is GFP_ATOMIC (in which > case you should not pass it in). OK it is only used with GFP_ATOMIC. Theoretically, what if I use a thread and am aloud to sleep, (and executing requests in serial). Can I then wait on the first bio_clone. > The only way to make this work is to: > Are you saying that, in the case I'm a swap device? or do you mean that if I use the above code I can break it for other devices that are swap-devices and cause a live lock for them. Currently the OSD library is not swap safe. And even if it was, iSCSI is not. So there is no option of this ever been swap. > 1) Have a private bio pool, and Do I need to manage such a pool internally and use __bio_clone() or is there an easy way to associate a private bio-pool to a request_queue? > 2) Make sure it has enough reserved entries to populate the chain Is there a system limit to that, that I can be sure of? Or just choose a magic number and if it is exceeded just split the io up in parts? > 3) Ensure only a single caller at the time, or entries enough for the N > users that are allowed. It has to be controlled either way, whether N > is 1 or larger. osdblk_rq_fn (the queue fn) is it serialized to one thread? If not could I use the queue lock for the duration of the clone? > Thanks for your help Boaz -- To unsubscribe from this list: send the line "unsubscribe linux-scsi" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html