summaryrefslogtreecommitdiff
path: root/fs/gfs2/super.c
diff options
context:
space:
mode:
authorAl Viro <viro@zeniv.linux.org.uk>2023-10-02 05:33:44 +0300
committerAndreas Gruenbacher <agruenba@redhat.com>2023-10-03 17:47:21 +0300
commit0abd1557e21c617bd13fc18f7725fc6363c05913 (patch)
tree4d47d283e3c50982341cfcabe05378aa6577b4d8 /fs/gfs2/super.c
parent4c6a08125f2249531ec01783a5f4317d7342add5 (diff)
downloadlinux-0abd1557e21c617bd13fc18f7725fc6363c05913.tar.xz
gfs2: fix an oops in gfs2_permission
In RCU mode, we might race with gfs2_evict_inode(), which zeroes ->i_gl. Freeing of the object it points to is RCU-delayed, so if we manage to fetch the pointer before it's been replaced with NULL, we are fine. Check if we'd fetched NULL and treat that as "bail out and tell the caller to get out of RCU mode". Signed-off-by: Al Viro <viro@zeniv.linux.org.uk> Signed-off-by: Andreas Gruenbacher <agruenba@redhat.com>
Diffstat (limited to 'fs/gfs2/super.c')
-rw-r--r--fs/gfs2/super.c2
1 files changed, 1 insertions, 1 deletions
diff --git a/fs/gfs2/super.c b/fs/gfs2/super.c
index 3141db77189e..dd2720a5ca62 100644
--- a/fs/gfs2/super.c
+++ b/fs/gfs2/super.c
@@ -1540,7 +1540,7 @@ out:
wait_on_bit_io(&ip->i_flags, GIF_GLOP_PENDING, TASK_UNINTERRUPTIBLE);
gfs2_glock_add_to_lru(ip->i_gl);
gfs2_glock_put_eventually(ip->i_gl);
- ip->i_gl = NULL;
+ rcu_assign_pointer(ip->i_gl, NULL);
}
}