zfs: provide a special vptocnp method for the .zfs vnode
vop_stdvptocnp() doesn't work properly if .zfs directory is hidden. Reported by: swills, des Tested by: des MFC after: 1 week MFC with: r314048
This commit is contained in:
parent
28ef18b8c1
commit
520758a51d
@ -706,6 +706,28 @@ zfsctl_root_readdir(ap)
|
||||
return (0);
|
||||
}
|
||||
|
||||
static int
|
||||
zfsctl_root_vptocnp(struct vop_vptocnp_args *ap)
|
||||
{
|
||||
static const char dotzfs_name[4] = ".zfs";
|
||||
vnode_t *dvp;
|
||||
int error;
|
||||
|
||||
if (*ap->a_buflen < sizeof (dotzfs_name))
|
||||
return (SET_ERROR(ENOMEM));
|
||||
|
||||
error = vn_vget_ino_gen(ap->a_vp, zfsctl_fs_root_vnode, NULL,
|
||||
LK_SHARED, &dvp);
|
||||
if (error != 0)
|
||||
return (SET_ERROR(error));
|
||||
|
||||
VOP_UNLOCK(dvp, 0);
|
||||
*ap->a_vpp = dvp;
|
||||
*ap->a_buflen -= sizeof (dotzfs_name);
|
||||
bcopy(dotzfs_name, ap->a_buf + *ap->a_buflen, sizeof (dotzfs_name));
|
||||
return (0);
|
||||
}
|
||||
|
||||
static struct vop_vector zfsctl_ops_root = {
|
||||
.vop_default = &default_vnodeops,
|
||||
.vop_open = zfsctl_common_open,
|
||||
@ -719,6 +741,7 @@ static struct vop_vector zfsctl_ops_root = {
|
||||
.vop_reclaim = zfsctl_common_reclaim,
|
||||
.vop_fid = zfsctl_common_fid,
|
||||
.vop_print = zfsctl_common_print,
|
||||
.vop_vptocnp = zfsctl_root_vptocnp,
|
||||
};
|
||||
|
||||
static int
|
||||
|
Loading…
Reference in New Issue
Block a user