]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
GFS2: Wait for iopen glock dequeues
authorBob Peterson <rpeterso@redhat.com>
Mon, 7 Dec 2015 21:10:42 +0000 (15:10 -0600)
committerBob Peterson <rpeterso@redhat.com>
Fri, 18 Dec 2015 16:49:22 +0000 (10:49 -0600)
This patch changes every glock_dq for iopen glocks into a dq_wait.
This makes sure that iopen glocks do not outlive the inode itself.
In turn, that ensures that anyone trying to unlink the glock will
be able to find the inode when it receives a remote iopen callback.

Signed-off-by: Bob Peterson <rpeterso@redhat.com>
Acked-by: Steven Whitehouse <swhiteho@redhat.com>
fs/gfs2/inode.c
fs/gfs2/super.c

index a8ce2e99cf5d7ef3ff67ee11398cec209033d4f5..bf2af049359bd0a7674e477f6df46fa86a83d60b 100644 (file)
@@ -191,7 +191,8 @@ struct inode *gfs2_inode_lookup(struct super_block *sb, unsigned int type,
 fail_refresh:
        ip->i_iopen_gh.gh_flags |= GL_NOCACHE;
        ip->i_iopen_gh.gh_gl->gl_object = NULL;
-       gfs2_glock_dq_uninit(&ip->i_iopen_gh);
+       gfs2_glock_dq_wait(&ip->i_iopen_gh);
+       gfs2_holder_uninit(&ip->i_iopen_gh);
 fail_iopen:
        if (io_gl)
                gfs2_glock_put(io_gl);
index 1e7da3886254ad2b1142f756e25af029e2c1d1a2..4f0708f7bf6c7af525340c4c0d5d4cd7788a1017 100644 (file)
@@ -1533,7 +1533,8 @@ static void gfs2_evict_inode(struct inode *inode)
        error = gfs2_glock_nq_init(ip->i_gl, LM_ST_EXCLUSIVE, GL_SKIP, &gh);
        if (unlikely(error)) {
                ip->i_iopen_gh.gh_flags |= GL_NOCACHE;
-               gfs2_glock_dq_uninit(&ip->i_iopen_gh);
+               gfs2_glock_dq_wait(&ip->i_iopen_gh);
+               gfs2_holder_uninit(&ip->i_iopen_gh);
                goto out;
        }
 
@@ -1605,7 +1606,7 @@ static void gfs2_evict_inode(struct inode *inode)
 
        if (test_bit(HIF_HOLDER, &ip->i_iopen_gh.gh_iflags)) {
                ip->i_iopen_gh.gh_flags |= GL_NOCACHE;
-               gfs2_glock_dq(&ip->i_iopen_gh);
+               gfs2_glock_dq_wait(&ip->i_iopen_gh);
        }
        gfs2_holder_uninit(&ip->i_iopen_gh);
        gfs2_glock_dq_uninit(&gh);
@@ -1626,7 +1627,8 @@ static void gfs2_evict_inode(struct inode *inode)
        if (ip->i_iopen_gh.gh_gl) {
                ip->i_iopen_gh.gh_gl->gl_object = NULL;
                ip->i_iopen_gh.gh_flags |= GL_NOCACHE;
-               gfs2_glock_dq_uninit(&ip->i_iopen_gh);
+               gfs2_glock_dq_wait(&ip->i_iopen_gh);
+               gfs2_holder_uninit(&ip->i_iopen_gh);
        }
 }