Generalize common code to reduce code duplication. Signed-off-by: Namhyung Kim <namhyung@xxxxxxxxx> --- drivers/scsi/sd.c | 36 ++++++++++++------------------------ 1 files changed, 12 insertions(+), 24 deletions(-) diff --git a/drivers/scsi/sd.c b/drivers/scsi/sd.c index 953773cb26d9..fb9d997ece9d 100644 --- a/drivers/scsi/sd.c +++ b/drivers/scsi/sd.c @@ -651,6 +651,7 @@ static int sd_prep_fn(struct request_queue *q, struct request *rq) unsigned int this_count = blk_rq_sectors(rq); int ret, host_dif; unsigned char protect; + int sector_shift; /* * Discard request come in as REQ_TYPE_FS but we turn them into @@ -735,36 +736,23 @@ static int sd_prep_fn(struct request_queue *q, struct request *rq) * and not force the scsi disk driver to use bounce buffers * for this. */ - if (sdp->sector_size == 1024) { - if ((block & 1) || (blk_rq_sectors(rq) & 1)) { + sector_shift = 0; + switch (sdp->sector_size) { + case 4096: sector_shift++; /* fall through */ + case 2048: sector_shift++; /* fall through */ + case 1024: sector_shift++; + + if (!IS_ALIGNED(block, 1 << sector_shift) || + !IS_ALIGNED(blk_rq_sectors(rq), 1 << sector_shift)) { scmd_printk(KERN_ERR, SCpnt, "Bad block number requested\n"); goto out; } else { - block = block >> 1; - this_count = this_count >> 1; - } - } - if (sdp->sector_size == 2048) { - if ((block & 3) || (blk_rq_sectors(rq) & 3)) { - scmd_printk(KERN_ERR, SCpnt, - "Bad block number requested\n"); - goto out; - } else { - block = block >> 2; - this_count = this_count >> 2; - } - } - if (sdp->sector_size == 4096) { - if ((block & 7) || (blk_rq_sectors(rq) & 7)) { - scmd_printk(KERN_ERR, SCpnt, - "Bad block number requested\n"); - goto out; - } else { - block = block >> 3; - this_count = this_count >> 3; + block = block >> sector_shift; + this_count = this_count >> sector_shift; } } + if (rq_data_dir(rq) == WRITE) { if (!sdp->writeable) { goto out; -- 1.7.6 -- 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