|
@@ -19,7 +19,6 @@
|
|
|
#include <linux/list.h>
|
|
|
#include <linux/wait.h>
|
|
|
#include <linux/module.h>
|
|
|
-#include <linux/rwsem.h>
|
|
|
#include <asm/uaccess.h>
|
|
|
#include <linux/seq_file.h>
|
|
|
#include <linux/debugfs.h>
|
|
@@ -60,7 +59,6 @@ static int __dump_glock(struct seq_file *seq, const struct gfs2_glock *gl);
|
|
|
#define GLOCK_BUG_ON(gl,x) do { if (unlikely(x)) { __dump_glock(NULL, gl); BUG(); } } while(0)
|
|
|
static void do_xmote(struct gfs2_glock *gl, struct gfs2_holder *gh, unsigned int target);
|
|
|
|
|
|
-static DECLARE_RWSEM(gfs2_umount_flush_sem);
|
|
|
static struct dentry *gfs2_root;
|
|
|
static struct workqueue_struct *glock_workqueue;
|
|
|
struct workqueue_struct *gfs2_delete_workqueue;
|
|
@@ -714,7 +712,6 @@ static void glock_work_func(struct work_struct *work)
|
|
|
finish_xmote(gl, gl->gl_reply);
|
|
|
drop_ref = 1;
|
|
|
}
|
|
|
- down_read(&gfs2_umount_flush_sem);
|
|
|
spin_lock(&gl->gl_spin);
|
|
|
if (test_and_clear_bit(GLF_PENDING_DEMOTE, &gl->gl_flags) &&
|
|
|
gl->gl_state != LM_ST_UNLOCKED &&
|
|
@@ -727,7 +724,6 @@ static void glock_work_func(struct work_struct *work)
|
|
|
}
|
|
|
run_queue(gl, 0);
|
|
|
spin_unlock(&gl->gl_spin);
|
|
|
- up_read(&gfs2_umount_flush_sem);
|
|
|
if (!delay ||
|
|
|
queue_delayed_work(glock_workqueue, &gl->gl_work, delay) == 0)
|
|
|
gfs2_glock_put(gl);
|
|
@@ -1512,35 +1508,10 @@ void gfs2_glock_thaw(struct gfs2_sbd *sdp)
|
|
|
|
|
|
void gfs2_gl_hash_clear(struct gfs2_sbd *sdp)
|
|
|
{
|
|
|
- unsigned long t;
|
|
|
unsigned int x;
|
|
|
- int cont;
|
|
|
|
|
|
- t = jiffies;
|
|
|
-
|
|
|
- for (;;) {
|
|
|
- cont = 0;
|
|
|
- for (x = 0; x < GFS2_GL_HASH_SIZE; x++) {
|
|
|
- if (examine_bucket(clear_glock, sdp, x))
|
|
|
- cont = 1;
|
|
|
- }
|
|
|
-
|
|
|
- if (!cont)
|
|
|
- break;
|
|
|
-
|
|
|
- if (time_after_eq(jiffies,
|
|
|
- t + gfs2_tune_get(sdp, gt_stall_secs) * HZ)) {
|
|
|
- fs_warn(sdp, "Unmount seems to be stalled. "
|
|
|
- "Dumping lock state...\n");
|
|
|
- gfs2_dump_lockstate(sdp);
|
|
|
- t = jiffies;
|
|
|
- }
|
|
|
-
|
|
|
- down_write(&gfs2_umount_flush_sem);
|
|
|
- invalidate_inodes(sdp->sd_vfs);
|
|
|
- up_write(&gfs2_umount_flush_sem);
|
|
|
- msleep(10);
|
|
|
- }
|
|
|
+ for (x = 0; x < GFS2_GL_HASH_SIZE; x++)
|
|
|
+ examine_bucket(clear_glock, sdp, x);
|
|
|
flush_workqueue(glock_workqueue);
|
|
|
wait_event(sdp->sd_glock_wait, atomic_read(&sdp->sd_glock_disposal) == 0);
|
|
|
gfs2_dump_lockstate(sdp);
|