Skip to contentSkip to conversation

bsg: add large command support

PATCH In review FUJITA Tomonori 2 participants 2 messages Apr 30, 2008

Subsystems (3)
lore
Share & tools
lore

FUJITA Tomonori

author maintainer
#0 lore raw

PATCH 1/1 bsg: add large command support

This is against Linus' tree since this depends on the large command support of the block layer, which was merged few hours ago.

This can be applied now since it doesn't depend on Boaz's variable length CDB support though this is useful only for the variable length CDB.

=
From: FUJITA Tomonori <[email protected]>
Subject: [PATCH] bsg: add large command support

This enables bsg to handle the request length larger than BLK_MAX_CDB (mainly for the variable length CDB format).

Cc Boaz Harrosh <[email protected]>
Cc Pete Wyckoff <[email protected]>
Cc Jens Axboe <[email protected]>
Cc James Bottomley <[email protected]>
---
 block/bsg.c |   12 +++++++++---
 1 files changed, 9 insertions(+), 3 deletions(-)
block/bsg.c +9 -3
index 23ea4fd..d8b889d 100644
@@ -174,7 +174,11 @@ unlock:
 static int blk_fill_sgv4_hdr_rq(struct request_queue *q, struct request *rq,
 				struct sg_io_v4 *hdr, int has_write_perm)
 {
-	memset(rq->cmd, 0, BLK_MAX_CDB); /* ATAPI hates garbage after CDB */
+	if (hdr->request_len > BLK_MAX_CDB) {
+		rq->cmd = kzalloc(hdr->request_len, GFP_KERNEL);
+		if (!rq->cmd)
+			return -ENOMEM;
+	}
 
 	if (copy_from_user(rq->cmd, (void *)(unsigned long)hdr->request,
 			   hdr->request_len))
@@ -211,8 +215,6 @@ bsg_validate_sgv4_hdr(struct request_queue *q, struct sg_io_v4 *hdr, int *rw)
 
 	if (hdr->guard != 'Q')
 		return -EINVAL;
-	if (hdr->request_len > BLK_MAX_CDB)
-		return -EINVAL;
 	if (hdr->dout_xfer_len > (q->max_sectors << 9) ||
 	    hdr->din_xfer_len > (q->max_sectors << 9))
 		return -EIO;
@@ -302,6 +304,8 @@ bsg_map_hdr(struct bsg_device *bd, struct sg_io_v4 *hdr)
 	}
 	return rq;
 out:
+	if (rq->cmd != rq->__cmd)
+		kfree(rq->cmd);
 	blk_put_request(rq);
 	if (next_rq) {
 		blk_rq_unmap_user(next_rq->bio);
@@ -455,6 +459,8 @@ static int blk_complete_sgv4_hdr_rq(struct request *rq, struct sg_io_v4 *hdr,
 		ret = rq->errors;
 
 	blk_rq_unmap_user(bio);
+	if (rq->cmd != rq->__cmd)
+		kfree(rq->cmd);
 	blk_put_request(rq);
 
 	return ret;
Signature · 1 line
1.5.4.2
Acked-by on v1 1/1
#1 lore raw
Quoted 14 lines · FUJITA Tomonori

This is against Linus' tree since this depends on the large command support of the block layer, which was merged few hours ago.

This can be applied now since it doesn't depend on Boaz's variable length CDB support though this is useful only for the variable length CDB.

=
From: FUJITA Tomonori <[email protected]>
Subject: [PATCH] bsg: add large command support

This enables bsg to handle the request length larger than BLK_MAX_CDB (mainly for the variable length CDB format).

Quoted 8 lines
Cc Boaz Harrosh <[email protected]>
Cc Pete Wyckoff <[email protected]>
Cc Jens Axboe <[email protected]>
Cc James Bottomley <[email protected]>
---
 block/bsg.c |   12 +++++++++---
 1 files changed, 9 insertions(+), 3 deletions(-)
Signature · 1 line
Jens Axboe