Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 16 Apr 2012 18:07:43 +0000 (UTC)
From:      Jaakko Heinonen <jh@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r234346 - head/sys/fs/tmpfs
Message-ID:  <201204161807.q3GI7hCc044407@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: jh
Date: Mon Apr 16 18:07:42 2012
New Revision: 234346
URL: http://svn.freebsd.org/changeset/base/234346

Log:
  tmpfs: Allow update mounts only for certain options.
  
  Since r230208 update mounts were allowed if the list of mount options
  contained the "export" option. This is not correct as tmpfs doesn't
  really support updating all options.
  
  Reviewed by:	kevlo, trociny

Modified:
  head/sys/fs/tmpfs/tmpfs.h
  head/sys/fs/tmpfs/tmpfs_vfsops.c

Modified: head/sys/fs/tmpfs/tmpfs.h
==============================================================================
--- head/sys/fs/tmpfs/tmpfs.h	Mon Apr 16 17:30:19 2012	(r234345)
+++ head/sys/fs/tmpfs/tmpfs.h	Mon Apr 16 18:07:42 2012	(r234346)
@@ -387,6 +387,9 @@ struct tmpfs_mount {
 	 * tmpfs_pool.c. */
 	uma_zone_t		tm_dirent_pool;
 	uma_zone_t		tm_node_pool;
+
+	/* Read-only status. */
+	int			tm_ronly;
 };
 #define TMPFS_LOCK(tm) mtx_lock(&(tm)->allnode_lock)
 #define TMPFS_UNLOCK(tm) mtx_unlock(&(tm)->allnode_lock)

Modified: head/sys/fs/tmpfs/tmpfs_vfsops.c
==============================================================================
--- head/sys/fs/tmpfs/tmpfs_vfsops.c	Mon Apr 16 17:30:19 2012	(r234345)
+++ head/sys/fs/tmpfs/tmpfs_vfsops.c	Mon Apr 16 18:07:42 2012	(r234346)
@@ -82,6 +82,10 @@ static const char *tmpfs_opts[] = {
 	NULL
 };
 
+static const char *tmpfs_updateopts[] = {
+	"from", "export", NULL
+};
+
 /* --------------------------------------------------------------------- */
 
 static int
@@ -150,12 +154,13 @@ tmpfs_mount(struct mount *mp)
 		return (EINVAL);
 
 	if (mp->mnt_flag & MNT_UPDATE) {
-		/*
-		 * Only support update mounts for NFS export.
-		 */
-		if (vfs_flagopt(mp->mnt_optnew, "export", NULL, 0))
-			return (0);
-		return (EOPNOTSUPP);
+		/* Only support update mounts for certain options. */
+		if (vfs_filteropt(mp->mnt_optnew, tmpfs_updateopts) != 0)
+			return (EOPNOTSUPP);
+		if (vfs_flagopt(mp->mnt_optnew, "ro", NULL, 0) !=
+		    ((struct tmpfs_mount *)mp->mnt_data)->tm_ronly)
+			return (EOPNOTSUPP);
+		return (0);
 	}
 
 	vn_lock(mp->mnt_vnodecovered, LK_SHARED | LK_RETRY);
@@ -228,6 +233,7 @@ tmpfs_mount(struct mount *mp)
 	    tmpfs_node_ctor, tmpfs_node_dtor,
 	    tmpfs_node_init, tmpfs_node_fini,
 	    UMA_ALIGN_PTR, 0);
+	tmp->tm_ronly = (mp->mnt_flag & MNT_RDONLY) != 0;
 
 	/* Allocate the root node. */
 	error = tmpfs_alloc_node(tmp, VDIR, root_uid,



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