svn commit: r230252 - head/sys/fs/tmpfs

Mikolaj Golub trociny at freebsd.org
Mon Jan 23 21:05:49 UTC 2012


On Mon, 23 Jan 2012 17:34:57 +0200 Jaakko Heinonen wrote:

 JH> On 2012-01-22, Mikolaj Golub wrote:
 >> Also, may be we should allow remounting ro (and may be some othe options) for
 >> tmpfs?

 JH> Yes, the patch below does that. I suspect that flipping the MNT_RDONLY
 JH> flag may be enough for tmpfs but I am not sure.

I see two issues with this patch:

1) 'mount -u -o rw /mnt' does not upgrade to rw, although it returns success.

2) if you have a file open for write, after remounting ro you still can write
to the file. The expected behaviour: remount fails with EBUSY if force option
is not specified; after remounting with force writing to the fail fails with EIO.

I think when remounting ro you should call vflush(), something like below:

	flags = WRITECLOSE;
	if (mp->mnt_flag & MNT_FORCE)
		flags |= FORCECLOSE;
	error = vflush(mp, 0, flags, curthread);
	if (error != 0)
		return (error);
	MNT_ILOCK(mp);
	mp->mnt_flag |= MNT_RDONLY;
	MNT_IUNLOCK(mp);

and when upgrading to rw reset MNT_RDONLY flag:

	MNT_ILOCK(mp);
	mp->mnt_flag &= ~MNT_RDONLY;
	MNT_IUNLOCK(mp);

I have no idea if something else is needed for tmpfs.

 >>  JH> %%%
 >>  JH> Index: sys/fs/tmpfs/tmpfs_vfsops.c
 >>  JH> ===================================================================
 >>  JH> --- sys/fs/tmpfs/tmpfs_vfsops.c        (revision 230328)
 >>  JH> +++ sys/fs/tmpfs/tmpfs_vfsops.c        (working copy)
 >>  JH> @@ -82,6 +82,10 @@ static const char *tmpfs_opts[] = {
 >>  JH>          NULL
 >>  JH>  };
 >>  JH>  
 >>  JH> +static const char *tmpfs_updateopts[] = {
 >>  JH> +        "from", "export", NULL
 >>  JH> +};
 >>  JH> +
 >>  JH>  /* --------------------------------------------------------------------- */
 >>  JH>  
 >>  JH>  static int
 >>  JH> @@ -150,12 +154,10 @@ tmpfs_mount(struct mount *mp)
 >>  JH>                  return (EINVAL);
 >>  JH>  
 >>  JH>          if (mp->mnt_flag & MNT_UPDATE) {
 >>  JH> -                /*
 >>  JH> -                 * Only support update mounts for NFS export.
 >>  JH> -                 */
 >>  JH> -                if (vfs_flagopt(mp->mnt_optnew, "export", NULL, 0))
 >>  JH> -                        return (0);
 >>  JH> -                return (EOPNOTSUPP);
 >>  JH> +                /* Only support update mounts for certain options. */
 >>  JH> +                if (vfs_filteropt(mp->mnt_optnew, tmpfs_updateopts) != 0)
 >>  JH> +                        return (EOPNOTSUPP);
 >>  JH> +                return (0);
 >>  JH>          }
 >>  JH>  
 >>  JH>          vn_lock(mp->mnt_vnodecovered, LK_SHARED | LK_RETRY);
 >>  JH> %%%

 JH> -- 
 JH> Jaakko

-- 
Mikolaj Golub


More information about the svn-src-all mailing list