diff options
Diffstat (limited to 'fs/ext4/super.c')
-rw-r--r-- | fs/ext4/super.c | 38 |
1 files changed, 27 insertions, 11 deletions
diff --git a/fs/ext4/super.c b/fs/ext4/super.c index eac4d3081ba4..7c8e1713e203 100644 --- a/fs/ext4/super.c +++ b/fs/ext4/super.c | |||
@@ -750,8 +750,10 @@ static void ext4_put_super(struct super_block *sb) | |||
750 | ext4_unregister_li_request(sb); | 750 | ext4_unregister_li_request(sb); |
751 | dquot_disable(sb, -1, DQUOT_USAGE_ENABLED | DQUOT_LIMITS_ENABLED); | 751 | dquot_disable(sb, -1, DQUOT_USAGE_ENABLED | DQUOT_LIMITS_ENABLED); |
752 | 752 | ||
753 | flush_workqueue(sbi->dio_unwritten_wq); | 753 | flush_workqueue(sbi->unrsv_conversion_wq); |
754 | destroy_workqueue(sbi->dio_unwritten_wq); | 754 | flush_workqueue(sbi->rsv_conversion_wq); |
755 | destroy_workqueue(sbi->unrsv_conversion_wq); | ||
756 | destroy_workqueue(sbi->rsv_conversion_wq); | ||
755 | 757 | ||
756 | if (sbi->s_journal) { | 758 | if (sbi->s_journal) { |
757 | err = jbd2_journal_destroy(sbi->s_journal); | 759 | err = jbd2_journal_destroy(sbi->s_journal); |
@@ -859,13 +861,15 @@ static struct inode *ext4_alloc_inode(struct super_block *sb) | |||
859 | ei->i_reserved_quota = 0; | 861 | ei->i_reserved_quota = 0; |
860 | #endif | 862 | #endif |
861 | ei->jinode = NULL; | 863 | ei->jinode = NULL; |
862 | INIT_LIST_HEAD(&ei->i_completed_io_list); | 864 | INIT_LIST_HEAD(&ei->i_rsv_conversion_list); |
865 | INIT_LIST_HEAD(&ei->i_unrsv_conversion_list); | ||
863 | spin_lock_init(&ei->i_completed_io_lock); | 866 | spin_lock_init(&ei->i_completed_io_lock); |
864 | ei->i_sync_tid = 0; | 867 | ei->i_sync_tid = 0; |
865 | ei->i_datasync_tid = 0; | 868 | ei->i_datasync_tid = 0; |
866 | atomic_set(&ei->i_ioend_count, 0); | 869 | atomic_set(&ei->i_ioend_count, 0); |
867 | atomic_set(&ei->i_unwritten, 0); | 870 | atomic_set(&ei->i_unwritten, 0); |
868 | INIT_WORK(&ei->i_unwritten_work, ext4_end_io_work); | 871 | INIT_WORK(&ei->i_rsv_conversion_work, ext4_end_io_rsv_work); |
872 | INIT_WORK(&ei->i_unrsv_conversion_work, ext4_end_io_unrsv_work); | ||
869 | 873 | ||
870 | return &ei->vfs_inode; | 874 | return &ei->vfs_inode; |
871 | } | 875 | } |
@@ -3936,12 +3940,20 @@ no_journal: | |||
3936 | * The maximum number of concurrent works can be high and | 3940 | * The maximum number of concurrent works can be high and |
3937 | * concurrency isn't really necessary. Limit it to 1. | 3941 | * concurrency isn't really necessary. Limit it to 1. |
3938 | */ | 3942 | */ |
3939 | EXT4_SB(sb)->dio_unwritten_wq = | 3943 | EXT4_SB(sb)->rsv_conversion_wq = |
3940 | alloc_workqueue("ext4-dio-unwritten", WQ_MEM_RECLAIM | WQ_UNBOUND, 1); | 3944 | alloc_workqueue("ext4-rsv-conversion", WQ_MEM_RECLAIM | WQ_UNBOUND, 1); |
3941 | if (!EXT4_SB(sb)->dio_unwritten_wq) { | 3945 | if (!EXT4_SB(sb)->rsv_conversion_wq) { |
3942 | printk(KERN_ERR "EXT4-fs: failed to create DIO workqueue\n"); | 3946 | printk(KERN_ERR "EXT4-fs: failed to create workqueue\n"); |
3943 | ret = -ENOMEM; | 3947 | ret = -ENOMEM; |
3944 | goto failed_mount_wq; | 3948 | goto failed_mount4; |
3949 | } | ||
3950 | |||
3951 | EXT4_SB(sb)->unrsv_conversion_wq = | ||
3952 | alloc_workqueue("ext4-unrsv-conversion", WQ_MEM_RECLAIM | WQ_UNBOUND, 1); | ||
3953 | if (!EXT4_SB(sb)->unrsv_conversion_wq) { | ||
3954 | printk(KERN_ERR "EXT4-fs: failed to create workqueue\n"); | ||
3955 | ret = -ENOMEM; | ||
3956 | goto failed_mount4; | ||
3945 | } | 3957 | } |
3946 | 3958 | ||
3947 | /* | 3959 | /* |
@@ -4095,7 +4107,10 @@ failed_mount4a: | |||
4095 | sb->s_root = NULL; | 4107 | sb->s_root = NULL; |
4096 | failed_mount4: | 4108 | failed_mount4: |
4097 | ext4_msg(sb, KERN_ERR, "mount failed"); | 4109 | ext4_msg(sb, KERN_ERR, "mount failed"); |
4098 | destroy_workqueue(EXT4_SB(sb)->dio_unwritten_wq); | 4110 | if (EXT4_SB(sb)->rsv_conversion_wq) |
4111 | destroy_workqueue(EXT4_SB(sb)->rsv_conversion_wq); | ||
4112 | if (EXT4_SB(sb)->unrsv_conversion_wq) | ||
4113 | destroy_workqueue(EXT4_SB(sb)->unrsv_conversion_wq); | ||
4099 | failed_mount_wq: | 4114 | failed_mount_wq: |
4100 | if (sbi->s_journal) { | 4115 | if (sbi->s_journal) { |
4101 | jbd2_journal_destroy(sbi->s_journal); | 4116 | jbd2_journal_destroy(sbi->s_journal); |
@@ -4541,7 +4556,8 @@ static int ext4_sync_fs(struct super_block *sb, int wait) | |||
4541 | struct ext4_sb_info *sbi = EXT4_SB(sb); | 4556 | struct ext4_sb_info *sbi = EXT4_SB(sb); |
4542 | 4557 | ||
4543 | trace_ext4_sync_fs(sb, wait); | 4558 | trace_ext4_sync_fs(sb, wait); |
4544 | flush_workqueue(sbi->dio_unwritten_wq); | 4559 | flush_workqueue(sbi->rsv_conversion_wq); |
4560 | flush_workqueue(sbi->unrsv_conversion_wq); | ||
4545 | /* | 4561 | /* |
4546 | * Writeback quota in non-journalled quota case - journalled quota has | 4562 | * Writeback quota in non-journalled quota case - journalled quota has |
4547 | * no dirty dquots | 4563 | * no dirty dquots |