.. | .. |
---|
43 | 43 | #include <linux/uaccess.h> |
---|
44 | 44 | #include <linux/iversion.h> |
---|
45 | 45 | #include <linux/unicode.h> |
---|
46 | | - |
---|
| 46 | +#include <linux/part_stat.h> |
---|
47 | 47 | #include <linux/kthread.h> |
---|
48 | 48 | #include <linux/freezer.h> |
---|
49 | 49 | |
---|
.. | .. |
---|
93 | 93 | * i_mmap_rwsem (inode->i_mmap_rwsem)! |
---|
94 | 94 | * |
---|
95 | 95 | * page fault path: |
---|
96 | | - * mmap_sem -> sb_start_pagefault -> i_mmap_sem (r) -> transaction start -> |
---|
| 96 | + * mmap_lock -> sb_start_pagefault -> i_mmap_sem (r) -> transaction start -> |
---|
97 | 97 | * page lock -> i_data_sem (rw) |
---|
98 | 98 | * |
---|
99 | 99 | * buffered write path: |
---|
100 | | - * sb_start_write -> i_mutex -> mmap_sem |
---|
| 100 | + * sb_start_write -> i_mutex -> mmap_lock |
---|
101 | 101 | * sb_start_write -> i_mutex -> transaction start -> page lock -> |
---|
102 | 102 | * i_data_sem (rw) |
---|
103 | 103 | * |
---|
.. | .. |
---|
107 | 107 | * i_data_sem (rw) |
---|
108 | 108 | * |
---|
109 | 109 | * direct IO: |
---|
110 | | - * sb_start_write -> i_mutex -> mmap_sem |
---|
| 110 | + * sb_start_write -> i_mutex -> mmap_lock |
---|
111 | 111 | * sb_start_write -> i_mutex -> transaction start -> i_data_sem (rw) |
---|
112 | 112 | * |
---|
113 | 113 | * writepages: |
---|
.. | .. |
---|
141 | 141 | MODULE_ALIAS("ext3"); |
---|
142 | 142 | #define IS_EXT3_SB(sb) ((sb)->s_bdev->bd_holder == &ext3_fs_type) |
---|
143 | 143 | |
---|
| 144 | + |
---|
| 145 | +static inline void __ext4_read_bh(struct buffer_head *bh, int op_flags, |
---|
| 146 | + bh_end_io_t *end_io) |
---|
| 147 | +{ |
---|
| 148 | + /* |
---|
| 149 | + * buffer's verified bit is no longer valid after reading from |
---|
| 150 | + * disk again due to write out error, clear it to make sure we |
---|
| 151 | + * recheck the buffer contents. |
---|
| 152 | + */ |
---|
| 153 | + clear_buffer_verified(bh); |
---|
| 154 | + |
---|
| 155 | + bh->b_end_io = end_io ? end_io : end_buffer_read_sync; |
---|
| 156 | + get_bh(bh); |
---|
| 157 | + submit_bh(REQ_OP_READ, op_flags, bh); |
---|
| 158 | +} |
---|
| 159 | + |
---|
| 160 | +void ext4_read_bh_nowait(struct buffer_head *bh, int op_flags, |
---|
| 161 | + bh_end_io_t *end_io) |
---|
| 162 | +{ |
---|
| 163 | + BUG_ON(!buffer_locked(bh)); |
---|
| 164 | + |
---|
| 165 | + if (ext4_buffer_uptodate(bh)) { |
---|
| 166 | + unlock_buffer(bh); |
---|
| 167 | + return; |
---|
| 168 | + } |
---|
| 169 | + __ext4_read_bh(bh, op_flags, end_io); |
---|
| 170 | +} |
---|
| 171 | + |
---|
| 172 | +int ext4_read_bh(struct buffer_head *bh, int op_flags, bh_end_io_t *end_io) |
---|
| 173 | +{ |
---|
| 174 | + BUG_ON(!buffer_locked(bh)); |
---|
| 175 | + |
---|
| 176 | + if (ext4_buffer_uptodate(bh)) { |
---|
| 177 | + unlock_buffer(bh); |
---|
| 178 | + return 0; |
---|
| 179 | + } |
---|
| 180 | + |
---|
| 181 | + __ext4_read_bh(bh, op_flags, end_io); |
---|
| 182 | + |
---|
| 183 | + wait_on_buffer(bh); |
---|
| 184 | + if (buffer_uptodate(bh)) |
---|
| 185 | + return 0; |
---|
| 186 | + return -EIO; |
---|
| 187 | +} |
---|
| 188 | + |
---|
| 189 | +int ext4_read_bh_lock(struct buffer_head *bh, int op_flags, bool wait) |
---|
| 190 | +{ |
---|
| 191 | + lock_buffer(bh); |
---|
| 192 | + if (!wait) { |
---|
| 193 | + ext4_read_bh_nowait(bh, op_flags, NULL); |
---|
| 194 | + return 0; |
---|
| 195 | + } |
---|
| 196 | + return ext4_read_bh(bh, op_flags, NULL); |
---|
| 197 | +} |
---|
| 198 | + |
---|
144 | 199 | /* |
---|
145 | | - * This works like sb_bread() except it uses ERR_PTR for error |
---|
| 200 | + * This works like __bread_gfp() except it uses ERR_PTR for error |
---|
146 | 201 | * returns. Currently with sb_bread it's impossible to distinguish |
---|
147 | 202 | * between ENOMEM and EIO situations (since both result in a NULL |
---|
148 | 203 | * return. |
---|
149 | 204 | */ |
---|
150 | | -struct buffer_head * |
---|
151 | | -ext4_sb_bread(struct super_block *sb, sector_t block, int op_flags) |
---|
| 205 | +static struct buffer_head *__ext4_sb_bread_gfp(struct super_block *sb, |
---|
| 206 | + sector_t block, int op_flags, |
---|
| 207 | + gfp_t gfp) |
---|
152 | 208 | { |
---|
153 | | - struct buffer_head *bh = sb_getblk(sb, block); |
---|
| 209 | + struct buffer_head *bh; |
---|
| 210 | + int ret; |
---|
154 | 211 | |
---|
| 212 | + bh = sb_getblk_gfp(sb, block, gfp); |
---|
155 | 213 | if (bh == NULL) |
---|
156 | 214 | return ERR_PTR(-ENOMEM); |
---|
157 | | - if (buffer_uptodate(bh)) |
---|
| 215 | + if (ext4_buffer_uptodate(bh)) |
---|
158 | 216 | return bh; |
---|
159 | | - ll_rw_block(REQ_OP_READ, REQ_META | op_flags, 1, &bh); |
---|
160 | | - wait_on_buffer(bh); |
---|
161 | | - if (buffer_uptodate(bh)) |
---|
162 | | - return bh; |
---|
163 | | - put_bh(bh); |
---|
164 | | - return ERR_PTR(-EIO); |
---|
| 217 | + |
---|
| 218 | + ret = ext4_read_bh_lock(bh, REQ_META | op_flags, true); |
---|
| 219 | + if (ret) { |
---|
| 220 | + put_bh(bh); |
---|
| 221 | + return ERR_PTR(ret); |
---|
| 222 | + } |
---|
| 223 | + return bh; |
---|
| 224 | +} |
---|
| 225 | + |
---|
| 226 | +struct buffer_head *ext4_sb_bread(struct super_block *sb, sector_t block, |
---|
| 227 | + int op_flags) |
---|
| 228 | +{ |
---|
| 229 | + return __ext4_sb_bread_gfp(sb, block, op_flags, __GFP_MOVABLE); |
---|
| 230 | +} |
---|
| 231 | + |
---|
| 232 | +struct buffer_head *ext4_sb_bread_unmovable(struct super_block *sb, |
---|
| 233 | + sector_t block) |
---|
| 234 | +{ |
---|
| 235 | + return __ext4_sb_bread_gfp(sb, block, 0, 0); |
---|
| 236 | +} |
---|
| 237 | + |
---|
| 238 | +void ext4_sb_breadahead_unmovable(struct super_block *sb, sector_t block) |
---|
| 239 | +{ |
---|
| 240 | + struct buffer_head *bh = sb_getblk_gfp(sb, block, 0); |
---|
| 241 | + |
---|
| 242 | + if (likely(bh)) { |
---|
| 243 | + if (trylock_buffer(bh)) |
---|
| 244 | + ext4_read_bh_nowait(bh, REQ_RAHEAD, NULL); |
---|
| 245 | + brelse(bh); |
---|
| 246 | + } |
---|
165 | 247 | } |
---|
166 | 248 | |
---|
167 | 249 | static int ext4_verify_csum_type(struct super_block *sb, |
---|
.. | .. |
---|
202 | 284 | return; |
---|
203 | 285 | |
---|
204 | 286 | es->s_checksum = ext4_superblock_csum(sb, es); |
---|
205 | | -} |
---|
206 | | - |
---|
207 | | -void *ext4_kvmalloc(size_t size, gfp_t flags) |
---|
208 | | -{ |
---|
209 | | - void *ret; |
---|
210 | | - |
---|
211 | | - ret = kmalloc(size, flags | __GFP_NOWARN); |
---|
212 | | - if (!ret) |
---|
213 | | - ret = __vmalloc(size, flags, PAGE_KERNEL); |
---|
214 | | - return ret; |
---|
215 | | -} |
---|
216 | | - |
---|
217 | | -void *ext4_kvzalloc(size_t size, gfp_t flags) |
---|
218 | | -{ |
---|
219 | | - void *ret; |
---|
220 | | - |
---|
221 | | - ret = kzalloc(size, flags | __GFP_NOWARN); |
---|
222 | | - if (!ret) |
---|
223 | | - ret = __vmalloc(size, flags | __GFP_ZERO, PAGE_KERNEL); |
---|
224 | | - return ret; |
---|
225 | 287 | } |
---|
226 | 288 | |
---|
227 | 289 | ext4_fsblk_t ext4_block_bitmap(struct super_block *sb, |
---|
.. | .. |
---|
355 | 417 | #define ext4_get_tstamp(es, tstamp) \ |
---|
356 | 418 | __ext4_get_tstamp(&(es)->tstamp, &(es)->tstamp ## _hi) |
---|
357 | 419 | |
---|
358 | | -static void __save_error_info(struct super_block *sb, const char *func, |
---|
359 | | - unsigned int line) |
---|
360 | | -{ |
---|
361 | | - struct ext4_super_block *es = EXT4_SB(sb)->s_es; |
---|
362 | | - |
---|
363 | | - EXT4_SB(sb)->s_mount_state |= EXT4_ERROR_FS; |
---|
364 | | - if (bdev_read_only(sb->s_bdev)) |
---|
365 | | - return; |
---|
366 | | - es->s_state |= cpu_to_le16(EXT4_ERROR_FS); |
---|
367 | | - ext4_update_tstamp(es, s_last_error_time); |
---|
368 | | - strncpy(es->s_last_error_func, func, sizeof(es->s_last_error_func)); |
---|
369 | | - es->s_last_error_line = cpu_to_le32(line); |
---|
370 | | - if (!es->s_first_error_time) { |
---|
371 | | - es->s_first_error_time = es->s_last_error_time; |
---|
372 | | - es->s_first_error_time_hi = es->s_last_error_time_hi; |
---|
373 | | - strncpy(es->s_first_error_func, func, |
---|
374 | | - sizeof(es->s_first_error_func)); |
---|
375 | | - es->s_first_error_line = cpu_to_le32(line); |
---|
376 | | - es->s_first_error_ino = es->s_last_error_ino; |
---|
377 | | - es->s_first_error_block = es->s_last_error_block; |
---|
378 | | - } |
---|
379 | | - /* |
---|
380 | | - * Start the daily error reporting function if it hasn't been |
---|
381 | | - * started already |
---|
382 | | - */ |
---|
383 | | - if (!es->s_error_count) |
---|
384 | | - mod_timer(&EXT4_SB(sb)->s_err_report, jiffies + 24*60*60*HZ); |
---|
385 | | - le32_add_cpu(&es->s_error_count, 1); |
---|
386 | | -} |
---|
387 | | - |
---|
388 | | -static void save_error_info(struct super_block *sb, const char *func, |
---|
389 | | - unsigned int line) |
---|
390 | | -{ |
---|
391 | | - __save_error_info(sb, func, line); |
---|
392 | | - if (!bdev_read_only(sb->s_bdev)) |
---|
393 | | - ext4_commit_super(sb, 1); |
---|
394 | | -} |
---|
395 | | - |
---|
396 | 420 | /* |
---|
397 | 421 | * The del_gendisk() function uninitializes the disk-specific data |
---|
398 | 422 | * structures, including the bdi structure, without telling anyone |
---|
.. | .. |
---|
432 | 456 | spin_unlock(&sbi->s_md_lock); |
---|
433 | 457 | } |
---|
434 | 458 | |
---|
| 459 | +/* |
---|
| 460 | + * This writepage callback for write_cache_pages() |
---|
| 461 | + * takes care of a few cases after page cleaning. |
---|
| 462 | + * |
---|
| 463 | + * write_cache_pages() already checks for dirty pages |
---|
| 464 | + * and calls clear_page_dirty_for_io(), which we want, |
---|
| 465 | + * to write protect the pages. |
---|
| 466 | + * |
---|
| 467 | + * However, we may have to redirty a page (see below.) |
---|
| 468 | + */ |
---|
| 469 | +static int ext4_journalled_writepage_callback(struct page *page, |
---|
| 470 | + struct writeback_control *wbc, |
---|
| 471 | + void *data) |
---|
| 472 | +{ |
---|
| 473 | + transaction_t *transaction = (transaction_t *) data; |
---|
| 474 | + struct buffer_head *bh, *head; |
---|
| 475 | + struct journal_head *jh; |
---|
| 476 | + |
---|
| 477 | + bh = head = page_buffers(page); |
---|
| 478 | + do { |
---|
| 479 | + /* |
---|
| 480 | + * We have to redirty a page in these cases: |
---|
| 481 | + * 1) If buffer is dirty, it means the page was dirty because it |
---|
| 482 | + * contains a buffer that needs checkpointing. So the dirty bit |
---|
| 483 | + * needs to be preserved so that checkpointing writes the buffer |
---|
| 484 | + * properly. |
---|
| 485 | + * 2) If buffer is not part of the committing transaction |
---|
| 486 | + * (we may have just accidentally come across this buffer because |
---|
| 487 | + * inode range tracking is not exact) or if the currently running |
---|
| 488 | + * transaction already contains this buffer as well, dirty bit |
---|
| 489 | + * needs to be preserved so that the buffer gets writeprotected |
---|
| 490 | + * properly on running transaction's commit. |
---|
| 491 | + */ |
---|
| 492 | + jh = bh2jh(bh); |
---|
| 493 | + if (buffer_dirty(bh) || |
---|
| 494 | + (jh && (jh->b_transaction != transaction || |
---|
| 495 | + jh->b_next_transaction))) { |
---|
| 496 | + redirty_page_for_writepage(wbc, page); |
---|
| 497 | + goto out; |
---|
| 498 | + } |
---|
| 499 | + } while ((bh = bh->b_this_page) != head); |
---|
| 500 | + |
---|
| 501 | +out: |
---|
| 502 | + return AOP_WRITEPAGE_ACTIVATE; |
---|
| 503 | +} |
---|
| 504 | + |
---|
| 505 | +static int ext4_journalled_submit_inode_data_buffers(struct jbd2_inode *jinode) |
---|
| 506 | +{ |
---|
| 507 | + struct address_space *mapping = jinode->i_vfs_inode->i_mapping; |
---|
| 508 | + struct writeback_control wbc = { |
---|
| 509 | + .sync_mode = WB_SYNC_ALL, |
---|
| 510 | + .nr_to_write = LONG_MAX, |
---|
| 511 | + .range_start = jinode->i_dirty_start, |
---|
| 512 | + .range_end = jinode->i_dirty_end, |
---|
| 513 | + }; |
---|
| 514 | + |
---|
| 515 | + return write_cache_pages(mapping, &wbc, |
---|
| 516 | + ext4_journalled_writepage_callback, |
---|
| 517 | + jinode->i_transaction); |
---|
| 518 | +} |
---|
| 519 | + |
---|
| 520 | +static int ext4_journal_submit_inode_data_buffers(struct jbd2_inode *jinode) |
---|
| 521 | +{ |
---|
| 522 | + int ret; |
---|
| 523 | + |
---|
| 524 | + if (ext4_should_journal_data(jinode->i_vfs_inode)) |
---|
| 525 | + ret = ext4_journalled_submit_inode_data_buffers(jinode); |
---|
| 526 | + else |
---|
| 527 | + ret = jbd2_journal_submit_inode_data_buffers(jinode); |
---|
| 528 | + |
---|
| 529 | + return ret; |
---|
| 530 | +} |
---|
| 531 | + |
---|
| 532 | +static int ext4_journal_finish_inode_data_buffers(struct jbd2_inode *jinode) |
---|
| 533 | +{ |
---|
| 534 | + int ret = 0; |
---|
| 535 | + |
---|
| 536 | + if (!ext4_should_journal_data(jinode->i_vfs_inode)) |
---|
| 537 | + ret = jbd2_journal_finish_inode_data_buffers(jinode); |
---|
| 538 | + |
---|
| 539 | + return ret; |
---|
| 540 | +} |
---|
| 541 | + |
---|
435 | 542 | static bool system_going_down(void) |
---|
436 | 543 | { |
---|
437 | 544 | return system_state == SYSTEM_HALT || system_state == SYSTEM_POWER_OFF |
---|
438 | 545 | || system_state == SYSTEM_RESTART; |
---|
| 546 | +} |
---|
| 547 | + |
---|
| 548 | +struct ext4_err_translation { |
---|
| 549 | + int code; |
---|
| 550 | + int errno; |
---|
| 551 | +}; |
---|
| 552 | + |
---|
| 553 | +#define EXT4_ERR_TRANSLATE(err) { .code = EXT4_ERR_##err, .errno = err } |
---|
| 554 | + |
---|
| 555 | +static struct ext4_err_translation err_translation[] = { |
---|
| 556 | + EXT4_ERR_TRANSLATE(EIO), |
---|
| 557 | + EXT4_ERR_TRANSLATE(ENOMEM), |
---|
| 558 | + EXT4_ERR_TRANSLATE(EFSBADCRC), |
---|
| 559 | + EXT4_ERR_TRANSLATE(EFSCORRUPTED), |
---|
| 560 | + EXT4_ERR_TRANSLATE(ENOSPC), |
---|
| 561 | + EXT4_ERR_TRANSLATE(ENOKEY), |
---|
| 562 | + EXT4_ERR_TRANSLATE(EROFS), |
---|
| 563 | + EXT4_ERR_TRANSLATE(EFBIG), |
---|
| 564 | + EXT4_ERR_TRANSLATE(EEXIST), |
---|
| 565 | + EXT4_ERR_TRANSLATE(ERANGE), |
---|
| 566 | + EXT4_ERR_TRANSLATE(EOVERFLOW), |
---|
| 567 | + EXT4_ERR_TRANSLATE(EBUSY), |
---|
| 568 | + EXT4_ERR_TRANSLATE(ENOTDIR), |
---|
| 569 | + EXT4_ERR_TRANSLATE(ENOTEMPTY), |
---|
| 570 | + EXT4_ERR_TRANSLATE(ESHUTDOWN), |
---|
| 571 | + EXT4_ERR_TRANSLATE(EFAULT), |
---|
| 572 | +}; |
---|
| 573 | + |
---|
| 574 | +static int ext4_errno_to_code(int errno) |
---|
| 575 | +{ |
---|
| 576 | + int i; |
---|
| 577 | + |
---|
| 578 | + for (i = 0; i < ARRAY_SIZE(err_translation); i++) |
---|
| 579 | + if (err_translation[i].errno == errno) |
---|
| 580 | + return err_translation[i].code; |
---|
| 581 | + return EXT4_ERR_UNKNOWN; |
---|
| 582 | +} |
---|
| 583 | + |
---|
| 584 | +static void __save_error_info(struct super_block *sb, int error, |
---|
| 585 | + __u32 ino, __u64 block, |
---|
| 586 | + const char *func, unsigned int line) |
---|
| 587 | +{ |
---|
| 588 | + struct ext4_super_block *es = EXT4_SB(sb)->s_es; |
---|
| 589 | + |
---|
| 590 | + EXT4_SB(sb)->s_mount_state |= EXT4_ERROR_FS; |
---|
| 591 | + if (bdev_read_only(sb->s_bdev)) |
---|
| 592 | + return; |
---|
| 593 | + /* We default to EFSCORRUPTED error... */ |
---|
| 594 | + if (error == 0) |
---|
| 595 | + error = EFSCORRUPTED; |
---|
| 596 | + es->s_state |= cpu_to_le16(EXT4_ERROR_FS); |
---|
| 597 | + ext4_update_tstamp(es, s_last_error_time); |
---|
| 598 | + strncpy(es->s_last_error_func, func, sizeof(es->s_last_error_func)); |
---|
| 599 | + es->s_last_error_line = cpu_to_le32(line); |
---|
| 600 | + es->s_last_error_ino = cpu_to_le32(ino); |
---|
| 601 | + es->s_last_error_block = cpu_to_le64(block); |
---|
| 602 | + es->s_last_error_errcode = ext4_errno_to_code(error); |
---|
| 603 | + if (!es->s_first_error_time) { |
---|
| 604 | + es->s_first_error_time = es->s_last_error_time; |
---|
| 605 | + es->s_first_error_time_hi = es->s_last_error_time_hi; |
---|
| 606 | + strncpy(es->s_first_error_func, func, |
---|
| 607 | + sizeof(es->s_first_error_func)); |
---|
| 608 | + es->s_first_error_line = cpu_to_le32(line); |
---|
| 609 | + es->s_first_error_ino = es->s_last_error_ino; |
---|
| 610 | + es->s_first_error_block = es->s_last_error_block; |
---|
| 611 | + es->s_first_error_errcode = es->s_last_error_errcode; |
---|
| 612 | + } |
---|
| 613 | + /* |
---|
| 614 | + * Start the daily error reporting function if it hasn't been |
---|
| 615 | + * started already |
---|
| 616 | + */ |
---|
| 617 | + if (!es->s_error_count) |
---|
| 618 | + mod_timer(&EXT4_SB(sb)->s_err_report, jiffies + 24*60*60*HZ); |
---|
| 619 | + le32_add_cpu(&es->s_error_count, 1); |
---|
| 620 | +} |
---|
| 621 | + |
---|
| 622 | +static void save_error_info(struct super_block *sb, int error, |
---|
| 623 | + __u32 ino, __u64 block, |
---|
| 624 | + const char *func, unsigned int line) |
---|
| 625 | +{ |
---|
| 626 | + __save_error_info(sb, error, ino, block, func, line); |
---|
| 627 | + if (!bdev_read_only(sb->s_bdev)) |
---|
| 628 | + ext4_commit_super(sb, 1); |
---|
439 | 629 | } |
---|
440 | 630 | |
---|
441 | 631 | /* Deal with the reporting of failure conditions on a filesystem such as |
---|
.. | .. |
---|
463 | 653 | if (sb_rdonly(sb) || test_opt(sb, ERRORS_CONT)) |
---|
464 | 654 | return; |
---|
465 | 655 | |
---|
466 | | - EXT4_SB(sb)->s_mount_flags |= EXT4_MF_FS_ABORTED; |
---|
| 656 | + ext4_set_mount_flag(sb, EXT4_MF_FS_ABORTED); |
---|
467 | 657 | if (journal) |
---|
468 | 658 | jbd2_journal_abort(journal, -EIO); |
---|
469 | 659 | /* |
---|
.. | .. |
---|
480 | 670 | smp_wmb(); |
---|
481 | 671 | sb->s_flags |= SB_RDONLY; |
---|
482 | 672 | } else if (test_opt(sb, ERRORS_PANIC)) { |
---|
483 | | - if (EXT4_SB(sb)->s_journal && |
---|
484 | | - !(EXT4_SB(sb)->s_journal->j_flags & JBD2_REC_ERR)) |
---|
485 | | - return; |
---|
486 | 673 | panic("EXT4-fs (device %s): panic forced after error\n", |
---|
487 | 674 | sb->s_id); |
---|
488 | 675 | } |
---|
.. | .. |
---|
493 | 680 | "EXT4-fs error") |
---|
494 | 681 | |
---|
495 | 682 | void __ext4_error(struct super_block *sb, const char *function, |
---|
496 | | - unsigned int line, const char *fmt, ...) |
---|
| 683 | + unsigned int line, int error, __u64 block, |
---|
| 684 | + const char *fmt, ...) |
---|
497 | 685 | { |
---|
498 | 686 | struct va_format vaf; |
---|
499 | 687 | va_list args; |
---|
.. | .. |
---|
511 | 699 | sb->s_id, function, line, current->comm, &vaf); |
---|
512 | 700 | va_end(args); |
---|
513 | 701 | } |
---|
514 | | - save_error_info(sb, function, line); |
---|
| 702 | + save_error_info(sb, error, 0, block, function, line); |
---|
515 | 703 | ext4_handle_error(sb); |
---|
516 | 704 | } |
---|
517 | 705 | |
---|
518 | 706 | void __ext4_error_inode(struct inode *inode, const char *function, |
---|
519 | | - unsigned int line, ext4_fsblk_t block, |
---|
| 707 | + unsigned int line, ext4_fsblk_t block, int error, |
---|
520 | 708 | const char *fmt, ...) |
---|
521 | 709 | { |
---|
522 | 710 | va_list args; |
---|
523 | 711 | struct va_format vaf; |
---|
524 | | - struct ext4_super_block *es = EXT4_SB(inode->i_sb)->s_es; |
---|
525 | 712 | |
---|
526 | 713 | if (unlikely(ext4_forced_shutdown(EXT4_SB(inode->i_sb)))) |
---|
527 | 714 | return; |
---|
528 | 715 | |
---|
529 | 716 | trace_ext4_error(inode->i_sb, function, line); |
---|
530 | | - es->s_last_error_ino = cpu_to_le32(inode->i_ino); |
---|
531 | | - es->s_last_error_block = cpu_to_le64(block); |
---|
532 | 717 | if (ext4_error_ratelimit(inode->i_sb)) { |
---|
533 | 718 | va_start(args, fmt); |
---|
534 | 719 | vaf.fmt = fmt; |
---|
.. | .. |
---|
545 | 730 | current->comm, &vaf); |
---|
546 | 731 | va_end(args); |
---|
547 | 732 | } |
---|
548 | | - save_error_info(inode->i_sb, function, line); |
---|
| 733 | + save_error_info(inode->i_sb, error, inode->i_ino, block, |
---|
| 734 | + function, line); |
---|
549 | 735 | ext4_handle_error(inode->i_sb); |
---|
550 | 736 | } |
---|
551 | 737 | |
---|
.. | .. |
---|
555 | 741 | { |
---|
556 | 742 | va_list args; |
---|
557 | 743 | struct va_format vaf; |
---|
558 | | - struct ext4_super_block *es; |
---|
559 | 744 | struct inode *inode = file_inode(file); |
---|
560 | 745 | char pathname[80], *path; |
---|
561 | 746 | |
---|
.. | .. |
---|
563 | 748 | return; |
---|
564 | 749 | |
---|
565 | 750 | trace_ext4_error(inode->i_sb, function, line); |
---|
566 | | - es = EXT4_SB(inode->i_sb)->s_es; |
---|
567 | | - es->s_last_error_ino = cpu_to_le32(inode->i_ino); |
---|
568 | 751 | if (ext4_error_ratelimit(inode->i_sb)) { |
---|
569 | 752 | path = file_path(file, pathname, sizeof(pathname)); |
---|
570 | 753 | if (IS_ERR(path)) |
---|
.. | .. |
---|
586 | 769 | current->comm, path, &vaf); |
---|
587 | 770 | va_end(args); |
---|
588 | 771 | } |
---|
589 | | - save_error_info(inode->i_sb, function, line); |
---|
| 772 | + save_error_info(inode->i_sb, EFSCORRUPTED, inode->i_ino, block, |
---|
| 773 | + function, line); |
---|
590 | 774 | ext4_handle_error(inode->i_sb); |
---|
591 | 775 | } |
---|
592 | 776 | |
---|
.. | .. |
---|
654 | 838 | sb->s_id, function, line, errstr); |
---|
655 | 839 | } |
---|
656 | 840 | |
---|
657 | | - save_error_info(sb, function, line); |
---|
| 841 | + save_error_info(sb, -errno, 0, 0, function, line); |
---|
658 | 842 | ext4_handle_error(sb); |
---|
659 | 843 | } |
---|
660 | 844 | |
---|
.. | .. |
---|
669 | 853 | */ |
---|
670 | 854 | |
---|
671 | 855 | void __ext4_abort(struct super_block *sb, const char *function, |
---|
672 | | - unsigned int line, const char *fmt, ...) |
---|
| 856 | + unsigned int line, int error, const char *fmt, ...) |
---|
673 | 857 | { |
---|
674 | 858 | struct va_format vaf; |
---|
675 | 859 | va_list args; |
---|
.. | .. |
---|
677 | 861 | if (unlikely(ext4_forced_shutdown(EXT4_SB(sb)))) |
---|
678 | 862 | return; |
---|
679 | 863 | |
---|
680 | | - save_error_info(sb, function, line); |
---|
| 864 | + save_error_info(sb, error, 0, 0, function, line); |
---|
681 | 865 | va_start(args, fmt); |
---|
682 | 866 | vaf.fmt = fmt; |
---|
683 | 867 | vaf.va = &args; |
---|
.. | .. |
---|
686 | 870 | va_end(args); |
---|
687 | 871 | |
---|
688 | 872 | if (sb_rdonly(sb) == 0) { |
---|
| 873 | + ext4_set_mount_flag(sb, EXT4_MF_FS_ABORTED); |
---|
| 874 | + if (EXT4_SB(sb)->s_journal) |
---|
| 875 | + jbd2_journal_abort(EXT4_SB(sb)->s_journal, -EIO); |
---|
| 876 | + |
---|
689 | 877 | ext4_msg(sb, KERN_CRIT, "Remounting filesystem read-only"); |
---|
690 | | - EXT4_SB(sb)->s_mount_flags |= EXT4_MF_FS_ABORTED; |
---|
691 | 878 | /* |
---|
692 | 879 | * Make sure updated value of ->s_mount_flags will be visible |
---|
693 | 880 | * before ->s_flags update |
---|
694 | 881 | */ |
---|
695 | 882 | smp_wmb(); |
---|
696 | 883 | sb->s_flags |= SB_RDONLY; |
---|
697 | | - if (EXT4_SB(sb)->s_journal) |
---|
698 | | - jbd2_journal_abort(EXT4_SB(sb)->s_journal, -EIO); |
---|
699 | | - save_error_info(sb, function, line); |
---|
700 | 884 | } |
---|
701 | | - if (test_opt(sb, ERRORS_PANIC) && !system_going_down()) { |
---|
702 | | - if (EXT4_SB(sb)->s_journal && |
---|
703 | | - !(EXT4_SB(sb)->s_journal->j_flags & JBD2_REC_ERR)) |
---|
704 | | - return; |
---|
| 885 | + if (test_opt(sb, ERRORS_PANIC) && !system_going_down()) |
---|
705 | 886 | panic("EXT4-fs panic from previous error\n"); |
---|
706 | | - } |
---|
707 | 887 | } |
---|
708 | 888 | |
---|
709 | 889 | void __ext4_msg(struct super_block *sb, |
---|
.. | .. |
---|
712 | 892 | struct va_format vaf; |
---|
713 | 893 | va_list args; |
---|
714 | 894 | |
---|
| 895 | + atomic_inc(&EXT4_SB(sb)->s_msg_count); |
---|
715 | 896 | if (!___ratelimit(&(EXT4_SB(sb)->s_msg_ratelimit_state), "EXT4-fs")) |
---|
716 | 897 | return; |
---|
717 | 898 | |
---|
.. | .. |
---|
722 | 903 | va_end(args); |
---|
723 | 904 | } |
---|
724 | 905 | |
---|
725 | | -#define ext4_warning_ratelimit(sb) \ |
---|
726 | | - ___ratelimit(&(EXT4_SB(sb)->s_warning_ratelimit_state), \ |
---|
727 | | - "EXT4-fs warning") |
---|
| 906 | +static int ext4_warning_ratelimit(struct super_block *sb) |
---|
| 907 | +{ |
---|
| 908 | + atomic_inc(&EXT4_SB(sb)->s_warning_count); |
---|
| 909 | + return ___ratelimit(&(EXT4_SB(sb)->s_warning_ratelimit_state), |
---|
| 910 | + "EXT4-fs warning"); |
---|
| 911 | +} |
---|
728 | 912 | |
---|
729 | 913 | void __ext4_warning(struct super_block *sb, const char *function, |
---|
730 | 914 | unsigned int line, const char *fmt, ...) |
---|
.. | .. |
---|
770 | 954 | { |
---|
771 | 955 | struct va_format vaf; |
---|
772 | 956 | va_list args; |
---|
773 | | - struct ext4_super_block *es = EXT4_SB(sb)->s_es; |
---|
774 | 957 | |
---|
775 | 958 | if (unlikely(ext4_forced_shutdown(EXT4_SB(sb)))) |
---|
776 | 959 | return; |
---|
777 | 960 | |
---|
778 | 961 | trace_ext4_error(sb, function, line); |
---|
779 | | - es->s_last_error_ino = cpu_to_le32(ino); |
---|
780 | | - es->s_last_error_block = cpu_to_le64(block); |
---|
781 | | - __save_error_info(sb, function, line); |
---|
| 962 | + __save_error_info(sb, EFSCORRUPTED, ino, block, function, line); |
---|
782 | 963 | |
---|
783 | 964 | if (ext4_error_ratelimit(sb)) { |
---|
784 | 965 | va_start(args, fmt); |
---|
.. | .. |
---|
830 | 1011 | struct ext4_group_desc *gdp = ext4_get_group_desc(sb, group, NULL); |
---|
831 | 1012 | int ret; |
---|
832 | 1013 | |
---|
| 1014 | + if (!grp || !gdp) |
---|
| 1015 | + return; |
---|
833 | 1016 | if (flags & EXT4_GROUP_INFO_BBITMAP_CORRUPT) { |
---|
834 | 1017 | ret = ext4_test_and_set_bit(EXT4_GROUP_INFO_BBITMAP_CORRUPT_BIT, |
---|
835 | 1018 | &grp->bb_state); |
---|
.. | .. |
---|
882 | 1065 | static struct block_device *ext4_blkdev_get(dev_t dev, struct super_block *sb) |
---|
883 | 1066 | { |
---|
884 | 1067 | struct block_device *bdev; |
---|
885 | | - char b[BDEVNAME_SIZE]; |
---|
886 | 1068 | |
---|
887 | 1069 | bdev = blkdev_get_by_dev(dev, FMODE_READ|FMODE_WRITE|FMODE_EXCL, sb); |
---|
888 | 1070 | if (IS_ERR(bdev)) |
---|
.. | .. |
---|
890 | 1072 | return bdev; |
---|
891 | 1073 | |
---|
892 | 1074 | fail: |
---|
893 | | - ext4_msg(sb, KERN_ERR, "failed to open journal device %s: %ld", |
---|
894 | | - __bdevname(dev, b), PTR_ERR(bdev)); |
---|
| 1075 | + ext4_msg(sb, KERN_ERR, |
---|
| 1076 | + "failed to open journal device unknown-block(%u,%u) %ld", |
---|
| 1077 | + MAJOR(dev), MINOR(dev), PTR_ERR(bdev)); |
---|
895 | 1078 | return NULL; |
---|
896 | 1079 | } |
---|
897 | 1080 | |
---|
.. | .. |
---|
906 | 1089 | static void ext4_blkdev_remove(struct ext4_sb_info *sbi) |
---|
907 | 1090 | { |
---|
908 | 1091 | struct block_device *bdev; |
---|
909 | | - bdev = sbi->journal_bdev; |
---|
| 1092 | + bdev = sbi->s_journal_bdev; |
---|
910 | 1093 | if (bdev) { |
---|
| 1094 | + /* |
---|
| 1095 | + * Invalidate the journal device's buffers. We don't want them |
---|
| 1096 | + * floating about in memory - the physical journal device may |
---|
| 1097 | + * hotswapped, and it breaks the `ro-after' testing code. |
---|
| 1098 | + */ |
---|
| 1099 | + invalidate_bdev(bdev); |
---|
911 | 1100 | ext4_blkdev_put(bdev); |
---|
912 | | - sbi->journal_bdev = NULL; |
---|
| 1101 | + sbi->s_journal_bdev = NULL; |
---|
913 | 1102 | } |
---|
914 | 1103 | } |
---|
915 | 1104 | |
---|
.. | .. |
---|
974 | 1163 | int aborted = 0; |
---|
975 | 1164 | int i, err; |
---|
976 | 1165 | |
---|
| 1166 | + /* |
---|
| 1167 | + * Unregister sysfs before destroying jbd2 journal. |
---|
| 1168 | + * Since we could still access attr_journal_task attribute via sysfs |
---|
| 1169 | + * path which could have sbi->s_journal->j_task as NULL |
---|
| 1170 | + * Unregister sysfs before flush sbi->s_error_work. |
---|
| 1171 | + * Since user may read /proc/fs/ext4/xx/mb_groups during umount, If |
---|
| 1172 | + * read metadata verify failed then will queue error work. |
---|
| 1173 | + * flush_stashed_error_work will call start_this_handle may trigger |
---|
| 1174 | + * BUG_ON. |
---|
| 1175 | + */ |
---|
| 1176 | + ext4_unregister_sysfs(sb); |
---|
| 1177 | + |
---|
977 | 1178 | ext4_unregister_li_request(sb); |
---|
978 | 1179 | ext4_quota_off_umount(sb); |
---|
979 | 1180 | |
---|
.. | .. |
---|
983 | 1184 | aborted = is_journal_aborted(sbi->s_journal); |
---|
984 | 1185 | err = jbd2_journal_destroy(sbi->s_journal); |
---|
985 | 1186 | sbi->s_journal = NULL; |
---|
986 | | - if ((err < 0) && !aborted) |
---|
987 | | - ext4_abort(sb, "Couldn't clean up the journal"); |
---|
| 1187 | + if ((err < 0) && !aborted) { |
---|
| 1188 | + ext4_abort(sb, -err, "Couldn't clean up the journal"); |
---|
| 1189 | + } |
---|
988 | 1190 | } |
---|
989 | 1191 | |
---|
990 | | - ext4_unregister_sysfs(sb); |
---|
991 | 1192 | ext4_es_unregister_shrinker(sbi); |
---|
992 | 1193 | del_timer_sync(&sbi->s_err_report); |
---|
993 | 1194 | ext4_release_system_zone(sb); |
---|
.. | .. |
---|
1017 | 1218 | percpu_counter_destroy(&sbi->s_freeinodes_counter); |
---|
1018 | 1219 | percpu_counter_destroy(&sbi->s_dirs_counter); |
---|
1019 | 1220 | percpu_counter_destroy(&sbi->s_dirtyclusters_counter); |
---|
| 1221 | + percpu_counter_destroy(&sbi->s_sra_exceeded_retry_limit); |
---|
1020 | 1222 | percpu_free_rwsem(&sbi->s_writepages_rwsem); |
---|
1021 | 1223 | #ifdef CONFIG_QUOTA |
---|
1022 | 1224 | for (i = 0; i < EXT4_MAXQUOTAS; i++) |
---|
.. | .. |
---|
1033 | 1235 | |
---|
1034 | 1236 | sync_blockdev(sb->s_bdev); |
---|
1035 | 1237 | invalidate_bdev(sb->s_bdev); |
---|
1036 | | - if (sbi->journal_bdev && sbi->journal_bdev != sb->s_bdev) { |
---|
1037 | | - /* |
---|
1038 | | - * Invalidate the journal device's buffers. We don't want them |
---|
1039 | | - * floating about in memory - the physical journal device may |
---|
1040 | | - * hotswapped, and it breaks the `ro-after' testing code. |
---|
1041 | | - */ |
---|
1042 | | - sync_blockdev(sbi->journal_bdev); |
---|
1043 | | - invalidate_bdev(sbi->journal_bdev); |
---|
| 1238 | + if (sbi->s_journal_bdev && sbi->s_journal_bdev != sb->s_bdev) { |
---|
| 1239 | + sync_blockdev(sbi->s_journal_bdev); |
---|
1044 | 1240 | ext4_blkdev_remove(sbi); |
---|
1045 | 1241 | } |
---|
1046 | | - if (sbi->s_ea_inode_cache) { |
---|
1047 | | - ext4_xattr_destroy_cache(sbi->s_ea_inode_cache); |
---|
1048 | | - sbi->s_ea_inode_cache = NULL; |
---|
1049 | | - } |
---|
1050 | | - if (sbi->s_ea_block_cache) { |
---|
1051 | | - ext4_xattr_destroy_cache(sbi->s_ea_block_cache); |
---|
1052 | | - sbi->s_ea_block_cache = NULL; |
---|
1053 | | - } |
---|
1054 | | - if (sbi->s_mmp_tsk) |
---|
1055 | | - kthread_stop(sbi->s_mmp_tsk); |
---|
| 1242 | + |
---|
| 1243 | + ext4_xattr_destroy_cache(sbi->s_ea_inode_cache); |
---|
| 1244 | + sbi->s_ea_inode_cache = NULL; |
---|
| 1245 | + |
---|
| 1246 | + ext4_xattr_destroy_cache(sbi->s_ea_block_cache); |
---|
| 1247 | + sbi->s_ea_block_cache = NULL; |
---|
| 1248 | + |
---|
| 1249 | + ext4_stop_mmpd(sbi); |
---|
| 1250 | + |
---|
1056 | 1251 | brelse(sbi->s_sbh); |
---|
1057 | 1252 | sb->s_fs_info = NULL; |
---|
1058 | 1253 | /* |
---|
.. | .. |
---|
1065 | 1260 | crypto_free_shash(sbi->s_chksum_driver); |
---|
1066 | 1261 | kfree(sbi->s_blockgroup_lock); |
---|
1067 | 1262 | fs_put_dax(sbi->s_daxdev); |
---|
1068 | | - fscrypt_free_dummy_context(&sbi->s_dummy_enc_ctx); |
---|
| 1263 | + fscrypt_free_dummy_policy(&sbi->s_dummy_enc_policy); |
---|
1069 | 1264 | #ifdef CONFIG_UNICODE |
---|
1070 | 1265 | utf8_unload(sb->s_encoding); |
---|
1071 | 1266 | #endif |
---|
.. | .. |
---|
1086 | 1281 | return NULL; |
---|
1087 | 1282 | |
---|
1088 | 1283 | inode_set_iversion(&ei->vfs_inode, 1); |
---|
| 1284 | + ei->i_flags = 0; |
---|
1089 | 1285 | spin_lock_init(&ei->i_raw_lock); |
---|
1090 | 1286 | INIT_LIST_HEAD(&ei->i_prealloc_list); |
---|
| 1287 | + atomic_set(&ei->i_prealloc_active, 0); |
---|
1091 | 1288 | spin_lock_init(&ei->i_prealloc_lock); |
---|
1092 | 1289 | ext4_es_init_tree(&ei->i_es_tree); |
---|
1093 | 1290 | rwlock_init(&ei->i_es_lock); |
---|
.. | .. |
---|
1096 | 1293 | ei->i_es_shk_nr = 0; |
---|
1097 | 1294 | ei->i_es_shrink_lblk = 0; |
---|
1098 | 1295 | ei->i_reserved_data_blocks = 0; |
---|
1099 | | - ei->i_da_metadata_calc_len = 0; |
---|
1100 | | - ei->i_da_metadata_calc_last_lblock = 0; |
---|
1101 | 1296 | spin_lock_init(&(ei->i_block_reservation_lock)); |
---|
| 1297 | + ext4_init_pending_tree(&ei->i_pending_tree); |
---|
1102 | 1298 | #ifdef CONFIG_QUOTA |
---|
1103 | 1299 | ei->i_reserved_quota = 0; |
---|
1104 | 1300 | memset(&ei->i_dquot, 0, sizeof(ei->i_dquot)); |
---|
.. | .. |
---|
1110 | 1306 | ei->i_datasync_tid = 0; |
---|
1111 | 1307 | atomic_set(&ei->i_unwritten, 0); |
---|
1112 | 1308 | INIT_WORK(&ei->i_rsv_conversion_work, ext4_end_io_rsv_work); |
---|
| 1309 | + ext4_fc_init_inode(&ei->vfs_inode); |
---|
| 1310 | + mutex_init(&ei->i_fc_lock); |
---|
1113 | 1311 | return &ei->vfs_inode; |
---|
1114 | 1312 | } |
---|
1115 | 1313 | |
---|
.. | .. |
---|
1124 | 1322 | return drop; |
---|
1125 | 1323 | } |
---|
1126 | 1324 | |
---|
1127 | | -static void ext4_i_callback(struct rcu_head *head) |
---|
| 1325 | +static void ext4_free_in_core_inode(struct inode *inode) |
---|
1128 | 1326 | { |
---|
1129 | | - struct inode *inode = container_of(head, struct inode, i_rcu); |
---|
1130 | | - |
---|
1131 | 1327 | fscrypt_free_inode(inode); |
---|
1132 | | - |
---|
| 1328 | + if (!list_empty(&(EXT4_I(inode)->i_fc_list))) { |
---|
| 1329 | + pr_warn("%s: inode %ld still in fc list", |
---|
| 1330 | + __func__, inode->i_ino); |
---|
| 1331 | + } |
---|
1133 | 1332 | kmem_cache_free(ext4_inode_cachep, EXT4_I(inode)); |
---|
1134 | 1333 | } |
---|
1135 | 1334 | |
---|
.. | .. |
---|
1144 | 1343 | true); |
---|
1145 | 1344 | dump_stack(); |
---|
1146 | 1345 | } |
---|
1147 | | - call_rcu(&inode->i_rcu, ext4_i_callback); |
---|
| 1346 | + |
---|
| 1347 | + if (EXT4_I(inode)->i_reserved_data_blocks) |
---|
| 1348 | + ext4_msg(inode->i_sb, KERN_ERR, |
---|
| 1349 | + "Inode %lu (%p): i_reserved_data_blocks (%u) not cleared!", |
---|
| 1350 | + inode->i_ino, EXT4_I(inode), |
---|
| 1351 | + EXT4_I(inode)->i_reserved_data_blocks); |
---|
1148 | 1352 | } |
---|
1149 | 1353 | |
---|
1150 | 1354 | static void init_once(void *foo) |
---|
.. | .. |
---|
1156 | 1360 | init_rwsem(&ei->i_data_sem); |
---|
1157 | 1361 | init_rwsem(&ei->i_mmap_sem); |
---|
1158 | 1362 | inode_init_once(&ei->vfs_inode); |
---|
| 1363 | + ext4_fc_init_inode(&ei->vfs_inode); |
---|
1159 | 1364 | } |
---|
1160 | 1365 | |
---|
1161 | 1366 | static int __init init_inodecache(void) |
---|
.. | .. |
---|
1184 | 1389 | |
---|
1185 | 1390 | void ext4_clear_inode(struct inode *inode) |
---|
1186 | 1391 | { |
---|
| 1392 | + ext4_fc_del(inode); |
---|
1187 | 1393 | invalidate_inode_buffers(inode); |
---|
1188 | 1394 | clear_inode(inode); |
---|
1189 | | - dquot_drop(inode); |
---|
1190 | | - ext4_discard_preallocations(inode); |
---|
| 1395 | + ext4_discard_preallocations(inode, 0); |
---|
1191 | 1396 | ext4_es_remove_extent(inode, 0, EXT_MAX_BLOCKS); |
---|
| 1397 | + dquot_drop(inode); |
---|
1192 | 1398 | if (EXT4_I(inode)->jinode) { |
---|
1193 | 1399 | jbd2_journal_release_jbd_inode(EXT4_JOURNAL(inode), |
---|
1194 | 1400 | EXT4_I(inode)->jinode); |
---|
.. | .. |
---|
1258 | 1464 | if (!page_has_buffers(page)) |
---|
1259 | 1465 | return 0; |
---|
1260 | 1466 | if (journal) |
---|
1261 | | - return jbd2_journal_try_to_free_buffers(journal, page, |
---|
1262 | | - wait & ~__GFP_DIRECT_RECLAIM); |
---|
| 1467 | + return jbd2_journal_try_to_free_buffers(journal, page); |
---|
| 1468 | + |
---|
1263 | 1469 | return try_to_free_buffers(page); |
---|
1264 | 1470 | } |
---|
1265 | 1471 | |
---|
.. | .. |
---|
1288 | 1494 | if (WARN_ON_ONCE(IS_DAX(inode) && i_size_read(inode))) |
---|
1289 | 1495 | return -EINVAL; |
---|
1290 | 1496 | |
---|
| 1497 | + if (ext4_test_inode_flag(inode, EXT4_INODE_DAX)) |
---|
| 1498 | + return -EOPNOTSUPP; |
---|
| 1499 | + |
---|
1291 | 1500 | res = ext4_convert_inline_data(inode); |
---|
1292 | 1501 | if (res) |
---|
1293 | 1502 | return res; |
---|
.. | .. |
---|
1313 | 1522 | * Update inode->i_flags - S_ENCRYPTED will be enabled, |
---|
1314 | 1523 | * S_DAX may be disabled |
---|
1315 | 1524 | */ |
---|
1316 | | - ext4_set_inode_flags(inode); |
---|
| 1525 | + ext4_set_inode_flags(inode, false); |
---|
1317 | 1526 | } |
---|
1318 | 1527 | return res; |
---|
1319 | 1528 | } |
---|
.. | .. |
---|
1340 | 1549 | * Update inode->i_flags - S_ENCRYPTED will be enabled, |
---|
1341 | 1550 | * S_DAX may be disabled |
---|
1342 | 1551 | */ |
---|
1343 | | - ext4_set_inode_flags(inode); |
---|
| 1552 | + ext4_set_inode_flags(inode, false); |
---|
1344 | 1553 | res = ext4_mark_inode_dirty(handle, inode); |
---|
1345 | 1554 | if (res) |
---|
1346 | 1555 | EXT4_ERROR_INODE(inode, "Failed to mark inode dirty"); |
---|
.. | .. |
---|
1354 | 1563 | return res; |
---|
1355 | 1564 | } |
---|
1356 | 1565 | |
---|
1357 | | -static const union fscrypt_context * |
---|
1358 | | -ext4_get_dummy_context(struct super_block *sb) |
---|
| 1566 | +static const union fscrypt_policy *ext4_get_dummy_policy(struct super_block *sb) |
---|
1359 | 1567 | { |
---|
1360 | | - return EXT4_SB(sb)->s_dummy_enc_ctx.ctx; |
---|
| 1568 | + return EXT4_SB(sb)->s_dummy_enc_policy.policy; |
---|
1361 | 1569 | } |
---|
1362 | 1570 | |
---|
1363 | 1571 | static bool ext4_has_stable_inodes(struct super_block *sb) |
---|
.. | .. |
---|
1372 | 1580 | *lblk_bits_ret = 8 * sizeof(ext4_lblk_t); |
---|
1373 | 1581 | } |
---|
1374 | 1582 | |
---|
1375 | | -static bool ext4_inline_crypt_enabled(struct super_block *sb) |
---|
1376 | | -{ |
---|
1377 | | - return test_opt(sb, INLINECRYPT); |
---|
1378 | | -} |
---|
1379 | | - |
---|
1380 | 1583 | static const struct fscrypt_operations ext4_cryptops = { |
---|
1381 | 1584 | .key_prefix = "ext4:", |
---|
1382 | 1585 | .get_context = ext4_get_context, |
---|
1383 | 1586 | .set_context = ext4_set_context, |
---|
1384 | | - .get_dummy_context = ext4_get_dummy_context, |
---|
| 1587 | + .get_dummy_policy = ext4_get_dummy_policy, |
---|
1385 | 1588 | .empty_dir = ext4_empty_dir, |
---|
1386 | 1589 | .max_namelen = EXT4_NAME_LEN, |
---|
1387 | 1590 | .has_stable_inodes = ext4_has_stable_inodes, |
---|
1388 | 1591 | .get_ino_and_lblk_bits = ext4_get_ino_and_lblk_bits, |
---|
1389 | | - .inline_crypt_enabled = ext4_inline_crypt_enabled, |
---|
1390 | 1592 | }; |
---|
1391 | 1593 | #endif |
---|
1392 | 1594 | |
---|
.. | .. |
---|
1409 | 1611 | static int ext4_quota_enable(struct super_block *sb, int type, int format_id, |
---|
1410 | 1612 | unsigned int flags); |
---|
1411 | 1613 | static int ext4_enable_quotas(struct super_block *sb); |
---|
1412 | | -static int ext4_get_next_id(struct super_block *sb, struct kqid *qid); |
---|
1413 | 1614 | |
---|
1414 | 1615 | static struct dquot **ext4_get_dquots(struct inode *inode) |
---|
1415 | 1616 | { |
---|
.. | .. |
---|
1427 | 1628 | .destroy_dquot = dquot_destroy, |
---|
1428 | 1629 | .get_projid = ext4_get_projid, |
---|
1429 | 1630 | .get_inode_usage = ext4_get_inode_usage, |
---|
1430 | | - .get_next_id = ext4_get_next_id, |
---|
| 1631 | + .get_next_id = dquot_get_next_id, |
---|
1431 | 1632 | }; |
---|
1432 | 1633 | |
---|
1433 | 1634 | static const struct quotactl_ops ext4_qctl_operations = { |
---|
.. | .. |
---|
1444 | 1645 | |
---|
1445 | 1646 | static const struct super_operations ext4_sops = { |
---|
1446 | 1647 | .alloc_inode = ext4_alloc_inode, |
---|
| 1648 | + .free_inode = ext4_free_in_core_inode, |
---|
1447 | 1649 | .destroy_inode = ext4_destroy_inode, |
---|
1448 | 1650 | .write_inode = ext4_write_inode, |
---|
1449 | 1651 | .dirty_inode = ext4_dirty_inode, |
---|
.. | .. |
---|
1485 | 1687 | Opt_usrjquota, Opt_grpjquota, Opt_offusrjquota, Opt_offgrpjquota, |
---|
1486 | 1688 | Opt_jqfmt_vfsold, Opt_jqfmt_vfsv0, Opt_jqfmt_vfsv1, Opt_quota, |
---|
1487 | 1689 | Opt_noquota, Opt_barrier, Opt_nobarrier, Opt_err, |
---|
1488 | | - Opt_usrquota, Opt_grpquota, Opt_prjquota, Opt_i_version, Opt_dax, |
---|
| 1690 | + Opt_usrquota, Opt_grpquota, Opt_prjquota, Opt_i_version, |
---|
| 1691 | + Opt_dax, Opt_dax_always, Opt_dax_inode, Opt_dax_never, |
---|
1489 | 1692 | Opt_stripe, Opt_delalloc, Opt_nodelalloc, Opt_warn_on_error, |
---|
1490 | 1693 | Opt_nowarn_on_error, Opt_mblk_io_submit, |
---|
1491 | 1694 | Opt_lazytime, Opt_nolazytime, Opt_debug_want_extra_isize, |
---|
.. | .. |
---|
1494 | 1697 | Opt_dioread_nolock, Opt_dioread_lock, |
---|
1495 | 1698 | Opt_discard, Opt_nodiscard, Opt_init_itable, Opt_noinit_itable, |
---|
1496 | 1699 | Opt_max_dir_size_kb, Opt_nojournal_checksum, Opt_nombcache, |
---|
| 1700 | + Opt_prefetch_block_bitmaps, |
---|
| 1701 | +#ifdef CONFIG_EXT4_DEBUG |
---|
| 1702 | + Opt_fc_debug_max_replay, Opt_fc_debug_force |
---|
| 1703 | +#endif |
---|
1497 | 1704 | }; |
---|
1498 | 1705 | |
---|
1499 | 1706 | static const match_table_t tokens = { |
---|
.. | .. |
---|
1552 | 1759 | {Opt_nobarrier, "nobarrier"}, |
---|
1553 | 1760 | {Opt_i_version, "i_version"}, |
---|
1554 | 1761 | {Opt_dax, "dax"}, |
---|
| 1762 | + {Opt_dax_always, "dax=always"}, |
---|
| 1763 | + {Opt_dax_inode, "dax=inode"}, |
---|
| 1764 | + {Opt_dax_never, "dax=never"}, |
---|
1555 | 1765 | {Opt_stripe, "stripe=%u"}, |
---|
1556 | 1766 | {Opt_delalloc, "delalloc"}, |
---|
1557 | 1767 | {Opt_warn_on_error, "warn_on_error"}, |
---|
.. | .. |
---|
1570 | 1780 | {Opt_auto_da_alloc, "auto_da_alloc"}, |
---|
1571 | 1781 | {Opt_noauto_da_alloc, "noauto_da_alloc"}, |
---|
1572 | 1782 | {Opt_dioread_nolock, "dioread_nolock"}, |
---|
| 1783 | + {Opt_dioread_lock, "nodioread_nolock"}, |
---|
1573 | 1784 | {Opt_dioread_lock, "dioread_lock"}, |
---|
1574 | 1785 | {Opt_discard, "discard"}, |
---|
1575 | 1786 | {Opt_nodiscard, "nodiscard"}, |
---|
1576 | 1787 | {Opt_init_itable, "init_itable=%u"}, |
---|
1577 | 1788 | {Opt_init_itable, "init_itable"}, |
---|
1578 | 1789 | {Opt_noinit_itable, "noinit_itable"}, |
---|
| 1790 | +#ifdef CONFIG_EXT4_DEBUG |
---|
| 1791 | + {Opt_fc_debug_force, "fc_debug_force"}, |
---|
| 1792 | + {Opt_fc_debug_max_replay, "fc_debug_max_replay=%u"}, |
---|
| 1793 | +#endif |
---|
1579 | 1794 | {Opt_max_dir_size_kb, "max_dir_size_kb=%u"}, |
---|
1580 | 1795 | {Opt_test_dummy_encryption, "test_dummy_encryption=%s"}, |
---|
1581 | 1796 | {Opt_test_dummy_encryption, "test_dummy_encryption"}, |
---|
1582 | 1797 | {Opt_inlinecrypt, "inlinecrypt"}, |
---|
1583 | 1798 | {Opt_nombcache, "nombcache"}, |
---|
1584 | 1799 | {Opt_nombcache, "no_mbcache"}, /* for backward compatibility */ |
---|
| 1800 | + {Opt_prefetch_block_bitmaps, "prefetch_block_bitmaps"}, |
---|
1585 | 1801 | {Opt_removed, "check=none"}, /* mount option from ext2/3 */ |
---|
1586 | 1802 | {Opt_removed, "nocheck"}, /* mount option from ext2/3 */ |
---|
1587 | 1803 | {Opt_removed, "reservation"}, /* mount option from ext2/3 */ |
---|
.. | .. |
---|
1700 | 1916 | #define MOPT_NO_EXT3 0x0200 |
---|
1701 | 1917 | #define MOPT_EXT4_ONLY (MOPT_NO_EXT2 | MOPT_NO_EXT3) |
---|
1702 | 1918 | #define MOPT_STRING 0x0400 |
---|
| 1919 | +#define MOPT_SKIP 0x0800 |
---|
| 1920 | +#define MOPT_2 0x1000 |
---|
1703 | 1921 | |
---|
1704 | 1922 | static const struct mount_opts { |
---|
1705 | 1923 | int token; |
---|
.. | .. |
---|
1724 | 1942 | MOPT_EXT4_ONLY | MOPT_CLEAR}, |
---|
1725 | 1943 | {Opt_warn_on_error, EXT4_MOUNT_WARN_ON_ERROR, MOPT_SET}, |
---|
1726 | 1944 | {Opt_nowarn_on_error, EXT4_MOUNT_WARN_ON_ERROR, MOPT_CLEAR}, |
---|
| 1945 | + {Opt_commit, 0, MOPT_NO_EXT2}, |
---|
1727 | 1946 | {Opt_nojournal_checksum, EXT4_MOUNT_JOURNAL_CHECKSUM, |
---|
1728 | 1947 | MOPT_EXT4_ONLY | MOPT_CLEAR}, |
---|
1729 | 1948 | {Opt_journal_checksum, EXT4_MOUNT_JOURNAL_CHECKSUM, |
---|
.. | .. |
---|
1749 | 1968 | {Opt_min_batch_time, 0, MOPT_GTE0}, |
---|
1750 | 1969 | {Opt_inode_readahead_blks, 0, MOPT_GTE0}, |
---|
1751 | 1970 | {Opt_init_itable, 0, MOPT_GTE0}, |
---|
1752 | | - {Opt_dax, EXT4_MOUNT_DAX, MOPT_SET}, |
---|
| 1971 | + {Opt_dax, EXT4_MOUNT_DAX_ALWAYS, MOPT_SET | MOPT_SKIP}, |
---|
| 1972 | + {Opt_dax_always, EXT4_MOUNT_DAX_ALWAYS, |
---|
| 1973 | + MOPT_EXT4_ONLY | MOPT_SET | MOPT_SKIP}, |
---|
| 1974 | + {Opt_dax_inode, EXT4_MOUNT2_DAX_INODE, |
---|
| 1975 | + MOPT_EXT4_ONLY | MOPT_SET | MOPT_SKIP}, |
---|
| 1976 | + {Opt_dax_never, EXT4_MOUNT2_DAX_NEVER, |
---|
| 1977 | + MOPT_EXT4_ONLY | MOPT_SET | MOPT_SKIP}, |
---|
1753 | 1978 | {Opt_stripe, 0, MOPT_GTE0}, |
---|
1754 | 1979 | {Opt_resuid, 0, MOPT_GTE0}, |
---|
1755 | 1980 | {Opt_resgid, 0, MOPT_GTE0}, |
---|
.. | .. |
---|
1791 | 2016 | {Opt_jqfmt_vfsv1, QFMT_VFS_V1, MOPT_QFMT}, |
---|
1792 | 2017 | {Opt_max_dir_size_kb, 0, MOPT_GTE0}, |
---|
1793 | 2018 | {Opt_test_dummy_encryption, 0, MOPT_STRING}, |
---|
1794 | | -#ifdef CONFIG_FS_ENCRYPTION_INLINE_CRYPT |
---|
1795 | | - {Opt_inlinecrypt, EXT4_MOUNT_INLINECRYPT, MOPT_SET}, |
---|
1796 | | -#else |
---|
1797 | | - {Opt_inlinecrypt, EXT4_MOUNT_INLINECRYPT, MOPT_NOSUPPORT}, |
---|
1798 | | -#endif |
---|
1799 | 2019 | {Opt_nombcache, EXT4_MOUNT_NO_MBCACHE, MOPT_SET}, |
---|
| 2020 | + {Opt_prefetch_block_bitmaps, EXT4_MOUNT_PREFETCH_BLOCK_BITMAPS, |
---|
| 2021 | + MOPT_SET}, |
---|
| 2022 | +#ifdef CONFIG_EXT4_DEBUG |
---|
| 2023 | + {Opt_fc_debug_force, EXT4_MOUNT2_JOURNAL_FAST_COMMIT, |
---|
| 2024 | + MOPT_SET | MOPT_2 | MOPT_EXT4_ONLY}, |
---|
| 2025 | + {Opt_fc_debug_max_replay, 0, MOPT_GTE0}, |
---|
| 2026 | +#endif |
---|
1800 | 2027 | {Opt_err, 0, 0} |
---|
1801 | 2028 | }; |
---|
1802 | 2029 | |
---|
.. | .. |
---|
1839 | 2066 | struct ext4_sb_info *sbi = EXT4_SB(sb); |
---|
1840 | 2067 | int err; |
---|
1841 | 2068 | |
---|
| 2069 | + if (!ext4_has_feature_encrypt(sb)) { |
---|
| 2070 | + ext4_msg(sb, KERN_WARNING, |
---|
| 2071 | + "test_dummy_encryption requires encrypt feature"); |
---|
| 2072 | + return -1; |
---|
| 2073 | + } |
---|
| 2074 | + |
---|
1842 | 2075 | /* |
---|
1843 | 2076 | * This mount option is just for testing, and it's not worthwhile to |
---|
1844 | 2077 | * implement the extra complexity (e.g. RCU protection) that would be |
---|
1845 | 2078 | * needed to allow it to be set or changed during remount. We do allow |
---|
1846 | 2079 | * it to be specified during remount, but only if there is no change. |
---|
1847 | 2080 | */ |
---|
1848 | | - if (is_remount && !sbi->s_dummy_enc_ctx.ctx) { |
---|
| 2081 | + if (is_remount && !sbi->s_dummy_enc_policy.policy) { |
---|
1849 | 2082 | ext4_msg(sb, KERN_WARNING, |
---|
1850 | 2083 | "Can't set test_dummy_encryption on remount"); |
---|
1851 | 2084 | return -1; |
---|
1852 | 2085 | } |
---|
1853 | | - err = fscrypt_set_test_dummy_encryption(sb, arg, &sbi->s_dummy_enc_ctx); |
---|
| 2086 | + err = fscrypt_set_test_dummy_encryption(sb, arg->from, |
---|
| 2087 | + &sbi->s_dummy_enc_policy); |
---|
1854 | 2088 | if (err) { |
---|
1855 | 2089 | if (err == -EEXIST) |
---|
1856 | 2090 | ext4_msg(sb, KERN_WARNING, |
---|
.. | .. |
---|
1865 | 2099 | return -1; |
---|
1866 | 2100 | } |
---|
1867 | 2101 | ext4_msg(sb, KERN_WARNING, "Test dummy encryption mode enabled"); |
---|
| 2102 | + return 1; |
---|
1868 | 2103 | #else |
---|
1869 | 2104 | ext4_msg(sb, KERN_WARNING, |
---|
1870 | | - "Test dummy encryption mount option ignored"); |
---|
| 2105 | + "test_dummy_encryption option not supported"); |
---|
| 2106 | + return -1; |
---|
| 2107 | + |
---|
1871 | 2108 | #endif |
---|
1872 | | - return 1; |
---|
1873 | 2109 | } |
---|
1874 | 2110 | |
---|
1875 | 2111 | static int handle_mount_opt(struct super_block *sb, char *opt, int token, |
---|
.. | .. |
---|
1903 | 2139 | ext4_msg(sb, KERN_WARNING, "Ignoring removed %s option", opt); |
---|
1904 | 2140 | return 1; |
---|
1905 | 2141 | case Opt_abort: |
---|
1906 | | - sbi->s_mount_flags |= EXT4_MF_FS_ABORTED; |
---|
| 2142 | + ext4_set_mount_flag(sb, EXT4_MF_FS_ABORTED); |
---|
1907 | 2143 | return 1; |
---|
1908 | 2144 | case Opt_i_version: |
---|
1909 | 2145 | sb->s_flags |= SB_I_VERSION; |
---|
.. | .. |
---|
1913 | 2149 | return 1; |
---|
1914 | 2150 | case Opt_nolazytime: |
---|
1915 | 2151 | sb->s_flags &= ~SB_LAZYTIME; |
---|
| 2152 | + return 1; |
---|
| 2153 | + case Opt_inlinecrypt: |
---|
| 2154 | +#ifdef CONFIG_FS_ENCRYPTION_INLINE_CRYPT |
---|
| 2155 | + sb->s_flags |= SB_INLINECRYPT; |
---|
| 2156 | +#else |
---|
| 2157 | + ext4_msg(sb, KERN_ERR, "inline encryption not supported"); |
---|
| 2158 | +#endif |
---|
1916 | 2159 | return 1; |
---|
1917 | 2160 | } |
---|
1918 | 2161 | |
---|
.. | .. |
---|
1962 | 2205 | } else if (token == Opt_commit) { |
---|
1963 | 2206 | if (arg == 0) |
---|
1964 | 2207 | arg = JBD2_DEFAULT_MAX_COMMIT_AGE; |
---|
| 2208 | + else if (arg > INT_MAX / HZ) { |
---|
| 2209 | + ext4_msg(sb, KERN_ERR, |
---|
| 2210 | + "Invalid commit interval %d, " |
---|
| 2211 | + "must be smaller than %d", |
---|
| 2212 | + arg, INT_MAX / HZ); |
---|
| 2213 | + return -1; |
---|
| 2214 | + } |
---|
1965 | 2215 | sbi->s_commit_interval = HZ * arg; |
---|
1966 | 2216 | } else if (token == Opt_debug_want_extra_isize) { |
---|
1967 | 2217 | if ((arg & 1) || |
---|
.. | .. |
---|
1991 | 2241 | sbi->s_li_wait_mult = arg; |
---|
1992 | 2242 | } else if (token == Opt_max_dir_size_kb) { |
---|
1993 | 2243 | sbi->s_max_dir_size_kb = arg; |
---|
| 2244 | +#ifdef CONFIG_EXT4_DEBUG |
---|
| 2245 | + } else if (token == Opt_fc_debug_max_replay) { |
---|
| 2246 | + sbi->s_fc_debug_max_replay = arg; |
---|
| 2247 | +#endif |
---|
1994 | 2248 | } else if (token == Opt_stripe) { |
---|
1995 | 2249 | sbi->s_stripe = arg; |
---|
1996 | 2250 | } else if (token == Opt_resuid) { |
---|
.. | .. |
---|
2092 | 2346 | } |
---|
2093 | 2347 | sbi->s_jquota_fmt = m->mount_opt; |
---|
2094 | 2348 | #endif |
---|
2095 | | - } else if (token == Opt_dax) { |
---|
| 2349 | + } else if (token == Opt_dax || token == Opt_dax_always || |
---|
| 2350 | + token == Opt_dax_inode || token == Opt_dax_never) { |
---|
2096 | 2351 | #ifdef CONFIG_FS_DAX |
---|
2097 | | - if (is_remount && test_opt(sb, DAX)) { |
---|
2098 | | - ext4_msg(sb, KERN_ERR, "can't mount with " |
---|
2099 | | - "both data=journal and dax"); |
---|
2100 | | - return -1; |
---|
| 2352 | + switch (token) { |
---|
| 2353 | + case Opt_dax: |
---|
| 2354 | + case Opt_dax_always: |
---|
| 2355 | + if (is_remount && |
---|
| 2356 | + (!(sbi->s_mount_opt & EXT4_MOUNT_DAX_ALWAYS) || |
---|
| 2357 | + (sbi->s_mount_opt2 & EXT4_MOUNT2_DAX_NEVER))) { |
---|
| 2358 | + fail_dax_change_remount: |
---|
| 2359 | + ext4_msg(sb, KERN_ERR, "can't change " |
---|
| 2360 | + "dax mount option while remounting"); |
---|
| 2361 | + return -1; |
---|
| 2362 | + } |
---|
| 2363 | + if (is_remount && |
---|
| 2364 | + (test_opt(sb, DATA_FLAGS) == |
---|
| 2365 | + EXT4_MOUNT_JOURNAL_DATA)) { |
---|
| 2366 | + ext4_msg(sb, KERN_ERR, "can't mount with " |
---|
| 2367 | + "both data=journal and dax"); |
---|
| 2368 | + return -1; |
---|
| 2369 | + } |
---|
| 2370 | + ext4_msg(sb, KERN_WARNING, |
---|
| 2371 | + "DAX enabled. Warning: EXPERIMENTAL, use at your own risk"); |
---|
| 2372 | + sbi->s_mount_opt |= EXT4_MOUNT_DAX_ALWAYS; |
---|
| 2373 | + sbi->s_mount_opt2 &= ~EXT4_MOUNT2_DAX_NEVER; |
---|
| 2374 | + break; |
---|
| 2375 | + case Opt_dax_never: |
---|
| 2376 | + if (is_remount && |
---|
| 2377 | + (!(sbi->s_mount_opt2 & EXT4_MOUNT2_DAX_NEVER) || |
---|
| 2378 | + (sbi->s_mount_opt & EXT4_MOUNT_DAX_ALWAYS))) |
---|
| 2379 | + goto fail_dax_change_remount; |
---|
| 2380 | + sbi->s_mount_opt2 |= EXT4_MOUNT2_DAX_NEVER; |
---|
| 2381 | + sbi->s_mount_opt &= ~EXT4_MOUNT_DAX_ALWAYS; |
---|
| 2382 | + break; |
---|
| 2383 | + case Opt_dax_inode: |
---|
| 2384 | + if (is_remount && |
---|
| 2385 | + ((sbi->s_mount_opt & EXT4_MOUNT_DAX_ALWAYS) || |
---|
| 2386 | + (sbi->s_mount_opt2 & EXT4_MOUNT2_DAX_NEVER) || |
---|
| 2387 | + !(sbi->s_mount_opt2 & EXT4_MOUNT2_DAX_INODE))) |
---|
| 2388 | + goto fail_dax_change_remount; |
---|
| 2389 | + sbi->s_mount_opt &= ~EXT4_MOUNT_DAX_ALWAYS; |
---|
| 2390 | + sbi->s_mount_opt2 &= ~EXT4_MOUNT2_DAX_NEVER; |
---|
| 2391 | + /* Strictly for printing options */ |
---|
| 2392 | + sbi->s_mount_opt2 |= EXT4_MOUNT2_DAX_INODE; |
---|
| 2393 | + break; |
---|
2101 | 2394 | } |
---|
2102 | | - if (is_remount && !(sbi->s_mount_opt & EXT4_MOUNT_DAX)) { |
---|
2103 | | - ext4_msg(sb, KERN_ERR, "can't change " |
---|
2104 | | - "dax mount option while remounting"); |
---|
2105 | | - return -1; |
---|
2106 | | - } |
---|
2107 | | - ext4_msg(sb, KERN_WARNING, |
---|
2108 | | - "DAX enabled. Warning: EXPERIMENTAL, use at your own risk"); |
---|
2109 | | - sbi->s_mount_opt |= m->mount_opt; |
---|
2110 | 2395 | #else |
---|
2111 | 2396 | ext4_msg(sb, KERN_INFO, "dax option not supported"); |
---|
| 2397 | + sbi->s_mount_opt2 |= EXT4_MOUNT2_DAX_NEVER; |
---|
| 2398 | + sbi->s_mount_opt &= ~EXT4_MOUNT_DAX_ALWAYS; |
---|
2112 | 2399 | return -1; |
---|
2113 | 2400 | #endif |
---|
2114 | 2401 | } else if (token == Opt_data_err_abort) { |
---|
.. | .. |
---|
2126 | 2413 | WARN_ON(1); |
---|
2127 | 2414 | return -1; |
---|
2128 | 2415 | } |
---|
2129 | | - if (arg != 0) |
---|
2130 | | - sbi->s_mount_opt |= m->mount_opt; |
---|
2131 | | - else |
---|
2132 | | - sbi->s_mount_opt &= ~m->mount_opt; |
---|
| 2416 | + if (m->flags & MOPT_2) { |
---|
| 2417 | + if (arg != 0) |
---|
| 2418 | + sbi->s_mount_opt2 |= m->mount_opt; |
---|
| 2419 | + else |
---|
| 2420 | + sbi->s_mount_opt2 &= ~m->mount_opt; |
---|
| 2421 | + } else { |
---|
| 2422 | + if (arg != 0) |
---|
| 2423 | + sbi->s_mount_opt |= m->mount_opt; |
---|
| 2424 | + else |
---|
| 2425 | + sbi->s_mount_opt &= ~m->mount_opt; |
---|
| 2426 | + } |
---|
2133 | 2427 | } |
---|
2134 | 2428 | return 1; |
---|
2135 | 2429 | } |
---|
.. | .. |
---|
2139 | 2433 | unsigned int *journal_ioprio, |
---|
2140 | 2434 | int is_remount) |
---|
2141 | 2435 | { |
---|
2142 | | - struct ext4_sb_info *sbi = EXT4_SB(sb); |
---|
| 2436 | + struct ext4_sb_info __maybe_unused *sbi = EXT4_SB(sb); |
---|
2143 | 2437 | char *p, __maybe_unused *usr_qf_name, __maybe_unused *grp_qf_name; |
---|
2144 | 2438 | substring_t args[MAX_OPT_ARGS]; |
---|
2145 | 2439 | int token; |
---|
.. | .. |
---|
2196 | 2490 | if (test_opt(sb, DIOREAD_NOLOCK)) { |
---|
2197 | 2491 | int blocksize = |
---|
2198 | 2492 | BLOCK_SIZE << le32_to_cpu(sbi->s_es->s_log_block_size); |
---|
2199 | | - |
---|
2200 | | - if (blocksize < PAGE_SIZE) { |
---|
2201 | | - ext4_msg(sb, KERN_ERR, "can't mount with " |
---|
2202 | | - "dioread_nolock if block size != PAGE_SIZE"); |
---|
2203 | | - return 0; |
---|
2204 | | - } |
---|
| 2493 | + if (blocksize < PAGE_SIZE) |
---|
| 2494 | + ext4_msg(sb, KERN_WARNING, "Warning: mounting with an " |
---|
| 2495 | + "experimental mount option 'dioread_nolock' " |
---|
| 2496 | + "for blocksize < PAGE_SIZE"); |
---|
2205 | 2497 | } |
---|
2206 | 2498 | return 1; |
---|
2207 | 2499 | } |
---|
.. | .. |
---|
2274 | 2566 | for (m = ext4_mount_opts; m->token != Opt_err; m++) { |
---|
2275 | 2567 | int want_set = m->flags & MOPT_SET; |
---|
2276 | 2568 | if (((m->flags & (MOPT_SET|MOPT_CLEAR)) == 0) || |
---|
2277 | | - (m->flags & MOPT_CLEAR_ERR)) |
---|
| 2569 | + (m->flags & MOPT_CLEAR_ERR) || m->flags & MOPT_SKIP) |
---|
2278 | 2570 | continue; |
---|
2279 | 2571 | if (!nodefs && !(m->mount_opt & (sbi->s_mount_opt ^ def_mount_opt))) |
---|
2280 | 2572 | continue; /* skip if same as the default */ |
---|
.. | .. |
---|
2334 | 2626 | |
---|
2335 | 2627 | fscrypt_show_test_dummy_encryption(seq, sep, sb); |
---|
2336 | 2628 | |
---|
| 2629 | + if (sb->s_flags & SB_INLINECRYPT) |
---|
| 2630 | + SEQ_OPTS_PUTS("inlinecrypt"); |
---|
| 2631 | + |
---|
| 2632 | + if (test_opt(sb, DAX_ALWAYS)) { |
---|
| 2633 | + if (IS_EXT2_SB(sb)) |
---|
| 2634 | + SEQ_OPTS_PUTS("dax"); |
---|
| 2635 | + else |
---|
| 2636 | + SEQ_OPTS_PUTS("dax=always"); |
---|
| 2637 | + } else if (test_opt2(sb, DAX_NEVER)) { |
---|
| 2638 | + SEQ_OPTS_PUTS("dax=never"); |
---|
| 2639 | + } else if (test_opt2(sb, DAX_INODE)) { |
---|
| 2640 | + SEQ_OPTS_PUTS("dax=inode"); |
---|
| 2641 | + } |
---|
2337 | 2642 | ext4_show_quota_options(seq, sb); |
---|
2338 | 2643 | return 0; |
---|
2339 | 2644 | } |
---|
.. | .. |
---|
2528 | 2833 | crc = crc16(crc, (__u8 *)gdp, offset); |
---|
2529 | 2834 | offset += sizeof(gdp->bg_checksum); /* skip checksum */ |
---|
2530 | 2835 | /* for checksum of struct ext4_group_desc do the rest...*/ |
---|
2531 | | - if (ext4_has_feature_64bit(sb) && |
---|
2532 | | - offset < le16_to_cpu(sbi->s_es->s_desc_size)) |
---|
| 2836 | + if (ext4_has_feature_64bit(sb) && offset < sbi->s_desc_size) |
---|
2533 | 2837 | crc = crc16(crc, (__u8 *)gdp + offset, |
---|
2534 | | - le16_to_cpu(sbi->s_es->s_desc_size) - |
---|
2535 | | - offset); |
---|
| 2838 | + sbi->s_desc_size - offset); |
---|
2536 | 2839 | |
---|
2537 | 2840 | out: |
---|
2538 | 2841 | return cpu_to_le16(crc); |
---|
.. | .. |
---|
2859 | 3162 | loff_t res; |
---|
2860 | 3163 | loff_t upper_limit = MAX_LFS_FILESIZE; |
---|
2861 | 3164 | |
---|
2862 | | - /* small i_blocks in vfs inode? */ |
---|
2863 | | - if (!has_huge_files || sizeof(blkcnt_t) < sizeof(u64)) { |
---|
2864 | | - /* |
---|
2865 | | - * CONFIG_LBDAF is not enabled implies the inode |
---|
2866 | | - * i_block represent total blocks in 512 bytes |
---|
2867 | | - * 32 == size of vfs inode i_blocks * 8 |
---|
2868 | | - */ |
---|
| 3165 | + BUILD_BUG_ON(sizeof(blkcnt_t) < sizeof(u64)); |
---|
| 3166 | + |
---|
| 3167 | + if (!has_huge_files) { |
---|
2869 | 3168 | upper_limit = (1LL << 32) - 1; |
---|
2870 | 3169 | |
---|
2871 | 3170 | /* total blocks in file system block size */ |
---|
.. | .. |
---|
2895 | 3194 | */ |
---|
2896 | 3195 | static loff_t ext4_max_bitmap_size(int bits, int has_huge_files) |
---|
2897 | 3196 | { |
---|
2898 | | - loff_t res = EXT4_NDIR_BLOCKS; |
---|
| 3197 | + unsigned long long upper_limit, res = EXT4_NDIR_BLOCKS; |
---|
2899 | 3198 | int meta_blocks; |
---|
2900 | | - loff_t upper_limit; |
---|
2901 | | - /* This is calculated to be the largest file size for a dense, block |
---|
| 3199 | + |
---|
| 3200 | + /* |
---|
| 3201 | + * This is calculated to be the largest file size for a dense, block |
---|
2902 | 3202 | * mapped file such that the file's total number of 512-byte sectors, |
---|
2903 | 3203 | * including data and all indirect blocks, does not exceed (2^48 - 1). |
---|
2904 | 3204 | * |
---|
2905 | 3205 | * __u32 i_blocks_lo and _u16 i_blocks_high represent the total |
---|
2906 | 3206 | * number of 512-byte sectors of the file. |
---|
2907 | 3207 | */ |
---|
2908 | | - |
---|
2909 | | - if (!has_huge_files || sizeof(blkcnt_t) < sizeof(u64)) { |
---|
| 3208 | + if (!has_huge_files) { |
---|
2910 | 3209 | /* |
---|
2911 | | - * !has_huge_files or CONFIG_LBDAF not enabled implies that |
---|
2912 | | - * the inode i_block field represents total file blocks in |
---|
2913 | | - * 2^32 512-byte sectors == size of vfs inode i_blocks * 8 |
---|
| 3210 | + * !has_huge_files or implies that the inode i_block field |
---|
| 3211 | + * represents total file blocks in 2^32 512-byte sectors == |
---|
| 3212 | + * size of vfs inode i_blocks * 8 |
---|
2914 | 3213 | */ |
---|
2915 | 3214 | upper_limit = (1LL << 32) - 1; |
---|
2916 | 3215 | |
---|
.. | .. |
---|
2948 | 3247 | if (res > MAX_LFS_FILESIZE) |
---|
2949 | 3248 | res = MAX_LFS_FILESIZE; |
---|
2950 | 3249 | |
---|
2951 | | - return res; |
---|
| 3250 | + return (loff_t)res; |
---|
2952 | 3251 | } |
---|
2953 | 3252 | |
---|
2954 | 3253 | static ext4_fsblk_t descriptor_loc(struct super_block *sb, |
---|
.. | .. |
---|
3059 | 3358 | ~EXT4_FEATURE_RO_COMPAT_SUPP)); |
---|
3060 | 3359 | return 0; |
---|
3061 | 3360 | } |
---|
3062 | | - /* |
---|
3063 | | - * Large file size enabled file system can only be mounted |
---|
3064 | | - * read-write on 32-bit systems if kernel is built with CONFIG_LBDAF |
---|
3065 | | - */ |
---|
3066 | | - if (ext4_has_feature_huge_file(sb)) { |
---|
3067 | | - if (sizeof(blkcnt_t) < sizeof(u64)) { |
---|
3068 | | - ext4_msg(sb, KERN_ERR, "Filesystem with huge files " |
---|
3069 | | - "cannot be mounted RDWR without " |
---|
3070 | | - "CONFIG_LBDAF"); |
---|
3071 | | - return 0; |
---|
3072 | | - } |
---|
3073 | | - } |
---|
3074 | 3361 | if (ext4_has_feature_bigalloc(sb) && !ext4_has_feature_extents(sb)) { |
---|
3075 | 3362 | ext4_msg(sb, KERN_ERR, |
---|
3076 | 3363 | "Can't support bigalloc feature without " |
---|
.. | .. |
---|
3140 | 3427 | static int ext4_run_li_request(struct ext4_li_request *elr) |
---|
3141 | 3428 | { |
---|
3142 | 3429 | struct ext4_group_desc *gdp = NULL; |
---|
3143 | | - ext4_group_t group, ngroups; |
---|
3144 | | - struct super_block *sb; |
---|
| 3430 | + struct super_block *sb = elr->lr_super; |
---|
| 3431 | + ext4_group_t ngroups = EXT4_SB(sb)->s_groups_count; |
---|
| 3432 | + ext4_group_t group = elr->lr_next_group; |
---|
| 3433 | + unsigned int prefetch_ios = 0; |
---|
3145 | 3434 | int ret = 0; |
---|
3146 | 3435 | u64 start_time; |
---|
3147 | 3436 | |
---|
3148 | | - sb = elr->lr_super; |
---|
3149 | | - ngroups = EXT4_SB(sb)->s_groups_count; |
---|
| 3437 | + if (elr->lr_mode == EXT4_LI_MODE_PREFETCH_BBITMAP) { |
---|
| 3438 | + elr->lr_next_group = ext4_mb_prefetch(sb, group, |
---|
| 3439 | + EXT4_SB(sb)->s_mb_prefetch, &prefetch_ios); |
---|
| 3440 | + if (prefetch_ios) |
---|
| 3441 | + ext4_mb_prefetch_fini(sb, elr->lr_next_group, |
---|
| 3442 | + prefetch_ios); |
---|
| 3443 | + trace_ext4_prefetch_bitmaps(sb, group, elr->lr_next_group, |
---|
| 3444 | + prefetch_ios); |
---|
| 3445 | + if (group >= elr->lr_next_group) { |
---|
| 3446 | + ret = 1; |
---|
| 3447 | + if (elr->lr_first_not_zeroed != ngroups && |
---|
| 3448 | + !sb_rdonly(sb) && test_opt(sb, INIT_INODE_TABLE)) { |
---|
| 3449 | + elr->lr_next_group = elr->lr_first_not_zeroed; |
---|
| 3450 | + elr->lr_mode = EXT4_LI_MODE_ITABLE; |
---|
| 3451 | + ret = 0; |
---|
| 3452 | + } |
---|
| 3453 | + } |
---|
| 3454 | + return ret; |
---|
| 3455 | + } |
---|
3150 | 3456 | |
---|
3151 | | - for (group = elr->lr_next_group; group < ngroups; group++) { |
---|
| 3457 | + for (; group < ngroups; group++) { |
---|
3152 | 3458 | gdp = ext4_get_group_desc(sb, group, NULL); |
---|
3153 | 3459 | if (!gdp) { |
---|
3154 | 3460 | ret = 1; |
---|
.. | .. |
---|
3166 | 3472 | start_time = ktime_get_real_ns(); |
---|
3167 | 3473 | ret = ext4_init_inode_table(sb, group, |
---|
3168 | 3474 | elr->lr_timeout ? 0 : 1); |
---|
| 3475 | + trace_ext4_lazy_itable_init(sb, group); |
---|
3169 | 3476 | if (elr->lr_timeout == 0) { |
---|
3170 | 3477 | elr->lr_timeout = nsecs_to_jiffies((ktime_get_real_ns() - start_time) * |
---|
3171 | | - elr->lr_sbi->s_li_wait_mult); |
---|
| 3478 | + EXT4_SB(elr->lr_super)->s_li_wait_mult); |
---|
3172 | 3479 | } |
---|
3173 | 3480 | elr->lr_next_sched = jiffies + elr->lr_timeout; |
---|
3174 | 3481 | elr->lr_next_group = group + 1; |
---|
.. | .. |
---|
3182 | 3489 | */ |
---|
3183 | 3490 | static void ext4_remove_li_request(struct ext4_li_request *elr) |
---|
3184 | 3491 | { |
---|
3185 | | - struct ext4_sb_info *sbi; |
---|
3186 | | - |
---|
3187 | 3492 | if (!elr) |
---|
3188 | 3493 | return; |
---|
3189 | 3494 | |
---|
3190 | | - sbi = elr->lr_sbi; |
---|
3191 | | - |
---|
3192 | 3495 | list_del(&elr->lr_request); |
---|
3193 | | - sbi->s_li_request = NULL; |
---|
| 3496 | + EXT4_SB(elr->lr_super)->s_li_request = NULL; |
---|
3194 | 3497 | kfree(elr); |
---|
3195 | 3498 | } |
---|
3196 | 3499 | |
---|
.. | .. |
---|
3227 | 3530 | unsigned long next_wakeup, cur; |
---|
3228 | 3531 | |
---|
3229 | 3532 | BUG_ON(NULL == eli); |
---|
| 3533 | + set_freezable(); |
---|
3230 | 3534 | |
---|
3231 | 3535 | cont_thread: |
---|
3232 | 3536 | while (true) { |
---|
.. | .. |
---|
3399 | 3703 | static struct ext4_li_request *ext4_li_request_new(struct super_block *sb, |
---|
3400 | 3704 | ext4_group_t start) |
---|
3401 | 3705 | { |
---|
3402 | | - struct ext4_sb_info *sbi = EXT4_SB(sb); |
---|
3403 | 3706 | struct ext4_li_request *elr; |
---|
3404 | 3707 | |
---|
3405 | 3708 | elr = kzalloc(sizeof(*elr), GFP_KERNEL); |
---|
.. | .. |
---|
3407 | 3710 | return NULL; |
---|
3408 | 3711 | |
---|
3409 | 3712 | elr->lr_super = sb; |
---|
3410 | | - elr->lr_sbi = sbi; |
---|
3411 | | - elr->lr_next_group = start; |
---|
| 3713 | + elr->lr_first_not_zeroed = start; |
---|
| 3714 | + if (test_opt(sb, PREFETCH_BLOCK_BITMAPS)) |
---|
| 3715 | + elr->lr_mode = EXT4_LI_MODE_PREFETCH_BBITMAP; |
---|
| 3716 | + else { |
---|
| 3717 | + elr->lr_mode = EXT4_LI_MODE_ITABLE; |
---|
| 3718 | + elr->lr_next_group = start; |
---|
| 3719 | + } |
---|
3412 | 3720 | |
---|
3413 | 3721 | /* |
---|
3414 | 3722 | * Randomize first schedule time of the request to |
---|
.. | .. |
---|
3438 | 3746 | goto out; |
---|
3439 | 3747 | } |
---|
3440 | 3748 | |
---|
3441 | | - if (first_not_zeroed == ngroups || sb_rdonly(sb) || |
---|
3442 | | - !test_opt(sb, INIT_INODE_TABLE)) |
---|
| 3749 | + if (!test_opt(sb, PREFETCH_BLOCK_BITMAPS) && |
---|
| 3750 | + (first_not_zeroed == ngroups || sb_rdonly(sb) || |
---|
| 3751 | + !test_opt(sb, INIT_INODE_TABLE))) |
---|
3443 | 3752 | goto out; |
---|
3444 | 3753 | |
---|
3445 | 3754 | elr = ext4_li_request_new(sb, first_not_zeroed); |
---|
.. | .. |
---|
3556 | 3865 | ext4_fsblk_t first_block, last_block, b; |
---|
3557 | 3866 | ext4_group_t i, ngroups = ext4_get_groups_count(sb); |
---|
3558 | 3867 | int s, j, count = 0; |
---|
| 3868 | + int has_super = ext4_bg_has_super(sb, grp); |
---|
3559 | 3869 | |
---|
3560 | 3870 | if (!ext4_has_feature_bigalloc(sb)) |
---|
3561 | | - return (ext4_bg_has_super(sb, grp) + ext4_bg_num_gdb(sb, grp) + |
---|
| 3871 | + return (has_super + ext4_bg_num_gdb(sb, grp) + |
---|
| 3872 | + (has_super ? le16_to_cpu(sbi->s_es->s_reserved_gdt_blocks) : 0) + |
---|
3562 | 3873 | sbi->s_itb_per_group + 2); |
---|
3563 | 3874 | |
---|
3564 | 3875 | first_block = le32_to_cpu(sbi->s_es->s_first_data_block) + |
---|
.. | .. |
---|
3650 | 3961 | * Add the internal journal blocks whether the journal has been |
---|
3651 | 3962 | * loaded or not |
---|
3652 | 3963 | */ |
---|
3653 | | - if (sbi->s_journal && !sbi->journal_bdev) |
---|
3654 | | - overhead += EXT4_NUM_B2C(sbi, sbi->s_journal->j_maxlen); |
---|
| 3964 | + if (sbi->s_journal && !sbi->s_journal_bdev) |
---|
| 3965 | + overhead += EXT4_NUM_B2C(sbi, sbi->s_journal->j_total_len); |
---|
3655 | 3966 | else if (ext4_has_feature_journal(sb) && !sbi->s_journal && j_inum) { |
---|
3656 | 3967 | /* j_inum for internal journal is non-zero */ |
---|
3657 | 3968 | j_inode = ext4_get_journal_inode(sb, j_inum); |
---|
.. | .. |
---|
3719 | 4030 | int blocksize, clustersize; |
---|
3720 | 4031 | unsigned int db_count; |
---|
3721 | 4032 | unsigned int i; |
---|
3722 | | - int needs_recovery, has_huge_files, has_bigalloc; |
---|
| 4033 | + int needs_recovery, has_huge_files; |
---|
3723 | 4034 | __u64 blocks_count; |
---|
3724 | 4035 | int err = 0; |
---|
3725 | 4036 | unsigned int journal_ioprio = DEFAULT_JOURNAL_IOPRIO; |
---|
.. | .. |
---|
3764 | 4075 | logical_sb_block = sb_block; |
---|
3765 | 4076 | } |
---|
3766 | 4077 | |
---|
3767 | | - if (!(bh = sb_bread_unmovable(sb, logical_sb_block))) { |
---|
| 4078 | + bh = ext4_sb_bread_unmovable(sb, logical_sb_block); |
---|
| 4079 | + if (IS_ERR(bh)) { |
---|
3768 | 4080 | ext4_msg(sb, KERN_ERR, "unable to read superblock"); |
---|
| 4081 | + ret = PTR_ERR(bh); |
---|
| 4082 | + bh = NULL; |
---|
3769 | 4083 | goto out_fail; |
---|
3770 | 4084 | } |
---|
3771 | 4085 | /* |
---|
.. | .. |
---|
3832 | 4146 | #ifdef CONFIG_EXT4_FS_POSIX_ACL |
---|
3833 | 4147 | set_opt(sb, POSIX_ACL); |
---|
3834 | 4148 | #endif |
---|
| 4149 | + if (ext4_has_feature_fast_commit(sb)) |
---|
| 4150 | + set_opt2(sb, JOURNAL_FAST_COMMIT); |
---|
3835 | 4151 | /* don't forget to enable journal_csum when metadata_csum is enabled. */ |
---|
3836 | 4152 | if (ext4_has_metadata_csum(sb)) |
---|
3837 | 4153 | set_opt(sb, JOURNAL_CHECKSUM); |
---|
.. | .. |
---|
3877 | 4193 | */ |
---|
3878 | 4194 | sbi->s_li_wait_mult = EXT4_DEF_LI_WAIT_MULT; |
---|
3879 | 4195 | |
---|
3880 | | - blocksize = BLOCK_SIZE << le32_to_cpu(es->s_log_block_size); |
---|
3881 | | - if (blocksize < EXT4_MIN_BLOCK_SIZE || |
---|
3882 | | - blocksize > EXT4_MAX_BLOCK_SIZE) { |
---|
| 4196 | + if (le32_to_cpu(es->s_log_block_size) > |
---|
| 4197 | + (EXT4_MAX_BLOCK_LOG_SIZE - EXT4_MIN_BLOCK_LOG_SIZE)) { |
---|
3883 | 4198 | ext4_msg(sb, KERN_ERR, |
---|
3884 | | - "Unsupported filesystem blocksize %d (%d log_block_size)", |
---|
3885 | | - blocksize, le32_to_cpu(es->s_log_block_size)); |
---|
| 4199 | + "Invalid log block size: %u", |
---|
| 4200 | + le32_to_cpu(es->s_log_block_size)); |
---|
3886 | 4201 | goto failed_mount; |
---|
3887 | 4202 | } |
---|
| 4203 | + if (le32_to_cpu(es->s_log_cluster_size) > |
---|
| 4204 | + (EXT4_MAX_CLUSTER_LOG_SIZE - EXT4_MIN_BLOCK_LOG_SIZE)) { |
---|
| 4205 | + ext4_msg(sb, KERN_ERR, |
---|
| 4206 | + "Invalid log cluster size: %u", |
---|
| 4207 | + le32_to_cpu(es->s_log_cluster_size)); |
---|
| 4208 | + goto failed_mount; |
---|
| 4209 | + } |
---|
| 4210 | + |
---|
| 4211 | + blocksize = EXT4_MIN_BLOCK_SIZE << le32_to_cpu(es->s_log_block_size); |
---|
| 4212 | + |
---|
| 4213 | + if (blocksize == PAGE_SIZE) |
---|
| 4214 | + set_opt(sb, DIOREAD_NOLOCK); |
---|
3888 | 4215 | |
---|
3889 | 4216 | if (le32_to_cpu(es->s_rev_level) == EXT4_GOOD_OLD_REV) { |
---|
3890 | 4217 | sbi->s_inode_size = EXT4_GOOD_OLD_INODE_SIZE; |
---|
.. | .. |
---|
3915 | 4242 | if (sbi->s_inode_size >= offsetof(struct ext4_inode, i_atime_extra) + |
---|
3916 | 4243 | sizeof(((struct ext4_inode *)0)->i_atime_extra)) { |
---|
3917 | 4244 | sb->s_time_gran = 1; |
---|
| 4245 | + sb->s_time_max = EXT4_EXTRA_TIMESTAMP_MAX; |
---|
3918 | 4246 | } else { |
---|
3919 | 4247 | sb->s_time_gran = NSEC_PER_SEC; |
---|
| 4248 | + sb->s_time_max = EXT4_NON_EXTRA_TIMESTAMP_MAX; |
---|
3920 | 4249 | } |
---|
| 4250 | + sb->s_time_min = EXT4_TIMESTAMP_MIN; |
---|
3921 | 4251 | } |
---|
3922 | 4252 | if (sbi->s_inode_size > EXT4_GOOD_OLD_INODE_SIZE) { |
---|
3923 | 4253 | sbi->s_want_extra_isize = sizeof(struct ext4_inode) - |
---|
.. | .. |
---|
3997 | 4327 | #endif |
---|
3998 | 4328 | |
---|
3999 | 4329 | if (test_opt(sb, DATA_FLAGS) == EXT4_MOUNT_JOURNAL_DATA) { |
---|
4000 | | - printk_once(KERN_WARNING "EXT4-fs: Warning: mounting " |
---|
4001 | | - "with data=journal disables delayed " |
---|
4002 | | - "allocation and O_DIRECT support!\n"); |
---|
| 4330 | + printk_once(KERN_WARNING "EXT4-fs: Warning: mounting with data=journal disables delayed allocation, dioread_nolock, O_DIRECT and fast_commit support!\n"); |
---|
| 4331 | + /* can't mount with both data=journal and dioread_nolock. */ |
---|
| 4332 | + clear_opt(sb, DIOREAD_NOLOCK); |
---|
| 4333 | + clear_opt2(sb, JOURNAL_FAST_COMMIT); |
---|
4003 | 4334 | if (test_opt2(sb, EXPLICIT_DELALLOC)) { |
---|
4004 | 4335 | ext4_msg(sb, KERN_ERR, "can't mount with " |
---|
4005 | 4336 | "both data=journal and delalloc"); |
---|
4006 | 4337 | goto failed_mount; |
---|
4007 | 4338 | } |
---|
4008 | | - if (test_opt(sb, DIOREAD_NOLOCK)) { |
---|
4009 | | - ext4_msg(sb, KERN_ERR, "can't mount with " |
---|
4010 | | - "both data=journal and dioread_nolock"); |
---|
4011 | | - goto failed_mount; |
---|
4012 | | - } |
---|
4013 | | - if (test_opt(sb, DAX)) { |
---|
| 4339 | + if (test_opt(sb, DAX_ALWAYS)) { |
---|
4014 | 4340 | ext4_msg(sb, KERN_ERR, "can't mount with " |
---|
4015 | 4341 | "both data=journal and dax"); |
---|
4016 | 4342 | goto failed_mount; |
---|
.. | .. |
---|
4098 | 4424 | if (!ext4_feature_set_ok(sb, (sb_rdonly(sb)))) |
---|
4099 | 4425 | goto failed_mount; |
---|
4100 | 4426 | |
---|
4101 | | - if (le32_to_cpu(es->s_log_block_size) > |
---|
4102 | | - (EXT4_MAX_BLOCK_LOG_SIZE - EXT4_MIN_BLOCK_LOG_SIZE)) { |
---|
4103 | | - ext4_msg(sb, KERN_ERR, |
---|
4104 | | - "Invalid log block size: %u", |
---|
4105 | | - le32_to_cpu(es->s_log_block_size)); |
---|
4106 | | - goto failed_mount; |
---|
4107 | | - } |
---|
4108 | | - if (le32_to_cpu(es->s_log_cluster_size) > |
---|
4109 | | - (EXT4_MAX_CLUSTER_LOG_SIZE - EXT4_MIN_BLOCK_LOG_SIZE)) { |
---|
4110 | | - ext4_msg(sb, KERN_ERR, |
---|
4111 | | - "Invalid log cluster size: %u", |
---|
4112 | | - le32_to_cpu(es->s_log_cluster_size)); |
---|
4113 | | - goto failed_mount; |
---|
4114 | | - } |
---|
4115 | | - |
---|
4116 | 4427 | if (le16_to_cpu(sbi->s_es->s_reserved_gdt_blocks) > (blocksize / 4)) { |
---|
4117 | 4428 | ext4_msg(sb, KERN_ERR, |
---|
4118 | 4429 | "Number of reserved GDT blocks insanely large: %d", |
---|
.. | .. |
---|
4120 | 4431 | goto failed_mount; |
---|
4121 | 4432 | } |
---|
4122 | 4433 | |
---|
4123 | | - if (sbi->s_mount_opt & EXT4_MOUNT_DAX) { |
---|
| 4434 | + if (bdev_dax_supported(sb->s_bdev, blocksize)) |
---|
| 4435 | + set_bit(EXT4_FLAGS_BDEV_IS_DAX, &sbi->s_ext4_flags); |
---|
| 4436 | + |
---|
| 4437 | + if (sbi->s_mount_opt & EXT4_MOUNT_DAX_ALWAYS) { |
---|
4124 | 4438 | if (ext4_has_feature_inline_data(sb)) { |
---|
4125 | 4439 | ext4_msg(sb, KERN_ERR, "Cannot use DAX on a filesystem" |
---|
4126 | 4440 | " that may contain inline data"); |
---|
4127 | | - sbi->s_mount_opt &= ~EXT4_MOUNT_DAX; |
---|
| 4441 | + goto failed_mount; |
---|
4128 | 4442 | } |
---|
4129 | | - if (!bdev_dax_supported(sb->s_bdev, blocksize)) { |
---|
| 4443 | + if (!test_bit(EXT4_FLAGS_BDEV_IS_DAX, &sbi->s_ext4_flags)) { |
---|
4130 | 4444 | ext4_msg(sb, KERN_ERR, |
---|
4131 | | - "DAX unsupported by block device. Turning off DAX."); |
---|
4132 | | - sbi->s_mount_opt &= ~EXT4_MOUNT_DAX; |
---|
| 4445 | + "DAX unsupported by block device."); |
---|
| 4446 | + goto failed_mount; |
---|
4133 | 4447 | } |
---|
4134 | 4448 | } |
---|
4135 | 4449 | |
---|
.. | .. |
---|
4140 | 4454 | } |
---|
4141 | 4455 | |
---|
4142 | 4456 | if (sb->s_blocksize != blocksize) { |
---|
| 4457 | + /* |
---|
| 4458 | + * bh must be released before kill_bdev(), otherwise |
---|
| 4459 | + * it won't be freed and its page also. kill_bdev() |
---|
| 4460 | + * is called by sb_set_blocksize(). |
---|
| 4461 | + */ |
---|
| 4462 | + brelse(bh); |
---|
4143 | 4463 | /* Validate the filesystem blocksize */ |
---|
4144 | 4464 | if (!sb_set_blocksize(sb, blocksize)) { |
---|
4145 | 4465 | ext4_msg(sb, KERN_ERR, "bad block size %d", |
---|
4146 | 4466 | blocksize); |
---|
| 4467 | + bh = NULL; |
---|
4147 | 4468 | goto failed_mount; |
---|
4148 | 4469 | } |
---|
4149 | 4470 | |
---|
4150 | | - brelse(bh); |
---|
4151 | 4471 | logical_sb_block = sb_block * EXT4_MIN_BLOCK_SIZE; |
---|
4152 | 4472 | offset = do_div(logical_sb_block, blocksize); |
---|
4153 | | - bh = sb_bread_unmovable(sb, logical_sb_block); |
---|
4154 | | - if (!bh) { |
---|
| 4473 | + bh = ext4_sb_bread_unmovable(sb, logical_sb_block); |
---|
| 4474 | + if (IS_ERR(bh)) { |
---|
4155 | 4475 | ext4_msg(sb, KERN_ERR, |
---|
4156 | 4476 | "Can't read superblock on 2nd try"); |
---|
| 4477 | + ret = PTR_ERR(bh); |
---|
| 4478 | + bh = NULL; |
---|
4157 | 4479 | goto failed_mount; |
---|
4158 | 4480 | } |
---|
4159 | 4481 | es = (struct ext4_super_block *)(bh->b_data + offset); |
---|
.. | .. |
---|
4199 | 4521 | sbi->s_inodes_per_block; |
---|
4200 | 4522 | sbi->s_desc_per_block = blocksize / EXT4_DESC_SIZE(sb); |
---|
4201 | 4523 | sbi->s_sbh = bh; |
---|
4202 | | - sbi->s_mount_state = le16_to_cpu(es->s_state); |
---|
| 4524 | + sbi->s_mount_state = le16_to_cpu(es->s_state) & ~EXT4_FC_REPLAY; |
---|
4203 | 4525 | sbi->s_addr_per_block_bits = ilog2(EXT4_ADDR_PER_BLOCK(sb)); |
---|
4204 | 4526 | sbi->s_desc_per_block_bits = ilog2(EXT4_DESC_PER_BLOCK(sb)); |
---|
4205 | 4527 | |
---|
.. | .. |
---|
4226 | 4548 | |
---|
4227 | 4549 | /* Handle clustersize */ |
---|
4228 | 4550 | clustersize = BLOCK_SIZE << le32_to_cpu(es->s_log_cluster_size); |
---|
4229 | | - has_bigalloc = ext4_has_feature_bigalloc(sb); |
---|
4230 | | - if (has_bigalloc) { |
---|
| 4551 | + if (ext4_has_feature_bigalloc(sb)) { |
---|
4231 | 4552 | if (clustersize < blocksize) { |
---|
4232 | 4553 | ext4_msg(sb, KERN_ERR, |
---|
4233 | 4554 | "cluster size (%d) smaller than " |
---|
.. | .. |
---|
4283 | 4604 | if (err) { |
---|
4284 | 4605 | ext4_msg(sb, KERN_ERR, "filesystem" |
---|
4285 | 4606 | " too large to mount safely on this system"); |
---|
4286 | | - if (sizeof(sector_t) < 8) |
---|
4287 | | - ext4_msg(sb, KERN_WARNING, "CONFIG_LBDAF not enabled"); |
---|
4288 | 4607 | goto failed_mount; |
---|
4289 | 4608 | } |
---|
4290 | 4609 | |
---|
.. | .. |
---|
4368 | 4687 | /* Pre-read the descriptors into the buffer cache */ |
---|
4369 | 4688 | for (i = 0; i < db_count; i++) { |
---|
4370 | 4689 | block = descriptor_loc(sb, logical_sb_block, i); |
---|
4371 | | - sb_breadahead_unmovable(sb, block); |
---|
| 4690 | + ext4_sb_breadahead_unmovable(sb, block); |
---|
4372 | 4691 | } |
---|
4373 | 4692 | |
---|
4374 | 4693 | for (i = 0; i < db_count; i++) { |
---|
4375 | 4694 | struct buffer_head *bh; |
---|
4376 | 4695 | |
---|
4377 | 4696 | block = descriptor_loc(sb, logical_sb_block, i); |
---|
4378 | | - bh = sb_bread_unmovable(sb, block); |
---|
4379 | | - if (!bh) { |
---|
| 4697 | + bh = ext4_sb_bread_unmovable(sb, block); |
---|
| 4698 | + if (IS_ERR(bh)) { |
---|
4380 | 4699 | ext4_msg(sb, KERN_ERR, |
---|
4381 | 4700 | "can't read group descriptor %d", i); |
---|
4382 | 4701 | db_count = i; |
---|
| 4702 | + ret = PTR_ERR(bh); |
---|
| 4703 | + bh = NULL; |
---|
4383 | 4704 | goto failed_mount2; |
---|
4384 | 4705 | } |
---|
4385 | 4706 | rcu_read_lock(); |
---|
.. | .. |
---|
4427 | 4748 | INIT_LIST_HEAD(&sbi->s_orphan); /* unlinked but open files */ |
---|
4428 | 4749 | mutex_init(&sbi->s_orphan_lock); |
---|
4429 | 4750 | |
---|
| 4751 | + /* Initialize fast commit stuff */ |
---|
| 4752 | + atomic_set(&sbi->s_fc_subtid, 0); |
---|
| 4753 | + atomic_set(&sbi->s_fc_ineligible_updates, 0); |
---|
| 4754 | + INIT_LIST_HEAD(&sbi->s_fc_q[FC_Q_MAIN]); |
---|
| 4755 | + INIT_LIST_HEAD(&sbi->s_fc_q[FC_Q_STAGING]); |
---|
| 4756 | + INIT_LIST_HEAD(&sbi->s_fc_dentry_q[FC_Q_MAIN]); |
---|
| 4757 | + INIT_LIST_HEAD(&sbi->s_fc_dentry_q[FC_Q_STAGING]); |
---|
| 4758 | + sbi->s_fc_bytes = 0; |
---|
| 4759 | + ext4_clear_mount_flag(sb, EXT4_MF_FC_INELIGIBLE); |
---|
| 4760 | + ext4_clear_mount_flag(sb, EXT4_MF_FC_COMMITTING); |
---|
| 4761 | + spin_lock_init(&sbi->s_fc_lock); |
---|
| 4762 | + memset(&sbi->s_fc_stats, 0, sizeof(sbi->s_fc_stats)); |
---|
| 4763 | + sbi->s_fc_replay_state.fc_regions = NULL; |
---|
| 4764 | + sbi->s_fc_replay_state.fc_regions_size = 0; |
---|
| 4765 | + sbi->s_fc_replay_state.fc_regions_used = 0; |
---|
| 4766 | + sbi->s_fc_replay_state.fc_regions_valid = 0; |
---|
| 4767 | + sbi->s_fc_replay_state.fc_modified_inodes = NULL; |
---|
| 4768 | + sbi->s_fc_replay_state.fc_modified_inodes_size = 0; |
---|
| 4769 | + sbi->s_fc_replay_state.fc_modified_inodes_used = 0; |
---|
| 4770 | + |
---|
4430 | 4771 | sb->s_root = NULL; |
---|
4431 | 4772 | |
---|
4432 | 4773 | needs_recovery = (es->s_last_orphan != 0 || |
---|
4433 | 4774 | ext4_has_feature_journal_needs_recovery(sb)); |
---|
4434 | 4775 | |
---|
4435 | | - if (ext4_has_feature_mmp(sb) && !sb_rdonly(sb)) |
---|
4436 | | - if (ext4_multi_mount_protect(sb, le64_to_cpu(es->s_mmp_block))) |
---|
| 4776 | + if (ext4_has_feature_mmp(sb) && !sb_rdonly(sb)) { |
---|
| 4777 | + err = ext4_multi_mount_protect(sb, le64_to_cpu(es->s_mmp_block)); |
---|
| 4778 | + if (err) |
---|
4437 | 4779 | goto failed_mount3a; |
---|
| 4780 | + } |
---|
4438 | 4781 | |
---|
4439 | 4782 | /* |
---|
4440 | 4783 | * The first inode we look at is the journal inode. Don't try |
---|
.. | .. |
---|
4448 | 4791 | ext4_has_feature_journal_needs_recovery(sb)) { |
---|
4449 | 4792 | ext4_msg(sb, KERN_ERR, "required journal recovery " |
---|
4450 | 4793 | "suppressed and not mounted read-only"); |
---|
4451 | | - goto failed_mount_wq; |
---|
| 4794 | + goto failed_mount3a; |
---|
4452 | 4795 | } else { |
---|
4453 | 4796 | /* Nojournal mode, all journal mount options are illegal */ |
---|
4454 | | - if (test_opt2(sb, EXPLICIT_JOURNAL_CHECKSUM)) { |
---|
4455 | | - ext4_msg(sb, KERN_ERR, "can't mount with " |
---|
4456 | | - "journal_checksum, fs mounted w/o journal"); |
---|
4457 | | - goto failed_mount_wq; |
---|
4458 | | - } |
---|
4459 | 4797 | if (test_opt(sb, JOURNAL_ASYNC_COMMIT)) { |
---|
4460 | 4798 | ext4_msg(sb, KERN_ERR, "can't mount with " |
---|
4461 | 4799 | "journal_async_commit, fs mounted w/o journal"); |
---|
4462 | | - goto failed_mount_wq; |
---|
| 4800 | + goto failed_mount3a; |
---|
| 4801 | + } |
---|
| 4802 | + |
---|
| 4803 | + if (test_opt2(sb, EXPLICIT_JOURNAL_CHECKSUM)) { |
---|
| 4804 | + ext4_msg(sb, KERN_ERR, "can't mount with " |
---|
| 4805 | + "journal_checksum, fs mounted w/o journal"); |
---|
| 4806 | + goto failed_mount3a; |
---|
4463 | 4807 | } |
---|
4464 | 4808 | if (sbi->s_commit_interval != JBD2_DEFAULT_MAX_COMMIT_AGE*HZ) { |
---|
4465 | 4809 | ext4_msg(sb, KERN_ERR, "can't mount with " |
---|
4466 | 4810 | "commit=%lu, fs mounted w/o journal", |
---|
4467 | 4811 | sbi->s_commit_interval / HZ); |
---|
4468 | | - goto failed_mount_wq; |
---|
| 4812 | + goto failed_mount3a; |
---|
4469 | 4813 | } |
---|
4470 | 4814 | if (EXT4_MOUNT_DATA_FLAGS & |
---|
4471 | 4815 | (sbi->s_mount_opt ^ sbi->s_def_mount_opt)) { |
---|
4472 | 4816 | ext4_msg(sb, KERN_ERR, "can't mount with " |
---|
4473 | 4817 | "data=, fs mounted w/o journal"); |
---|
4474 | | - goto failed_mount_wq; |
---|
| 4818 | + goto failed_mount3a; |
---|
4475 | 4819 | } |
---|
4476 | 4820 | sbi->s_def_mount_opt &= ~EXT4_MOUNT_JOURNAL_CHECKSUM; |
---|
4477 | 4821 | clear_opt(sb, JOURNAL_CHECKSUM); |
---|
4478 | 4822 | clear_opt(sb, DATA_FLAGS); |
---|
| 4823 | + clear_opt2(sb, JOURNAL_FAST_COMMIT); |
---|
4479 | 4824 | sbi->s_journal = NULL; |
---|
4480 | 4825 | needs_recovery = 0; |
---|
4481 | 4826 | goto no_journal; |
---|
.. | .. |
---|
4491 | 4836 | if (!set_journal_csum_feature_set(sb)) { |
---|
4492 | 4837 | ext4_msg(sb, KERN_ERR, "Failed to set journal checksum " |
---|
4493 | 4838 | "feature set"); |
---|
| 4839 | + goto failed_mount_wq; |
---|
| 4840 | + } |
---|
| 4841 | + |
---|
| 4842 | + if (test_opt2(sb, JOURNAL_FAST_COMMIT) && |
---|
| 4843 | + !jbd2_journal_set_features(EXT4_SB(sb)->s_journal, 0, 0, |
---|
| 4844 | + JBD2_FEATURE_INCOMPAT_FAST_COMMIT)) { |
---|
| 4845 | + ext4_msg(sb, KERN_ERR, |
---|
| 4846 | + "Failed to set fast commit journal feature"); |
---|
4494 | 4847 | goto failed_mount_wq; |
---|
4495 | 4848 | } |
---|
4496 | 4849 | |
---|
.. | .. |
---|
4533 | 4886 | |
---|
4534 | 4887 | set_task_ioprio(sbi->s_journal->j_task, journal_ioprio); |
---|
4535 | 4888 | |
---|
4536 | | - sbi->s_journal->j_commit_callback = ext4_journal_commit_callback; |
---|
| 4889 | + sbi->s_journal->j_submit_inode_data_buffers = |
---|
| 4890 | + ext4_journal_submit_inode_data_buffers; |
---|
| 4891 | + sbi->s_journal->j_finish_inode_data_buffers = |
---|
| 4892 | + ext4_journal_finish_inode_data_buffers; |
---|
4537 | 4893 | |
---|
4538 | 4894 | no_journal: |
---|
4539 | 4895 | if (!test_opt(sb, NO_MBCACHE)) { |
---|
.. | .. |
---|
4554 | 4910 | } |
---|
4555 | 4911 | } |
---|
4556 | 4912 | |
---|
4557 | | - if ((DUMMY_ENCRYPTION_ENABLED(sbi) || ext4_has_feature_encrypt(sb)) && |
---|
4558 | | - (blocksize != PAGE_SIZE)) { |
---|
4559 | | - ext4_msg(sb, KERN_ERR, |
---|
4560 | | - "Unsupported blocksize for fs encryption"); |
---|
4561 | | - goto failed_mount_wq; |
---|
4562 | | - } |
---|
4563 | | - |
---|
4564 | 4913 | if (ext4_has_feature_verity(sb) && blocksize != PAGE_SIZE) { |
---|
4565 | 4914 | ext4_msg(sb, KERN_ERR, "Unsupported blocksize for fs-verity"); |
---|
4566 | 4915 | goto failed_mount_wq; |
---|
4567 | | - } |
---|
4568 | | - |
---|
4569 | | - if (DUMMY_ENCRYPTION_ENABLED(sbi) && !sb_rdonly(sb) && |
---|
4570 | | - !ext4_has_feature_encrypt(sb)) { |
---|
4571 | | - ext4_set_feature_encrypt(sb); |
---|
4572 | | - ext4_commit_super(sb, 1); |
---|
4573 | 4916 | } |
---|
4574 | 4917 | |
---|
4575 | 4918 | /* |
---|
4576 | 4919 | * Get the # of file system overhead blocks from the |
---|
4577 | 4920 | * superblock if present. |
---|
4578 | 4921 | */ |
---|
4579 | | - if (es->s_overhead_clusters) |
---|
4580 | | - sbi->s_overhead = le32_to_cpu(es->s_overhead_clusters); |
---|
4581 | | - else { |
---|
| 4922 | + sbi->s_overhead = le32_to_cpu(es->s_overhead_clusters); |
---|
| 4923 | + /* ignore the precalculated value if it is ridiculous */ |
---|
| 4924 | + if (sbi->s_overhead > ext4_blocks_count(es)) |
---|
| 4925 | + sbi->s_overhead = 0; |
---|
| 4926 | + /* |
---|
| 4927 | + * If the bigalloc feature is not enabled recalculating the |
---|
| 4928 | + * overhead doesn't take long, so we might as well just redo |
---|
| 4929 | + * it to make sure we are using the correct value. |
---|
| 4930 | + */ |
---|
| 4931 | + if (!ext4_has_feature_bigalloc(sb)) |
---|
| 4932 | + sbi->s_overhead = 0; |
---|
| 4933 | + if (sbi->s_overhead == 0) { |
---|
4582 | 4934 | err = ext4_calculate_overhead(sb); |
---|
4583 | 4935 | if (err) |
---|
4584 | 4936 | goto failed_mount_wq; |
---|
.. | .. |
---|
4638 | 4990 | goto failed_mount4a; |
---|
4639 | 4991 | } |
---|
4640 | 4992 | } |
---|
| 4993 | + ext4_fc_replay_cleanup(sb); |
---|
4641 | 4994 | |
---|
4642 | 4995 | ext4_ext_init(sb); |
---|
4643 | 4996 | err = ext4_mb_init(sb); |
---|
.. | .. |
---|
4646 | 4999 | err); |
---|
4647 | 5000 | goto failed_mount5; |
---|
4648 | 5001 | } |
---|
| 5002 | + |
---|
| 5003 | + /* |
---|
| 5004 | + * We can only set up the journal commit callback once |
---|
| 5005 | + * mballoc is initialized |
---|
| 5006 | + */ |
---|
| 5007 | + if (sbi->s_journal) |
---|
| 5008 | + sbi->s_journal->j_commit_callback = |
---|
| 5009 | + ext4_journal_commit_callback; |
---|
4649 | 5010 | |
---|
4650 | 5011 | block = ext4_count_free_clusters(sb); |
---|
4651 | 5012 | ext4_free_blocks_count_set(sbi->s_es, |
---|
.. | .. |
---|
4665 | 5026 | ext4_count_dirs(sb), GFP_KERNEL); |
---|
4666 | 5027 | if (!err) |
---|
4667 | 5028 | err = percpu_counter_init(&sbi->s_dirtyclusters_counter, 0, |
---|
| 5029 | + GFP_KERNEL); |
---|
| 5030 | + if (!err) |
---|
| 5031 | + err = percpu_counter_init(&sbi->s_sra_exceeded_retry_limit, 0, |
---|
4668 | 5032 | GFP_KERNEL); |
---|
4669 | 5033 | if (!err) |
---|
4670 | 5034 | err = percpu_init_rwsem(&sbi->s_writepages_rwsem); |
---|
.. | .. |
---|
4700 | 5064 | } |
---|
4701 | 5065 | #endif /* CONFIG_QUOTA */ |
---|
4702 | 5066 | |
---|
| 5067 | + /* |
---|
| 5068 | + * Save the original bdev mapping's wb_err value which could be |
---|
| 5069 | + * used to detect the metadata async write error. |
---|
| 5070 | + */ |
---|
| 5071 | + spin_lock_init(&sbi->s_bdev_wb_lock); |
---|
| 5072 | + errseq_check_and_advance(&sb->s_bdev->bd_inode->i_mapping->wb_err, |
---|
| 5073 | + &sbi->s_bdev_wb_err); |
---|
| 5074 | + sb->s_bdev->bd_super = sb; |
---|
4703 | 5075 | EXT4_SB(sb)->s_mount_state |= EXT4_ORPHAN_FS; |
---|
4704 | 5076 | ext4_orphan_cleanup(sb, es); |
---|
4705 | 5077 | EXT4_SB(sb)->s_mount_state &= ~EXT4_ORPHAN_FS; |
---|
.. | .. |
---|
4741 | 5113 | ratelimit_state_init(&sbi->s_err_ratelimit_state, 5 * HZ, 10); |
---|
4742 | 5114 | ratelimit_state_init(&sbi->s_warning_ratelimit_state, 5 * HZ, 10); |
---|
4743 | 5115 | ratelimit_state_init(&sbi->s_msg_ratelimit_state, 5 * HZ, 10); |
---|
| 5116 | + atomic_set(&sbi->s_warning_count, 0); |
---|
| 5117 | + atomic_set(&sbi->s_msg_count, 0); |
---|
4744 | 5118 | |
---|
4745 | 5119 | kfree(orig_data); |
---|
4746 | 5120 | return 0; |
---|
.. | .. |
---|
4769 | 5143 | percpu_counter_destroy(&sbi->s_freeinodes_counter); |
---|
4770 | 5144 | percpu_counter_destroy(&sbi->s_dirs_counter); |
---|
4771 | 5145 | percpu_counter_destroy(&sbi->s_dirtyclusters_counter); |
---|
| 5146 | + percpu_counter_destroy(&sbi->s_sra_exceeded_retry_limit); |
---|
4772 | 5147 | percpu_free_rwsem(&sbi->s_writepages_rwsem); |
---|
4773 | 5148 | failed_mount5: |
---|
4774 | 5149 | ext4_ext_release(sb); |
---|
.. | .. |
---|
4781 | 5156 | if (EXT4_SB(sb)->rsv_conversion_wq) |
---|
4782 | 5157 | destroy_workqueue(EXT4_SB(sb)->rsv_conversion_wq); |
---|
4783 | 5158 | failed_mount_wq: |
---|
4784 | | - if (sbi->s_ea_inode_cache) { |
---|
4785 | | - ext4_xattr_destroy_cache(sbi->s_ea_inode_cache); |
---|
4786 | | - sbi->s_ea_inode_cache = NULL; |
---|
4787 | | - } |
---|
4788 | | - if (sbi->s_ea_block_cache) { |
---|
4789 | | - ext4_xattr_destroy_cache(sbi->s_ea_block_cache); |
---|
4790 | | - sbi->s_ea_block_cache = NULL; |
---|
4791 | | - } |
---|
| 5159 | + ext4_xattr_destroy_cache(sbi->s_ea_inode_cache); |
---|
| 5160 | + sbi->s_ea_inode_cache = NULL; |
---|
| 5161 | + |
---|
| 5162 | + ext4_xattr_destroy_cache(sbi->s_ea_block_cache); |
---|
| 5163 | + sbi->s_ea_block_cache = NULL; |
---|
| 5164 | + |
---|
4792 | 5165 | if (sbi->s_journal) { |
---|
4793 | 5166 | jbd2_journal_destroy(sbi->s_journal); |
---|
4794 | 5167 | sbi->s_journal = NULL; |
---|
.. | .. |
---|
4797 | 5170 | ext4_es_unregister_shrinker(sbi); |
---|
4798 | 5171 | failed_mount3: |
---|
4799 | 5172 | del_timer_sync(&sbi->s_err_report); |
---|
4800 | | - if (sbi->s_mmp_tsk) |
---|
4801 | | - kthread_stop(sbi->s_mmp_tsk); |
---|
| 5173 | + ext4_stop_mmpd(sbi); |
---|
4802 | 5174 | failed_mount2: |
---|
4803 | 5175 | rcu_read_lock(); |
---|
4804 | 5176 | group_desc = rcu_dereference(sbi->s_group_desc); |
---|
.. | .. |
---|
4816 | 5188 | |
---|
4817 | 5189 | #ifdef CONFIG_QUOTA |
---|
4818 | 5190 | for (i = 0; i < EXT4_MAXQUOTAS; i++) |
---|
4819 | | - kfree(sbi->s_qf_names[i]); |
---|
| 5191 | + kfree(get_qf_name(sb, sbi, i)); |
---|
4820 | 5192 | #endif |
---|
4821 | | - fscrypt_free_dummy_context(&sbi->s_dummy_enc_ctx); |
---|
4822 | | - ext4_blkdev_remove(sbi); |
---|
| 5193 | + fscrypt_free_dummy_policy(&sbi->s_dummy_enc_policy); |
---|
| 5194 | + /* ext4_blkdev_remove() calls kill_bdev(), release bh before it. */ |
---|
4823 | 5195 | brelse(bh); |
---|
| 5196 | + ext4_blkdev_remove(sbi); |
---|
4824 | 5197 | out_fail: |
---|
| 5198 | + invalidate_bdev(sb->s_bdev); |
---|
4825 | 5199 | sb->s_fs_info = NULL; |
---|
4826 | 5200 | kfree(sbi->s_blockgroup_lock); |
---|
4827 | 5201 | out_free_base: |
---|
.. | .. |
---|
4843 | 5217 | journal->j_commit_interval = sbi->s_commit_interval; |
---|
4844 | 5218 | journal->j_min_batch_time = sbi->s_min_batch_time; |
---|
4845 | 5219 | journal->j_max_batch_time = sbi->s_max_batch_time; |
---|
| 5220 | + ext4_fc_init(sb, journal); |
---|
4846 | 5221 | |
---|
4847 | 5222 | write_lock(&journal->j_state_lock); |
---|
4848 | 5223 | if (test_opt(sb, BARRIER)) |
---|
.. | .. |
---|
4880 | 5255 | |
---|
4881 | 5256 | jbd_debug(2, "Journal inode found at %p: %lld bytes\n", |
---|
4882 | 5257 | journal_inode, journal_inode->i_size); |
---|
4883 | | - if (!S_ISREG(journal_inode->i_mode)) { |
---|
| 5258 | + if (!S_ISREG(journal_inode->i_mode) || IS_ENCRYPTED(journal_inode)) { |
---|
4884 | 5259 | ext4_msg(sb, KERN_ERR, "invalid journal inode"); |
---|
4885 | 5260 | iput(journal_inode); |
---|
4886 | 5261 | return NULL; |
---|
.. | .. |
---|
4985 | 5360 | goto out_bdev; |
---|
4986 | 5361 | } |
---|
4987 | 5362 | journal->j_private = sb; |
---|
4988 | | - ll_rw_block(REQ_OP_READ, REQ_META | REQ_PRIO, 1, &journal->j_sb_buffer); |
---|
4989 | | - wait_on_buffer(journal->j_sb_buffer); |
---|
4990 | | - if (!buffer_uptodate(journal->j_sb_buffer)) { |
---|
| 5363 | + if (ext4_read_bh_lock(journal->j_sb_buffer, REQ_META | REQ_PRIO, true)) { |
---|
4991 | 5364 | ext4_msg(sb, KERN_ERR, "I/O error on journal device"); |
---|
4992 | 5365 | goto out_journal; |
---|
4993 | 5366 | } |
---|
.. | .. |
---|
4997 | 5370 | be32_to_cpu(journal->j_superblock->s_nr_users)); |
---|
4998 | 5371 | goto out_journal; |
---|
4999 | 5372 | } |
---|
5000 | | - EXT4_SB(sb)->journal_bdev = bdev; |
---|
| 5373 | + EXT4_SB(sb)->s_journal_bdev = bdev; |
---|
5001 | 5374 | ext4_init_journal_params(sb, journal); |
---|
5002 | 5375 | return journal; |
---|
5003 | 5376 | |
---|
.. | .. |
---|
5323 | 5696 | needs_barrier = true; |
---|
5324 | 5697 | if (needs_barrier) { |
---|
5325 | 5698 | int err; |
---|
5326 | | - err = blkdev_issue_flush(sb->s_bdev, GFP_KERNEL, NULL); |
---|
| 5699 | + err = blkdev_issue_flush(sb->s_bdev, GFP_KERNEL); |
---|
5327 | 5700 | if (!ret) |
---|
5328 | 5701 | ret = err; |
---|
5329 | 5702 | } |
---|
.. | .. |
---|
5413 | 5786 | struct ext4_sb_info *sbi = EXT4_SB(sb); |
---|
5414 | 5787 | unsigned long old_sb_flags, vfs_flags; |
---|
5415 | 5788 | struct ext4_mount_options old_opts; |
---|
5416 | | - int enable_quota = 0; |
---|
5417 | 5789 | ext4_group_t g; |
---|
5418 | 5790 | unsigned int journal_ioprio = DEFAULT_JOURNAL_IOPRIO; |
---|
5419 | 5791 | int err = 0; |
---|
5420 | 5792 | #ifdef CONFIG_QUOTA |
---|
| 5793 | + int enable_quota = 0; |
---|
5421 | 5794 | int i, j; |
---|
5422 | 5795 | char *to_free[EXT4_MAXQUOTAS]; |
---|
5423 | 5796 | #endif |
---|
.. | .. |
---|
5502 | 5875 | goto restore_opts; |
---|
5503 | 5876 | } |
---|
5504 | 5877 | |
---|
5505 | | - if (sbi->s_mount_flags & EXT4_MF_FS_ABORTED) |
---|
5506 | | - ext4_abort(sb, "Abort forced by user"); |
---|
| 5878 | + if (ext4_test_mount_flag(sb, EXT4_MF_FS_ABORTED)) |
---|
| 5879 | + ext4_abort(sb, EXT4_ERR_ESHUTDOWN, "Abort forced by user"); |
---|
5507 | 5880 | |
---|
5508 | 5881 | sb->s_flags = (sb->s_flags & ~SB_POSIXACL) | |
---|
5509 | 5882 | (test_opt(sb, POSIX_ACL) ? SB_POSIXACL : 0); |
---|
.. | .. |
---|
5516 | 5889 | } |
---|
5517 | 5890 | |
---|
5518 | 5891 | if ((bool)(*flags & SB_RDONLY) != sb_rdonly(sb)) { |
---|
5519 | | - if (sbi->s_mount_flags & EXT4_MF_FS_ABORTED) { |
---|
| 5892 | + if (ext4_test_mount_flag(sb, EXT4_MF_FS_ABORTED)) { |
---|
5520 | 5893 | err = -EROFS; |
---|
5521 | 5894 | goto restore_opts; |
---|
5522 | 5895 | } |
---|
.. | .. |
---|
5551 | 5924 | */ |
---|
5552 | 5925 | ext4_mark_recovery_complete(sb, es); |
---|
5553 | 5926 | } |
---|
5554 | | - if (sbi->s_mmp_tsk) |
---|
5555 | | - kthread_stop(sbi->s_mmp_tsk); |
---|
5556 | 5927 | } else { |
---|
5557 | 5928 | /* Make sure we can mount this feature set readwrite */ |
---|
5558 | 5929 | if (ext4_has_feature_readonly(sb) || |
---|
.. | .. |
---|
5603 | 5974 | if (err) |
---|
5604 | 5975 | goto restore_opts; |
---|
5605 | 5976 | } |
---|
5606 | | - sbi->s_mount_state = le16_to_cpu(es->s_state); |
---|
| 5977 | + sbi->s_mount_state = (le16_to_cpu(es->s_state) & |
---|
| 5978 | + ~EXT4_FC_REPLAY); |
---|
5607 | 5979 | |
---|
5608 | 5980 | err = ext4_setup_super(sb, es, 0); |
---|
5609 | 5981 | if (err) |
---|
5610 | 5982 | goto restore_opts; |
---|
5611 | 5983 | |
---|
5612 | 5984 | sb->s_flags &= ~SB_RDONLY; |
---|
5613 | | - if (ext4_has_feature_mmp(sb)) |
---|
5614 | | - if (ext4_multi_mount_protect(sb, |
---|
5615 | | - le64_to_cpu(es->s_mmp_block))) { |
---|
5616 | | - err = -EROFS; |
---|
| 5985 | + if (ext4_has_feature_mmp(sb)) { |
---|
| 5986 | + err = ext4_multi_mount_protect(sb, |
---|
| 5987 | + le64_to_cpu(es->s_mmp_block)); |
---|
| 5988 | + if (err) |
---|
5617 | 5989 | goto restore_opts; |
---|
5618 | | - } |
---|
| 5990 | + } |
---|
| 5991 | +#ifdef CONFIG_QUOTA |
---|
5619 | 5992 | enable_quota = 1; |
---|
| 5993 | +#endif |
---|
5620 | 5994 | } |
---|
5621 | 5995 | } |
---|
| 5996 | + |
---|
| 5997 | + /* |
---|
| 5998 | + * Handle creation of system zone data early because it can fail. |
---|
| 5999 | + * Releasing of existing data is done when we are sure remount will |
---|
| 6000 | + * succeed. |
---|
| 6001 | + */ |
---|
| 6002 | + if (test_opt(sb, BLOCK_VALIDITY) && !sbi->s_system_blks) { |
---|
| 6003 | + err = ext4_setup_system_zone(sb); |
---|
| 6004 | + if (err) |
---|
| 6005 | + goto restore_opts; |
---|
| 6006 | + } |
---|
| 6007 | + |
---|
| 6008 | + if (sbi->s_journal == NULL && !(old_sb_flags & SB_RDONLY)) { |
---|
| 6009 | + err = ext4_commit_super(sb, 1); |
---|
| 6010 | + if (err) |
---|
| 6011 | + goto restore_opts; |
---|
| 6012 | + } |
---|
| 6013 | + |
---|
| 6014 | +#ifdef CONFIG_QUOTA |
---|
| 6015 | + if (enable_quota) { |
---|
| 6016 | + if (sb_any_quota_suspended(sb)) |
---|
| 6017 | + dquot_resume(sb, -1); |
---|
| 6018 | + else if (ext4_has_feature_quota(sb)) { |
---|
| 6019 | + err = ext4_enable_quotas(sb); |
---|
| 6020 | + if (err) |
---|
| 6021 | + goto restore_opts; |
---|
| 6022 | + } |
---|
| 6023 | + } |
---|
| 6024 | + /* Release old quota file names */ |
---|
| 6025 | + for (i = 0; i < EXT4_MAXQUOTAS; i++) |
---|
| 6026 | + kfree(old_opts.s_qf_names[i]); |
---|
| 6027 | +#endif |
---|
| 6028 | + if (!test_opt(sb, BLOCK_VALIDITY) && sbi->s_system_blks) |
---|
| 6029 | + ext4_release_system_zone(sb); |
---|
5622 | 6030 | |
---|
5623 | 6031 | /* |
---|
5624 | 6032 | * Reinitialize lazy itable initialization thread based on |
---|
.. | .. |
---|
5632 | 6040 | ext4_register_li_request(sb, first_not_zeroed); |
---|
5633 | 6041 | } |
---|
5634 | 6042 | |
---|
5635 | | - /* |
---|
5636 | | - * Handle creation of system zone data early because it can fail. |
---|
5637 | | - * Releasing of existing data is done when we are sure remount will |
---|
5638 | | - * succeed. |
---|
5639 | | - */ |
---|
5640 | | - if (test_opt(sb, BLOCK_VALIDITY) && !sbi->system_blks) { |
---|
5641 | | - err = ext4_setup_system_zone(sb); |
---|
5642 | | - if (err) |
---|
5643 | | - goto restore_opts; |
---|
5644 | | - } |
---|
5645 | | - |
---|
5646 | | - if (sbi->s_journal == NULL && !(old_sb_flags & SB_RDONLY)) { |
---|
5647 | | - err = ext4_commit_super(sb, 1); |
---|
5648 | | - if (err) |
---|
5649 | | - goto restore_opts; |
---|
5650 | | - } |
---|
5651 | | - |
---|
5652 | | -#ifdef CONFIG_QUOTA |
---|
5653 | | - /* Release old quota file names */ |
---|
5654 | | - for (i = 0; i < EXT4_MAXQUOTAS; i++) |
---|
5655 | | - kfree(old_opts.s_qf_names[i]); |
---|
5656 | | - if (enable_quota) { |
---|
5657 | | - if (sb_any_quota_suspended(sb)) |
---|
5658 | | - dquot_resume(sb, -1); |
---|
5659 | | - else if (ext4_has_feature_quota(sb)) { |
---|
5660 | | - err = ext4_enable_quotas(sb); |
---|
5661 | | - if (err) |
---|
5662 | | - goto restore_opts; |
---|
5663 | | - } |
---|
5664 | | - } |
---|
5665 | | -#endif |
---|
5666 | | - if (!test_opt(sb, BLOCK_VALIDITY) && sbi->system_blks) |
---|
5667 | | - ext4_release_system_zone(sb); |
---|
| 6043 | + if (!ext4_has_feature_mmp(sb) || sb_rdonly(sb)) |
---|
| 6044 | + ext4_stop_mmpd(sbi); |
---|
5668 | 6045 | |
---|
5669 | 6046 | /* |
---|
5670 | 6047 | * Some options can be enabled by ext4 and/or by VFS mount flag |
---|
.. | .. |
---|
5678 | 6055 | return 0; |
---|
5679 | 6056 | |
---|
5680 | 6057 | restore_opts: |
---|
| 6058 | + /* |
---|
| 6059 | + * If there was a failing r/w to ro transition, we may need to |
---|
| 6060 | + * re-enable quota |
---|
| 6061 | + */ |
---|
| 6062 | + if ((sb->s_flags & SB_RDONLY) && !(old_sb_flags & SB_RDONLY) && |
---|
| 6063 | + sb_any_quota_suspended(sb)) |
---|
| 6064 | + dquot_resume(sb, -1); |
---|
5681 | 6065 | sb->s_flags = old_sb_flags; |
---|
5682 | 6066 | sbi->s_mount_opt = old_opts.s_mount_opt; |
---|
5683 | 6067 | sbi->s_mount_opt2 = old_opts.s_mount_opt2; |
---|
.. | .. |
---|
5686 | 6070 | sbi->s_commit_interval = old_opts.s_commit_interval; |
---|
5687 | 6071 | sbi->s_min_batch_time = old_opts.s_min_batch_time; |
---|
5688 | 6072 | sbi->s_max_batch_time = old_opts.s_max_batch_time; |
---|
5689 | | - if (!test_opt(sb, BLOCK_VALIDITY) && sbi->system_blks) |
---|
| 6073 | + if (!test_opt(sb, BLOCK_VALIDITY) && sbi->s_system_blks) |
---|
5690 | 6074 | ext4_release_system_zone(sb); |
---|
5691 | 6075 | #ifdef CONFIG_QUOTA |
---|
5692 | 6076 | sbi->s_jquota_fmt = old_opts.s_jquota_fmt; |
---|
.. | .. |
---|
5698 | 6082 | for (i = 0; i < EXT4_MAXQUOTAS; i++) |
---|
5699 | 6083 | kfree(to_free[i]); |
---|
5700 | 6084 | #endif |
---|
| 6085 | + if (!ext4_has_feature_mmp(sb) || sb_rdonly(sb)) |
---|
| 6086 | + ext4_stop_mmpd(sbi); |
---|
5701 | 6087 | kfree(orig_data); |
---|
5702 | 6088 | return err; |
---|
5703 | 6089 | } |
---|
.. | .. |
---|
5717 | 6103 | return PTR_ERR(dquot); |
---|
5718 | 6104 | spin_lock(&dquot->dq_dqb_lock); |
---|
5719 | 6105 | |
---|
5720 | | - limit = (dquot->dq_dqb.dqb_bsoftlimit ? |
---|
5721 | | - dquot->dq_dqb.dqb_bsoftlimit : |
---|
5722 | | - dquot->dq_dqb.dqb_bhardlimit) >> sb->s_blocksize_bits; |
---|
| 6106 | + limit = min_not_zero(dquot->dq_dqb.dqb_bsoftlimit, |
---|
| 6107 | + dquot->dq_dqb.dqb_bhardlimit); |
---|
| 6108 | + limit >>= sb->s_blocksize_bits; |
---|
| 6109 | + |
---|
5723 | 6110 | if (limit && buf->f_blocks > limit) { |
---|
5724 | 6111 | curblock = (dquot->dq_dqb.dqb_curspace + |
---|
5725 | 6112 | dquot->dq_dqb.dqb_rsvspace) >> sb->s_blocksize_bits; |
---|
.. | .. |
---|
5729 | 6116 | (buf->f_blocks - curblock) : 0; |
---|
5730 | 6117 | } |
---|
5731 | 6118 | |
---|
5732 | | - limit = dquot->dq_dqb.dqb_isoftlimit ? |
---|
5733 | | - dquot->dq_dqb.dqb_isoftlimit : |
---|
5734 | | - dquot->dq_dqb.dqb_ihardlimit; |
---|
| 6119 | + limit = min_not_zero(dquot->dq_dqb.dqb_isoftlimit, |
---|
| 6120 | + dquot->dq_dqb.dqb_ihardlimit); |
---|
5735 | 6121 | if (limit && buf->f_files > limit) { |
---|
5736 | 6122 | buf->f_files = limit; |
---|
5737 | 6123 | buf->f_ffree = |
---|
.. | .. |
---|
5774 | 6160 | buf->f_namelen = EXT4_NAME_LEN; |
---|
5775 | 6161 | fsid = le64_to_cpup((void *)es->s_uuid) ^ |
---|
5776 | 6162 | le64_to_cpup((void *)es->s_uuid + sizeof(u64)); |
---|
5777 | | - buf->f_fsid.val[0] = fsid & 0xFFFFFFFFUL; |
---|
5778 | | - buf->f_fsid.val[1] = (fsid >> 32) & 0xFFFFFFFFUL; |
---|
| 6163 | + buf->f_fsid = u64_to_fsid(fsid); |
---|
5779 | 6164 | |
---|
5780 | 6165 | #ifdef CONFIG_QUOTA |
---|
5781 | 6166 | if (ext4_test_inode_flag(dentry->d_inode, EXT4_INODE_PROJINHERIT) && |
---|
.. | .. |
---|
5871 | 6256 | handle_t *handle; |
---|
5872 | 6257 | |
---|
5873 | 6258 | /* Data block + inode block */ |
---|
5874 | | - handle = ext4_journal_start(d_inode(sb->s_root), EXT4_HT_QUOTA, 2); |
---|
| 6259 | + handle = ext4_journal_start_sb(sb, EXT4_HT_QUOTA, 2); |
---|
5875 | 6260 | if (IS_ERR(handle)) |
---|
5876 | 6261 | return PTR_ERR(handle); |
---|
5877 | 6262 | ret = dquot_commit_info(sb, type); |
---|
.. | .. |
---|
5975 | 6360 | EXT4_I(inode)->i_flags |= EXT4_NOATIME_FL | EXT4_IMMUTABLE_FL; |
---|
5976 | 6361 | inode_set_flags(inode, S_NOATIME | S_IMMUTABLE, |
---|
5977 | 6362 | S_NOATIME | S_IMMUTABLE); |
---|
5978 | | - ext4_mark_inode_dirty(handle, inode); |
---|
| 6363 | + err = ext4_mark_inode_dirty(handle, inode); |
---|
5979 | 6364 | ext4_journal_stop(handle); |
---|
5980 | 6365 | unlock_inode: |
---|
5981 | 6366 | inode_unlock(inode); |
---|
.. | .. |
---|
5986 | 6371 | lockdep_set_quota_inode(path->dentry->d_inode, |
---|
5987 | 6372 | I_DATA_SEM_NORMAL); |
---|
5988 | 6373 | return err; |
---|
| 6374 | +} |
---|
| 6375 | + |
---|
| 6376 | +static inline bool ext4_check_quota_inum(int type, unsigned long qf_inum) |
---|
| 6377 | +{ |
---|
| 6378 | + switch (type) { |
---|
| 6379 | + case USRQUOTA: |
---|
| 6380 | + return qf_inum == EXT4_USR_QUOTA_INO; |
---|
| 6381 | + case GRPQUOTA: |
---|
| 6382 | + return qf_inum == EXT4_GRP_QUOTA_INO; |
---|
| 6383 | + case PRJQUOTA: |
---|
| 6384 | + return qf_inum >= EXT4_GOOD_OLD_FIRST_INO; |
---|
| 6385 | + default: |
---|
| 6386 | + BUG(); |
---|
| 6387 | + } |
---|
5989 | 6388 | } |
---|
5990 | 6389 | |
---|
5991 | 6390 | static int ext4_quota_enable(struct super_block *sb, int type, int format_id, |
---|
.. | .. |
---|
6004 | 6403 | if (!qf_inums[type]) |
---|
6005 | 6404 | return -EPERM; |
---|
6006 | 6405 | |
---|
| 6406 | + if (!ext4_check_quota_inum(type, qf_inums[type])) { |
---|
| 6407 | + ext4_error(sb, "Bad quota inum: %lu, type: %d", |
---|
| 6408 | + qf_inums[type], type); |
---|
| 6409 | + return -EUCLEAN; |
---|
| 6410 | + } |
---|
| 6411 | + |
---|
6007 | 6412 | qf_inode = ext4_iget(sb, qf_inums[type], EXT4_IGET_SPECIAL); |
---|
6008 | 6413 | if (IS_ERR(qf_inode)) { |
---|
6009 | | - ext4_error(sb, "Bad quota inode # %lu", qf_inums[type]); |
---|
| 6414 | + ext4_error(sb, "Bad quota inode: %lu, type: %d", |
---|
| 6415 | + qf_inums[type], type); |
---|
6010 | 6416 | return PTR_ERR(qf_inode); |
---|
6011 | 6417 | } |
---|
6012 | 6418 | |
---|
6013 | 6419 | /* Don't account quota for quota files to avoid recursion */ |
---|
6014 | 6420 | qf_inode->i_flags |= S_NOQUOTA; |
---|
6015 | 6421 | lockdep_set_quota_inode(qf_inode, I_DATA_SEM_QUOTA); |
---|
6016 | | - err = dquot_enable(qf_inode, type, format_id, flags); |
---|
| 6422 | + err = dquot_load_quota_inode(qf_inode, type, format_id, flags); |
---|
6017 | 6423 | if (err) |
---|
6018 | 6424 | lockdep_set_quota_inode(qf_inode, I_DATA_SEM_NORMAL); |
---|
6019 | 6425 | iput(qf_inode); |
---|
.. | .. |
---|
6045 | 6451 | if (err) { |
---|
6046 | 6452 | ext4_warning(sb, |
---|
6047 | 6453 | "Failed to enable quota tracking " |
---|
6048 | | - "(type=%d, err=%d). Please run " |
---|
6049 | | - "e2fsck to fix.", type, err); |
---|
| 6454 | + "(type=%d, err=%d, ino=%lu). " |
---|
| 6455 | + "Please run e2fsck to fix.", type, |
---|
| 6456 | + err, qf_inums[type]); |
---|
6050 | 6457 | for (type--; type >= 0; type--) { |
---|
6051 | 6458 | struct inode *inode; |
---|
6052 | 6459 | |
---|
.. | .. |
---|
6093 | 6500 | * this is not a hard failure and quotas are already disabled. |
---|
6094 | 6501 | */ |
---|
6095 | 6502 | handle = ext4_journal_start(inode, EXT4_HT_QUOTA, 1); |
---|
6096 | | - if (IS_ERR(handle)) |
---|
| 6503 | + if (IS_ERR(handle)) { |
---|
| 6504 | + err = PTR_ERR(handle); |
---|
6097 | 6505 | goto out_unlock; |
---|
| 6506 | + } |
---|
6098 | 6507 | EXT4_I(inode)->i_flags &= ~(EXT4_NOATIME_FL | EXT4_IMMUTABLE_FL); |
---|
6099 | 6508 | inode_set_flags(inode, 0, S_NOATIME | S_IMMUTABLE); |
---|
6100 | 6509 | inode->i_mtime = inode->i_ctime = current_time(inode); |
---|
6101 | | - ext4_mark_inode_dirty(handle, inode); |
---|
| 6510 | + err = ext4_mark_inode_dirty(handle, inode); |
---|
6102 | 6511 | ext4_journal_stop(handle); |
---|
6103 | 6512 | out_unlock: |
---|
6104 | 6513 | inode_unlock(inode); |
---|
.. | .. |
---|
6156 | 6565 | { |
---|
6157 | 6566 | struct inode *inode = sb_dqopt(sb)->files[type]; |
---|
6158 | 6567 | ext4_lblk_t blk = off >> EXT4_BLOCK_SIZE_BITS(sb); |
---|
6159 | | - int err, offset = off & (sb->s_blocksize - 1); |
---|
| 6568 | + int err = 0, err2 = 0, offset = off & (sb->s_blocksize - 1); |
---|
6160 | 6569 | int retries = 0; |
---|
6161 | 6570 | struct buffer_head *bh; |
---|
6162 | 6571 | handle_t *handle = journal_current_handle(); |
---|
.. | .. |
---|
6182 | 6591 | bh = ext4_bread(handle, inode, blk, |
---|
6183 | 6592 | EXT4_GET_BLOCKS_CREATE | |
---|
6184 | 6593 | EXT4_GET_BLOCKS_METADATA_NOFAIL); |
---|
6185 | | - } while (IS_ERR(bh) && (PTR_ERR(bh) == -ENOSPC) && |
---|
| 6594 | + } while (PTR_ERR(bh) == -ENOSPC && |
---|
6186 | 6595 | ext4_should_retry_alloc(inode->i_sb, &retries)); |
---|
6187 | 6596 | if (IS_ERR(bh)) |
---|
6188 | 6597 | return PTR_ERR(bh); |
---|
.. | .. |
---|
6204 | 6613 | if (inode->i_size < off + len) { |
---|
6205 | 6614 | i_size_write(inode, off + len); |
---|
6206 | 6615 | EXT4_I(inode)->i_disksize = inode->i_size; |
---|
6207 | | - ext4_mark_inode_dirty(handle, inode); |
---|
| 6616 | + err2 = ext4_mark_inode_dirty(handle, inode); |
---|
| 6617 | + if (unlikely(err2 && !err)) |
---|
| 6618 | + err = err2; |
---|
6208 | 6619 | } |
---|
6209 | | - return len; |
---|
6210 | | -} |
---|
6211 | | - |
---|
6212 | | -static int ext4_get_next_id(struct super_block *sb, struct kqid *qid) |
---|
6213 | | -{ |
---|
6214 | | - const struct quota_format_ops *ops; |
---|
6215 | | - |
---|
6216 | | - if (!sb_has_quota_loaded(sb, qid->type)) |
---|
6217 | | - return -ESRCH; |
---|
6218 | | - ops = sb_dqopt(sb)->ops[qid->type]; |
---|
6219 | | - if (!ops || !ops->get_next_id) |
---|
6220 | | - return -ENOSYS; |
---|
6221 | | - return dquot_get_next_id(sb, qid); |
---|
| 6620 | + return err ? err : len; |
---|
6222 | 6621 | } |
---|
6223 | 6622 | #endif |
---|
6224 | 6623 | |
---|
.. | .. |
---|
6314 | 6713 | if (err) |
---|
6315 | 6714 | return err; |
---|
6316 | 6715 | |
---|
| 6716 | + err = ext4_init_pending(); |
---|
| 6717 | + if (err) |
---|
| 6718 | + goto out7; |
---|
| 6719 | + |
---|
6317 | 6720 | err = ext4_init_post_read_processing(); |
---|
6318 | 6721 | if (err) |
---|
6319 | 6722 | goto out6; |
---|
.. | .. |
---|
6336 | 6739 | err = init_inodecache(); |
---|
6337 | 6740 | if (err) |
---|
6338 | 6741 | goto out1; |
---|
| 6742 | + |
---|
| 6743 | + err = ext4_fc_init_dentry_cache(); |
---|
| 6744 | + if (err) |
---|
| 6745 | + goto out05; |
---|
| 6746 | + |
---|
6339 | 6747 | register_as_ext3(); |
---|
6340 | 6748 | register_as_ext2(); |
---|
6341 | 6749 | err = register_filesystem(&ext4_fs_type); |
---|
.. | .. |
---|
6346 | 6754 | out: |
---|
6347 | 6755 | unregister_as_ext2(); |
---|
6348 | 6756 | unregister_as_ext3(); |
---|
| 6757 | + ext4_fc_destroy_dentry_cache(); |
---|
| 6758 | +out05: |
---|
6349 | 6759 | destroy_inodecache(); |
---|
6350 | 6760 | out1: |
---|
6351 | 6761 | ext4_exit_mballoc(); |
---|
.. | .. |
---|
6358 | 6768 | out5: |
---|
6359 | 6769 | ext4_exit_post_read_processing(); |
---|
6360 | 6770 | out6: |
---|
| 6771 | + ext4_exit_pending(); |
---|
| 6772 | +out7: |
---|
6361 | 6773 | ext4_exit_es(); |
---|
6362 | 6774 | |
---|
6363 | 6775 | return err; |
---|
.. | .. |
---|
6369 | 6781 | unregister_as_ext2(); |
---|
6370 | 6782 | unregister_as_ext3(); |
---|
6371 | 6783 | unregister_filesystem(&ext4_fs_type); |
---|
| 6784 | + ext4_fc_destroy_dentry_cache(); |
---|
6372 | 6785 | destroy_inodecache(); |
---|
6373 | 6786 | ext4_exit_mballoc(); |
---|
6374 | 6787 | ext4_exit_sysfs(); |
---|
.. | .. |
---|
6376 | 6789 | ext4_exit_pageio(); |
---|
6377 | 6790 | ext4_exit_post_read_processing(); |
---|
6378 | 6791 | ext4_exit_es(); |
---|
| 6792 | + ext4_exit_pending(); |
---|
6379 | 6793 | } |
---|
6380 | 6794 | |
---|
6381 | 6795 | MODULE_AUTHOR("Remy Card, Stephen Tweedie, Andrew Morton, Andreas Dilger, Theodore Ts'o and others"); |
---|
6382 | 6796 | MODULE_DESCRIPTION("Fourth Extended Filesystem"); |
---|
6383 | 6797 | MODULE_LICENSE("GPL"); |
---|
| 6798 | +MODULE_IMPORT_NS(ANDROID_GKI_VFS_EXPORT_ONLY); |
---|
6384 | 6799 | MODULE_SOFTDEP("pre: crc32c"); |
---|
6385 | 6800 | module_init(ext4_init_fs) |
---|
6386 | 6801 | module_exit(ext4_exit_fs) |
---|