diff options
author | Bob Peterson <rpeterso@redhat.com> | 2015-12-07 16:24:27 -0600 |
---|---|---|
committer | Bob Peterson <rpeterso@redhat.com> | 2016-03-15 10:46:37 -0400 |
commit | a4923865ea071b0bd708339df7a83c76732fa2db (patch) | |
tree | 26f80b7fe5be0b047ce37fe198d0a4ec797fccdd /fs/gfs2/inode.c | |
parent | 2df6f47150b6afbb258ed1d5c9ed78c23df05053 (diff) | |
download | linux-a4923865ea071b0bd708339df7a83c76732fa2db.tar.gz linux-a4923865ea071b0bd708339df7a83c76732fa2db.tar.bz2 linux-a4923865ea071b0bd708339df7a83c76732fa2db.zip |
GFS2: Prevent delete work from occurring on glocks used for create
This patch tries to prevent delete work (queued via iopen callback)
from executing if the glock is currently being used to create
a new inode.
Signed-off-by: Bob Peterson <rpeterso@redhat.com>
Acked-by: Steven Whitehouse <swhiteho@redhat.com>
Diffstat (limited to 'fs/gfs2/inode.c')
-rw-r--r-- | fs/gfs2/inode.c | 7 |
1 files changed, 6 insertions, 1 deletions
diff --git a/fs/gfs2/inode.c b/fs/gfs2/inode.c index 3e94400d587c..95a914524a39 100644 --- a/fs/gfs2/inode.c +++ b/fs/gfs2/inode.c @@ -592,7 +592,7 @@ static int gfs2_create_inode(struct inode *dir, struct dentry *dentry, struct inode *inode = NULL; struct gfs2_inode *dip = GFS2_I(dir), *ip; struct gfs2_sbd *sdp = GFS2_SB(&dip->i_inode); - struct gfs2_glock *io_gl; + struct gfs2_glock *io_gl = NULL; int error, free_vfs_inode = 1; u32 aflags = 0; unsigned blocks = 1; @@ -729,6 +729,8 @@ static int gfs2_create_inode(struct inode *dir, struct dentry *dentry, if (error) goto fail_gunlock2; + BUG_ON(test_and_set_bit(GLF_INODE_CREATING, &io_gl->gl_flags)); + error = gfs2_glock_nq_init(io_gl, LM_ST_SHARED, GL_EXACT, &ip->i_iopen_gh); if (error) goto fail_gunlock2; @@ -771,12 +773,15 @@ static int gfs2_create_inode(struct inode *dir, struct dentry *dentry, } gfs2_glock_dq_uninit(ghs); gfs2_glock_dq_uninit(ghs + 1); + clear_bit(GLF_INODE_CREATING, &io_gl->gl_flags); return error; fail_gunlock3: gfs2_glock_dq_uninit(&ip->i_iopen_gh); gfs2_glock_put(io_gl); fail_gunlock2: + if (io_gl) + clear_bit(GLF_INODE_CREATING, &io_gl->gl_flags); gfs2_glock_dq_uninit(ghs + 1); fail_free_inode: if (ip->i_gl) |