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
 };
 

Reply via email to