From e54a5b7747089435a8dfeecb08571cd5b57d0da4 Mon Sep 17 00:00:00 2001 From: Steven Whitehouse Date: Mon, 29 Jan 2007 11:51:45 +0000 Subject: [PATCH] --- yaml --- r: 46317 b: refs/heads/master c: 61be084efcc4451934257350281962595418a33c h: refs/heads/master i: 46315: cdfaf85331ac1a1917033e4afc6d393bd7dc89c4 v: v3 --- [refs] | 2 +- trunk/fs/gfs2/glock.c | 6 ++++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/[refs] b/[refs] index 4a7d3f31b780..af9ba869e370 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: bbb28ab7599789740b2233a0805d22aefb97f533 +refs/heads/master: 61be084efcc4451934257350281962595418a33c diff --git a/trunk/fs/gfs2/glock.c b/trunk/fs/gfs2/glock.c index c070ede531c5..6618c1190252 100644 --- a/trunk/fs/gfs2/glock.c +++ b/trunk/fs/gfs2/glock.c @@ -20,6 +20,7 @@ #include #include #include +#include #include #include "gfs2.h" @@ -45,6 +46,7 @@ static int dump_glock(struct gfs2_glock *gl); static int dump_inode(struct gfs2_inode *ip); static void gfs2_glock_xmote_th(struct gfs2_holder *gh); static void gfs2_glock_drop_th(struct gfs2_glock *gl); +static DECLARE_RWSEM(gfs2_umount_flush_sem); #define GFS2_GL_HASH_SHIFT 15 #define GFS2_GL_HASH_SIZE (1 << GFS2_GL_HASH_SHIFT) @@ -1578,12 +1580,14 @@ void gfs2_glock_cb(void *cb_data, unsigned int type, void *data) struct lm_async_cb *async = data; struct gfs2_glock *gl; + down_read(&gfs2_umount_flush_sem); gl = gfs2_glock_find(sdp, &async->lc_name); if (gfs2_assert_warn(sdp, gl)) return; if (!gfs2_assert_warn(sdp, gl->gl_req_bh)) gl->gl_req_bh(gl, async->lc_ret); gfs2_glock_put(gl); + up_read(&gfs2_umount_flush_sem); return; } @@ -1828,7 +1832,9 @@ void gfs2_gl_hash_clear(struct gfs2_sbd *sdp, int wait) t = jiffies; } + down_write(&gfs2_umount_flush_sem); invalidate_inodes(sdp->sd_vfs); + up_write(&gfs2_umount_flush_sem); msleep(10); } }