aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--fs/gfs2/glock.c24
-rw-r--r--fs/gfs2/incore.h1
-rw-r--r--fs/gfs2/ops_fstype.c1
3 files changed, 5 insertions, 21 deletions
diff --git a/fs/gfs2/glock.c b/fs/gfs2/glock.c
index a5e16e539999..005788fb361f 100644
--- a/fs/gfs2/glock.c
+++ b/fs/gfs2/glock.c
@@ -150,12 +150,9 @@ static void kill_glock(struct kref *kref)
150 150
151int gfs2_glock_put(struct gfs2_glock *gl) 151int gfs2_glock_put(struct gfs2_glock *gl)
152{ 152{
153 struct gfs2_sbd *sdp = gl->gl_sbd;
154 struct gfs2_gl_hash_bucket *bucket = gl->gl_bucket; 153 struct gfs2_gl_hash_bucket *bucket = gl->gl_bucket;
155 int rv = 0; 154 int rv = 0;
156 155
157 mutex_lock(&sdp->sd_invalidate_inodes_mutex);
158
159 write_lock(&bucket->hb_lock); 156 write_lock(&bucket->hb_lock);
160 if (kref_put(&gl->gl_ref, kill_glock)) { 157 if (kref_put(&gl->gl_ref, kill_glock)) {
161 list_del_init(&gl->gl_list); 158 list_del_init(&gl->gl_list);
@@ -166,8 +163,7 @@ int gfs2_glock_put(struct gfs2_glock *gl)
166 goto out; 163 goto out;
167 } 164 }
168 write_unlock(&bucket->hb_lock); 165 write_unlock(&bucket->hb_lock);
169 out: 166out:
170 mutex_unlock(&sdp->sd_invalidate_inodes_mutex);
171 return rv; 167 return rv;
172} 168}
173 169
@@ -1964,19 +1960,18 @@ static int examine_bucket(glock_examiner examiner, struct gfs2_sbd *sdp,
1964 1960
1965static void scan_glock(struct gfs2_glock *gl) 1961static void scan_glock(struct gfs2_glock *gl)
1966{ 1962{
1963 if (gl->gl_ops == &gfs2_inode_glops)
1964 goto out;
1965
1967 if (gfs2_glmutex_trylock(gl)) { 1966 if (gfs2_glmutex_trylock(gl)) {
1968 if (gl->gl_ops == &gfs2_inode_glops)
1969 goto out;
1970 if (queue_empty(gl, &gl->gl_holders) && 1967 if (queue_empty(gl, &gl->gl_holders) &&
1971 gl->gl_state != LM_ST_UNLOCKED && 1968 gl->gl_state != LM_ST_UNLOCKED &&
1972 demote_ok(gl)) 1969 demote_ok(gl))
1973 goto out_schedule; 1970 goto out_schedule;
1974out:
1975 gfs2_glmutex_unlock(gl); 1971 gfs2_glmutex_unlock(gl);
1976 } 1972 }
1977 1973out:
1978 gfs2_glock_put(gl); 1974 gfs2_glock_put(gl);
1979
1980 return; 1975 return;
1981 1976
1982out_schedule: 1977out_schedule:
@@ -2070,16 +2065,7 @@ void gfs2_gl_hash_clear(struct gfs2_sbd *sdp, int wait)
2070 t = jiffies; 2065 t = jiffies;
2071 } 2066 }
2072 2067
2073 /* invalidate_inodes() requires that the sb inodes list
2074 not change, but an async completion callback for an
2075 unlock can occur which does glock_put() which
2076 can call iput() which will change the sb inodes list.
2077 invalidate_inodes_mutex prevents glock_put()'s during
2078 an invalidate_inodes() */
2079
2080 mutex_lock(&sdp->sd_invalidate_inodes_mutex);
2081 invalidate_inodes(sdp->sd_vfs); 2068 invalidate_inodes(sdp->sd_vfs);
2082 mutex_unlock(&sdp->sd_invalidate_inodes_mutex);
2083 msleep(10); 2069 msleep(10);
2084 } 2070 }
2085} 2071}
diff --git a/fs/gfs2/incore.h b/fs/gfs2/incore.h
index e98c14f30daa..78d3cb511eb8 100644
--- a/fs/gfs2/incore.h
+++ b/fs/gfs2/incore.h
@@ -507,7 +507,6 @@ struct gfs2_sbd {
507 struct gfs2_holder sd_live_gh; 507 struct gfs2_holder sd_live_gh;
508 struct gfs2_glock *sd_rename_gl; 508 struct gfs2_glock *sd_rename_gl;
509 struct gfs2_glock *sd_trans_gl; 509 struct gfs2_glock *sd_trans_gl;
510 struct mutex sd_invalidate_inodes_mutex;
511 510
512 /* Inode Stuff */ 511 /* Inode Stuff */
513 512
diff --git a/fs/gfs2/ops_fstype.c b/fs/gfs2/ops_fstype.c
index 444000968cf4..c66067c84bcf 100644
--- a/fs/gfs2/ops_fstype.c
+++ b/fs/gfs2/ops_fstype.c
@@ -63,7 +63,6 @@ static struct gfs2_sbd *init_sbd(struct super_block *sb)
63 INIT_LIST_HEAD(&sdp->sd_reclaim_list); 63 INIT_LIST_HEAD(&sdp->sd_reclaim_list);
64 spin_lock_init(&sdp->sd_reclaim_lock); 64 spin_lock_init(&sdp->sd_reclaim_lock);
65 init_waitqueue_head(&sdp->sd_reclaim_wq); 65 init_waitqueue_head(&sdp->sd_reclaim_wq);
66 mutex_init(&sdp->sd_invalidate_inodes_mutex);
67 66
68 mutex_init(&sdp->sd_inum_mutex); 67 mutex_init(&sdp->sd_inum_mutex);
69 spin_lock_init(&sdp->sd_statfs_spin); 68 spin_lock_init(&sdp->sd_statfs_spin);