summaryrefslogtreecommitdiff
path: root/usr/src/uts/common/io/blkdev/blkdev.c
diff options
context:
space:
mode:
authorDan McDonald <danmcd@omniti.com>2017-01-26 11:36:31 -0500
committerDan McDonald <danmcd@omniti.com>2017-01-26 12:02:38 -0500
commit04904ca2a4492f1b3e2ec393f82d81a9a1c9611e (patch)
treec6b8f9f9f8f3c87f002c2ed6c50eca5304a95da0 /usr/src/uts/common/io/blkdev/blkdev.c
parentd2c5b266b717b923ea0e28b925ddb8e66dd98b42 (diff)
downloadillumos-joyent-04904ca2a4492f1b3e2ec393f82d81a9a1c9611e.tar.gz
backout: 7367 blkdev: support block size larger than 512
(Needs more work.) This reverts commit d2c5b266b717b923ea0e28b925ddb8e66dd98b42.
Diffstat (limited to 'usr/src/uts/common/io/blkdev/blkdev.c')
-rw-r--r--usr/src/uts/common/io/blkdev/blkdev.c46
1 files changed, 19 insertions, 27 deletions
diff --git a/usr/src/uts/common/io/blkdev/blkdev.c b/usr/src/uts/common/io/blkdev/blkdev.c
index ba1f0710a2..e94aeba89d 100644
--- a/usr/src/uts/common/io/blkdev/blkdev.c
+++ b/usr/src/uts/common/io/blkdev/blkdev.c
@@ -23,7 +23,6 @@
* Copyright 2012 Garrett D'Amore <garrett@damore.org>. All rights reserved.
* Copyright 2012 Alexey Zaytsev <alexey.zaytsev@gmail.com> All rights reserved.
* Copyright 2016 Nexenta Systems, Inc. All rights reserved.
- * Copyright 2017 The MathWorks, Inc. All rights reserved.
*/
#include <sys/types.h>
@@ -754,7 +753,7 @@ bd_xfer_alloc(bd_t *bd, struct buf *bp, int (*func)(void *, bd_xfer_t *),
xi->i_bp = bp;
xi->i_func = func;
- xi->i_blkno = bp->b_lblkno >> (bd->d_blkshift - DEV_BSHIFT);
+ xi->i_blkno = bp->b_lblkno;
if (bp->b_bcount == 0) {
xi->i_len = 0;
@@ -784,7 +783,7 @@ bd_xfer_alloc(bd_t *bd, struct buf *bp, int (*func)(void *, bd_xfer_t *),
(bp->b_bcount + (bd->d_maxxfer - 1)) / bd->d_maxxfer;
xi->i_cur_win = 0;
xi->i_len = min(bp->b_bcount, bd->d_maxxfer);
- xi->i_nblks = howmany(xi->i_len, (1U << shift));
+ xi->i_nblks = xi->i_len >> shift;
xi->i_kaddr = bp->b_un.b_addr;
xi->i_resid = bp->b_bcount;
} else {
@@ -807,7 +806,7 @@ bd_xfer_alloc(bd_t *bd, struct buf *bp, int (*func)(void *, bd_xfer_t *),
xi->i_cur_win = 0;
xi->i_offset = 0;
xi->i_len = bp->b_bcount;
- xi->i_nblks = howmany(xi->i_len, (1U << shift));
+ xi->i_nblks = xi->i_len >> shift;
xi->i_resid = bp->b_bcount;
rv = 0;
break;
@@ -819,13 +818,13 @@ bd_xfer_alloc(bd_t *bd, struct buf *bp, int (*func)(void *, bd_xfer_t *),
(ddi_dma_getwin(xi->i_dmah, 0, &xi->i_offset,
&len, &xi->i_dmac, &xi->i_ndmac) !=
DDI_SUCCESS) ||
- (P2PHASE(len, (1U << DEV_BSHIFT)) != 0)) {
+ (P2PHASE(len, shift) != 0)) {
(void) ddi_dma_unbind_handle(xi->i_dmah);
rv = EFAULT;
goto done;
}
xi->i_len = len;
- xi->i_nblks = howmany(xi->i_len, (1U << shift));
+ xi->i_nblks = xi->i_len >> shift;
xi->i_resid = bp->b_bcount;
rv = 0;
break;
@@ -1036,9 +1035,6 @@ bd_dump(dev_t dev, caddr_t caddr, daddr_t blkno, int nblk)
bd_xfer_impl_t *xi;
buf_t *bp;
int rv;
- uint32_t shift;
- daddr_t d_blkno;
- int d_nblk;
rw_enter(&bd_lock, RW_READER);
@@ -1049,9 +1045,6 @@ bd_dump(dev_t dev, caddr_t caddr, daddr_t blkno, int nblk)
rw_exit(&bd_lock);
return (ENXIO);
}
- shift = bd->d_blkshift;
- d_blkno = blkno >> (shift - DEV_BSHIFT);
- d_nblk = howmany((nblk << DEV_BSHIFT), (1U << shift));
/*
* do cmlb, but do it synchronously unless we already have the
* partition (which we probably should.)
@@ -1062,7 +1055,7 @@ bd_dump(dev_t dev, caddr_t caddr, daddr_t blkno, int nblk)
return (ENXIO);
}
- if ((d_blkno + d_nblk) > psize) {
+ if ((blkno + nblk) > psize) {
rw_exit(&bd_lock);
return (EINVAL);
}
@@ -1072,7 +1065,7 @@ bd_dump(dev_t dev, caddr_t caddr, daddr_t blkno, int nblk)
return (ENOMEM);
}
- bp->b_bcount = nblk << DEV_BSHIFT;
+ bp->b_bcount = nblk << bd->d_blkshift;
bp->b_resid = bp->b_bcount;
bp->b_lblkno = blkno;
bp->b_un.b_addr = caddr;
@@ -1083,7 +1076,7 @@ bd_dump(dev_t dev, caddr_t caddr, daddr_t blkno, int nblk)
freerbuf(bp);
return (ENOMEM);
}
- xi->i_blkno = d_blkno + pstart;
+ xi->i_blkno = blkno + pstart;
xi->i_flags = BD_XFER_POLL;
bd_submit(bd, xi);
rw_exit(&bd_lock);
@@ -1159,7 +1152,6 @@ bd_strategy(struct buf *bp)
bd_xfer_impl_t *xi;
uint32_t shift;
int (*func)(void *, bd_xfer_t *);
- diskaddr_t lblkno;
part = BDPART(bp->b_edev);
inst = BDINST(bp->b_edev);
@@ -1182,21 +1174,21 @@ bd_strategy(struct buf *bp)
}
shift = bd->d_blkshift;
- lblkno = bp->b_lblkno >> (shift - DEV_BSHIFT);
- if ((P2PHASE(bp->b_bcount, (1U << DEV_BSHIFT)) != 0) ||
- (lblkno > p_nblks)) {
+
+ if ((P2PHASE(bp->b_bcount, (1U << shift)) != 0) ||
+ (bp->b_lblkno > p_nblks)) {
bioerror(bp, ENXIO);
biodone(bp);
return (0);
}
- b_nblks = howmany(bp->b_bcount, (1U << shift));
- if ((lblkno == p_nblks) || (bp->b_bcount == 0)) {
+ b_nblks = bp->b_bcount >> shift;
+ if ((bp->b_lblkno == p_nblks) || (bp->b_bcount == 0)) {
biodone(bp);
return (0);
}
- if ((b_nblks + lblkno) > p_nblks) {
- bp->b_resid = ((lblkno + b_nblks - p_nblks) << shift);
+ if ((b_nblks + bp->b_lblkno) > p_nblks) {
+ bp->b_resid = ((bp->b_lblkno + b_nblks - p_nblks) << shift);
bp->b_bcount -= bp->b_resid;
} else {
bp->b_resid = 0;
@@ -1212,7 +1204,7 @@ bd_strategy(struct buf *bp)
biodone(bp);
return (0);
}
- xi->i_blkno = lblkno + p_lba;
+ xi->i_blkno = bp->b_lblkno + p_lba;
bd_submit(bd, xi);
@@ -1394,7 +1386,7 @@ bd_tg_rdwr(dev_info_t *dip, uchar_t cmd, void *bufaddr, diskaddr_t start,
bd = ddi_get_soft_state(bd_state, ddi_get_instance(dip));
- if (P2PHASE(length, (1U << DEV_BSHIFT)) != 0) {
+ if (P2PHASE(length, (1U << bd->d_blkshift)) != 0) {
/* We can only transfer whole blocks at a time! */
return (EINVAL);
}
@@ -1913,7 +1905,7 @@ bd_xfer_done(bd_xfer_t *xfer, int err)
if ((rv != DDI_SUCCESS) ||
- (P2PHASE(len, (1U << DEV_BSHIFT) != 0))) {
+ (P2PHASE(len, (1U << xi->i_blkshift) != 0))) {
bd_runq_exit(xi, EFAULT);
bp->b_resid += xi->i_resid;
@@ -1923,7 +1915,7 @@ bd_xfer_done(bd_xfer_t *xfer, int err)
return;
}
xi->i_len = len;
- xi->i_nblks = howmany(len, (1U << xi->i_blkshift));
+ xi->i_nblks = len >> xi->i_blkshift;
/* Submit next window to hardware. */
rv = xi->i_func(bd->d_private, &xi->i_public);