f2fs: correctly fix the parent inode number during fsync()
authorEric Biggers <ebiggers@google.com>
Tue, 5 May 2020 18:41:11 +0000 (11:41 -0700)
committerJaegeuk Kim <jaegeuk@kernel.org>
Tue, 12 May 2020 03:36:46 +0000 (20:36 -0700)
fsync() may be called on a deleted file that's still open.  So when
fsync() tries to set the parent inode number when the inode has
LOST_PINO and i_nlink == 1 (to avoid later checkpoints), it needs to
make sure to get the parent directory via a non-deleted alias.

Also remove the unnecessary igrab() and iput(), as the caller already
holds a reference to the inode.

Signed-off-by: Eric Biggers <ebiggers@google.com>
Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
fs/f2fs/file.c

index 175c661900876af754f1609bae178c880555aa78..81bfc5b44fa136f4151633bdaf2b01c506ec39b3 100644 (file)
@@ -169,9 +169,11 @@ static int get_parent_ino(struct inode *inode, nid_t *pino)
 {
        struct dentry *dentry;
 
-       inode = igrab(inode);
-       dentry = d_find_any_alias(inode);
-       iput(inode);
+       /*
+        * Make sure to get the non-deleted alias.  The alias associated with
+        * the open file descriptor being fsync()'ed may be deleted already.
+        */
+       dentry = d_find_alias(inode);
        if (!dentry)
                return 0;