diff options
author | Bob Peterson <rpeterso@redhat.com> | 2015-12-18 18:54:55 +0100 |
---|---|---|
committer | Bob Peterson <rpeterso@redhat.com> | 2016-01-14 14:47:42 +0100 |
commit | 7508abc4bdac43dc87d2fdd31527063f72da7020 (patch) | |
tree | ef25c3648ace05e47eca1ecc76ddbba541bd4f03 /fs/gfs2/glock.c | |
parent | Merge tag 'pm+acpi-4.5-rc1-1' of git://git.kernel.org/pub/scm/linux/kernel/gi... (diff) | |
download | linux-7508abc4bdac43dc87d2fdd31527063f72da7020.tar.xz linux-7508abc4bdac43dc87d2fdd31527063f72da7020.zip |
GFS2: Check if iopen is held when deleting inode
This patch fixes an error condition in which an inode is partially
created in gfs2_create_inode() but then some error is discovered,
which causes it to fail and call iput() before the iopen glock is
created or held. In that case, gfs2_delete_inode would try to
unlock an iopen glock that doesn't yet exist. Therefore, we test
its holder (which must exist) for the HIF_HOLDER bit before trying
to dq it.
Signed-off-by: Bob Peterson <rpeterso@redhat.com>
Acked-by: Steven Whitehouse <swhiteho@redhat.com>
Diffstat (limited to 'fs/gfs2/glock.c')
-rw-r--r-- | fs/gfs2/glock.c | 1 |
1 files changed, 1 insertions, 0 deletions
diff --git a/fs/gfs2/glock.c b/fs/gfs2/glock.c index a4ff7b56f5cd..5788ebff716a 100644 --- a/fs/gfs2/glock.c +++ b/fs/gfs2/glock.c @@ -1015,6 +1015,7 @@ void gfs2_glock_dq(struct gfs2_holder *gh) handle_callback(gl, LM_ST_UNLOCKED, 0, false); list_del_init(&gh->gh_list); + clear_bit(HIF_HOLDER, &gh->gh_iflags); if (find_first_holder(gl) == NULL) { if (glops->go_unlock) { GLOCK_BUG_ON(gl, test_and_set_bit(GLF_LOCK, &gl->gl_flags)); |