diff options
Diffstat (limited to 'fs/ext4/super.c')
-rw-r--r-- | fs/ext4/super.c | 297 |
1 files changed, 164 insertions, 133 deletions
diff --git a/fs/ext4/super.c b/fs/ext4/super.c index c93bd1e651f5..cb10a06775e4 100644 --- a/fs/ext4/super.c +++ b/fs/ext4/super.c | |||
@@ -388,13 +388,14 @@ static void ext4_handle_error(struct super_block *sb) | |||
388 | void __ext4_error(struct super_block *sb, const char *function, | 388 | void __ext4_error(struct super_block *sb, const char *function, |
389 | unsigned int line, const char *fmt, ...) | 389 | unsigned int line, const char *fmt, ...) |
390 | { | 390 | { |
391 | struct va_format vaf; | ||
391 | va_list args; | 392 | va_list args; |
392 | 393 | ||
393 | va_start(args, fmt); | 394 | va_start(args, fmt); |
394 | printk(KERN_CRIT "EXT4-fs error (device %s): %s:%d: comm %s: ", | 395 | vaf.fmt = fmt; |
395 | sb->s_id, function, line, current->comm); | 396 | vaf.va = &args; |
396 | vprintk(fmt, args); | 397 | printk(KERN_CRIT "EXT4-fs error (device %s): %s:%d: comm %s: %pV\n", |
397 | printk("\n"); | 398 | sb->s_id, function, line, current->comm, &vaf); |
398 | va_end(args); | 399 | va_end(args); |
399 | 400 | ||
400 | ext4_handle_error(sb); | 401 | ext4_handle_error(sb); |
@@ -405,28 +406,31 @@ void ext4_error_inode(struct inode *inode, const char *function, | |||
405 | const char *fmt, ...) | 406 | const char *fmt, ...) |
406 | { | 407 | { |
407 | va_list args; | 408 | va_list args; |
409 | struct va_format vaf; | ||
408 | struct ext4_super_block *es = EXT4_SB(inode->i_sb)->s_es; | 410 | struct ext4_super_block *es = EXT4_SB(inode->i_sb)->s_es; |
409 | 411 | ||
410 | es->s_last_error_ino = cpu_to_le32(inode->i_ino); | 412 | es->s_last_error_ino = cpu_to_le32(inode->i_ino); |
411 | es->s_last_error_block = cpu_to_le64(block); | 413 | es->s_last_error_block = cpu_to_le64(block); |
412 | save_error_info(inode->i_sb, function, line); | 414 | save_error_info(inode->i_sb, function, line); |
413 | va_start(args, fmt); | 415 | va_start(args, fmt); |
416 | vaf.fmt = fmt; | ||
417 | vaf.va = &args; | ||
414 | printk(KERN_CRIT "EXT4-fs error (device %s): %s:%d: inode #%lu: ", | 418 | printk(KERN_CRIT "EXT4-fs error (device %s): %s:%d: inode #%lu: ", |
415 | inode->i_sb->s_id, function, line, inode->i_ino); | 419 | inode->i_sb->s_id, function, line, inode->i_ino); |
416 | if (block) | 420 | if (block) |
417 | printk("block %llu: ", block); | 421 | printk(KERN_CONT "block %llu: ", block); |
418 | printk("comm %s: ", current->comm); | 422 | printk(KERN_CONT "comm %s: %pV\n", current->comm, &vaf); |
419 | vprintk(fmt, args); | ||
420 | printk("\n"); | ||
421 | va_end(args); | 423 | va_end(args); |
422 | 424 | ||
423 | ext4_handle_error(inode->i_sb); | 425 | ext4_handle_error(inode->i_sb); |
424 | } | 426 | } |
425 | 427 | ||
426 | void ext4_error_file(struct file *file, const char *function, | 428 | void ext4_error_file(struct file *file, const char *function, |
427 | unsigned int line, const char *fmt, ...) | 429 | unsigned int line, ext4_fsblk_t block, |
430 | const char *fmt, ...) | ||
428 | { | 431 | { |
429 | va_list args; | 432 | va_list args; |
433 | struct va_format vaf; | ||
430 | struct ext4_super_block *es; | 434 | struct ext4_super_block *es; |
431 | struct inode *inode = file->f_dentry->d_inode; | 435 | struct inode *inode = file->f_dentry->d_inode; |
432 | char pathname[80], *path; | 436 | char pathname[80], *path; |
@@ -434,17 +438,18 @@ void ext4_error_file(struct file *file, const char *function, | |||
434 | es = EXT4_SB(inode->i_sb)->s_es; | 438 | es = EXT4_SB(inode->i_sb)->s_es; |
435 | es->s_last_error_ino = cpu_to_le32(inode->i_ino); | 439 | es->s_last_error_ino = cpu_to_le32(inode->i_ino); |
436 | save_error_info(inode->i_sb, function, line); | 440 | save_error_info(inode->i_sb, function, line); |
437 | va_start(args, fmt); | ||
438 | path = d_path(&(file->f_path), pathname, sizeof(pathname)); | 441 | path = d_path(&(file->f_path), pathname, sizeof(pathname)); |
439 | if (!path) | 442 | if (IS_ERR(path)) |
440 | path = "(unknown)"; | 443 | path = "(unknown)"; |
441 | printk(KERN_CRIT | 444 | printk(KERN_CRIT |
442 | "EXT4-fs error (device %s): %s:%d: inode #%lu " | 445 | "EXT4-fs error (device %s): %s:%d: inode #%lu: ", |
443 | "(comm %s path %s): ", | 446 | inode->i_sb->s_id, function, line, inode->i_ino); |
444 | inode->i_sb->s_id, function, line, inode->i_ino, | 447 | if (block) |
445 | current->comm, path); | 448 | printk(KERN_CONT "block %llu: ", block); |
446 | vprintk(fmt, args); | 449 | va_start(args, fmt); |
447 | printk("\n"); | 450 | vaf.fmt = fmt; |
451 | vaf.va = &args; | ||
452 | printk(KERN_CONT "comm %s: path %s: %pV\n", current->comm, path, &vaf); | ||
448 | va_end(args); | 453 | va_end(args); |
449 | 454 | ||
450 | ext4_handle_error(inode->i_sb); | 455 | ext4_handle_error(inode->i_sb); |
@@ -543,28 +548,29 @@ void __ext4_abort(struct super_block *sb, const char *function, | |||
543 | panic("EXT4-fs panic from previous error\n"); | 548 | panic("EXT4-fs panic from previous error\n"); |
544 | } | 549 | } |
545 | 550 | ||
546 | void ext4_msg (struct super_block * sb, const char *prefix, | 551 | void ext4_msg(struct super_block *sb, const char *prefix, const char *fmt, ...) |
547 | const char *fmt, ...) | ||
548 | { | 552 | { |
553 | struct va_format vaf; | ||
549 | va_list args; | 554 | va_list args; |
550 | 555 | ||
551 | va_start(args, fmt); | 556 | va_start(args, fmt); |
552 | printk("%sEXT4-fs (%s): ", prefix, sb->s_id); | 557 | vaf.fmt = fmt; |
553 | vprintk(fmt, args); | 558 | vaf.va = &args; |
554 | printk("\n"); | 559 | printk("%sEXT4-fs (%s): %pV\n", prefix, sb->s_id, &vaf); |
555 | va_end(args); | 560 | va_end(args); |
556 | } | 561 | } |
557 | 562 | ||
558 | void __ext4_warning(struct super_block *sb, const char *function, | 563 | void __ext4_warning(struct super_block *sb, const char *function, |
559 | unsigned int line, const char *fmt, ...) | 564 | unsigned int line, const char *fmt, ...) |
560 | { | 565 | { |
566 | struct va_format vaf; | ||
561 | va_list args; | 567 | va_list args; |
562 | 568 | ||
563 | va_start(args, fmt); | 569 | va_start(args, fmt); |
564 | printk(KERN_WARNING "EXT4-fs warning (device %s): %s:%d: ", | 570 | vaf.fmt = fmt; |
565 | sb->s_id, function, line); | 571 | vaf.va = &args; |
566 | vprintk(fmt, args); | 572 | printk(KERN_WARNING "EXT4-fs warning (device %s): %s:%d: %pV\n", |
567 | printk("\n"); | 573 | sb->s_id, function, line, &vaf); |
568 | va_end(args); | 574 | va_end(args); |
569 | } | 575 | } |
570 | 576 | ||
@@ -575,21 +581,25 @@ void __ext4_grp_locked_error(const char *function, unsigned int line, | |||
575 | __releases(bitlock) | 581 | __releases(bitlock) |
576 | __acquires(bitlock) | 582 | __acquires(bitlock) |
577 | { | 583 | { |
584 | struct va_format vaf; | ||
578 | va_list args; | 585 | va_list args; |
579 | struct ext4_super_block *es = EXT4_SB(sb)->s_es; | 586 | struct ext4_super_block *es = EXT4_SB(sb)->s_es; |
580 | 587 | ||
581 | es->s_last_error_ino = cpu_to_le32(ino); | 588 | es->s_last_error_ino = cpu_to_le32(ino); |
582 | es->s_last_error_block = cpu_to_le64(block); | 589 | es->s_last_error_block = cpu_to_le64(block); |
583 | __save_error_info(sb, function, line); | 590 | __save_error_info(sb, function, line); |
591 | |||
584 | va_start(args, fmt); | 592 | va_start(args, fmt); |
593 | |||
594 | vaf.fmt = fmt; | ||
595 | vaf.va = &args; | ||
585 | printk(KERN_CRIT "EXT4-fs error (device %s): %s:%d: group %u", | 596 | printk(KERN_CRIT "EXT4-fs error (device %s): %s:%d: group %u", |
586 | sb->s_id, function, line, grp); | 597 | sb->s_id, function, line, grp); |
587 | if (ino) | 598 | if (ino) |
588 | printk("inode %lu: ", ino); | 599 | printk(KERN_CONT "inode %lu: ", ino); |
589 | if (block) | 600 | if (block) |
590 | printk("block %llu:", (unsigned long long) block); | 601 | printk(KERN_CONT "block %llu:", (unsigned long long) block); |
591 | vprintk(fmt, args); | 602 | printk(KERN_CONT "%pV\n", &vaf); |
592 | printk("\n"); | ||
593 | va_end(args); | 603 | va_end(args); |
594 | 604 | ||
595 | if (test_opt(sb, ERRORS_CONT)) { | 605 | if (test_opt(sb, ERRORS_CONT)) { |
@@ -807,21 +817,15 @@ static struct inode *ext4_alloc_inode(struct super_block *sb) | |||
807 | memset(&ei->i_cached_extent, 0, sizeof(struct ext4_ext_cache)); | 817 | memset(&ei->i_cached_extent, 0, sizeof(struct ext4_ext_cache)); |
808 | INIT_LIST_HEAD(&ei->i_prealloc_list); | 818 | INIT_LIST_HEAD(&ei->i_prealloc_list); |
809 | spin_lock_init(&ei->i_prealloc_lock); | 819 | spin_lock_init(&ei->i_prealloc_lock); |
810 | /* | ||
811 | * Note: We can be called before EXT4_SB(sb)->s_journal is set, | ||
812 | * therefore it can be null here. Don't check it, just initialize | ||
813 | * jinode. | ||
814 | */ | ||
815 | jbd2_journal_init_jbd_inode(&ei->jinode, &ei->vfs_inode); | ||
816 | ei->i_reserved_data_blocks = 0; | 820 | ei->i_reserved_data_blocks = 0; |
817 | ei->i_reserved_meta_blocks = 0; | 821 | ei->i_reserved_meta_blocks = 0; |
818 | ei->i_allocated_meta_blocks = 0; | 822 | ei->i_allocated_meta_blocks = 0; |
819 | ei->i_da_metadata_calc_len = 0; | 823 | ei->i_da_metadata_calc_len = 0; |
820 | ei->i_delalloc_reserved_flag = 0; | ||
821 | spin_lock_init(&(ei->i_block_reservation_lock)); | 824 | spin_lock_init(&(ei->i_block_reservation_lock)); |
822 | #ifdef CONFIG_QUOTA | 825 | #ifdef CONFIG_QUOTA |
823 | ei->i_reserved_quota = 0; | 826 | ei->i_reserved_quota = 0; |
824 | #endif | 827 | #endif |
828 | ei->jinode = NULL; | ||
825 | INIT_LIST_HEAD(&ei->i_completed_io_list); | 829 | INIT_LIST_HEAD(&ei->i_completed_io_list); |
826 | spin_lock_init(&ei->i_completed_io_lock); | 830 | spin_lock_init(&ei->i_completed_io_lock); |
827 | ei->cur_aio_dio = NULL; | 831 | ei->cur_aio_dio = NULL; |
@@ -840,6 +844,13 @@ static int ext4_drop_inode(struct inode *inode) | |||
840 | return drop; | 844 | return drop; |
841 | } | 845 | } |
842 | 846 | ||
847 | static void ext4_i_callback(struct rcu_head *head) | ||
848 | { | ||
849 | struct inode *inode = container_of(head, struct inode, i_rcu); | ||
850 | INIT_LIST_HEAD(&inode->i_dentry); | ||
851 | kmem_cache_free(ext4_inode_cachep, EXT4_I(inode)); | ||
852 | } | ||
853 | |||
843 | static void ext4_destroy_inode(struct inode *inode) | 854 | static void ext4_destroy_inode(struct inode *inode) |
844 | { | 855 | { |
845 | ext4_ioend_wait(inode); | 856 | ext4_ioend_wait(inode); |
@@ -852,7 +863,7 @@ static void ext4_destroy_inode(struct inode *inode) | |||
852 | true); | 863 | true); |
853 | dump_stack(); | 864 | dump_stack(); |
854 | } | 865 | } |
855 | kmem_cache_free(ext4_inode_cachep, EXT4_I(inode)); | 866 | call_rcu(&inode->i_rcu, ext4_i_callback); |
856 | } | 867 | } |
857 | 868 | ||
858 | static void init_once(void *foo) | 869 | static void init_once(void *foo) |
@@ -890,9 +901,12 @@ void ext4_clear_inode(struct inode *inode) | |||
890 | end_writeback(inode); | 901 | end_writeback(inode); |
891 | dquot_drop(inode); | 902 | dquot_drop(inode); |
892 | ext4_discard_preallocations(inode); | 903 | ext4_discard_preallocations(inode); |
893 | if (EXT4_JOURNAL(inode)) | 904 | if (EXT4_I(inode)->jinode) { |
894 | jbd2_journal_release_jbd_inode(EXT4_SB(inode->i_sb)->s_journal, | 905 | jbd2_journal_release_jbd_inode(EXT4_JOURNAL(inode), |
895 | &EXT4_I(inode)->jinode); | 906 | EXT4_I(inode)->jinode); |
907 | jbd2_free_inode(EXT4_I(inode)->jinode); | ||
908 | EXT4_I(inode)->jinode = NULL; | ||
909 | } | ||
896 | } | 910 | } |
897 | 911 | ||
898 | static inline void ext4_show_quota_options(struct seq_file *seq, | 912 | static inline void ext4_show_quota_options(struct seq_file *seq, |
@@ -1385,7 +1399,7 @@ static int set_qf_name(struct super_block *sb, int qtype, substring_t *args) | |||
1385 | sbi->s_qf_names[qtype] = NULL; | 1399 | sbi->s_qf_names[qtype] = NULL; |
1386 | return 0; | 1400 | return 0; |
1387 | } | 1401 | } |
1388 | set_opt(sbi->s_mount_opt, QUOTA); | 1402 | set_opt(sb, QUOTA); |
1389 | return 1; | 1403 | return 1; |
1390 | } | 1404 | } |
1391 | 1405 | ||
@@ -1440,21 +1454,21 @@ static int parse_options(char *options, struct super_block *sb, | |||
1440 | switch (token) { | 1454 | switch (token) { |
1441 | case Opt_bsd_df: | 1455 | case Opt_bsd_df: |
1442 | ext4_msg(sb, KERN_WARNING, deprecated_msg, p, "2.6.38"); | 1456 | ext4_msg(sb, KERN_WARNING, deprecated_msg, p, "2.6.38"); |
1443 | clear_opt(sbi->s_mount_opt, MINIX_DF); | 1457 | clear_opt(sb, MINIX_DF); |
1444 | break; | 1458 | break; |
1445 | case Opt_minix_df: | 1459 | case Opt_minix_df: |
1446 | ext4_msg(sb, KERN_WARNING, deprecated_msg, p, "2.6.38"); | 1460 | ext4_msg(sb, KERN_WARNING, deprecated_msg, p, "2.6.38"); |
1447 | set_opt(sbi->s_mount_opt, MINIX_DF); | 1461 | set_opt(sb, MINIX_DF); |
1448 | 1462 | ||
1449 | break; | 1463 | break; |
1450 | case Opt_grpid: | 1464 | case Opt_grpid: |
1451 | ext4_msg(sb, KERN_WARNING, deprecated_msg, p, "2.6.38"); | 1465 | ext4_msg(sb, KERN_WARNING, deprecated_msg, p, "2.6.38"); |
1452 | set_opt(sbi->s_mount_opt, GRPID); | 1466 | set_opt(sb, GRPID); |
1453 | 1467 | ||
1454 | break; | 1468 | break; |
1455 | case Opt_nogrpid: | 1469 | case Opt_nogrpid: |
1456 | ext4_msg(sb, KERN_WARNING, deprecated_msg, p, "2.6.38"); | 1470 | ext4_msg(sb, KERN_WARNING, deprecated_msg, p, "2.6.38"); |
1457 | clear_opt(sbi->s_mount_opt, GRPID); | 1471 | clear_opt(sb, GRPID); |
1458 | 1472 | ||
1459 | break; | 1473 | break; |
1460 | case Opt_resuid: | 1474 | case Opt_resuid: |
@@ -1472,38 +1486,38 @@ static int parse_options(char *options, struct super_block *sb, | |||
1472 | /* *sb_block = match_int(&args[0]); */ | 1486 | /* *sb_block = match_int(&args[0]); */ |
1473 | break; | 1487 | break; |
1474 | case Opt_err_panic: | 1488 | case Opt_err_panic: |
1475 | clear_opt(sbi->s_mount_opt, ERRORS_CONT); | 1489 | clear_opt(sb, ERRORS_CONT); |
1476 | clear_opt(sbi->s_mount_opt, ERRORS_RO); | 1490 | clear_opt(sb, ERRORS_RO); |
1477 | set_opt(sbi->s_mount_opt, ERRORS_PANIC); | 1491 | set_opt(sb, ERRORS_PANIC); |
1478 | break; | 1492 | break; |
1479 | case Opt_err_ro: | 1493 | case Opt_err_ro: |
1480 | clear_opt(sbi->s_mount_opt, ERRORS_CONT); | 1494 | clear_opt(sb, ERRORS_CONT); |
1481 | clear_opt(sbi->s_mount_opt, ERRORS_PANIC); | 1495 | clear_opt(sb, ERRORS_PANIC); |
1482 | set_opt(sbi->s_mount_opt, ERRORS_RO); | 1496 | set_opt(sb, ERRORS_RO); |
1483 | break; | 1497 | break; |
1484 | case Opt_err_cont: | 1498 | case Opt_err_cont: |
1485 | clear_opt(sbi->s_mount_opt, ERRORS_RO); | 1499 | clear_opt(sb, ERRORS_RO); |
1486 | clear_opt(sbi->s_mount_opt, ERRORS_PANIC); | 1500 | clear_opt(sb, ERRORS_PANIC); |
1487 | set_opt(sbi->s_mount_opt, ERRORS_CONT); | 1501 | set_opt(sb, ERRORS_CONT); |
1488 | break; | 1502 | break; |
1489 | case Opt_nouid32: | 1503 | case Opt_nouid32: |
1490 | set_opt(sbi->s_mount_opt, NO_UID32); | 1504 | set_opt(sb, NO_UID32); |
1491 | break; | 1505 | break; |
1492 | case Opt_debug: | 1506 | case Opt_debug: |
1493 | set_opt(sbi->s_mount_opt, DEBUG); | 1507 | set_opt(sb, DEBUG); |
1494 | break; | 1508 | break; |
1495 | case Opt_oldalloc: | 1509 | case Opt_oldalloc: |
1496 | set_opt(sbi->s_mount_opt, OLDALLOC); | 1510 | set_opt(sb, OLDALLOC); |
1497 | break; | 1511 | break; |
1498 | case Opt_orlov: | 1512 | case Opt_orlov: |
1499 | clear_opt(sbi->s_mount_opt, OLDALLOC); | 1513 | clear_opt(sb, OLDALLOC); |
1500 | break; | 1514 | break; |
1501 | #ifdef CONFIG_EXT4_FS_XATTR | 1515 | #ifdef CONFIG_EXT4_FS_XATTR |
1502 | case Opt_user_xattr: | 1516 | case Opt_user_xattr: |
1503 | set_opt(sbi->s_mount_opt, XATTR_USER); | 1517 | set_opt(sb, XATTR_USER); |
1504 | break; | 1518 | break; |
1505 | case Opt_nouser_xattr: | 1519 | case Opt_nouser_xattr: |
1506 | clear_opt(sbi->s_mount_opt, XATTR_USER); | 1520 | clear_opt(sb, XATTR_USER); |
1507 | break; | 1521 | break; |
1508 | #else | 1522 | #else |
1509 | case Opt_user_xattr: | 1523 | case Opt_user_xattr: |
@@ -1513,10 +1527,10 @@ static int parse_options(char *options, struct super_block *sb, | |||
1513 | #endif | 1527 | #endif |
1514 | #ifdef CONFIG_EXT4_FS_POSIX_ACL | 1528 | #ifdef CONFIG_EXT4_FS_POSIX_ACL |
1515 | case Opt_acl: | 1529 | case Opt_acl: |
1516 | set_opt(sbi->s_mount_opt, POSIX_ACL); | 1530 | set_opt(sb, POSIX_ACL); |
1517 | break; | 1531 | break; |
1518 | case Opt_noacl: | 1532 | case Opt_noacl: |
1519 | clear_opt(sbi->s_mount_opt, POSIX_ACL); | 1533 | clear_opt(sb, POSIX_ACL); |
1520 | break; | 1534 | break; |
1521 | #else | 1535 | #else |
1522 | case Opt_acl: | 1536 | case Opt_acl: |
@@ -1535,7 +1549,7 @@ static int parse_options(char *options, struct super_block *sb, | |||
1535 | "Cannot specify journal on remount"); | 1549 | "Cannot specify journal on remount"); |
1536 | return 0; | 1550 | return 0; |
1537 | } | 1551 | } |
1538 | set_opt(sbi->s_mount_opt, UPDATE_JOURNAL); | 1552 | set_opt(sb, UPDATE_JOURNAL); |
1539 | break; | 1553 | break; |
1540 | case Opt_journal_dev: | 1554 | case Opt_journal_dev: |
1541 | if (is_remount) { | 1555 | if (is_remount) { |
@@ -1548,14 +1562,14 @@ static int parse_options(char *options, struct super_block *sb, | |||
1548 | *journal_devnum = option; | 1562 | *journal_devnum = option; |
1549 | break; | 1563 | break; |
1550 | case Opt_journal_checksum: | 1564 | case Opt_journal_checksum: |
1551 | set_opt(sbi->s_mount_opt, JOURNAL_CHECKSUM); | 1565 | set_opt(sb, JOURNAL_CHECKSUM); |
1552 | break; | 1566 | break; |
1553 | case Opt_journal_async_commit: | 1567 | case Opt_journal_async_commit: |
1554 | set_opt(sbi->s_mount_opt, JOURNAL_ASYNC_COMMIT); | 1568 | set_opt(sb, JOURNAL_ASYNC_COMMIT); |
1555 | set_opt(sbi->s_mount_opt, JOURNAL_CHECKSUM); | 1569 | set_opt(sb, JOURNAL_CHECKSUM); |
1556 | break; | 1570 | break; |
1557 | case Opt_noload: | 1571 | case Opt_noload: |
1558 | set_opt(sbi->s_mount_opt, NOLOAD); | 1572 | set_opt(sb, NOLOAD); |
1559 | break; | 1573 | break; |
1560 | case Opt_commit: | 1574 | case Opt_commit: |
1561 | if (match_int(&args[0], &option)) | 1575 | if (match_int(&args[0], &option)) |
@@ -1598,15 +1612,15 @@ static int parse_options(char *options, struct super_block *sb, | |||
1598 | return 0; | 1612 | return 0; |
1599 | } | 1613 | } |
1600 | } else { | 1614 | } else { |
1601 | clear_opt(sbi->s_mount_opt, DATA_FLAGS); | 1615 | clear_opt(sb, DATA_FLAGS); |
1602 | sbi->s_mount_opt |= data_opt; | 1616 | sbi->s_mount_opt |= data_opt; |
1603 | } | 1617 | } |
1604 | break; | 1618 | break; |
1605 | case Opt_data_err_abort: | 1619 | case Opt_data_err_abort: |
1606 | set_opt(sbi->s_mount_opt, DATA_ERR_ABORT); | 1620 | set_opt(sb, DATA_ERR_ABORT); |
1607 | break; | 1621 | break; |
1608 | case Opt_data_err_ignore: | 1622 | case Opt_data_err_ignore: |
1609 | clear_opt(sbi->s_mount_opt, DATA_ERR_ABORT); | 1623 | clear_opt(sb, DATA_ERR_ABORT); |
1610 | break; | 1624 | break; |
1611 | #ifdef CONFIG_QUOTA | 1625 | #ifdef CONFIG_QUOTA |
1612 | case Opt_usrjquota: | 1626 | case Opt_usrjquota: |
@@ -1646,12 +1660,12 @@ set_qf_format: | |||
1646 | break; | 1660 | break; |
1647 | case Opt_quota: | 1661 | case Opt_quota: |
1648 | case Opt_usrquota: | 1662 | case Opt_usrquota: |
1649 | set_opt(sbi->s_mount_opt, QUOTA); | 1663 | set_opt(sb, QUOTA); |
1650 | set_opt(sbi->s_mount_opt, USRQUOTA); | 1664 | set_opt(sb, USRQUOTA); |
1651 | break; | 1665 | break; |
1652 | case Opt_grpquota: | 1666 | case Opt_grpquota: |
1653 | set_opt(sbi->s_mount_opt, QUOTA); | 1667 | set_opt(sb, QUOTA); |
1654 | set_opt(sbi->s_mount_opt, GRPQUOTA); | 1668 | set_opt(sb, GRPQUOTA); |
1655 | break; | 1669 | break; |
1656 | case Opt_noquota: | 1670 | case Opt_noquota: |
1657 | if (sb_any_quota_loaded(sb)) { | 1671 | if (sb_any_quota_loaded(sb)) { |
@@ -1659,9 +1673,9 @@ set_qf_format: | |||
1659 | "options when quota turned on"); | 1673 | "options when quota turned on"); |
1660 | return 0; | 1674 | return 0; |
1661 | } | 1675 | } |
1662 | clear_opt(sbi->s_mount_opt, QUOTA); | 1676 | clear_opt(sb, QUOTA); |
1663 | clear_opt(sbi->s_mount_opt, USRQUOTA); | 1677 | clear_opt(sb, USRQUOTA); |
1664 | clear_opt(sbi->s_mount_opt, GRPQUOTA); | 1678 | clear_opt(sb, GRPQUOTA); |
1665 | break; | 1679 | break; |
1666 | #else | 1680 | #else |
1667 | case Opt_quota: | 1681 | case Opt_quota: |
@@ -1687,7 +1701,7 @@ set_qf_format: | |||
1687 | sbi->s_mount_flags |= EXT4_MF_FS_ABORTED; | 1701 | sbi->s_mount_flags |= EXT4_MF_FS_ABORTED; |
1688 | break; | 1702 | break; |
1689 | case Opt_nobarrier: | 1703 | case Opt_nobarrier: |
1690 | clear_opt(sbi->s_mount_opt, BARRIER); | 1704 | clear_opt(sb, BARRIER); |
1691 | break; | 1705 | break; |
1692 | case Opt_barrier: | 1706 | case Opt_barrier: |
1693 | if (args[0].from) { | 1707 | if (args[0].from) { |
@@ -1696,9 +1710,9 @@ set_qf_format: | |||
1696 | } else | 1710 | } else |
1697 | option = 1; /* No argument, default to 1 */ | 1711 | option = 1; /* No argument, default to 1 */ |
1698 | if (option) | 1712 | if (option) |
1699 | set_opt(sbi->s_mount_opt, BARRIER); | 1713 | set_opt(sb, BARRIER); |
1700 | else | 1714 | else |
1701 | clear_opt(sbi->s_mount_opt, BARRIER); | 1715 | clear_opt(sb, BARRIER); |
1702 | break; | 1716 | break; |
1703 | case Opt_ignore: | 1717 | case Opt_ignore: |
1704 | break; | 1718 | break; |
@@ -1722,17 +1736,17 @@ set_qf_format: | |||
1722 | "Ignoring deprecated bh option"); | 1736 | "Ignoring deprecated bh option"); |
1723 | break; | 1737 | break; |
1724 | case Opt_i_version: | 1738 | case Opt_i_version: |
1725 | set_opt(sbi->s_mount_opt, I_VERSION); | 1739 | set_opt(sb, I_VERSION); |
1726 | sb->s_flags |= MS_I_VERSION; | 1740 | sb->s_flags |= MS_I_VERSION; |
1727 | break; | 1741 | break; |
1728 | case Opt_nodelalloc: | 1742 | case Opt_nodelalloc: |
1729 | clear_opt(sbi->s_mount_opt, DELALLOC); | 1743 | clear_opt(sb, DELALLOC); |
1730 | break; | 1744 | break; |
1731 | case Opt_mblk_io_submit: | 1745 | case Opt_mblk_io_submit: |
1732 | set_opt(sbi->s_mount_opt, MBLK_IO_SUBMIT); | 1746 | set_opt(sb, MBLK_IO_SUBMIT); |
1733 | break; | 1747 | break; |
1734 | case Opt_nomblk_io_submit: | 1748 | case Opt_nomblk_io_submit: |
1735 | clear_opt(sbi->s_mount_opt, MBLK_IO_SUBMIT); | 1749 | clear_opt(sb, MBLK_IO_SUBMIT); |
1736 | break; | 1750 | break; |
1737 | case Opt_stripe: | 1751 | case Opt_stripe: |
1738 | if (match_int(&args[0], &option)) | 1752 | if (match_int(&args[0], &option)) |
@@ -1742,13 +1756,13 @@ set_qf_format: | |||
1742 | sbi->s_stripe = option; | 1756 | sbi->s_stripe = option; |
1743 | break; | 1757 | break; |
1744 | case Opt_delalloc: | 1758 | case Opt_delalloc: |
1745 | set_opt(sbi->s_mount_opt, DELALLOC); | 1759 | set_opt(sb, DELALLOC); |
1746 | break; | 1760 | break; |
1747 | case Opt_block_validity: | 1761 | case Opt_block_validity: |
1748 | set_opt(sbi->s_mount_opt, BLOCK_VALIDITY); | 1762 | set_opt(sb, BLOCK_VALIDITY); |
1749 | break; | 1763 | break; |
1750 | case Opt_noblock_validity: | 1764 | case Opt_noblock_validity: |
1751 | clear_opt(sbi->s_mount_opt, BLOCK_VALIDITY); | 1765 | clear_opt(sb, BLOCK_VALIDITY); |
1752 | break; | 1766 | break; |
1753 | case Opt_inode_readahead_blks: | 1767 | case Opt_inode_readahead_blks: |
1754 | if (match_int(&args[0], &option)) | 1768 | if (match_int(&args[0], &option)) |
@@ -1772,7 +1786,7 @@ set_qf_format: | |||
1772 | option); | 1786 | option); |
1773 | break; | 1787 | break; |
1774 | case Opt_noauto_da_alloc: | 1788 | case Opt_noauto_da_alloc: |
1775 | set_opt(sbi->s_mount_opt,NO_AUTO_DA_ALLOC); | 1789 | set_opt(sb, NO_AUTO_DA_ALLOC); |
1776 | break; | 1790 | break; |
1777 | case Opt_auto_da_alloc: | 1791 | case Opt_auto_da_alloc: |
1778 | if (args[0].from) { | 1792 | if (args[0].from) { |
@@ -1781,24 +1795,24 @@ set_qf_format: | |||
1781 | } else | 1795 | } else |
1782 | option = 1; /* No argument, default to 1 */ | 1796 | option = 1; /* No argument, default to 1 */ |
1783 | if (option) | 1797 | if (option) |
1784 | clear_opt(sbi->s_mount_opt, NO_AUTO_DA_ALLOC); | 1798 | clear_opt(sb, NO_AUTO_DA_ALLOC); |
1785 | else | 1799 | else |
1786 | set_opt(sbi->s_mount_opt,NO_AUTO_DA_ALLOC); | 1800 | set_opt(sb,NO_AUTO_DA_ALLOC); |
1787 | break; | 1801 | break; |
1788 | case Opt_discard: | 1802 | case Opt_discard: |
1789 | set_opt(sbi->s_mount_opt, DISCARD); | 1803 | set_opt(sb, DISCARD); |
1790 | break; | 1804 | break; |
1791 | case Opt_nodiscard: | 1805 | case Opt_nodiscard: |
1792 | clear_opt(sbi->s_mount_opt, DISCARD); | 1806 | clear_opt(sb, DISCARD); |
1793 | break; | 1807 | break; |
1794 | case Opt_dioread_nolock: | 1808 | case Opt_dioread_nolock: |
1795 | set_opt(sbi->s_mount_opt, DIOREAD_NOLOCK); | 1809 | set_opt(sb, DIOREAD_NOLOCK); |
1796 | break; | 1810 | break; |
1797 | case Opt_dioread_lock: | 1811 | case Opt_dioread_lock: |
1798 | clear_opt(sbi->s_mount_opt, DIOREAD_NOLOCK); | 1812 | clear_opt(sb, DIOREAD_NOLOCK); |
1799 | break; | 1813 | break; |
1800 | case Opt_init_inode_table: | 1814 | case Opt_init_inode_table: |
1801 | set_opt(sbi->s_mount_opt, INIT_INODE_TABLE); | 1815 | set_opt(sb, INIT_INODE_TABLE); |
1802 | if (args[0].from) { | 1816 | if (args[0].from) { |
1803 | if (match_int(&args[0], &option)) | 1817 | if (match_int(&args[0], &option)) |
1804 | return 0; | 1818 | return 0; |
@@ -1809,7 +1823,7 @@ set_qf_format: | |||
1809 | sbi->s_li_wait_mult = option; | 1823 | sbi->s_li_wait_mult = option; |
1810 | break; | 1824 | break; |
1811 | case Opt_noinit_inode_table: | 1825 | case Opt_noinit_inode_table: |
1812 | clear_opt(sbi->s_mount_opt, INIT_INODE_TABLE); | 1826 | clear_opt(sb, INIT_INODE_TABLE); |
1813 | break; | 1827 | break; |
1814 | default: | 1828 | default: |
1815 | ext4_msg(sb, KERN_ERR, | 1829 | ext4_msg(sb, KERN_ERR, |
@@ -1821,10 +1835,10 @@ set_qf_format: | |||
1821 | #ifdef CONFIG_QUOTA | 1835 | #ifdef CONFIG_QUOTA |
1822 | if (sbi->s_qf_names[USRQUOTA] || sbi->s_qf_names[GRPQUOTA]) { | 1836 | if (sbi->s_qf_names[USRQUOTA] || sbi->s_qf_names[GRPQUOTA]) { |
1823 | if (test_opt(sb, USRQUOTA) && sbi->s_qf_names[USRQUOTA]) | 1837 | if (test_opt(sb, USRQUOTA) && sbi->s_qf_names[USRQUOTA]) |
1824 | clear_opt(sbi->s_mount_opt, USRQUOTA); | 1838 | clear_opt(sb, USRQUOTA); |
1825 | 1839 | ||
1826 | if (test_opt(sb, GRPQUOTA) && sbi->s_qf_names[GRPQUOTA]) | 1840 | if (test_opt(sb, GRPQUOTA) && sbi->s_qf_names[GRPQUOTA]) |
1827 | clear_opt(sbi->s_mount_opt, GRPQUOTA); | 1841 | clear_opt(sb, GRPQUOTA); |
1828 | 1842 | ||
1829 | if (test_opt(sb, GRPQUOTA) || test_opt(sb, USRQUOTA)) { | 1843 | if (test_opt(sb, GRPQUOTA) || test_opt(sb, USRQUOTA)) { |
1830 | ext4_msg(sb, KERN_ERR, "old and new quota " | 1844 | ext4_msg(sb, KERN_ERR, "old and new quota " |
@@ -1894,12 +1908,12 @@ static int ext4_setup_super(struct super_block *sb, struct ext4_super_block *es, | |||
1894 | ext4_commit_super(sb, 1); | 1908 | ext4_commit_super(sb, 1); |
1895 | if (test_opt(sb, DEBUG)) | 1909 | if (test_opt(sb, DEBUG)) |
1896 | printk(KERN_INFO "[EXT4 FS bs=%lu, gc=%u, " | 1910 | printk(KERN_INFO "[EXT4 FS bs=%lu, gc=%u, " |
1897 | "bpg=%lu, ipg=%lu, mo=%04x]\n", | 1911 | "bpg=%lu, ipg=%lu, mo=%04x, mo2=%04x]\n", |
1898 | sb->s_blocksize, | 1912 | sb->s_blocksize, |
1899 | sbi->s_groups_count, | 1913 | sbi->s_groups_count, |
1900 | EXT4_BLOCKS_PER_GROUP(sb), | 1914 | EXT4_BLOCKS_PER_GROUP(sb), |
1901 | EXT4_INODES_PER_GROUP(sb), | 1915 | EXT4_INODES_PER_GROUP(sb), |
1902 | sbi->s_mount_opt); | 1916 | sbi->s_mount_opt, sbi->s_mount_opt2); |
1903 | 1917 | ||
1904 | return res; | 1918 | return res; |
1905 | } | 1919 | } |
@@ -1929,14 +1943,13 @@ static int ext4_fill_flex_info(struct super_block *sb) | |||
1929 | size = flex_group_count * sizeof(struct flex_groups); | 1943 | size = flex_group_count * sizeof(struct flex_groups); |
1930 | sbi->s_flex_groups = kzalloc(size, GFP_KERNEL); | 1944 | sbi->s_flex_groups = kzalloc(size, GFP_KERNEL); |
1931 | if (sbi->s_flex_groups == NULL) { | 1945 | if (sbi->s_flex_groups == NULL) { |
1932 | sbi->s_flex_groups = vmalloc(size); | 1946 | sbi->s_flex_groups = vzalloc(size); |
1933 | if (sbi->s_flex_groups) | 1947 | if (sbi->s_flex_groups == NULL) { |
1934 | memset(sbi->s_flex_groups, 0, size); | 1948 | ext4_msg(sb, KERN_ERR, |
1935 | } | 1949 | "not enough memory for %u flex groups", |
1936 | if (sbi->s_flex_groups == NULL) { | 1950 | flex_group_count); |
1937 | ext4_msg(sb, KERN_ERR, "not enough memory for " | 1951 | goto failed; |
1938 | "%u flex groups", flex_group_count); | 1952 | } |
1939 | goto failed; | ||
1940 | } | 1953 | } |
1941 | 1954 | ||
1942 | for (i = 0; i < sbi->s_groups_count; i++) { | 1955 | for (i = 0; i < sbi->s_groups_count; i++) { |
@@ -2915,7 +2928,7 @@ static int ext4_register_li_request(struct super_block *sb, | |||
2915 | struct ext4_sb_info *sbi = EXT4_SB(sb); | 2928 | struct ext4_sb_info *sbi = EXT4_SB(sb); |
2916 | struct ext4_li_request *elr; | 2929 | struct ext4_li_request *elr; |
2917 | ext4_group_t ngroups = EXT4_SB(sb)->s_groups_count; | 2930 | ext4_group_t ngroups = EXT4_SB(sb)->s_groups_count; |
2918 | int ret; | 2931 | int ret = 0; |
2919 | 2932 | ||
2920 | if (sbi->s_li_request != NULL) | 2933 | if (sbi->s_li_request != NULL) |
2921 | return 0; | 2934 | return 0; |
@@ -3070,41 +3083,41 @@ static int ext4_fill_super(struct super_block *sb, void *data, int silent) | |||
3070 | 3083 | ||
3071 | /* Set defaults before we parse the mount options */ | 3084 | /* Set defaults before we parse the mount options */ |
3072 | def_mount_opts = le32_to_cpu(es->s_default_mount_opts); | 3085 | def_mount_opts = le32_to_cpu(es->s_default_mount_opts); |
3073 | set_opt(sbi->s_mount_opt, INIT_INODE_TABLE); | 3086 | set_opt(sb, INIT_INODE_TABLE); |
3074 | if (def_mount_opts & EXT4_DEFM_DEBUG) | 3087 | if (def_mount_opts & EXT4_DEFM_DEBUG) |
3075 | set_opt(sbi->s_mount_opt, DEBUG); | 3088 | set_opt(sb, DEBUG); |
3076 | if (def_mount_opts & EXT4_DEFM_BSDGROUPS) { | 3089 | if (def_mount_opts & EXT4_DEFM_BSDGROUPS) { |
3077 | ext4_msg(sb, KERN_WARNING, deprecated_msg, "bsdgroups", | 3090 | ext4_msg(sb, KERN_WARNING, deprecated_msg, "bsdgroups", |
3078 | "2.6.38"); | 3091 | "2.6.38"); |
3079 | set_opt(sbi->s_mount_opt, GRPID); | 3092 | set_opt(sb, GRPID); |
3080 | } | 3093 | } |
3081 | if (def_mount_opts & EXT4_DEFM_UID16) | 3094 | if (def_mount_opts & EXT4_DEFM_UID16) |
3082 | set_opt(sbi->s_mount_opt, NO_UID32); | 3095 | set_opt(sb, NO_UID32); |
3083 | #ifdef CONFIG_EXT4_FS_XATTR | 3096 | #ifdef CONFIG_EXT4_FS_XATTR |
3084 | if (def_mount_opts & EXT4_DEFM_XATTR_USER) | 3097 | if (def_mount_opts & EXT4_DEFM_XATTR_USER) |
3085 | set_opt(sbi->s_mount_opt, XATTR_USER); | 3098 | set_opt(sb, XATTR_USER); |
3086 | #endif | 3099 | #endif |
3087 | #ifdef CONFIG_EXT4_FS_POSIX_ACL | 3100 | #ifdef CONFIG_EXT4_FS_POSIX_ACL |
3088 | if (def_mount_opts & EXT4_DEFM_ACL) | 3101 | if (def_mount_opts & EXT4_DEFM_ACL) |
3089 | set_opt(sbi->s_mount_opt, POSIX_ACL); | 3102 | set_opt(sb, POSIX_ACL); |
3090 | #endif | 3103 | #endif |
3091 | if ((def_mount_opts & EXT4_DEFM_JMODE) == EXT4_DEFM_JMODE_DATA) | 3104 | if ((def_mount_opts & EXT4_DEFM_JMODE) == EXT4_DEFM_JMODE_DATA) |
3092 | set_opt(sbi->s_mount_opt, JOURNAL_DATA); | 3105 | set_opt(sb, JOURNAL_DATA); |
3093 | else if ((def_mount_opts & EXT4_DEFM_JMODE) == EXT4_DEFM_JMODE_ORDERED) | 3106 | else if ((def_mount_opts & EXT4_DEFM_JMODE) == EXT4_DEFM_JMODE_ORDERED) |
3094 | set_opt(sbi->s_mount_opt, ORDERED_DATA); | 3107 | set_opt(sb, ORDERED_DATA); |
3095 | else if ((def_mount_opts & EXT4_DEFM_JMODE) == EXT4_DEFM_JMODE_WBACK) | 3108 | else if ((def_mount_opts & EXT4_DEFM_JMODE) == EXT4_DEFM_JMODE_WBACK) |
3096 | set_opt(sbi->s_mount_opt, WRITEBACK_DATA); | 3109 | set_opt(sb, WRITEBACK_DATA); |
3097 | 3110 | ||
3098 | if (le16_to_cpu(sbi->s_es->s_errors) == EXT4_ERRORS_PANIC) | 3111 | if (le16_to_cpu(sbi->s_es->s_errors) == EXT4_ERRORS_PANIC) |
3099 | set_opt(sbi->s_mount_opt, ERRORS_PANIC); | 3112 | set_opt(sb, ERRORS_PANIC); |
3100 | else if (le16_to_cpu(sbi->s_es->s_errors) == EXT4_ERRORS_CONTINUE) | 3113 | else if (le16_to_cpu(sbi->s_es->s_errors) == EXT4_ERRORS_CONTINUE) |
3101 | set_opt(sbi->s_mount_opt, ERRORS_CONT); | 3114 | set_opt(sb, ERRORS_CONT); |
3102 | else | 3115 | else |
3103 | set_opt(sbi->s_mount_opt, ERRORS_RO); | 3116 | set_opt(sb, ERRORS_RO); |
3104 | if (def_mount_opts & EXT4_DEFM_BLOCK_VALIDITY) | 3117 | if (def_mount_opts & EXT4_DEFM_BLOCK_VALIDITY) |
3105 | set_opt(sbi->s_mount_opt, BLOCK_VALIDITY); | 3118 | set_opt(sb, BLOCK_VALIDITY); |
3106 | if (def_mount_opts & EXT4_DEFM_DISCARD) | 3119 | if (def_mount_opts & EXT4_DEFM_DISCARD) |
3107 | set_opt(sbi->s_mount_opt, DISCARD); | 3120 | set_opt(sb, DISCARD); |
3108 | 3121 | ||
3109 | sbi->s_resuid = le16_to_cpu(es->s_def_resuid); | 3122 | sbi->s_resuid = le16_to_cpu(es->s_def_resuid); |
3110 | sbi->s_resgid = le16_to_cpu(es->s_def_resgid); | 3123 | sbi->s_resgid = le16_to_cpu(es->s_def_resgid); |
@@ -3113,7 +3126,7 @@ static int ext4_fill_super(struct super_block *sb, void *data, int silent) | |||
3113 | sbi->s_max_batch_time = EXT4_DEF_MAX_BATCH_TIME; | 3126 | sbi->s_max_batch_time = EXT4_DEF_MAX_BATCH_TIME; |
3114 | 3127 | ||
3115 | if ((def_mount_opts & EXT4_DEFM_NOBARRIER) == 0) | 3128 | if ((def_mount_opts & EXT4_DEFM_NOBARRIER) == 0) |
3116 | set_opt(sbi->s_mount_opt, BARRIER); | 3129 | set_opt(sb, BARRIER); |
3117 | 3130 | ||
3118 | /* | 3131 | /* |
3119 | * enable delayed allocation by default | 3132 | * enable delayed allocation by default |
@@ -3121,7 +3134,7 @@ static int ext4_fill_super(struct super_block *sb, void *data, int silent) | |||
3121 | */ | 3134 | */ |
3122 | if (!IS_EXT3_SB(sb) && | 3135 | if (!IS_EXT3_SB(sb) && |
3123 | ((def_mount_opts & EXT4_DEFM_NODELALLOC) == 0)) | 3136 | ((def_mount_opts & EXT4_DEFM_NODELALLOC) == 0)) |
3124 | set_opt(sbi->s_mount_opt, DELALLOC); | 3137 | set_opt(sb, DELALLOC); |
3125 | 3138 | ||
3126 | if (!parse_options((char *) sbi->s_es->s_mount_opts, sb, | 3139 | if (!parse_options((char *) sbi->s_es->s_mount_opts, sb, |
3127 | &journal_devnum, &journal_ioprio, NULL, 0)) { | 3140 | &journal_devnum, &journal_ioprio, NULL, 0)) { |
@@ -3424,8 +3437,8 @@ static int ext4_fill_super(struct super_block *sb, void *data, int silent) | |||
3424 | "suppressed and not mounted read-only"); | 3437 | "suppressed and not mounted read-only"); |
3425 | goto failed_mount_wq; | 3438 | goto failed_mount_wq; |
3426 | } else { | 3439 | } else { |
3427 | clear_opt(sbi->s_mount_opt, DATA_FLAGS); | 3440 | clear_opt(sb, DATA_FLAGS); |
3428 | set_opt(sbi->s_mount_opt, WRITEBACK_DATA); | 3441 | set_opt(sb, WRITEBACK_DATA); |
3429 | sbi->s_journal = NULL; | 3442 | sbi->s_journal = NULL; |
3430 | needs_recovery = 0; | 3443 | needs_recovery = 0; |
3431 | goto no_journal; | 3444 | goto no_journal; |
@@ -3463,9 +3476,9 @@ static int ext4_fill_super(struct super_block *sb, void *data, int silent) | |||
3463 | */ | 3476 | */ |
3464 | if (jbd2_journal_check_available_features | 3477 | if (jbd2_journal_check_available_features |
3465 | (sbi->s_journal, 0, 0, JBD2_FEATURE_INCOMPAT_REVOKE)) | 3478 | (sbi->s_journal, 0, 0, JBD2_FEATURE_INCOMPAT_REVOKE)) |
3466 | set_opt(sbi->s_mount_opt, ORDERED_DATA); | 3479 | set_opt(sb, ORDERED_DATA); |
3467 | else | 3480 | else |
3468 | set_opt(sbi->s_mount_opt, JOURNAL_DATA); | 3481 | set_opt(sb, JOURNAL_DATA); |
3469 | break; | 3482 | break; |
3470 | 3483 | ||
3471 | case EXT4_MOUNT_ORDERED_DATA: | 3484 | case EXT4_MOUNT_ORDERED_DATA: |
@@ -3555,18 +3568,18 @@ no_journal: | |||
3555 | (test_opt(sb, DATA_FLAGS) == EXT4_MOUNT_JOURNAL_DATA)) { | 3568 | (test_opt(sb, DATA_FLAGS) == EXT4_MOUNT_JOURNAL_DATA)) { |
3556 | ext4_msg(sb, KERN_WARNING, "Ignoring delalloc option - " | 3569 | ext4_msg(sb, KERN_WARNING, "Ignoring delalloc option - " |
3557 | "requested data journaling mode"); | 3570 | "requested data journaling mode"); |
3558 | clear_opt(sbi->s_mount_opt, DELALLOC); | 3571 | clear_opt(sb, DELALLOC); |
3559 | } | 3572 | } |
3560 | if (test_opt(sb, DIOREAD_NOLOCK)) { | 3573 | if (test_opt(sb, DIOREAD_NOLOCK)) { |
3561 | if (test_opt(sb, DATA_FLAGS) == EXT4_MOUNT_JOURNAL_DATA) { | 3574 | if (test_opt(sb, DATA_FLAGS) == EXT4_MOUNT_JOURNAL_DATA) { |
3562 | ext4_msg(sb, KERN_WARNING, "Ignoring dioread_nolock " | 3575 | ext4_msg(sb, KERN_WARNING, "Ignoring dioread_nolock " |
3563 | "option - requested data journaling mode"); | 3576 | "option - requested data journaling mode"); |
3564 | clear_opt(sbi->s_mount_opt, DIOREAD_NOLOCK); | 3577 | clear_opt(sb, DIOREAD_NOLOCK); |
3565 | } | 3578 | } |
3566 | if (sb->s_blocksize < PAGE_SIZE) { | 3579 | if (sb->s_blocksize < PAGE_SIZE) { |
3567 | ext4_msg(sb, KERN_WARNING, "Ignoring dioread_nolock " | 3580 | ext4_msg(sb, KERN_WARNING, "Ignoring dioread_nolock " |
3568 | "option - block size is too small"); | 3581 | "option - block size is too small"); |
3569 | clear_opt(sbi->s_mount_opt, DIOREAD_NOLOCK); | 3582 | clear_opt(sb, DIOREAD_NOLOCK); |
3570 | } | 3583 | } |
3571 | } | 3584 | } |
3572 | 3585 | ||
@@ -4158,6 +4171,22 @@ static int ext4_unfreeze(struct super_block *sb) | |||
4158 | return 0; | 4171 | return 0; |
4159 | } | 4172 | } |
4160 | 4173 | ||
4174 | /* | ||
4175 | * Structure to save mount options for ext4_remount's benefit | ||
4176 | */ | ||
4177 | struct ext4_mount_options { | ||
4178 | unsigned long s_mount_opt; | ||
4179 | unsigned long s_mount_opt2; | ||
4180 | uid_t s_resuid; | ||
4181 | gid_t s_resgid; | ||
4182 | unsigned long s_commit_interval; | ||
4183 | u32 s_min_batch_time, s_max_batch_time; | ||
4184 | #ifdef CONFIG_QUOTA | ||
4185 | int s_jquota_fmt; | ||
4186 | char *s_qf_names[MAXQUOTAS]; | ||
4187 | #endif | ||
4188 | }; | ||
4189 | |||
4161 | static int ext4_remount(struct super_block *sb, int *flags, char *data) | 4190 | static int ext4_remount(struct super_block *sb, int *flags, char *data) |
4162 | { | 4191 | { |
4163 | struct ext4_super_block *es; | 4192 | struct ext4_super_block *es; |
@@ -4178,6 +4207,7 @@ static int ext4_remount(struct super_block *sb, int *flags, char *data) | |||
4178 | lock_super(sb); | 4207 | lock_super(sb); |
4179 | old_sb_flags = sb->s_flags; | 4208 | old_sb_flags = sb->s_flags; |
4180 | old_opts.s_mount_opt = sbi->s_mount_opt; | 4209 | old_opts.s_mount_opt = sbi->s_mount_opt; |
4210 | old_opts.s_mount_opt2 = sbi->s_mount_opt2; | ||
4181 | old_opts.s_resuid = sbi->s_resuid; | 4211 | old_opts.s_resuid = sbi->s_resuid; |
4182 | old_opts.s_resgid = sbi->s_resgid; | 4212 | old_opts.s_resgid = sbi->s_resgid; |
4183 | old_opts.s_commit_interval = sbi->s_commit_interval; | 4213 | old_opts.s_commit_interval = sbi->s_commit_interval; |
@@ -4331,6 +4361,7 @@ static int ext4_remount(struct super_block *sb, int *flags, char *data) | |||
4331 | restore_opts: | 4361 | restore_opts: |
4332 | sb->s_flags = old_sb_flags; | 4362 | sb->s_flags = old_sb_flags; |
4333 | sbi->s_mount_opt = old_opts.s_mount_opt; | 4363 | sbi->s_mount_opt = old_opts.s_mount_opt; |
4364 | sbi->s_mount_opt2 = old_opts.s_mount_opt2; | ||
4334 | sbi->s_resuid = old_opts.s_resuid; | 4365 | sbi->s_resuid = old_opts.s_resuid; |
4335 | sbi->s_resgid = old_opts.s_resgid; | 4366 | sbi->s_resgid = old_opts.s_resgid; |
4336 | sbi->s_commit_interval = old_opts.s_commit_interval; | 4367 | sbi->s_commit_interval = old_opts.s_commit_interval; |