You've already forked linux-apfs
mirror of
https://github.com/linux-apfs/linux-apfs.git
synced 2026-05-01 15:00:59 -07:00
GFS2: Wait for unlock completion on umount
This patch adds a wait on umount between the point at which we dispose of all glocks and the point at which we unmount the lock protocol. This ensures that we've received all the replies to our unlock requests before we stop the locking. Signed-off-by: Steven Whitehouse <swhiteho@redhat.com> Reported-by: Fabio M. Di Nitto <fdinitto@redhat.com>
This commit is contained in:
+6
-1
@@ -21,6 +21,7 @@ static void gdlm_ast(void *arg)
|
||||
{
|
||||
struct gfs2_glock *gl = arg;
|
||||
unsigned ret = gl->gl_state;
|
||||
struct gfs2_sbd *sdp = gl->gl_sbd;
|
||||
|
||||
BUG_ON(gl->gl_lksb.sb_flags & DLM_SBF_DEMOTED);
|
||||
|
||||
@@ -30,6 +31,8 @@ static void gdlm_ast(void *arg)
|
||||
switch (gl->gl_lksb.sb_status) {
|
||||
case -DLM_EUNLOCK: /* Unlocked, so glock can be freed */
|
||||
kmem_cache_free(gfs2_glock_cachep, gl);
|
||||
if (atomic_dec_and_test(&sdp->sd_glock_disposal))
|
||||
wake_up(&sdp->sd_glock_wait);
|
||||
return;
|
||||
case -DLM_ECANCEL: /* Cancel while getting lock */
|
||||
ret |= LM_OUT_CANCELED;
|
||||
@@ -167,7 +170,8 @@ static unsigned int gdlm_lock(struct gfs2_glock *gl,
|
||||
static void gdlm_put_lock(struct kmem_cache *cachep, void *ptr)
|
||||
{
|
||||
struct gfs2_glock *gl = ptr;
|
||||
struct lm_lockstruct *ls = &gl->gl_sbd->sd_lockstruct;
|
||||
struct gfs2_sbd *sdp = gl->gl_sbd;
|
||||
struct lm_lockstruct *ls = &sdp->sd_lockstruct;
|
||||
int error;
|
||||
|
||||
if (gl->gl_lksb.sb_lkid == 0) {
|
||||
@@ -183,6 +187,7 @@ static void gdlm_put_lock(struct kmem_cache *cachep, void *ptr)
|
||||
(unsigned long long)gl->gl_name.ln_number, error);
|
||||
return;
|
||||
}
|
||||
atomic_inc(&sdp->sd_glock_disposal);
|
||||
}
|
||||
|
||||
static void gdlm_cancel(struct gfs2_glock *gl)
|
||||
|
||||
Reference in New Issue
Block a user