summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authordaichi <daichi@FreeBSD.org>2010-09-05 04:58:16 +0000
committerdaichi <daichi@FreeBSD.org>2010-09-05 04:58:16 +0000
commit6f5cfa0928d7e16b144d20cd0f802f09e20eda42 (patch)
tree1e8df9e5003865acc60713eeb5b1164470d04288
parente749c008a468830e24c30a5dd53f107044f2d486 (diff)
downloadFreeBSD-src-6f5cfa0928d7e16b144d20cd0f802f09e20eda42.zip
FreeBSD-src-6f5cfa0928d7e16b144d20cd0f802f09e20eda42.tar.gz
Allowed unionfs to use whiteout not supporting file system as
upper layer. Until now, unionfs prevents to use that kind of file system as upper layer. This time, I changed to allow that kind of file system as upper layer. By this change, you can use whiteout not supporting file system (e.g., especially for tmpfs) as upper layer. It's very useful for combination of tmpfs as upper layer and read only file system as lower layer. By difinition, without whiteout support from the file system backing the upper layer, there is no way that delete and rename operations on lower layer objects can be done. EOPNOTSUPP is returned for this kind of operations as generated by VOP_WHITEOUT() along with any others which would make modifica tions to the lower layer, such as chmod(1). This change is suggested by ed. Submitted by: ed
-rw-r--r--sbin/mount_unionfs/mount_unionfs.87
-rw-r--r--sys/fs/unionfs/union_vfsops.c21
2 files changed, 4 insertions, 24 deletions
diff --git a/sbin/mount_unionfs/mount_unionfs.8 b/sbin/mount_unionfs/mount_unionfs.8
index 4f661b8..d120dd0 100644
--- a/sbin/mount_unionfs/mount_unionfs.8
+++ b/sbin/mount_unionfs/mount_unionfs.8
@@ -363,9 +363,10 @@ their intent to take it over.
Without whiteout support from the file system backing the upper layer,
there is no way that delete and rename operations on lower layer
objects can be done.
-.Er EROFS
-is returned for this kind of operations along with any others
-which would make modifications to the lower layer, such as
+.Er EOPNOTSUPP
+is returned for this kind of operations as generated by VOP_WHITEOUT()
+along with any others which would make modifications to the lower
+layer, such as
.Xr chmod 1 .
.Pp
Running
diff --git a/sys/fs/unionfs/union_vfsops.c b/sys/fs/unionfs/union_vfsops.c
index 604d4a3..e11219c 100644
--- a/sys/fs/unionfs/union_vfsops.c
+++ b/sys/fs/unionfs/union_vfsops.c
@@ -89,7 +89,6 @@ unionfs_domount(struct mount *mp)
u_short ufile;
unionfs_copymode copymode;
unionfs_whitemode whitemode;
- struct componentname fakecn;
struct nameidata nd, *ndp;
struct vattr va;
@@ -280,26 +279,6 @@ unionfs_domount(struct mount *mp)
mp->mnt_flag |= ump->um_uppervp->v_mount->mnt_flag & MNT_RDONLY;
/*
- * Check whiteout
- */
- if ((mp->mnt_flag & MNT_RDONLY) == 0) {
- memset(&fakecn, 0, sizeof(fakecn));
- fakecn.cn_nameiop = LOOKUP;
- fakecn.cn_thread = td;
- error = VOP_WHITEOUT(ump->um_uppervp, &fakecn, LOOKUP);
- if (error) {
- if (below) {
- VOP_UNLOCK(ump->um_uppervp, 0);
- vrele(upperrootvp);
- } else
- vput(ump->um_uppervp);
- free(ump, M_UNIONFSMNT);
- mp->mnt_data = NULL;
- return (error);
- }
- }
-
- /*
* Unlock the node
*/
VOP_UNLOCK(ump->um_uppervp, 0);
OpenPOWER on IntegriCloud