gfs2: Prevent inode creation race
authorAndreas Gruenbacher <agruenba@redhat.com>
Tue, 19 Nov 2024 11:15:26 +0000 (12:15 +0100)
committerAndreas Gruenbacher <agruenba@redhat.com>
Tue, 19 Nov 2024 12:05:41 +0000 (13:05 +0100)
When a request to evict an inode comes in over the network, we are
trying to grab an inode reference via the iopen glock's gl_object
pointer.  There is a very small probability that by the time such a
request comes in, inode creation hasn't completed and the I_NEW flag is
still set.  To deal with that, wait for the inode and then check if
inode creation was successful.

Signed-off-by: Andreas Gruenbacher <agruenba@redhat.com>
fs/gfs2/glock.c

index 46a6e97..8db92a3 100644 (file)
@@ -982,6 +982,13 @@ static void gfs2_try_evict(struct gfs2_glock *gl)
        if (ip && !igrab(&ip->i_inode))
                ip = NULL;
        spin_unlock(&gl->gl_lockref.lock);
+       if (ip) {
+               wait_on_inode(&ip->i_inode);
+               if (is_bad_inode(&ip->i_inode)) {
+                       iput(&ip->i_inode);
+                       ip = NULL;
+               }
+       }
        if (ip) {
                set_bit(GIF_DEFER_DELETE, &ip->i_flags);
                d_prune_aliases(&ip->i_inode);