GFS2: Don't cache iopen glocks
A message that is not in the archive (sent off-list or not yet received): [email protected]
PATCH 1/1 GFS2: Don't cache iopen glocks
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 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); } }