FreeBSD: vfsops: use setgen for error case
Fix from https://github.com/openzfs/zfs/pull/12844#discussion_r774179413 Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Reviewed-by: Alexander Motin <mav@FreeBSD.org> Reviewed-by: Ryan Moeller <ryan@ixsystems.com> Signed-off-by: Ahelenia Ziemiańska <nabijaczleweli@nabijaczleweli.xyz> Closes #12905
This commit is contained in:
parent
1259dc6e6a
commit
36a91d6cef
|
@ -1801,6 +1801,7 @@ zfs_fhtovp(vfs_t *vfsp, fid_t *fidp, int flags, vnode_t **vpp)
|
||||||
vnode_t *dvp;
|
vnode_t *dvp;
|
||||||
uint64_t object = 0;
|
uint64_t object = 0;
|
||||||
uint64_t fid_gen = 0;
|
uint64_t fid_gen = 0;
|
||||||
|
uint64_t setgen = 0;
|
||||||
uint64_t gen_mask;
|
uint64_t gen_mask;
|
||||||
uint64_t zp_gen;
|
uint64_t zp_gen;
|
||||||
int i, err;
|
int i, err;
|
||||||
|
@ -1816,7 +1817,6 @@ zfs_fhtovp(vfs_t *vfsp, fid_t *fidp, int flags, vnode_t **vpp)
|
||||||
if (zfsvfs->z_parent == zfsvfs && fidp->fid_len == LONG_FID_LEN) {
|
if (zfsvfs->z_parent == zfsvfs && fidp->fid_len == LONG_FID_LEN) {
|
||||||
zfid_long_t *zlfid = (zfid_long_t *)fidp;
|
zfid_long_t *zlfid = (zfid_long_t *)fidp;
|
||||||
uint64_t objsetid = 0;
|
uint64_t objsetid = 0;
|
||||||
uint64_t setgen = 0;
|
|
||||||
|
|
||||||
for (i = 0; i < sizeof (zlfid->zf_setid); i++)
|
for (i = 0; i < sizeof (zlfid->zf_setid); i++)
|
||||||
objsetid |= ((uint64_t)zlfid->zf_setid[i]) << (8 * i);
|
objsetid |= ((uint64_t)zlfid->zf_setid[i]) << (8 * i);
|
||||||
|
@ -1845,6 +1845,12 @@ zfs_fhtovp(vfs_t *vfsp, fid_t *fidp, int flags, vnode_t **vpp)
|
||||||
return (SET_ERROR(EINVAL));
|
return (SET_ERROR(EINVAL));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (fidp->fid_len == LONG_FID_LEN && (fid_gen > 1 || setgen != 0)) {
|
||||||
|
dprintf("snapdir fid: fid_gen (%llu) and setgen (%llu)\n",
|
||||||
|
(u_longlong_t)fid_gen, (u_longlong_t)setgen);
|
||||||
|
return (SET_ERROR(EINVAL));
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* A zero fid_gen means we are in .zfs or the .zfs/snapshot
|
* A zero fid_gen means we are in .zfs or the .zfs/snapshot
|
||||||
* directory tree. If the object == zfsvfs->z_shares_dir, then
|
* directory tree. If the object == zfsvfs->z_shares_dir, then
|
||||||
|
|
Loading…
Reference in New Issue