zfs_vget, zfs_fhtovp: properly handle the z_shares_dir object
A special gfs vnode corresponds to that object. A regular zfs vnode must not be returned. This should be upstreamed. Reported by: pluknet Submitted by: rmacklem Tested by: pluknet MFC after: 10 days
This commit is contained in:
parent
e2bb19dce5
commit
0dcab786b8
@ -2009,7 +2009,8 @@ zfs_vget(vfs_t *vfsp, ino_t ino, int flags, vnode_t **vpp)
|
||||
* .zfs/snapshot/ directories, that's why we return EOPNOTSUPP.
|
||||
* This will make NFS to switch to LOOKUP instead of using VGET.
|
||||
*/
|
||||
if (ino == ZFSCTL_INO_ROOT || ino == ZFSCTL_INO_SNAPDIR)
|
||||
if (ino == ZFSCTL_INO_ROOT || ino == ZFSCTL_INO_SNAPDIR ||
|
||||
(zfsvfs->z_shares_dir != 0 && ino == zfsvfs->z_shares_dir))
|
||||
return (EOPNOTSUPP);
|
||||
|
||||
ZFS_ENTER(zfsvfs);
|
||||
@ -2101,14 +2102,22 @@ zfs_fhtovp(vfs_t *vfsp, fid_t *fidp, int flags, vnode_t **vpp)
|
||||
return (EINVAL);
|
||||
}
|
||||
|
||||
/* A zero fid_gen means we are in the .zfs control directories */
|
||||
if (fid_gen == 0 &&
|
||||
(object == ZFSCTL_INO_ROOT || object == ZFSCTL_INO_SNAPDIR)) {
|
||||
/*
|
||||
* A zero fid_gen means we are in .zfs or the .zfs/snapshot
|
||||
* directory tree. If the object == zfsvfs->z_shares_dir, then
|
||||
* we are in the .zfs/shares directory tree.
|
||||
*/
|
||||
if ((fid_gen == 0 &&
|
||||
(object == ZFSCTL_INO_ROOT || object == ZFSCTL_INO_SNAPDIR)) ||
|
||||
(zfsvfs->z_shares_dir != 0 && object == zfsvfs->z_shares_dir)) {
|
||||
*vpp = zfsvfs->z_ctldir;
|
||||
ASSERT(*vpp != NULL);
|
||||
if (object == ZFSCTL_INO_SNAPDIR) {
|
||||
VERIFY(zfsctl_root_lookup(*vpp, "snapshot", vpp, NULL,
|
||||
0, NULL, NULL, NULL, NULL, NULL) == 0);
|
||||
} else if (object == zfsvfs->z_shares_dir) {
|
||||
VERIFY(zfsctl_root_lookup(*vpp, "shares", vpp, NULL,
|
||||
0, NULL, NULL, NULL, NULL, NULL) == 0);
|
||||
} else {
|
||||
VN_HOLD(*vpp);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user