Fix zfs_rmnode() unlink / rollback issue

If a has rollback has occurred while a file is open and unlinked.
Then when the file is closed post rollback it will not exist in the
rolled back version of the unlinked object.  Therefore, the call to
zap_remove_int() may correctly return ENOENT and should be allowed.

Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov>
Closes #6812 
Closes #9739
This commit is contained in:
Brian Behlendorf 2020-03-18 11:47:07 -07:00 committed by GitHub
parent 6b7028ec51
commit 5351951274
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 9 additions and 3 deletions

View File

@ -739,9 +739,15 @@ zfs_rmnode(znode_t *zp)
zfs_unlinked_add(xzp, tx);
}
/* Remove this znode from the unlinked set */
VERIFY3U(0, ==,
zap_remove_int(zfsvfs->z_os, zfsvfs->z_unlinkedobj, zp->z_id, tx));
/*
* Remove this znode from the unlinked set. If a has rollback has
* occurred while a file is open and unlinked. Then when the file
* is closed post rollback it will not exist in the rolled back
* version of the unlinked object.
*/
error = zap_remove_int(zfsvfs->z_os, zfsvfs->z_unlinkedobj,
zp->z_id, tx);
VERIFY(error == 0 || error == ENOENT);
dataset_kstats_update_nunlinked_kstat(&zfsvfs->z_kstat, 1);