Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 10 Nov 2012 19:32:17 +0000 (UTC)
From:      Attilio Rao <attilio@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r242875 - head/sys/fs/fuse
Message-ID:  <201211101932.qAAJWHeY092962@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: attilio
Date: Sat Nov 10 19:32:16 2012
New Revision: 242875
URL: http://svnweb.freebsd.org/changeset/base/242875

Log:
  - Protect mnt_data and mnt_flags under the mount interlock
  - Move mp->mnt_stat manipulation where all of them happens
  
  Reported by:	davide
  Discussed with:	kib
  Tested by:	flo
  MFC after:	2 months
  X-MFC:		241519, 242536,242616, 242727

Modified:
  head/sys/fs/fuse/fuse_vfsops.c

Modified: head/sys/fs/fuse/fuse_vfsops.c
==============================================================================
--- head/sys/fs/fuse/fuse_vfsops.c	Sat Nov 10 16:08:21 2012	(r242874)
+++ head/sys/fs/fuse/fuse_vfsops.c	Sat Nov 10 19:32:16 2012	(r242875)
@@ -234,8 +234,10 @@ fuse_vfsop_mount(struct mount *mp)
 	if (mp->mnt_flag & MNT_UPDATE)
 		return EOPNOTSUPP;
 
+	MNT_ILOCK(mp);
 	mp->mnt_flag |= MNT_SYNCHRONOUS;
 	mp->mnt_data = NULL;
+	MNT_IUNLOCK(mp);
 	/* Get the new options passed to mount */
 	opts = mp->mnt_optnew;
 
@@ -323,22 +325,20 @@ fuse_vfsop_mount(struct mount *mp)
 		FUSE_UNLOCK();
 		goto out;
 	}
-	/* We need this here as this slot is used by getnewvnode() */
-	mp->mnt_stat.f_iosize = PAGE_SIZE;
-	mp->mnt_data = data;
 	data->ref++;
 	data->mp = mp;
 	data->dataflags |= mntopts;
 	data->max_read = max_read;
 	data->daemon_timeout = daemon_timeout;
-#ifdef XXXIP
-	if (!priv_check(td, PRIV_VFS_FUSE_SYNC_UNMOUNT))
-		data->dataflags |= FSESS_CAN_SYNC_UNMOUNT;
-#endif
 	FUSE_UNLOCK();
 
 	vfs_getnewfsid(mp);
+	MNT_ILOCK(mp);
+	mp->mnt_data = data;
 	mp->mnt_flag |= MNT_LOCAL;
+	MNT_IUNLOCK(mp);
+	/* We need this here as this slot is used by getnewvnode() */
+	mp->mnt_stat.f_iosize = PAGE_SIZE;
 	if (subtype) {
 		strlcat(mp->mnt_stat.f_fstypename, ".", MFSNAMELEN);
 		strlcat(mp->mnt_stat.f_fstypename, subtype, MFSNAMELEN);



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