OSDN Git Service

gfs2: gl_object races fix
authorAndreas Gruenbacher <agruenba@redhat.com>
Mon, 23 Jan 2023 17:58:27 +0000 (18:58 +0100)
committerAndreas Gruenbacher <agruenba@redhat.com>
Fri, 27 Jan 2023 14:55:48 +0000 (15:55 +0100)
commit9ffa18884cceb2e5731e422140fad06292de0577
tree46a9312352bb91d1f8f6d41da5be6e7b456f2057
parent63510d9f2f6e6337960499a3d72d5a457b19c287
gfs2: gl_object races fix

Function glock_clear_object() checks if the specified glock is still
pointing at the right object and clears the gl_object pointer.  To
handle the case of incompletely constructed inodes, glock_clear_object()
also allows gl_object to be NULL.

However, in the teardown case, when iget_failed() is called and the
inode is removed from the inode hash, by the time we get to the
glock_clear_object() calls in gfs2_put_super() and its helpers, we don't
have exclusion against concurrent gfs2_inode_lookup() and
gfs2_create_inode() calls, and the inode and iopen glocks may already be
pointing at another inode, so the checks in glock_clear_object() are
incorrect.

To better handle this case, always completely disassociate an inode from
its glocks before tearing it down.  In addition, get rid of a duplicate
glock_clear_object() call in gfs2_evict_inode().  That way,
glock_clear_object() will only ever be called when the glock points at
the current inode, and the NULL check in glock_clear_object() can be
removed.

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