Module Name: src
Committed By: hannken
Date: Fri Jan 27 10:47:54 UTC 2017
Modified Files:
src/sys/fs/tmpfs: tmpfs.h tmpfs_vfsops.c
Log Message:
Run vflush() when going from read/write to read only.
To generate a diff of this commit:
cvs rdiff -u -r1.52 -r1.53 src/sys/fs/tmpfs/tmpfs.h
cvs rdiff -u -r1.68 -r1.69 src/sys/fs/tmpfs/tmpfs_vfsops.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/fs/tmpfs/tmpfs.h
diff -u src/sys/fs/tmpfs/tmpfs.h:1.52 src/sys/fs/tmpfs/tmpfs.h:1.53
--- src/sys/fs/tmpfs/tmpfs.h:1.52 Mon Jul 6 10:07:12 2015
+++ src/sys/fs/tmpfs/tmpfs.h Fri Jan 27 10:47:54 2017
@@ -1,4 +1,4 @@
-/* $NetBSD: tmpfs.h,v 1.52 2015/07/06 10:07:12 hannken Exp $ */
+/* $NetBSD: tmpfs.h,v 1.53 2017/01/27 10:47:54 hannken Exp $ */
/*
* Copyright (c) 2005, 2006, 2007 The NetBSD Foundation, Inc.
@@ -217,6 +217,9 @@ typedef struct tmpfs_mount {
uint64_t tm_bytes_used;
kmutex_t tm_acc_lock;
+ /* Read-only indicator. */
+ bool tm_rdonly;
+
/* Pointer to the root inode. */
tmpfs_node_t * tm_root;
Index: src/sys/fs/tmpfs/tmpfs_vfsops.c
diff -u src/sys/fs/tmpfs/tmpfs_vfsops.c:1.68 src/sys/fs/tmpfs/tmpfs_vfsops.c:1.69
--- src/sys/fs/tmpfs/tmpfs_vfsops.c:1.68 Fri Aug 26 21:44:24 2016
+++ src/sys/fs/tmpfs/tmpfs_vfsops.c Fri Jan 27 10:47:54 2017
@@ -1,4 +1,4 @@
-/* $NetBSD: tmpfs_vfsops.c,v 1.68 2016/08/26 21:44:24 dholland Exp $ */
+/* $NetBSD: tmpfs_vfsops.c,v 1.69 2017/01/27 10:47:54 hannken Exp $ */
/*
* Copyright (c) 2005, 2006, 2007 The NetBSD Foundation, Inc.
@@ -42,7 +42,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: tmpfs_vfsops.c,v 1.68 2016/08/26 21:44:24 dholland Exp $");
+__KERNEL_RCSID(0, "$NetBSD: tmpfs_vfsops.c,v 1.69 2017/01/27 10:47:54 hannken Exp $");
#include <sys/param.h>
#include <sys/atomic.h>
@@ -92,7 +92,7 @@ tmpfs_mount(struct mount *mp, const char
struct vnode *vp;
uint64_t memlimit;
ino_t nodes;
- int error;
+ int error, flags;
bool set_memlimit;
bool set_nodes;
@@ -160,6 +160,20 @@ tmpfs_mount(struct mount *mp, const char
tmp = VFS_TO_TMPFS(mp);
if (set_nodes && nodes < tmp->tm_nodes_cnt)
return EBUSY;
+ if (!tmp->tm_rdonly && (mp->mnt_flag & MNT_RDONLY)) {
+ /* Changing from read/write to read-only. */
+ flags = WRITECLOSE;
+ if ((mp->mnt_flag & MNT_FORCE))
+ flags |= FORCECLOSE;
+ error = vflush(mp, NULL, flags);
+ if (error)
+ return error;
+ tmp->tm_rdonly = true;
+ }
+ if (tmp->tm_rdonly && (mp->mnt_flag & IMNT_WANTRDWR)) {
+ /* Changing from read-only to read/write. */
+ tmp->tm_rdonly = false;
+ }
if (set_memlimit) {
if ((error = tmpfs_mntmem_set(tmp, memlimit)) != 0)
return error;
@@ -178,6 +192,8 @@ tmpfs_mount(struct mount *mp, const char
if (tmp == NULL)
return ENOMEM;
+ if ((mp->mnt_flag & MNT_RDONLY))
+ tmp->tm_rdonly = true;
tmp->tm_nodes_max = nodes;
tmp->tm_nodes_cnt = 0;
LIST_INIT(&tmp->tm_nodes);