GFS2: Don't cache iopen glocks
PATCH 1/1 GFS2: Don't cache iopen glocks
In reply to a message not in the archiveHi,
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.
Regards,
Bob Peterson
Red Hat File Systems
Signed-off-by Bob Peterson <[email protected]>
---
fs/gfs2/inode.c +1 -0
@@ -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:
fs/gfs2/super.c +5 -1
@@ -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 @@ out_unlock: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 @@ out: 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); } }
PATCH 1/1 GFS2: Don't cache iopen glocks
Hi,
Now in the -nmw git tree. Thanks,
Steve.
Quoted 59 lines · Bob Peterson
Hi,
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.
Regards,
Bob Peterson
Red Hat File SystemsSigned-off-by Bob Peterson <[email protected]>---
fs/gfs2/inode.c +1
-0@@ -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:fs/gfs2/super.c +5
-1@@ -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 @@ out_unlock: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 @@ out: 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); } }