[SCSI] libosd: osd_req_read_sg, optimize the single entry case
authorBoaz Harrosh <bharrosh@panasas.com>
Sun, 23 Jan 2011 15:53:24 +0000 (17:53 +0200)
committerJames Bottomley <James.Bottomley@suse.de>
Mon, 24 Jan 2011 18:06:31 +0000 (12:06 -0600)
Since sg-read is a bidi operation, it is a gain to convert
a single sg entry into a regular read. Better do this in the
generic layer then force each caller to do so.

Signed-off-by: Boaz Harrosh <bharrosh@panasas.com>
Signed-off-by: James Bottomley <James.Bottomley@suse.de>
drivers/scsi/osd/osd_initiator.c

index b37c8a3..86afb13 100644 (file)
@@ -1005,11 +1005,23 @@ int osd_req_read_sg(struct osd_request *or,
        const struct osd_sg_entry *sglist, unsigned numentries)
 {
        u64 len;
-       int ret = _add_sg_continuation_descriptor(or, sglist, numentries, &len);
+       u64 off;
+       int ret;
 
-       if (ret)
-               return ret;
-       osd_req_read(or, obj, 0, bio, len);
+       if (numentries > 1) {
+               off = 0;
+               ret = _add_sg_continuation_descriptor(or, sglist, numentries,
+                                                     &len);
+               if (ret)
+                       return ret;
+       } else {
+               /* Optimize the case of single segment, read_sg is a
+                * bidi operation.
+                */
+               len = sglist->len;
+               off = sglist->offset;
+       }
+       osd_req_read(or, obj, off, bio, len);
 
        return 0;
 }