Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 12 Nov 2016 23:58:07 +0000 (UTC)
From:      Alexander Motin <mav@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-10@freebsd.org
Subject:   svn commit: r308596 - in stable/10/sys/cddl/contrib/opensolaris/uts/common/fs/zfs: . sys
Message-ID:  <201611122358.uACNw7Cd087469@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: mav
Date: Sat Nov 12 23:58:07 2016
New Revision: 308596
URL: https://svnweb.freebsd.org/changeset/base/308596

Log:
  MFC r308173:
  Fix ZIL records ordering when ZVOL opened both with and without FSYNC.
  
  Before this an earlier writes to a ZVOL opened without FSYNC could get to
  ZIL after later writes to the same ZVOL opened with FSYNC.  Fix this by
  replicating functionality of ZPL (zv_sync_cnt equivalent to z_sync_cnt),
  marking all log records sync if anybody opened the ZVOL with FSYNC.

Modified:
  stable/10/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/zil.h
  stable/10/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zil.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/sys/zil.h
==============================================================================
--- stable/10/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/zil.h	Sat Nov 12 23:53:37 2016	(r308595)
+++ stable/10/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/zil.h	Sat Nov 12 23:58:07 2016	(r308596)
@@ -405,6 +405,7 @@ extern itx_t	*zil_itx_create(uint64_t tx
 extern void	zil_itx_destroy(itx_t *itx);
 extern void	zil_itx_assign(zilog_t *zilog, itx_t *itx, dmu_tx_t *tx);
 
+extern void	zil_async_to_sync(zilog_t *zilog, uint64_t oid);
 extern void	zil_commit(zilog_t *zilog, uint64_t oid);
 
 extern int	zil_vdev_offline(const char *osname, void *txarg);

Modified: stable/10/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zil.c
==============================================================================
--- stable/10/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zil.c	Sat Nov 12 23:53:37 2016	(r308595)
+++ stable/10/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zil.c	Sat Nov 12 23:58:07 2016	(r308596)
@@ -93,8 +93,6 @@ SYSCTL_INT(_vfs_zfs_trim, OID_AUTO, enab
 
 static kmem_cache_t *zil_lwb_cache;
 
-static void zil_async_to_sync(zilog_t *zilog, uint64_t foid);
-
 #define	LWB_EMPTY(lwb) ((BP_GET_LSIZE(&lwb->lwb_blk) - \
     sizeof (zil_chain_t)) == (lwb->lwb_sz - lwb->lwb_nused))
 
@@ -1415,7 +1413,7 @@ zil_get_commit_list(zilog_t *zilog)
 /*
  * Move the async itxs for a specified object to commit into sync lists.
  */
-static void
+void
 zil_async_to_sync(zilog_t *zilog, uint64_t foid)
 {
 	uint64_t otxg, txg;

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	Sat Nov 12 23:53:37 2016	(r308595)
+++ stable/10/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zvol.c	Sat Nov 12 23:58:07 2016	(r308596)
@@ -167,6 +167,7 @@ typedef struct zvol_state {
 	uint32_t	zv_open_count[OTYPCNT];	/* open counts */
 #endif
 	uint32_t	zv_total_opens;	/* total open count */
+	uint32_t	zv_sync_cnt;	/* synchronous open count */
 	zilog_t		*zv_zilog;	/* ZIL handle */
 	list_t		zv_extents;	/* List of extents for dump */
 	znode_t		zv_znode;	/* for range locking */
@@ -1416,7 +1417,9 @@ zvol_log_write(zvol_state_t *zv, dmu_tx_
 		BP_ZERO(&lr->lr_blkptr);
 
 		itx->itx_private = zv;
-		itx->itx_sync = sync;
+
+		if (!sync && (zv->zv_sync_cnt == 0))
+			itx->itx_sync = B_FALSE;
 
 		zil_itx_assign(zilog, itx, tx);
 
@@ -2058,7 +2061,7 @@ zvol_log_truncate(zvol_state_t *zv, dmu_
 	lr->lr_offset = off;
 	lr->lr_length = len;
 
-	itx->itx_sync = sync;
+	itx->itx_sync = (sync || zv->zv_sync_cnt != 0);
 	zil_itx_assign(zilog, itx, tx);
 }
 
@@ -3050,6 +3053,11 @@ zvol_d_open(struct cdev *dev, int flags,
 #endif
 
 	zv->zv_total_opens++;
+	if (flags & (FSYNC | FDSYNC)) {
+		zv->zv_sync_cnt++;
+		if (zv->zv_sync_cnt == 1)
+			zil_async_to_sync(zv->zv_zilog, ZVOL_OBJ);
+	}
 	mutex_exit(&zfsdev_state_lock);
 	return (err);
 out:
@@ -3080,6 +3088,8 @@ zvol_d_close(struct cdev *dev, int flags
 	 * You may get multiple opens, but only one close.
 	 */
 	zv->zv_total_opens--;
+	if (flags & (FSYNC | FDSYNC))
+		zv->zv_sync_cnt--;
 
 	if (zv->zv_total_opens == 0)
 		zvol_last_close(zv);



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201611122358.uACNw7Cd087469>