diff options
| -rw-r--r-- | fs/gfs2/glock.c | 33 | ||||
| -rw-r--r-- | fs/gfs2/incore.h | 1 | ||||
| -rw-r--r-- | fs/gfs2/ops_fstype.c | 4 | ||||
| -rw-r--r-- | fs/gfs2/super.c | 1 | ||||
| -rw-r--r-- | fs/gfs2/sys.c | 2 |
5 files changed, 4 insertions, 37 deletions
diff --git a/fs/gfs2/glock.c b/fs/gfs2/glock.c index dfb10a4d467e..4773f9098a41 100644 --- a/fs/gfs2/glock.c +++ b/fs/gfs2/glock.c | |||
| @@ -19,7 +19,6 @@ | |||
| 19 | #include <linux/list.h> | 19 | #include <linux/list.h> |
| 20 | #include <linux/wait.h> | 20 | #include <linux/wait.h> |
| 21 | #include <linux/module.h> | 21 | #include <linux/module.h> |
| 22 | #include <linux/rwsem.h> | ||
| 23 | #include <asm/uaccess.h> | 22 | #include <asm/uaccess.h> |
| 24 | #include <linux/seq_file.h> | 23 | #include <linux/seq_file.h> |
| 25 | #include <linux/debugfs.h> | 24 | #include <linux/debugfs.h> |
| @@ -60,7 +59,6 @@ static int __dump_glock(struct seq_file *seq, const struct gfs2_glock *gl); | |||
| 60 | #define GLOCK_BUG_ON(gl,x) do { if (unlikely(x)) { __dump_glock(NULL, gl); BUG(); } } while(0) | 59 | #define GLOCK_BUG_ON(gl,x) do { if (unlikely(x)) { __dump_glock(NULL, gl); BUG(); } } while(0) |
| 61 | static void do_xmote(struct gfs2_glock *gl, struct gfs2_holder *gh, unsigned int target); | 60 | static void do_xmote(struct gfs2_glock *gl, struct gfs2_holder *gh, unsigned int target); |
| 62 | 61 | ||
| 63 | static DECLARE_RWSEM(gfs2_umount_flush_sem); | ||
| 64 | static struct dentry *gfs2_root; | 62 | static struct dentry *gfs2_root; |
| 65 | static struct workqueue_struct *glock_workqueue; | 63 | static struct workqueue_struct *glock_workqueue; |
| 66 | struct workqueue_struct *gfs2_delete_workqueue; | 64 | struct workqueue_struct *gfs2_delete_workqueue; |
| @@ -714,7 +712,6 @@ static void glock_work_func(struct work_struct *work) | |||
| 714 | finish_xmote(gl, gl->gl_reply); | 712 | finish_xmote(gl, gl->gl_reply); |
| 715 | drop_ref = 1; | 713 | drop_ref = 1; |
| 716 | } | 714 | } |
| 717 | down_read(&gfs2_umount_flush_sem); | ||
| 718 | spin_lock(&gl->gl_spin); | 715 | spin_lock(&gl->gl_spin); |
| 719 | if (test_and_clear_bit(GLF_PENDING_DEMOTE, &gl->gl_flags) && | 716 | if (test_and_clear_bit(GLF_PENDING_DEMOTE, &gl->gl_flags) && |
| 720 | gl->gl_state != LM_ST_UNLOCKED && | 717 | gl->gl_state != LM_ST_UNLOCKED && |
| @@ -727,7 +724,6 @@ static void glock_work_func(struct work_struct *work) | |||
| 727 | } | 724 | } |
| 728 | run_queue(gl, 0); | 725 | run_queue(gl, 0); |
| 729 | spin_unlock(&gl->gl_spin); | 726 | spin_unlock(&gl->gl_spin); |
| 730 | up_read(&gfs2_umount_flush_sem); | ||
| 731 | if (!delay || | 727 | if (!delay || |
| 732 | queue_delayed_work(glock_workqueue, &gl->gl_work, delay) == 0) | 728 | queue_delayed_work(glock_workqueue, &gl->gl_work, delay) == 0) |
| 733 | gfs2_glock_put(gl); | 729 | gfs2_glock_put(gl); |
| @@ -1512,35 +1508,10 @@ void gfs2_glock_thaw(struct gfs2_sbd *sdp) | |||
| 1512 | 1508 | ||
| 1513 | void gfs2_gl_hash_clear(struct gfs2_sbd *sdp) | 1509 | void gfs2_gl_hash_clear(struct gfs2_sbd *sdp) |
| 1514 | { | 1510 | { |
| 1515 | unsigned long t; | ||
| 1516 | unsigned int x; | 1511 | unsigned int x; |
| 1517 | int cont; | ||
| 1518 | 1512 | ||
| 1519 | t = jiffies; | 1513 | for (x = 0; x < GFS2_GL_HASH_SIZE; x++) |
| 1520 | 1514 | examine_bucket(clear_glock, sdp, x); | |
| 1521 | for (;;) { | ||
| 1522 | cont = 0; | ||
| 1523 | for (x = 0; x < GFS2_GL_HASH_SIZE; x++) { | ||
| 1524 | if (examine_bucket(clear_glock, sdp, x)) | ||
| 1525 | cont = 1; | ||
| 1526 | } | ||
| 1527 | |||
| 1528 | if (!cont) | ||
| 1529 | break; | ||
| 1530 | |||
| 1531 | if (time_after_eq(jiffies, | ||
| 1532 | t + gfs2_tune_get(sdp, gt_stall_secs) * HZ)) { | ||
| 1533 | fs_warn(sdp, "Unmount seems to be stalled. " | ||
| 1534 | "Dumping lock state...\n"); | ||
| 1535 | gfs2_dump_lockstate(sdp); | ||
| 1536 | t = jiffies; | ||
| 1537 | } | ||
| 1538 | |||
| 1539 | down_write(&gfs2_umount_flush_sem); | ||
| 1540 | invalidate_inodes(sdp->sd_vfs); | ||
| 1541 | up_write(&gfs2_umount_flush_sem); | ||
| 1542 | msleep(10); | ||
| 1543 | } | ||
| 1544 | flush_workqueue(glock_workqueue); | 1515 | flush_workqueue(glock_workqueue); |
| 1545 | wait_event(sdp->sd_glock_wait, atomic_read(&sdp->sd_glock_disposal) == 0); | 1516 | wait_event(sdp->sd_glock_wait, atomic_read(&sdp->sd_glock_disposal) == 0); |
| 1546 | gfs2_dump_lockstate(sdp); | 1517 | gfs2_dump_lockstate(sdp); |
diff --git a/fs/gfs2/incore.h b/fs/gfs2/incore.h index 1de7e1b7ce83..b8025e51cabf 100644 --- a/fs/gfs2/incore.h +++ b/fs/gfs2/incore.h | |||
| @@ -451,7 +451,6 @@ struct gfs2_tune { | |||
| 451 | unsigned int gt_quota_quantum; /* Secs between syncs to quota file */ | 451 | unsigned int gt_quota_quantum; /* Secs between syncs to quota file */ |
| 452 | unsigned int gt_new_files_jdata; | 452 | unsigned int gt_new_files_jdata; |
| 453 | unsigned int gt_max_readahead; /* Max bytes to read-ahead from disk */ | 453 | unsigned int gt_max_readahead; /* Max bytes to read-ahead from disk */ |
| 454 | unsigned int gt_stall_secs; /* Detects trouble! */ | ||
| 455 | unsigned int gt_complain_secs; | 454 | unsigned int gt_complain_secs; |
| 456 | unsigned int gt_statfs_quantum; | 455 | unsigned int gt_statfs_quantum; |
| 457 | unsigned int gt_statfs_slow; | 456 | unsigned int gt_statfs_slow; |
diff --git a/fs/gfs2/ops_fstype.c b/fs/gfs2/ops_fstype.c index a86ed6381566..a054b526dc08 100644 --- a/fs/gfs2/ops_fstype.c +++ b/fs/gfs2/ops_fstype.c | |||
| @@ -65,7 +65,6 @@ static void gfs2_tune_init(struct gfs2_tune *gt) | |||
| 65 | gt->gt_quota_scale_den = 1; | 65 | gt->gt_quota_scale_den = 1; |
| 66 | gt->gt_new_files_jdata = 0; | 66 | gt->gt_new_files_jdata = 0; |
| 67 | gt->gt_max_readahead = 1 << 18; | 67 | gt->gt_max_readahead = 1 << 18; |
| 68 | gt->gt_stall_secs = 600; | ||
| 69 | gt->gt_complain_secs = 10; | 68 | gt->gt_complain_secs = 10; |
| 70 | } | 69 | } |
| 71 | 70 | ||
| @@ -1241,10 +1240,9 @@ fail_sb: | |||
| 1241 | fail_locking: | 1240 | fail_locking: |
| 1242 | init_locking(sdp, &mount_gh, UNDO); | 1241 | init_locking(sdp, &mount_gh, UNDO); |
| 1243 | fail_lm: | 1242 | fail_lm: |
| 1243 | invalidate_inodes(sb); | ||
| 1244 | gfs2_gl_hash_clear(sdp); | 1244 | gfs2_gl_hash_clear(sdp); |
| 1245 | gfs2_lm_unmount(sdp); | 1245 | gfs2_lm_unmount(sdp); |
| 1246 | while (invalidate_inodes(sb)) | ||
| 1247 | yield(); | ||
| 1248 | fail_sys: | 1246 | fail_sys: |
| 1249 | gfs2_sys_fs_del(sdp); | 1247 | gfs2_sys_fs_del(sdp); |
| 1250 | fail: | 1248 | fail: |
diff --git a/fs/gfs2/super.c b/fs/gfs2/super.c index ad7bc2d25ac2..e5e22629da67 100644 --- a/fs/gfs2/super.c +++ b/fs/gfs2/super.c | |||
| @@ -859,6 +859,7 @@ restart: | |||
| 859 | gfs2_clear_rgrpd(sdp); | 859 | gfs2_clear_rgrpd(sdp); |
| 860 | gfs2_jindex_free(sdp); | 860 | gfs2_jindex_free(sdp); |
| 861 | /* Take apart glock structures and buffer lists */ | 861 | /* Take apart glock structures and buffer lists */ |
| 862 | invalidate_inodes(sdp->sd_vfs); | ||
| 862 | gfs2_gl_hash_clear(sdp); | 863 | gfs2_gl_hash_clear(sdp); |
| 863 | /* Unmount the locking protocol */ | 864 | /* Unmount the locking protocol */ |
| 864 | gfs2_lm_unmount(sdp); | 865 | gfs2_lm_unmount(sdp); |
diff --git a/fs/gfs2/sys.c b/fs/gfs2/sys.c index 0dc34621f6a6..a0db1c94317d 100644 --- a/fs/gfs2/sys.c +++ b/fs/gfs2/sys.c | |||
| @@ -478,7 +478,6 @@ TUNE_ATTR(complain_secs, 0); | |||
| 478 | TUNE_ATTR(statfs_slow, 0); | 478 | TUNE_ATTR(statfs_slow, 0); |
| 479 | TUNE_ATTR(new_files_jdata, 0); | 479 | TUNE_ATTR(new_files_jdata, 0); |
| 480 | TUNE_ATTR(quota_simul_sync, 1); | 480 | TUNE_ATTR(quota_simul_sync, 1); |
| 481 | TUNE_ATTR(stall_secs, 1); | ||
| 482 | TUNE_ATTR(statfs_quantum, 1); | 481 | TUNE_ATTR(statfs_quantum, 1); |
| 483 | TUNE_ATTR_3(quota_scale, quota_scale_show, quota_scale_store); | 482 | TUNE_ATTR_3(quota_scale, quota_scale_show, quota_scale_store); |
| 484 | 483 | ||
| @@ -491,7 +490,6 @@ static struct attribute *tune_attrs[] = { | |||
| 491 | &tune_attr_complain_secs.attr, | 490 | &tune_attr_complain_secs.attr, |
| 492 | &tune_attr_statfs_slow.attr, | 491 | &tune_attr_statfs_slow.attr, |
| 493 | &tune_attr_quota_simul_sync.attr, | 492 | &tune_attr_quota_simul_sync.attr, |
| 494 | &tune_attr_stall_secs.attr, | ||
| 495 | &tune_attr_statfs_quantum.attr, | 493 | &tune_attr_statfs_quantum.attr, |
| 496 | &tune_attr_quota_scale.attr, | 494 | &tune_attr_quota_scale.attr, |
| 497 | &tune_attr_new_files_jdata.attr, | 495 | &tune_attr_new_files_jdata.attr, |
