GFS2: Don't cache iopen glocks
This patch makes GFS2 immediately reclaim/delete all iopen glocks as soon as they're dequeued. This allows deleters to get an EXclusive lock on iopen so files are deleted properly instead of being set as unlinked. Signed-off-by: Bob Peterson <rpeterso@redhat.com> Signed-off-by: Steven Whitehouse <swhiteho@redhat.com>
This commit is contained in:
parent
e8830d8856
commit
a6a4d98b01
|
@ -189,6 +189,7 @@ struct inode *gfs2_inode_lookup(struct super_block *sb, unsigned int type,
|
|||
return inode;
|
||||
|
||||
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);
|
||||
fail_iopen:
|
||||
|
|
|
@ -1444,6 +1444,7 @@ static void gfs2_evict_inode(struct inode *inode)
|
|||
/* Must not read inode block until block type has been verified */
|
||||
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);
|
||||
goto out;
|
||||
}
|
||||
|
@ -1514,8 +1515,10 @@ static void gfs2_evict_inode(struct inode *inode)
|
|||
if (gfs2_rs_active(ip->i_res))
|
||||
gfs2_rs_deltree(ip->i_res);
|
||||
|
||||
if (test_bit(HIF_HOLDER, &ip->i_iopen_gh.gh_iflags))
|
||||
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_holder_uninit(&ip->i_iopen_gh);
|
||||
gfs2_glock_dq_uninit(&gh);
|
||||
if (error && error != GLR_TRYFAILED && error != -EROFS)
|
||||
|
@ -1534,6 +1537,7 @@ static void gfs2_evict_inode(struct inode *inode)
|
|||
ip->i_gl = NULL;
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue