diff options
author | Ingo Molnar <mingo@elte.hu> | 2009-04-07 12:05:21 +0200 |
---|---|---|
committer | Ingo Molnar <mingo@elte.hu> | 2009-04-07 12:05:25 +0200 |
commit | 6c009ecef8cca28c7c09eb16d0802e37915a76e1 (patch) | |
tree | 11c773f780186fdb9fbc9c80a73fb7c8426b1fba /drivers/scsi/osd | |
parent | 98c2aaf8be5baf7193be37fb28bce8e7327158bc (diff) | |
parent | d508afb437daee7cf07da085b635c44a4ebf9b38 (diff) |
Merge branch 'linus' into perfcounters/core
Merge reason: need the upstream facility added by:
7f1e2ca: hrtimer: fix rq->lock inversion (again)
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Diffstat (limited to 'drivers/scsi/osd')
-rw-r--r-- | drivers/scsi/osd/osd_initiator.c | 42 | ||||
-rw-r--r-- | drivers/scsi/osd/osd_uld.c | 6 |
2 files changed, 24 insertions, 24 deletions
diff --git a/drivers/scsi/osd/osd_initiator.c b/drivers/scsi/osd/osd_initiator.c index 552f58b655d1..2a5f0777148d 100644 --- a/drivers/scsi/osd/osd_initiator.c +++ b/drivers/scsi/osd/osd_initiator.c @@ -338,20 +338,6 @@ struct osd_request *osd_start_request(struct osd_dev *dev, gfp_t gfp) } EXPORT_SYMBOL(osd_start_request); -/* - * If osd_finalize_request() was called but the request was not executed through - * the block layer, then we must release BIOs. - */ -static void _abort_unexecuted_bios(struct request *rq) -{ - struct bio *bio; - - while ((bio = rq->bio) != NULL) { - rq->bio = bio->bi_next; - bio_endio(bio, 0); - } -} - static void _osd_free_seg(struct osd_request *or __unused, struct _osd_req_data_segment *seg) { @@ -363,9 +349,30 @@ static void _osd_free_seg(struct osd_request *or __unused, seg->alloc_size = 0; } +static void _put_request(struct request *rq , bool is_async) +{ + if (is_async) { + WARN_ON(rq->bio); + __blk_put_request(rq->q, rq); + } else { + /* + * If osd_finalize_request() was called but the request was not + * executed through the block layer, then we must release BIOs. + * TODO: Keep error code in or->async_error. Need to audit all + * code paths. + */ + if (unlikely(rq->bio)) + blk_end_request(rq, -ENOMEM, blk_rq_bytes(rq)); + else + blk_put_request(rq); + } +} + void osd_end_request(struct osd_request *or) { struct request *rq = or->request; + /* IMPORTANT: make sure this agrees with osd_execute_request_async */ + bool is_async = (or->request->end_io_data == or); _osd_free_seg(or, &or->set_attr); _osd_free_seg(or, &or->enc_get_attr); @@ -373,12 +380,11 @@ void osd_end_request(struct osd_request *or) if (rq) { if (rq->next_rq) { - _abort_unexecuted_bios(rq->next_rq); - blk_put_request(rq->next_rq); + _put_request(rq->next_rq, is_async); + rq->next_rq = NULL; } - _abort_unexecuted_bios(rq); - blk_put_request(rq); + _put_request(rq, is_async); } _osd_request_free(or); } diff --git a/drivers/scsi/osd/osd_uld.c b/drivers/scsi/osd/osd_uld.c index f8b1a749958b..f644c9571eab 100644 --- a/drivers/scsi/osd/osd_uld.c +++ b/drivers/scsi/osd/osd_uld.c @@ -345,10 +345,6 @@ static int osd_probe(struct device *dev) } dev_set_drvdata(oud->class_member, oud); - error = sysfs_create_link(&scsi_device->sdev_gendev.kobj, - &oud->class_member->kobj, osd_symlink); - if (error) - OSD_ERR("warning: unable to make symlink\n"); OSD_INFO("osd_probe %s\n", disk->disk_name); return 0; @@ -377,8 +373,6 @@ static int osd_remove(struct device *dev) scsi_device); } - sysfs_remove_link(&oud->od.scsi_device->sdev_gendev.kobj, osd_symlink); - if (oud->class_member) device_destroy(osd_sysfs_class, MKDEV(SCSI_OSD_MAJOR, oud->minor)); |