Skip to content

Commit

Permalink
Check for unlinked znodes after igrab()
Browse files Browse the repository at this point in the history
The changes in commit 41e1aa2 / PR #9583 introduced a regression on
tmpfile_001_pos: fsetxattr() on a O_TMPFILE file descriptor started
to fail with errno ENODATA:

    openat(AT_FDCWD, "/test", O_RDWR|O_TMPFILE, 0666) = 3
    <...>
    fsetxattr(3, "user.test", <...>, 64, 0) = -1 ENODATA

The originally proposed change on PR #9583 is not susceptible to it,
so just move the code/if-checks around back in that way, to fix it.

Reviewed-by: Pavel Snajdr <[email protected]>
Reviewed-by: Brian Behlendorf <[email protected]>
Original-patch-by: Heitor Alves de Siqueira <[email protected]>
Signed-off-by: Mauricio Faria de Oliveira <[email protected]>
Closes #9602
  • Loading branch information
mfoliveira authored and behlendorf committed Nov 21, 2019
1 parent da92d5c commit 0c46813
Showing 1 changed file with 7 additions and 5 deletions.
12 changes: 7 additions & 5 deletions module/os/linux/zfs/zfs_znode.c
Original file line number Diff line number Diff line change
Expand Up @@ -1094,7 +1094,8 @@ zfs_zget(zfsvfs_t *zfsvfs, uint64_t obj_num, znode_t **zpp)
ASSERT3U(zp->z_id, ==, obj_num);
/*
* If zp->z_unlinked is set, the znode is already marked
* for deletion and should not be discovered.
* for deletion and should not be discovered. Check this
* after checking igrab() due to fsetxattr() & O_TMPFILE.
*
* If igrab() returns NULL the VFS has independently
* determined the inode should be evicted and has
Expand All @@ -1109,10 +1110,11 @@ zfs_zget(zfsvfs_t *zfsvfs, uint64_t obj_num, znode_t **zpp)
* need to detect the active SA hold thereby informing
* the VFS that this inode should not be evicted.
*/
if (zp->z_unlinked) {
err = SET_ERROR(ENOENT);
} else if (igrab(ZTOI(zp)) == NULL) {
err = SET_ERROR(EAGAIN);
if (igrab(ZTOI(zp)) == NULL) {
if (zp->z_unlinked)
err = SET_ERROR(ENOENT);
else
err = SET_ERROR(EAGAIN);
} else {
*zpp = zp;
err = 0;
Expand Down

0 comments on commit 0c46813

Please sign in to comment.