Module Name: src Committed By: haad Date: Tue Dec 14 01:28:18 UTC 2010
Modified Files: src/external/cddl/osnet/dist/uts/common/fs: gfs.c src/external/cddl/osnet/dist/uts/common/fs/zfs: zfs_ctldir.c Log Message: Add NetBSD version of zfs snapshot management code. IT needs testing it was only compile tested for now, but I would like to have some code in to be sure that it will not be lost. To generate a diff of this commit: cvs rdiff -u -r1.1.1.1 -r1.2 src/external/cddl/osnet/dist/uts/common/fs/gfs.c cvs rdiff -u -r1.1.1.2 -r1.2 \ src/external/cddl/osnet/dist/uts/common/fs/zfs/zfs_ctldir.c 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/gfs.c diff -u src/external/cddl/osnet/dist/uts/common/fs/gfs.c:1.1.1.1 src/external/cddl/osnet/dist/uts/common/fs/gfs.c:1.2 --- src/external/cddl/osnet/dist/uts/common/fs/gfs.c:1.1.1.1 Fri Aug 7 18:32:48 2009 +++ src/external/cddl/osnet/dist/uts/common/fs/gfs.c Tue Dec 14 01:28:18 2010 @@ -121,6 +121,7 @@ * both the caller and the vnode type provider need to access gfsv_ops * and gfsv_template, and the caller also needs to know gfsv_name. */ +#ifdef PORT_SOLARIS int gfs_make_opsvec(gfs_opsvec_t *vec) { @@ -143,6 +144,7 @@ } return (error); } +#endif /* * Low level directory routines @@ -257,15 +259,17 @@ static int gfs_readdir_emit_int(gfs_readdir_state_t *st, uio_t *uiop, offset_t next) { - int reclen; + int reclen, namelen; dirent64_t *dp; edirent_t *edp; if (st->grd_flags & V_RDDIR_ENTFLAGS) { edp = st->grd_dirent; + namelen = strlen(edp->ed_name); reclen = EDIRENT_RECLEN(strlen(edp->ed_name)); } else { dp = st->grd_dirent; + namelen = strlen(dp->d_name); reclen = DIRENT64_RECLEN(strlen(dp->d_name)); } @@ -282,8 +286,9 @@ edp->ed_off = next; edp->ed_reclen = (ushort_t)reclen; } else { - dp->d_off = next; dp->d_reclen = (ushort_t)reclen; + dp->d_type = DT_DIR; + dp->d_namlen = namelen; } if (uiomove((caddr_t)st->grd_dirent, reclen, UIO_READ, uiop)) @@ -458,12 +463,17 @@ { gfs_file_t *fp; vnode_t *vp; + int error; /* * Allocate vnode and internal data structure */ fp = kmem_zalloc(size, KM_SLEEP); - vp = vn_alloc(KM_SLEEP); + /* XXX FreeBSD adds vfs_t * as parameter to gfs_file_create and + gfs_dir_create */ + error = getnewvnode(VT_ZFS, pvp->v_vfsp, ops, &vp); + ASSERT(error == 0); + vn_lock(vp, LK_EXCLUSIVE | LK_RETRY); /* * Set up various pointers @@ -639,6 +649,7 @@ mutex_enter(&fp->gfs_parent->v_lock); } mutex_enter(&vp->v_lock); +#ifdef PORT_SOLARIS if (vp->v_count == 1) { /* * Really remove this vnode @@ -680,6 +691,7 @@ if (dp) gfs_dir_unlock(dp); } +#endif return (data); } @@ -1093,6 +1105,7 @@ * putpage() routines. */ /* ARGSUSED */ +#ifdef PORT_SOLARIS int gfs_vop_map(vnode_t *vp, offset_t off, struct as *as, caddr_t *addrp, size_t len, uchar_t prot, uchar_t maxprot, uint_t flags, cred_t *cred, @@ -1154,7 +1167,7 @@ return (rv); } - +#endif /* * gfs_vop_inactive: VOP_INACTIVE() entry point * 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.1.1.2 src/external/cddl/osnet/dist/uts/common/fs/zfs/zfs_ctldir.c:1.2 --- src/external/cddl/osnet/dist/uts/common/fs/zfs/zfs_ctldir.c:1.1.1.2 Sat Feb 27 22:31:19 2010 +++ src/external/cddl/osnet/dist/uts/common/fs/zfs/zfs_ctldir.c Tue Dec 14 01:28:18 2010 @@ -111,16 +111,13 @@ return (0); } -vnodeops_t *zfsctl_ops_root; -vnodeops_t *zfsctl_ops_snapdir; -vnodeops_t *zfsctl_ops_snapshot; -vnodeops_t *zfsctl_ops_shares; -vnodeops_t *zfsctl_ops_shares_dir; - -static const fs_operation_def_t zfsctl_tops_root[]; -static const fs_operation_def_t zfsctl_tops_snapdir[]; -static const fs_operation_def_t zfsctl_tops_snapshot[]; -static const fs_operation_def_t zfsctl_tops_shares[]; +//vnodeops_t *zfsctl_ops_shares_dir; + +static struct vnodeopv_entry_desc zfsctl_ops_root; +static struct vnodeopv_entry_desc zfsctl_ops_snapdir; +static struct vnodeopv_entry_desc zfsctl_ops_snapshot; +static struct vnodeopv_entry_desc zfsctl_ops_shares; + static vnode_t *zfsctl_mknode_snapdir(vnode_t *); static vnode_t *zfsctl_mknode_shares(vnode_t *); @@ -159,31 +156,11 @@ void zfsctl_init(void) { - VERIFY(gfs_make_opsvec(zfsctl_opsvec) == 0); } void zfsctl_fini(void) { - /* - * Remove vfsctl vnode ops - */ - if (zfsctl_ops_root) - vn_freevnodeops(zfsctl_ops_root); - if (zfsctl_ops_snapdir) - vn_freevnodeops(zfsctl_ops_snapdir); - if (zfsctl_ops_snapshot) - vn_freevnodeops(zfsctl_ops_snapshot); - if (zfsctl_ops_shares) - vn_freevnodeops(zfsctl_ops_shares); - if (zfsctl_ops_shares_dir) - vn_freevnodeops(zfsctl_ops_shares_dir); - - zfsctl_ops_root = NULL; - zfsctl_ops_snapdir = NULL; - zfsctl_ops_snapshot = NULL; - zfsctl_ops_shares = NULL; - zfsctl_ops_shares_dir = NULL; } /* @@ -1123,6 +1100,7 @@ } } +#ifndef __NetBSD__ static const fs_operation_def_t zfsctl_tops_snapdir[] = { { VOPNAME_OPEN, { .vop_open = zfsctl_common_open } }, { VOPNAME_CLOSE, { .vop_close = zfsctl_common_close } }, @@ -1153,7 +1131,7 @@ { VOPNAME_FID, { .vop_fid = zfsctl_shares_fid } }, { NULL } }; - +#endif /* * pvp is the GFS vnode '.zfs/snapshot'. * @@ -1220,7 +1198,7 @@ gfs_vop_inactive(vp, cr, ct); } - +#ifndef __NetBSD__ /* * These VP's should never see the light of day. They should always * be covered. @@ -1229,6 +1207,7 @@ VOPNAME_INACTIVE, { .vop_inactive = zfsctl_snapshot_inactive }, NULL, NULL }; +#endif int zfsctl_lookup_objset(vfs_t *vfsp, uint64_t objsetid, zfsvfs_t **zfsvfsp)