Module Name:    src
Committed By:   hannken
Date:           Tue Feb  5 09:54:36 UTC 2019

Modified Files:
        src/external/cddl/osnet/dist/uts/common/fs/zfs: zfs_ctldir.c
            zfs_ioctl.c zfs_vfsops.c zfs_vnops.c zfs_znode.c
        src/external/cddl/osnet/dist/uts/common/fs/zfs/sys: zfs_ctldir.h
        src/sys/modules/zfs: Makefile.zfsmod
Removed Files:
        src/external/cddl/osnet/sys/kern: zfs_stub.c

Log Message:
Prepare the implementation of the ZFS control directory ".zfs".

- Move the stub routines from zfs_stub.c to zfs_ctldir.c and
  remove now empty file zfs_stub.c

- Add stub routines for zfsctl_loadvnode() to initialize control
  nodes and zfsctl_snapshot() to retrieve ".zfs/snapshot".

- Add an initial vnode operations vector for control nodes.

- Implement lookup into ".zfs" and lookup ".." from ".zfs/snapshot/<snap>".

- Change nodeid of mounted snapshots to the snapshot object id.

- Respect "-u" flag to "zfs rename <snapshot> ...".


To generate a diff of this commit:
cvs rdiff -u -r1.3 -r1.4 \
    src/external/cddl/osnet/dist/uts/common/fs/zfs/zfs_ctldir.c
cvs rdiff -u -r1.15 -r1.16 \
    src/external/cddl/osnet/dist/uts/common/fs/zfs/zfs_ioctl.c
cvs rdiff -u -r1.18 -r1.19 \
    src/external/cddl/osnet/dist/uts/common/fs/zfs/zfs_vfsops.c
cvs rdiff -u -r1.43 -r1.44 \
    src/external/cddl/osnet/dist/uts/common/fs/zfs/zfs_vnops.c
cvs rdiff -u -r1.24 -r1.25 \
    src/external/cddl/osnet/dist/uts/common/fs/zfs/zfs_znode.c
cvs rdiff -u -r1.1.1.3 -r1.2 \
    src/external/cddl/osnet/dist/uts/common/fs/zfs/sys/zfs_ctldir.h
