Module Name: src Committed By: riastradh Date: Fri Feb 28 03:52:26 UTC 2020
Modified Files: src/external/cddl/osnet/dist/uts/common/fs/zfs: zfs_ioctl.c Log Message: Teach zfs bdevsw to do b_psize. This is needed, among other things, to swap on zvols. Attempting to swap on zvols currently deadlocks but that's a separate issue that needs to be fixed too! To generate a diff of this commit: cvs rdiff -u -r1.21 -r1.22 \ src/external/cddl/osnet/dist/uts/common/fs/zfs/zfs_ioctl.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/external/cddl/osnet/dist/uts/common/fs/zfs/zfs_ioctl.c diff -u src/external/cddl/osnet/dist/uts/common/fs/zfs/zfs_ioctl.c:1.21 src/external/cddl/osnet/dist/uts/common/fs/zfs/zfs_ioctl.c:1.22 --- src/external/cddl/osnet/dist/uts/common/fs/zfs/zfs_ioctl.c:1.21 Mon Oct 14 13:18:00 2019 +++ src/external/cddl/osnet/dist/uts/common/fs/zfs/zfs_ioctl.c Fri Feb 28 03:52:26 2020 @@ -7062,6 +7062,29 @@ nb_zvol_strategy(struct buf *bp) (void) zvol_strategy(bp); } +static int +nb_zvol_psize(dev_t dev) +{ + minor_t minor = getminor(dev); + off_t nbytes; + unsigned bytespersector; + + if (minor == 0) /* /dev/zfs */ + return -1; + + if (zvol_ioctl(dev, DIOCGMEDIASIZE, (intptr_t)&nbytes, 0, + NOCRED, NULL)) + return -1; + if (zvol_ioctl(dev, DIOCGSECTORSIZE, (intptr_t)&bytespersector, 0, + NOCRED, NULL)) + return -1; + if (bytespersector == 0) /* paranoia */ + return -1; + if (nbytes/bytespersector > INT_MAX) /* paranoia */ + return -1; + return nbytes/bytespersector; +} + static const struct fileops zfs_fileops = { .fo_name = "zfs", .fo_read = fbadop_read, @@ -7081,7 +7104,7 @@ const struct bdevsw zfs_bdevsw = { .d_strategy = nb_zvol_strategy, .d_ioctl = nb_zfsdev_ioctl, .d_dump = nodump, - .d_psize = nosize, + .d_psize = nb_zvol_psize, .d_flag = D_DISK | D_MPSAFE };