Update fixes for making ext4 more robust against malicious images
[ext4-patch-queue.git] / remove-EXT4_STATE_DIOREAD_LOCK-flag
bloba0d1a4bbba3d6be3e1d4c425aaf3c0d86655cef2
1 ext4: remove EXT4_STATE_DIOREAD_LOCK flag
3 From: Nikolay Borisov <nborisov@suse.com>
5 Commit 16c54688592c ("ext4: Allow parallel DIO reads") reworked the way
6 locking happens around parallel dio reads. This resulted in obviating
7 the need for EXT4_STATE_DIOREAD_LOCK flag and accompanying logic.
8 Currently this amounts to dead code so let's remove it. No functional
9 changes
11 Signed-off-by: Nikolay Borisov <nborisov@suse.com>
12 Signed-off-by: Theodore Ts'o <tytso@mit.edu>
13 Reviewed-by: Jan Kara <jack@suse.cz>
14 ---
15  fs/ext4/ext4.h        | 17 -----------------
16  fs/ext4/extents.c     | 19 +++++--------------
17  fs/ext4/inode.c       |  8 --------
18  fs/ext4/ioctl.c       |  4 ----
19  fs/ext4/move_extent.c |  4 ----
20  fs/ext4/super.c       | 12 +++++-------
21  6 files changed, 10 insertions(+), 54 deletions(-)
23 diff --git a/fs/ext4/ext4.h b/fs/ext4/ext4.h
24 index 3241475a1733..a42e71203e53 100644
25 --- a/fs/ext4/ext4.h
26 +++ b/fs/ext4/ext4.h
27 @@ -1522,8 +1522,6 @@ enum {
28         EXT4_STATE_EXT_MIGRATE,         /* Inode is migrating */
29         EXT4_STATE_DIO_UNWRITTEN,       /* need convert on dio done*/
30         EXT4_STATE_NEWENTRY,            /* File just added to dir */
31 -       EXT4_STATE_DIOREAD_LOCK,        /* Disable support for dio read
32 -                                          nolocking */
33         EXT4_STATE_MAY_INLINE_DATA,     /* may have in-inode data */
34         EXT4_STATE_EXT_PRECACHED,       /* extents have been precached */
35         EXT4_STATE_LUSTRE_EA_INODE,     /* Lustre-style ea_inode */
36 @@ -3181,21 +3179,6 @@ static inline void set_bitmap_uptodate(struct buffer_head *bh)
37         set_bit(BH_BITMAP_UPTODATE, &(bh)->b_state);
38  }
40 -/*
41 - * Disable DIO read nolock optimization, so new dioreaders will be forced
42 - * to grab i_mutex
43 - */
44 -static inline void ext4_inode_block_unlocked_dio(struct inode *inode)
46 -       ext4_set_inode_state(inode, EXT4_STATE_DIOREAD_LOCK);
47 -       smp_mb();
49 -static inline void ext4_inode_resume_unlocked_dio(struct inode *inode)
51 -       smp_mb();
52 -       ext4_clear_inode_state(inode, EXT4_STATE_DIOREAD_LOCK);
55  #define in_range(b, first, len)        ((b) >= (first) && (b) <= (first) + (len) - 1)
57  /* For ioend & aio unwritten conversion wait queues */
58 diff --git a/fs/ext4/extents.c b/fs/ext4/extents.c
59 index 054416e9d827..837f0a6357c7 100644
60 --- a/fs/ext4/extents.c
61 +++ b/fs/ext4/extents.c
62 @@ -4796,7 +4796,6 @@ static long ext4_zero_range(struct file *file, loff_t offset,
63                 flags |= EXT4_GET_BLOCKS_KEEP_SIZE;
65         /* Wait all existing dio workers, newcomers will block on i_mutex */
66 -       ext4_inode_block_unlocked_dio(inode);
67         inode_dio_wait(inode);
69         /* Preallocate the range including the unaligned edges */
70 @@ -4807,7 +4806,7 @@ static long ext4_zero_range(struct file *file, loff_t offset,
71                                  round_down(offset, 1 << blkbits)) >> blkbits,
72                                 new_size, flags);
73                 if (ret)
74 -                       goto out_dio;
75 +                       goto out_mutex;
77         }
79 @@ -4824,7 +4823,7 @@ static long ext4_zero_range(struct file *file, loff_t offset,
80                 ret = ext4_update_disksize_before_punch(inode, offset, len);
81                 if (ret) {
82                         up_write(&EXT4_I(inode)->i_mmap_sem);
83 -                       goto out_dio;
84 +                       goto out_mutex;
85                 }
86                 /* Now release the pages and zero block aligned part of pages */
87                 truncate_pagecache_range(inode, start, end - 1);
88 @@ -4834,10 +4833,10 @@ static long ext4_zero_range(struct file *file, loff_t offset,
89                                              flags);
90                 up_write(&EXT4_I(inode)->i_mmap_sem);
91                 if (ret)
92 -                       goto out_dio;
93 +                       goto out_mutex;
94         }
95         if (!partial_begin && !partial_end)
96 -               goto out_dio;
97 +               goto out_mutex;
99         /*
100          * In worst case we have to writeout two nonadjacent unwritten
101 @@ -4850,7 +4849,7 @@ static long ext4_zero_range(struct file *file, loff_t offset,
102         if (IS_ERR(handle)) {
103                 ret = PTR_ERR(handle);
104                 ext4_std_error(inode->i_sb, ret);
105 -               goto out_dio;
106 +               goto out_mutex;
107         }
109         inode->i_mtime = inode->i_ctime = current_time(inode);
110 @@ -4875,8 +4874,6 @@ static long ext4_zero_range(struct file *file, loff_t offset,
111                 ext4_handle_sync(handle);
113         ext4_journal_stop(handle);
114 -out_dio:
115 -       ext4_inode_resume_unlocked_dio(inode);
116  out_mutex:
117         inode_unlock(inode);
118         return ret;
119 @@ -4964,11 +4961,9 @@ long ext4_fallocate(struct file *file, int mode, loff_t offset, loff_t len)
120         }
122         /* Wait all existing dio workers, newcomers will block on i_mutex */
123 -       ext4_inode_block_unlocked_dio(inode);
124         inode_dio_wait(inode);
126         ret = ext4_alloc_file_blocks(file, lblk, max_blocks, new_size, flags);
127 -       ext4_inode_resume_unlocked_dio(inode);
128         if (ret)
129                 goto out;
131 @@ -5485,7 +5480,6 @@ int ext4_collapse_range(struct inode *inode, loff_t offset, loff_t len)
132         }
134         /* Wait for existing dio to complete */
135 -       ext4_inode_block_unlocked_dio(inode);
136         inode_dio_wait(inode);
138         /*
139 @@ -5562,7 +5556,6 @@ int ext4_collapse_range(struct inode *inode, loff_t offset, loff_t len)
140         ext4_journal_stop(handle);
141  out_mmap:
142         up_write(&EXT4_I(inode)->i_mmap_sem);
143 -       ext4_inode_resume_unlocked_dio(inode);
144  out_mutex:
145         inode_unlock(inode);
146         return ret;
147 @@ -5635,7 +5628,6 @@ int ext4_insert_range(struct inode *inode, loff_t offset, loff_t len)
148         }
150         /* Wait for existing dio to complete */
151 -       ext4_inode_block_unlocked_dio(inode);
152         inode_dio_wait(inode);
154         /*
155 @@ -5737,7 +5729,6 @@ int ext4_insert_range(struct inode *inode, loff_t offset, loff_t len)
156         ext4_journal_stop(handle);
157  out_mmap:
158         up_write(&EXT4_I(inode)->i_mmap_sem);
159 -       ext4_inode_resume_unlocked_dio(inode);
160  out_mutex:
161         inode_unlock(inode);
162         return ret;
163 diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c
164 index c94780075b04..7d285e79fd9f 100644
165 --- a/fs/ext4/inode.c
166 +++ b/fs/ext4/inode.c
167 @@ -4251,7 +4251,6 @@ int ext4_punch_hole(struct inode *inode, loff_t offset, loff_t length)
168         }
170         /* Wait all existing dio workers, newcomers will block on i_mutex */
171 -       ext4_inode_block_unlocked_dio(inode);
172         inode_dio_wait(inode);
174         /*
175 @@ -4324,7 +4323,6 @@ int ext4_punch_hole(struct inode *inode, loff_t offset, loff_t length)
176         ext4_journal_stop(handle);
177  out_dio:
178         up_write(&EXT4_I(inode)->i_mmap_sem);
179 -       ext4_inode_resume_unlocked_dio(inode);
180  out_mutex:
181         inode_unlock(inode);
182         return ret;
183 @@ -5506,9 +5504,7 @@ int ext4_setattr(struct dentry *dentry, struct iattr *attr)
184                  */
185                 if (orphan) {
186                         if (!ext4_should_journal_data(inode)) {
187 -                               ext4_inode_block_unlocked_dio(inode);
188                                 inode_dio_wait(inode);
189 -                               ext4_inode_resume_unlocked_dio(inode);
190                         } else
191                                 ext4_wait_for_tail_page_commit(inode);
192                 }
193 @@ -5999,7 +5995,6 @@ int ext4_change_inode_journal_flag(struct inode *inode, int val)
194                 return -EROFS;
196         /* Wait for all existing dio workers */
197 -       ext4_inode_block_unlocked_dio(inode);
198         inode_dio_wait(inode);
200         /*
201 @@ -6015,7 +6010,6 @@ int ext4_change_inode_journal_flag(struct inode *inode, int val)
202                 err = filemap_write_and_wait(inode->i_mapping);
203                 if (err < 0) {
204                         up_write(&EXT4_I(inode)->i_mmap_sem);
205 -                       ext4_inode_resume_unlocked_dio(inode);
206                         return err;
207                 }
208         }
209 @@ -6038,7 +6032,6 @@ int ext4_change_inode_journal_flag(struct inode *inode, int val)
210                 if (err < 0) {
211                         jbd2_journal_unlock_updates(journal);
212                         percpu_up_write(&sbi->s_journal_flag_rwsem);
213 -                       ext4_inode_resume_unlocked_dio(inode);
214                         return err;
215                 }
216                 ext4_clear_inode_flag(inode, EXT4_INODE_JOURNAL_DATA);
217 @@ -6050,7 +6043,6 @@ int ext4_change_inode_journal_flag(struct inode *inode, int val)
219         if (val)
220                 up_write(&EXT4_I(inode)->i_mmap_sem);
221 -       ext4_inode_resume_unlocked_dio(inode);
223         /* Finally we can mark the inode as dirty. */
225 diff --git a/fs/ext4/ioctl.c b/fs/ext4/ioctl.c
226 index 7e99ad02f1ba..3644e31ba347 100644
227 --- a/fs/ext4/ioctl.c
228 +++ b/fs/ext4/ioctl.c
229 @@ -124,8 +124,6 @@ static long swap_inode_boot_loader(struct super_block *sb,
230         truncate_inode_pages(&inode_bl->i_data, 0);
232         /* Wait for all existing dio workers */
233 -       ext4_inode_block_unlocked_dio(inode);
234 -       ext4_inode_block_unlocked_dio(inode_bl);
235         inode_dio_wait(inode);
236         inode_dio_wait(inode_bl);
238 @@ -186,8 +184,6 @@ static long swap_inode_boot_loader(struct super_block *sb,
239         ext4_double_up_write_data_sem(inode, inode_bl);
241  journal_err_out:
242 -       ext4_inode_resume_unlocked_dio(inode);
243 -       ext4_inode_resume_unlocked_dio(inode_bl);
244         unlock_two_nondirectories(inode, inode_bl);
245         iput(inode_bl);
246         return err;
247 diff --git a/fs/ext4/move_extent.c b/fs/ext4/move_extent.c
248 index b96e4bd3b3ec..8e17efdcbf11 100644
249 --- a/fs/ext4/move_extent.c
250 +++ b/fs/ext4/move_extent.c
251 @@ -601,8 +601,6 @@ ext4_move_extents(struct file *o_filp, struct file *d_filp, __u64 orig_blk,
252         lock_two_nondirectories(orig_inode, donor_inode);
254         /* Wait for all existing dio workers */
255 -       ext4_inode_block_unlocked_dio(orig_inode);
256 -       ext4_inode_block_unlocked_dio(donor_inode);
257         inode_dio_wait(orig_inode);
258         inode_dio_wait(donor_inode);
260 @@ -693,8 +691,6 @@ ext4_move_extents(struct file *o_filp, struct file *d_filp, __u64 orig_blk,
261         ext4_ext_drop_refs(path);
262         kfree(path);
263         ext4_double_up_write_data_sem(orig_inode, donor_inode);
264 -       ext4_inode_resume_unlocked_dio(orig_inode);
265 -       ext4_inode_resume_unlocked_dio(donor_inode);
266         unlock_two_nondirectories(orig_inode, donor_inode);
268         return ret;
269 diff --git a/fs/ext4/super.c b/fs/ext4/super.c
270 index 39bf464c35f1..8781f8afbe50 100644
271 --- a/fs/ext4/super.c
272 +++ b/fs/ext4/super.c
273 @@ -101,15 +101,13 @@ static struct inode *ext4_get_journal_inode(struct super_block *sb,
274   *   i_data_sem (rw)
275   *
276   * truncate:
277 - * sb_start_write -> i_mutex -> EXT4_STATE_DIOREAD_LOCK (w) -> i_mmap_sem (w) ->
278 - *   i_mmap_rwsem (w) -> page lock
279 - * sb_start_write -> i_mutex -> EXT4_STATE_DIOREAD_LOCK (w) -> i_mmap_sem (w) ->
280 - *   transaction start -> i_data_sem (rw)
281 + * sb_start_write -> i_mutex -> i_mmap_sem (w) -> i_mmap_rwsem (w) -> page lock
282 + * sb_start_write -> i_mutex -> i_mmap_sem (w) -> transaction start ->
283 + *   i_data_sem (rw)
284   *
285   * direct IO:
286 - * sb_start_write -> i_mutex -> EXT4_STATE_DIOREAD_LOCK (r) -> mmap_sem
287 - * sb_start_write -> i_mutex -> EXT4_STATE_DIOREAD_LOCK (r) ->
288 - *   transaction start -> i_data_sem (rw)
289 + * sb_start_write -> i_mutex -> mmap_sem
290 + * sb_start_write -> i_mutex -> transaction start -> i_data_sem (rw)
291   *
292   * writepages:
293   * transaction start -> page lock(s) -> i_data_sem (rw)
294 -- 
295 2.7.4