Module Name:    src
Committed By:   pooka
Date:           Thu Jan 13 07:27:36 UTC 2011

Modified Files:
        src/sys/rump/librump/rumpvfs: rumpfs.c

Log Message:
support MNT_RDONLY


To generate a diff of this commit:
cvs rdiff -u -r1.86 -r1.87 src/sys/rump/librump/rumpvfs/rumpfs.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/rump/librump/rumpvfs/rumpfs.c
diff -u src/sys/rump/librump/rumpvfs/rumpfs.c:1.86 src/sys/rump/librump/rumpvfs/rumpfs.c:1.87
--- src/sys/rump/librump/rumpvfs/rumpfs.c:1.86	Wed Jan 12 21:08:55 2011
+++ src/sys/rump/librump/rumpvfs/rumpfs.c	Thu Jan 13 07:27:35 2011
@@ -1,4 +1,4 @@
-/*	$NetBSD: rumpfs.c,v 1.86 2011/01/12 21:08:55 pooka Exp $	*/
+/*	$NetBSD: rumpfs.c,v 1.87 2011/01/13 07:27:35 pooka Exp $	*/
 
 /*
  * Copyright (c) 2009, 2010 Antti Kantee.  All Rights Reserved.
@@ -26,7 +26,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: rumpfs.c,v 1.86 2011/01/12 21:08:55 pooka Exp $");
+__KERNEL_RCSID(0, "$NetBSD: rumpfs.c,v 1.87 2011/01/13 07:27:35 pooka Exp $");
 
 #include <sys/param.h>
 #include <sys/atomic.h>
@@ -83,6 +83,7 @@
 static int rump_vop_bmap(void *);
 static int rump_vop_strategy(void *);
 static int rump_vop_advlock(void *);
+static int rump_vop_access(void *);
 
 int (**fifo_vnodeop_p)(void *);
 const struct vnodeopv_entry_desc fifo_vnodeop_entries[] = {
@@ -105,7 +106,7 @@
 	{ &vop_create_desc, rump_vop_create },
 	{ &vop_symlink_desc, rump_vop_symlink },
 	{ &vop_readlink_desc, rump_vop_readlink },
-	{ &vop_access_desc, rump_vop_success },
+	{ &vop_access_desc, rump_vop_access },
 	{ &vop_readdir_desc, rump_vop_readdir },
 	{ &vop_read_desc, rump_vop_read },
 	{ &vop_write_desc, rump_vop_write },
@@ -647,6 +648,11 @@
 
 	*vpp = NULL;
 
+	if ((cnp->cn_flags & ISLASTCN)
+	    && (dvp->v_mount->mnt_flag & MNT_RDONLY)
+	    && (cnp->cn_nameiop == DELETE || cnp->cn_nameiop == RENAME))
+		return EROFS;
+
 	/* check for dot, return directly if the case */
 	if (cnp->cn_namelen == 1 && cnp->cn_nameptr[0] == '.') {
 		vref(dvp);
@@ -728,6 +734,8 @@
 		return ENOENT;
 
 	if (!rd && (cnp->cn_flags & ISLASTCN) && cnp->cn_nameiop == CREATE) {
+		if (dvp->v_mount->mnt_flag & MNT_RDONLY)
+			return EROFS;
 		return EJUSTRETURN;
 	}
 
@@ -761,6 +769,34 @@
 	return rv;
 }
 
+int
+rump_vop_access(void *v)
+{
+	struct vop_access_args /* {
+		const struct vnodeop_desc *a_desc;
+		struct vnode *a_vp;
+		int a_mode;
+		kauth_cred_t a_cred;
+	} */ *ap = v;
+	struct vnode *vp = ap->a_vp;
+	int mode = ap->a_mode;
+
+	if (mode & VWRITE) {
+		switch (vp->v_type) {
+		case VDIR:
+		case VLNK:
+		case VREG:
+			if ((vp->v_mount->mnt_flag & MNT_RDONLY))
+				return EROFS;
+			break;
+		default:
+			break;
+		}
+	}
+
+	return 0;
+}
+
 static int
 rump_vop_getattr(void *v)
 {
@@ -1558,7 +1594,7 @@
 	mp->mnt_stat.f_namemax = MAXNAMLEN;
 	mp->mnt_stat.f_iosize = 512;
 	mp->mnt_flag |= MNT_LOCAL;
-	mp->mnt_iflag |= IMNT_MPSAFE;
+	mp->mnt_iflag |= IMNT_MPSAFE | IMNT_CAN_RWTORO;
 	mp->mnt_fs_bshift = DEV_BSHIFT;
 	vfs_getnewfsid(mp);
 
@@ -1570,9 +1606,8 @@
 {
 	int error;
 
-	if (mp->mnt_flag & MNT_RDONLY) {
-		printf("rumpfs does not support r/o mounts\n");
-		return EOPNOTSUPP;
+	if (mp->mnt_flag & MNT_UPDATE) {
+		return 0;
 	}
 
 	error = set_statvfs_info(mntpath, UIO_USERSPACE, "rumpfs", UIO_SYSSPACE,

Reply via email to