svn commit: r329265 - head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs
John Baldwin
jhb at freebsd.org
Thu Feb 15 23:16:31 UTC 2018
On Wednesday, February 14, 2018 03:49:31 PM Alan Somers wrote:
> Author: asomers
> Date: Wed Feb 14 15:49:31 2018
> New Revision: 329265
> URL: https://svnweb.freebsd.org/changeset/base/329265
>
> Log:
> Implement .vop_pathconf and .vop_getacl for the .zfs ctldir
>
> zfsctl_common_pathconf will report all the same variables that regular ZFS
> volumes report. zfsctl_common_getacl will report an ACL equivalent to 555,
> except that you can't read xattrs or edit attributes.
>
> Fixes a bug where "ls .zfs" will occasionally print something like:
> ls: .zfs/.: Operation not supported
>
> PR: 225793
> Reviewed by: avg
> MFC after: 3 weeks
> Sponsored by: Spectra Logic Corp
> Differential Revision: https://reviews.freebsd.org/D14365
>
> Modified:
> head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_ctldir.c
>
> Modified: head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_ctldir.c
> ==============================================================================
> --- head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_ctldir.c Wed Feb 14 15:40:13 2018 (r329264)
> +++ head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_ctldir.c Wed Feb 14 15:49:31 2018 (r329265)
> @@ -80,6 +80,10 @@
>
> #include "zfs_namecheck.h"
>
> +/* Common access mode for all virtual directories under the ctldir */
> +const u_short zfsctl_ctldir_mode = S_IRUSR | S_IXUSR | S_IRGRP | S_IXGRP |
> + S_IROTH | S_IXOTH;
> +
> /*
> * "Synthetic" filesystem implementation.
> */
> @@ -496,8 +500,7 @@ zfsctl_common_getattr(vnode_t *vp, vattr_t *vap)
> vap->va_nblocks = 0;
> vap->va_seq = 0;
> vn_fsid(vp, vap);
> - vap->va_mode = S_IRUSR | S_IXUSR | S_IRGRP | S_IXGRP |
> - S_IROTH | S_IXOTH;
> + vap->va_mode = zfsctl_ctldir_mode;
> vap->va_type = VDIR;
> /*
> * We live in the now (for atime).
> @@ -724,6 +727,87 @@ zfsctl_root_vptocnp(struct vop_vptocnp_args *ap)
> return (0);
> }
>
> +static int
> +zfsctl_common_pathconf(ap)
> + struct vop_pathconf_args /* {
> + struct vnode *a_vp;
> + int a_name;
> + int *a_retval;
> + } */ *ap;
> +{
> + /*
> + * We care about ACL variables so that user land utilities like ls
> + * can display them correctly. Since the ctldir's st_dev is set to be
> + * the same as the parent dataset, we must support all variables that
> + * it supports.
> + */
> + switch (ap->a_name) {
> + case _PC_LINK_MAX:
> + *ap->a_retval = INT_MAX;
> + return (0);
On HEAD this should probably match the existing ZFS pathconf
(min(LONG_MAX, ZFS_LINK_MAX IIRC), though if these directories can only
ever have a link count of 2 (which seems true from zfsctl_common_getattr())
then it would be fine to return '2' here instead. For stable you'd have to
restrict it to LINK_MAX if you don't use '2'.
Also, you should call vfs_stdpathconf() in the default: case.
--
John Baldwin
More information about the svn-src-head
mailing list