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