Author: avg
Date: Mon Oct  2 12:47:35 2017
New Revision: 324204
URL: https://svnweb.freebsd.org/changeset/base/324204

Log:
  MFC r323918: MFV r323917: 8648 Fix range locking in ZIL commit codepath
  
  This fixes a problem introduced in r320496, MFC of r308782.

Modified:
  stable/10/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c
  stable/10/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zvol.c
Directory Properties:
  stable/10/   (props changed)

Modified: stable/10/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c
==============================================================================
--- stable/10/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c        
Mon Oct  2 12:44:06 2017        (r324203)
+++ stable/10/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c        
Mon Oct  2 12:47:35 2017        (r324204)
@@ -1344,7 +1344,7 @@ zfs_get_data(void *arg, lr_write_t *lr, char *buf, zio
        } else { /* indirect write */
                /*
                 * Have to lock the whole block to ensure when it's
-                * written out and it's checksum is being calculated
+                * written out and its checksum is being calculated
                 * that no one can change the data. We need to re-check
                 * blocksize after we get the lock in case it's changed!
                 */

Modified: stable/10/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zvol.c
==============================================================================
--- stable/10/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zvol.c     Mon Oct 
 2 12:44:06 2017        (r324203)
+++ stable/10/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zvol.c     Mon Oct 
 2 12:47:35 2017        (r324204)
@@ -1305,7 +1305,6 @@ zvol_get_data(void *arg, lr_write_t *lr, char *buf, zi
 
        zgd = kmem_zalloc(sizeof (zgd_t), KM_SLEEP);
        zgd->zgd_zilog = zv->zv_zilog;
-       zgd->zgd_rl = zfs_range_lock(&zv->zv_znode, offset, size, RL_READER);
 
        /*
         * Write records come in two flavors: immediate and indirect.
@@ -1314,12 +1313,22 @@ zvol_get_data(void *arg, lr_write_t *lr, char *buf, zi
         * sync the data and get a pointer to it (indirect) so that
         * we don't have to write the data twice.
         */
-       if (buf != NULL) {      /* immediate write */
+       if (buf != NULL) { /* immediate write */
+               zgd->zgd_rl = zfs_range_lock(&zv->zv_znode, offset, size,
+                   RL_READER);
                error = dmu_read(os, object, offset, size, buf,
                    DMU_READ_NO_PREFETCH);
-       } else {
+       } else { /* indirect write */
+               /*
+                * Have to lock the whole block to ensure when it's written out
+                * and its checksum is being calculated that no one can change
+                * the data. Contrarily to zfs_get_data we need not re-check
+                * blocksize after we get the lock because it cannot be changed.
+                */
                size = zv->zv_volblocksize;
                offset = P2ALIGN(offset, size);
+               zgd->zgd_rl = zfs_range_lock(&zv->zv_znode, offset, size,
+                   RL_READER);
                error = dmu_buf_hold(os, object, offset, zgd, &db,
                    DMU_READ_NO_PREFETCH);
                if (error == 0) {
_______________________________________________
svn-src-stable-10@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-stable-10
To unsubscribe, send any mail to "svn-src-stable-10-unsubscr...@freebsd.org"

Reply via email to