Commit 797d9016 authored by Jeff Mahoney's avatar Jeff Mahoney Committed by Jan Kara

reiserfs: use per-fs commit workqueues

The reiserfs write lock hasn't been the BKL for some time. There's no
need to have different file systems queued up on the same workqueue.
Signed-off-by: default avatarJeff Mahoney <jeffm@suse.com>
Signed-off-by: default avatarJan Kara <jack@suse.cz>
parent 38583f09
...@@ -58,13 +58,6 @@ ...@@ -58,13 +58,6 @@
#define JOURNAL_WORK_ENTRY(h) (list_entry((h), struct reiserfs_journal_list, \ #define JOURNAL_WORK_ENTRY(h) (list_entry((h), struct reiserfs_journal_list, \
j_working_list)) j_working_list))
/* the number of mounted filesystems. This is used to decide when to
** start and kill the commit workqueue
*/
static int reiserfs_mounted_fs_count;
static struct workqueue_struct *commit_wq;
#define JOURNAL_TRANS_HALF 1018 /* must be correct to keep the desc and commit #define JOURNAL_TRANS_HALF 1018 /* must be correct to keep the desc and commit
structs at 4k */ structs at 4k */
#define BUFNR 64 /*read ahead */ #define BUFNR 64 /*read ahead */
...@@ -1882,7 +1875,6 @@ static int do_journal_release(struct reiserfs_transaction_handle *th, ...@@ -1882,7 +1875,6 @@ static int do_journal_release(struct reiserfs_transaction_handle *th,
} }
} }
reiserfs_mounted_fs_count--;
/* wait for all commits to finish */ /* wait for all commits to finish */
cancel_delayed_work(&SB_JOURNAL(sb)->j_work); cancel_delayed_work(&SB_JOURNAL(sb)->j_work);
...@@ -1893,12 +1885,7 @@ static int do_journal_release(struct reiserfs_transaction_handle *th, ...@@ -1893,12 +1885,7 @@ static int do_journal_release(struct reiserfs_transaction_handle *th,
reiserfs_write_unlock(sb); reiserfs_write_unlock(sb);
cancel_delayed_work_sync(&REISERFS_SB(sb)->old_work); cancel_delayed_work_sync(&REISERFS_SB(sb)->old_work);
flush_workqueue(commit_wq); flush_workqueue(REISERFS_SB(sb)->commit_wq);
if (!reiserfs_mounted_fs_count) {
destroy_workqueue(commit_wq);
commit_wq = NULL;
}
free_journal_ram(sb); free_journal_ram(sb);
...@@ -2807,10 +2794,6 @@ int journal_init(struct super_block *sb, const char *j_dev_name, ...@@ -2807,10 +2794,6 @@ int journal_init(struct super_block *sb, const char *j_dev_name,
goto free_and_return; goto free_and_return;
} }
reiserfs_mounted_fs_count++;
if (reiserfs_mounted_fs_count <= 1)
commit_wq = alloc_workqueue("reiserfs", WQ_MEM_RECLAIM, 0);
INIT_DELAYED_WORK(&journal->j_work, flush_async_commits); INIT_DELAYED_WORK(&journal->j_work, flush_async_commits);
journal->j_work_sb = sb; journal->j_work_sb = sb;
return 0; return 0;
...@@ -4134,7 +4117,8 @@ static int do_journal_end(struct reiserfs_transaction_handle *th, ...@@ -4134,7 +4117,8 @@ static int do_journal_end(struct reiserfs_transaction_handle *th,
flush_commit_list(sb, jl, 1); flush_commit_list(sb, jl, 1);
flush_journal_list(sb, jl, 1); flush_journal_list(sb, jl, 1);
} else if (!(jl->j_state & LIST_COMMIT_PENDING)) } else if (!(jl->j_state & LIST_COMMIT_PENDING))
queue_delayed_work(commit_wq, &journal->j_work, HZ / 10); queue_delayed_work(REISERFS_SB(sb)->commit_wq,
&journal->j_work, HZ / 10);
/* if the next transaction has any chance of wrapping, flush /* if the next transaction has any chance of wrapping, flush
** transactions that might get overwritten. If any journal lists are very ** transactions that might get overwritten. If any journal lists are very
......
...@@ -431,6 +431,8 @@ struct reiserfs_sb_info { ...@@ -431,6 +431,8 @@ struct reiserfs_sb_info {
/* Depth of the lock, start from -1 like the bkl */ /* Depth of the lock, start from -1 like the bkl */
int lock_depth; int lock_depth;
struct workqueue_struct *commit_wq;
/* Comment? -Hans */ /* Comment? -Hans */
void (*end_io_handler) (struct buffer_head *, int); void (*end_io_handler) (struct buffer_head *, int);
hashf_t s_hash_function; /* pointer to function which is used hashf_t s_hash_function; /* pointer to function which is used
......
...@@ -559,6 +559,7 @@ static void reiserfs_put_super(struct super_block *s) ...@@ -559,6 +559,7 @@ static void reiserfs_put_super(struct super_block *s)
reiserfs_write_unlock(s); reiserfs_write_unlock(s);
mutex_destroy(&REISERFS_SB(s)->lock); mutex_destroy(&REISERFS_SB(s)->lock);
destroy_workqueue(REISERFS_SB(s)->commit_wq);
kfree(s->s_fs_info); kfree(s->s_fs_info);
s->s_fs_info = NULL; s->s_fs_info = NULL;
} }
...@@ -1796,6 +1797,14 @@ static int reiserfs_fill_super(struct super_block *s, void *data, int silent) ...@@ -1796,6 +1797,14 @@ static int reiserfs_fill_super(struct super_block *s, void *data, int silent)
mutex_init(&sbi->lock); mutex_init(&sbi->lock);
sbi->lock_depth = -1; sbi->lock_depth = -1;
sbi->commit_wq = alloc_workqueue("reiserfs/%s", WQ_MEM_RECLAIM, 0,
s->s_id);
if (!sbi->commit_wq) {
SWARN(silent, s, "", "Cannot allocate commit workqueue");
errval = -ENOMEM;
goto error_unlocked;
}
jdev_name = NULL; jdev_name = NULL;
if (reiserfs_parse_options if (reiserfs_parse_options
(s, (char *)data, &(sbi->s_mount_opt), &blocks, &jdev_name, (s, (char *)data, &(sbi->s_mount_opt), &blocks, &jdev_name,
...@@ -2402,18 +2411,18 @@ static int __init init_reiserfs_fs(void) ...@@ -2402,18 +2411,18 @@ static int __init init_reiserfs_fs(void)
{ {
int ret; int ret;
if ((ret = init_inodecache())) { ret = init_inodecache();
if (ret)
return ret; return ret;
}
reiserfs_proc_info_global_init(); reiserfs_proc_info_global_init();
ret = register_filesystem(&reiserfs_fs_type); ret = register_filesystem(&reiserfs_fs_type);
if (ret)
goto out;
if (ret == 0) { return 0;
return 0; out:
}
reiserfs_proc_info_global_done(); reiserfs_proc_info_global_done();
destroy_inodecache(); destroy_inodecache();
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment