Commit ffd1cf04 authored by Andreas Gruenbacher's avatar Andreas Gruenbacher
Browse files

gfs2: Prevent inode creation race



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: default avatarAndreas Gruenbacher <agruenba@redhat.com>
parent c5b7a240
Loading
Loading
Loading
Loading
+7 −0
Original line number Diff line number Diff line
@@ -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);