cvs rdiff -u -r1.2 -r0 src/external/cddl/osnet/sys/kern/zfs_stub.c
cvs rdiff -u -r1.8 -r1.9 src/sys/modules/zfs/Makefile.zfsmod

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/external/cddl/osnet/dist/uts/common/fs/zfs/zfs_ctldir.c
diff -u src/external/cddl/osnet/dist/uts/common/fs/zfs/zfs_ctldir.c:1.3 src/external/cddl/osnet/dist/uts/common/fs/zfs/zfs_ctldir.c:1.4
--- src/external/cddl/osnet/dist/uts/common/fs/zfs/zfs_ctldir.c:1.3	Mon May 28 21:05:07 2018
+++ src/external/cddl/osnet/dist/uts/common/fs/zfs/zfs_ctldir.c	Tue Feb  5 09:54:36 2019
@@ -1261,9 +1261,80 @@ zfsctl_umount_snapshots(vfs_t *vfsp, int
 
 #ifdef __NetBSD__
 
+#include <sys/pathname.h>
 #include <sys/zfs_context.h>
 #include <sys/zfs_ctldir.h>
 
+static int (**zfs_sfsop_p)(void *);
+
+static const struct vnodeopv_entry_desc zfs_sfsop_entries[] = {
+	{ &vop_default_desc,		vn_default_error },
+	{ NULL, NULL }
+};
+
+const struct vnodeopv_desc zfs_sfsop_opv_desc =
+	{ &zfs_sfsop_p, zfs_sfsop_entries };
+
+void
+zfsctl_init(void)
+{
+}
+
+void
+zfsctl_fini(void)
+{
+}
+
+int
+zfsctl_loadvnode(vfs_t *vfsp, vnode_t *vp,
+    const void *key, size_t key_len, const void **new_key)
+{
+
+	return EINVAL;
+}
+
+int
+zfsctl_root(zfsvfs_t *zfsvfs, vnode_t **znode)
+{
+
+	return ENOENT;
+}
+
+int
+zfsctl_snapshot(zfsvfs_t *zfsvfs, vnode_t **znode)
+{
+
+	return ENOENT;
+}
+
+void
+zfsctl_create(zfsvfs_t *zfsvfs)
+{
+
+	ASSERT(zfsvfs->z_ctldir == NULL);
+}
+
+void
+zfsctl_destroy(zfsvfs_t *zfsvfs)
+{
+
+	ASSERT(zfsvfs->z_ctldir == NULL);
+}
+
+int
+zfsctl_lookup_objset(vfs_t *vfsp, uint64_t objsetid, zfsvfs_t **zfsvfsp)
+{
+
+	return EINVAL;
+}
+
+int
+zfsctl_umount_snapshots(vfs_t *vfsp, int fflags, cred_t *cr)
+{
+
+	return 0;
+}
+
 boolean_t
 zfsctl_is_node(vnode_t *vp)
 {

Index: src/external/cddl/osnet/dist/uts/common/fs/zfs/zfs_ioctl.c
diff -u src/external/cddl/osnet/dist/uts/common/fs/zfs/zfs_ioctl.c:1.15 src/external/cddl/osnet/dist/uts/common/fs/zfs/zfs_ioctl.c:1.16
--- src/external/cddl/osnet/dist/uts/common/fs/zfs/zfs_ioctl.c:1.15	Sat Jan 12 10:43:33 2019
+++ src/external/cddl/osnet/dist/uts/common/fs/zfs/zfs_ioctl.c	Tue Feb  5 09:54:36 2019
@@ -3881,7 +3881,7 @@ zfs_ioc_rename(zfs_cmd_t *zc)
 	char *at;
 	boolean_t allow_mounted = B_TRUE;
 
-#ifdef __FreeBSD__
+#if defined(__FreeBSD__) || defined(__NetBSD__)
 	allow_mounted = (zc->zc_cookie & 2) != 0;
 #endif
 

Index: src/external/cddl/osnet/dist/uts/common/fs/zfs/zfs_vfsops.c
diff -u src/external/cddl/osnet/dist/uts/common/fs/zfs/zfs_vfsops.c:1.18 src/external/cddl/osnet/dist/uts/common/fs/zfs/zfs_vfsops.c:1.19
--- src/external/cddl/osnet/dist/uts/common/fs/zfs/zfs_vfsops.c:1.18	Tue Jan  1 10:08:01 2019
+++ src/external/cddl/osnet/dist/uts/common/fs/zfs/zfs_vfsops.c	Tue Feb  5 09:54:36 2019
@@ -146,9 +146,11 @@ void zfs_init(void);
 void zfs_fini(void);
 
 extern const struct vnodeopv_desc zfs_vnodeop_opv_desc;
+extern const struct vnodeopv_desc zfs_sfsop_opv_desc;
 
 static const struct vnodeopv_desc * const zfs_vnodeop_descs[] = {
 	&zfs_vnodeop_opv_desc,
+	&zfs_sfsop_opv_desc,
 	NULL,
 };
 
@@ -185,9 +187,11 @@ zfs_sync_selector(void *cl, struct vnode
 	znode_t *zp;
 
 	/*
-	 * Skip the vnode/inode if inaccessible, or if the
+	 * Skip the vnode/inode if inaccessible, is control node or if the
 	 * atime is clean.
 	 */
+	if (zfsctl_is_node(vp))
+		return false;
 	zp = VTOZ(vp);
 	return zp != NULL && vp->v_type != VNON && zp->z_atime_dirty != 0
 	    && !zp->z_unlinked;
@@ -1302,7 +1306,11 @@ zfs_set_fuid_feature(zfsvfs_t *zfsvfs)
 	zfsvfs->z_use_sa = USE_SA(zfsvfs->z_version, zfsvfs->z_os);
 }
 
+#ifdef __NetBSD__
+int
+#else
 static int
+#endif
 zfs_domount(vfs_t *vfsp, char *osname)
 {
 	uint64_t recordsize, fsid_guid;

Index: src/external/cddl/osnet/dist/uts/common/fs/zfs/zfs_vnops.c
diff -u src/external/cddl/osnet/dist/uts/common/fs/zfs/zfs_vnops.c:1.43 src/external/cddl/osnet/dist/uts/common/fs/zfs/zfs_vnops.c:1.44
--- src/external/cddl/osnet/dist/uts/common/fs/zfs/zfs_vnops.c:1.43	Tue Feb  5 09:50:18 2019
+++ src/external/cddl/osnet/dist/uts/common/fs/zfs/zfs_vnops.c	Tue Feb  5 09:54:36 2019
@@ -1929,9 +1929,8 @@ specvp_check(vnode_t **vpp, cred_t *cr)
  */
 /* ARGSUSED */
 static int
-zfs_lookup(vnode_t *dvp, char *nm, vnode_t **vpp, struct pathname *pnp,
-    int flags, vnode_t *rdir, cred_t *cr, caller_context_t *ct,
-    int *direntflags, pathname_t *realpnp)
+zfs_lookup(vnode_t *dvp, char *nm, vnode_t **vpp, int flags,
+    struct componentname *cnp, int nameiop, cred_t *cr)
 {
 	znode_t *zdp = VTOZ(dvp);
 	znode_t *zp;
@@ -2038,6 +2037,29 @@ zfs_lookup(vnode_t *dvp, char *nm, vnode
 		return (EILSEQ);
 	}
 
+	/*
+	 * First handle the special cases.
+	 */
+	if ((cnp->cn_flags & ISDOTDOT) != 0) {
+		/*
+		 * If we are a snapshot mounted under .zfs, return
+		 * the vp for the snapshot directory.
+		 */
+		if (zdp->z_id == zfsvfs->z_root && zfsvfs->z_parent != zfsvfs) {
+			ZFS_EXIT(zfsvfs);
+			error = zfsctl_snapshot(zfsvfs->z_parent, vpp);
+
+			return (error);
+		}
+	}
+	if (zfs_has_ctldir(zdp) && strcmp(nm, ZFS_CTLDIR_NAME) == 0) {
+		ZFS_EXIT(zfsvfs);
+		if ((cnp->cn_flags & ISLASTCN) != 0 && nameiop != LOOKUP)
+			return (SET_ERROR(ENOTSUP));
+		error = zfsctl_root(zfsvfs, vpp);
+		return (error);
+	}
+
 	error = zfs_dirlook(zdp, nm, &zp);
 	if (error == 0) {
 		*vpp = ZTOV(zp);
@@ -3047,11 +3069,22 @@ zfs_getattr(vnode_t *vp, vattr_t *vap, i
 #endif
 #ifdef __FreeBSD__
 	vap->va_fsid = vp->v_mount->mnt_stat.f_fsid.val[0];
+	vap->va_nodeid = zp->z_id;
 #endif
 #ifdef __NetBSD__
 	vap->va_fsid = vp->v_mount->mnt_stat.f_fsidx.__fsid_val[0];
-#endif
 	vap->va_nodeid = zp->z_id;
+	/*
+	 * If we are a snapshot mounted under .zfs, return
+	 * the object id of the snapshot to make getcwd happy.
+	 */
+	if (zp->z_id == zfsvfs->z_root && zfsvfs->z_parent != zfsvfs) {
+		vnode_t *cvp = vp->v_mount->mnt_vnodecovered;
+
+		if (cvp && zfsctl_is_node(cvp))
+			vap->va_nodeid = dmu_objset_id(zfsvfs->z_os);
+	}
+#endif
 	if ((vp->v_flag & VROOT) && zfs_show_ctldir(zp))
 		links = zp->z_links + 1;
 	else
@@ -5139,8 +5172,7 @@ zfs_netbsd_lookup(void *v)
 		nm = short_nm;
 	(void)strlcpy(nm, cnp->cn_nameptr, cnp->cn_namelen + 1);
 
-	error = zfs_lookup(dvp, nm, vpp, NULL, 0, NULL, cnp->cn_cred, NULL,
-	    NULL, NULL);
+	error = zfs_lookup(dvp, nm, vpp, 0, cnp, cnp->cn_nameiop, cnp->cn_cred);
 
 	if (nm != short_nm)
 		PNBUF_PUT(nm);

Index: src/external/cddl/osnet/dist/uts/common/fs/zfs/zfs_znode.c
diff -u src/external/cddl/osnet/dist/uts/common/fs/zfs/zfs_znode.c:1.24 src/external/cddl/osnet/dist/uts/common/fs/zfs/zfs_znode.c:1.25
--- src/external/cddl/osnet/dist/uts/common/fs/zfs/zfs_znode.c:1.24	Tue Jan  1 10:08:01 2019
+++ src/external/cddl/osnet/dist/uts/common/fs/zfs/zfs_znode.c	Tue Feb  5 09:54:36 2019
@@ -54,6 +54,7 @@
 #include <sys/kidmap.h>
 
 #ifdef __NetBSD__
+#include <sys/zfs_ctldir.h>
 #include <miscfs/specfs/specdev.h>
 
 extern int (**zfs_vnodeop_p)(void *);
@@ -835,7 +836,9 @@ zfs_loadvnode(struct mount *mp, struct v
 	sa_handle_t *hdl;
 	znode_t *zp;
 
-	KASSERT(key_len == sizeof(obj_num));
+	if (key_len != sizeof(obj_num))
+		return zfsctl_loadvnode(mp, vp, key, key_len, new_key);
+
 	memcpy(&obj_num, key, key_len);
 
 	zfsvfs = mp->mnt_data;

Index: src/external/cddl/osnet/dist/uts/common/fs/zfs/sys/zfs_ctldir.h
diff -u src/external/cddl/osnet/dist/uts/common/fs/zfs/sys/zfs_ctldir.h:1.1.1.3 src/external/cddl/osnet/dist/uts/common/fs/zfs/sys/zfs_ctldir.h:1.2
--- src/external/cddl/osnet/dist/uts/common/fs/zfs/sys/zfs_ctldir.h:1.1.1.3	Mon May 28 20:53:01 2018
+++ src/external/cddl/osnet/dist/uts/common/fs/zfs/sys/zfs_ctldir.h	Tue Feb  5 09:54:36 2019
@@ -44,7 +44,13 @@ extern "C" {
 
 void zfsctl_create(zfsvfs_t *);
 void zfsctl_destroy(zfsvfs_t *);
+#ifdef __NetBSD__
+int zfsctl_loadvnode(vfs_t *, vnode_t *, const void *, size_t, const void **);
+int zfsctl_root(zfsvfs_t *, vnode_t **);
+int zfsctl_snapshot(zfsvfs_t *, vnode_t **);
+#else
 int zfsctl_root(zfsvfs_t *, int, vnode_t **);
+#endif
 void zfsctl_init(void);
 void zfsctl_fini(void);
 boolean_t zfsctl_is_node(vnode_t *);

Index: src/sys/modules/zfs/Makefile.zfsmod
diff -u src/sys/modules/zfs/Makefile.zfsmod:1.8 src/sys/modules/zfs/Makefile.zfsmod:1.9
--- src/sys/modules/zfs/Makefile.zfsmod:1.8	Sat Aug 18 11:57:57 2018
+++ src/sys/modules/zfs/Makefile.zfsmod	Tue Feb  5 09:54:36 2019
@@ -1,4 +1,4 @@
-#	$NetBSD: Makefile.zfsmod,v 1.8 2018/08/18 11:57:57 christos Exp $
+#	$NetBSD: Makefile.zfsmod,v 1.9 2019/02/05 09:54:36 hannken Exp $
 
 ZFSDIR=	${S}/../external/cddl/osnet
 
@@ -113,10 +113,6 @@ SRCS+=	zrlock.c
 SRCS+=	zvol.c
 SRCS+= 	zfs_acl.c
 
-.PATH: ${ZFSDIR}/sys/kern
-
-SRCS+=	zfs_stub.c
-
 WARNS=		0
 
 CWARNFLAGS+=	-Wall

Reply via email to