mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-30 03:27:44 -04:00
direct-io: Implement generic deferred AIO completions
Add support to the core direct-io code to defer AIO completions to user context using a workqueue. This replaces opencoded and less efficient code in XFS and ext4 (we save a memory allocation for each direct IO) and will be needed to properly support O_(D)SYNC for AIO. The communication between the filesystem and the direct I/O code requires a new buffer head flag, which is a bit ugly but not avoidable until the direct I/O code stops abusing the buffer_head structure for communicating with the filesystems. Currently this creates a per-superblock unbound workqueue for these completions, which is taken from an earlier patch by Jan Kara. I'm not really convinced about this use and would prefer a "normal" global workqueue with a high concurrency limit, but this needs further discussion. JK: Fixed ext4 part, dynamic allocation of the workqueue. Signed-off-by: Christoph Hellwig <[email protected]> Signed-off-by: Jan Kara <[email protected]> Signed-off-by: Al Viro <[email protected]>
This commit is contained in:
parent
4b6ccca701
commit
7b7a8665ed
11 changed files with 105 additions and 131 deletions
18
fs/super.c
18
fs/super.c
|
|
@ -152,15 +152,9 @@ static struct super_block *alloc_super(struct file_system_type *type, int flags)
|
|||
static const struct super_operations default_op;
|
||||
|
||||
if (s) {
|
||||
if (security_sb_alloc(s)) {
|
||||
/*
|
||||
* We cannot call security_sb_free() without
|
||||
* security_sb_alloc() succeeding. So bail out manually
|
||||
*/
|
||||
kfree(s);
|
||||
s = NULL;
|
||||
goto out;
|
||||
}
|
||||
if (security_sb_alloc(s))
|
||||
goto out_free_sb;
|
||||
|
||||
#ifdef CONFIG_SMP
|
||||
s->s_files = alloc_percpu(struct list_head);
|
||||
if (!s->s_files)
|
||||
|
|
@ -228,6 +222,7 @@ err_out:
|
|||
free_percpu(s->s_files);
|
||||
#endif
|
||||
destroy_sb_writers(s);
|
||||
out_free_sb:
|
||||
kfree(s);
|
||||
s = NULL;
|
||||
goto out;
|
||||
|
|
@ -414,6 +409,11 @@ void generic_shutdown_super(struct super_block *sb)
|
|||
|
||||
evict_inodes(sb);
|
||||
|
||||
if (sb->s_dio_done_wq) {
|
||||
destroy_workqueue(sb->s_dio_done_wq);
|
||||
sb->s_dio_done_wq = NULL;
|
||||
}
|
||||
|
||||
if (sop->put_super)
|
||||
sop->put_super(sb);
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue