diff options
author | Adam D. Moss <[email protected]> | 2021-03-16 16:33:34 -0700 |
---|---|---|
committer | GitHub <[email protected]> | 2021-03-16 16:33:34 -0700 |
commit | 1daad98176d18a785d116d9666dadc866f631f98 (patch) | |
tree | ad4a4bb806f02a98f3ceb3f6f7ada1639620689e /include | |
parent | 5f9d61d06b5a2df87d8d5733429cf4eba66f0acb (diff) |
Linux: always check or verify return of igrab()
zhold() wraps igrab() on Linux, and igrab() may fail when the inode
is in the process of being deleted. This means zhold() must only be
called when a reference exists and therefore it cannot be deleted.
This is the case for all existing consumers so add a VERIFY and a
comment explaining this requirement.
Reviewed-by: Brian Behlendorf <[email protected]>
Signed-off-by: Adam Moss <[email protected]>
Closes #11704
Diffstat (limited to 'include')
-rw-r--r-- | include/os/linux/zfs/sys/zfs_znode_impl.h | 8 |
1 files changed, 7 insertions, 1 deletions
diff --git a/include/os/linux/zfs/sys/zfs_znode_impl.h b/include/os/linux/zfs/sys/zfs_znode_impl.h index b1b3aec4c..be211c5b5 100644 --- a/include/os/linux/zfs/sys/zfs_znode_impl.h +++ b/include/os/linux/zfs/sys/zfs_znode_impl.h @@ -73,7 +73,13 @@ extern "C" { #define zn_has_cached_data(zp) ((zp)->z_is_mapped) #define zn_rlimit_fsize(zp, uio) (0) -#define zhold(zp) igrab(ZTOI((zp))) +/* + * zhold() wraps igrab() on Linux, and igrab() may fail when the + * inode is in the process of being deleted. As zhold() must only be + * called when a ref already exists - so the inode cannot be + * mid-deletion - we VERIFY() this. + */ +#define zhold(zp) VERIFY3P(igrab(ZTOI((zp))), !=, NULL) #define zrele(zp) iput(ZTOI((zp))) /* Called on entry to each ZFS inode and vfs operation. */ |