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