diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2012-02-28 09:17:31 -0800 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2012-02-28 09:17:31 -0800 |
commit | 891003abb0db6bfffd61b76ad0ed39bb7c3db8e1 (patch) | |
tree | ba2c54bee79d46dbd7855fb6b87fa0487c761808 /fs/gfs2/rgrp.c | |
parent | d5a74afd08738af84d51c353ac3ac200b06c51d7 (diff) | |
parent | a365fbf354907430e6852f0c373b4b3eeff81ba3 (diff) | |
download | linux-891003abb0db6bfffd61b76ad0ed39bb7c3db8e1.tar.bz2 |
Merge git://git.kernel.org/pub/scm/linux/kernel/git/steve/gfs2-3.0-fixes
* git://git.kernel.org/pub/scm/linux/kernel/git/steve/gfs2-3.0-fixes:
GFS2: Read resource groups on mount
GFS2: Ensure rindex is uptodate for fallocate
GFS2: Read in rindex if necessary during unlink
GFS2: Fix race between lru_list and glock ref count
Diffstat (limited to 'fs/gfs2/rgrp.c')
-rw-r--r-- | fs/gfs2/rgrp.c | 13 |
1 files changed, 9 insertions, 4 deletions
diff --git a/fs/gfs2/rgrp.c b/fs/gfs2/rgrp.c index 981bfa32121a..49ada95209d0 100644 --- a/fs/gfs2/rgrp.c +++ b/fs/gfs2/rgrp.c @@ -683,16 +683,21 @@ int gfs2_rindex_update(struct gfs2_sbd *sdp) struct gfs2_glock *gl = ip->i_gl; struct gfs2_holder ri_gh; int error = 0; + int unlock_required = 0; /* Read new copy from disk if we don't have the latest */ if (!sdp->sd_rindex_uptodate) { mutex_lock(&sdp->sd_rindex_mutex); - error = gfs2_glock_nq_init(gl, LM_ST_SHARED, 0, &ri_gh); - if (error) - return error; + if (!gfs2_glock_is_locked_by_me(gl)) { + error = gfs2_glock_nq_init(gl, LM_ST_SHARED, 0, &ri_gh); + if (error) + return error; + unlock_required = 1; + } if (!sdp->sd_rindex_uptodate) error = gfs2_ri_update(ip); - gfs2_glock_dq_uninit(&ri_gh); + if (unlock_required) + gfs2_glock_dq_uninit(&ri_gh); mutex_unlock(&sdp->sd_rindex_mutex); } |