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 fb15c9c0be7..29c80f6d8b2 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)) { |
@@ -808,21 +818,15 @@ static struct inode *ext4_alloc_inode(struct super_block *sb) | |||
808 | memset(&ei->i_cached_extent, 0, sizeof(struct ext4_ext_cache)); | 818 | memset(&ei->i_cached_extent, 0, sizeof(struct ext4_ext_cache)); |
809 | INIT_LIST_HEAD(&ei->i_prealloc_list); | 819 | INIT_LIST_HEAD(&ei->i_prealloc_list); |
810 | spin_lock_init(&ei->i_prealloc_lock); | 820 | spin_lock_init(&ei->i_prealloc_lock); |
811 | /* | ||
812 | * Note: We can be called before EXT4_SB(sb)->s_journal is set, | ||
813 | * therefore it can be null here. Don't check it, just initialize | ||
814 | * jinode. | ||
815 | */ | ||
816 | jbd2_journal_init_jbd_inode(&ei->jinode, &ei->vfs_inode); | ||
817 | ei->i_reserved_data_blocks = 0; | 821 | ei->i_reserved_data_blocks = 0; |
818 | ei->i_reserved_meta_blocks = 0; | 822 | ei->i_reserved_meta_blocks = 0; |
819 | ei->i_allocated_meta_blocks = 0; | 823 | ei->i_allocated_meta_blocks = 0; |
820 | ei->i_da_metadata_calc_len = 0; | 824 | ei->i_da_metadata_calc_len = 0; |
821 | ei->i_delalloc_reserved_flag = 0; | ||
822 | spin_lock_init(&(ei->i_block_reservation_lock)); | 825 | spin_lock_init(&(ei->i_block_reservation_lock)); |
823 | #ifdef CONFIG_QUOTA | 826 | #ifdef CONFIG_QUOTA |
824 | ei->i_reserved_quota = 0; | 827 | ei->i_reserved_quota = 0; |
825 | #endif | 828 | #endif |
829 | ei->jinode = NULL; | ||
826 | INIT_LIST_HEAD(&ei->i_completed_io_list); | 830 | INIT_LIST_HEAD(&ei->i_completed_io_list); |
827 | spin_lock_init(&ei->i_completed_io_lock); | 831 | spin_lock_init(&ei->i_completed_io_lock); |
828 | ei->cur_aio_dio = NULL; | 832 | ei->cur_aio_dio = NULL; |
@@ -841,6 +845,13 @@ static int ext4_drop_inode(struct inode *inode) | |||
841 | return drop; | 845 | return drop; |
842 | } | 846 | } |
843 | 847 | ||
848 | static void ext4_i_callback(struct rcu_head *head) | ||
849 | { | ||
850 | struct inode *inode = container_of(head, struct inode, i_rcu); | ||
851 | INIT_LIST_HEAD(&inode->i_dentry); | ||
852 | kmem_cache_free(ext4_inode_cachep, EXT4_I(inode)); | ||
853 | } | ||
854 | |||
844 | static void ext4_destroy_inode(struct inode *inode) | 855 | static void ext4_destroy_inode(struct inode *inode) |
845 | { | 856 | { |
846 | ext4_ioend_wait(inode); | 857 | ext4_ioend_wait(inode); |
@@ -853,7 +864,7 @@ static void ext4_destroy_inode(struct inode *inode) | |||
853 | true); | 864 | true); |
854 | dump_stack(); | 865 | dump_stack(); |
855 | } | 866 | } |
856 | kmem_cache_free(ext4_inode_cachep, EXT4_I(inode)); | 867 | call_rcu(&inode->i_rcu, ext4_i_callback); |
857 | } | 868 | } |
858 | 869 | ||
859 | static void init_once(void *foo) | 870 | static void init_once(void *foo) |
@@ -891,9 +902,12 @@ void ext4_clear_inode(struct inode *inode) | |||
891 | end_writeback(inode); | 902 | end_writeback(inode); |
892 | dquot_drop(inode); | 903 | dquot_drop(inode); |
893 | ext4_discard_preallocations(inode); | 904 | ext4_discard_preallocations(inode); |
894 | if (EXT4_JOURNAL(inode)) | 905 | if (EXT4_I(inode)->jinode) { |
895 | jbd2_journal_release_jbd_inode(EXT4_SB(inode->i_sb)->s_journal, | 906 | jbd2_journal_release_jbd_inode(EXT4_JOURNAL(inode), |
896 | &EXT4_I(inode)->jinode); | 907 | EXT4_I(inode)->jinode); |
908 | jbd2_free_inode(EXT4_I(inode)->jinode); | ||
909 | EXT4_I(inode)->jinode = NULL; | ||
910 | } | ||
897 | } | 911 | } |
898 | 912 | ||
899 | static inline void ext4_show_quota_options(struct seq_file *seq, | 913 | static inline void ext4_show_quota_options(struct seq_file *seq, |
@@ -1386,7 +1400,7 @@ static int set_qf_name(struct super_block *sb, int qtype, substring_t *args) | |||
1386 | sbi->s_qf_names[qtype] = NULL; | 1400 | sbi->s_qf_names[qtype] = NULL; |
1387 | return 0; | 1401 | return 0; |
1388 | } | 1402 | } |
1389 | set_opt(sbi->s_mount_opt, QUOTA); | 1403 | set_opt(sb, QUOTA); |
1390 | return 1; | 1404 | return 1; |
1391 | } | 1405 | } |
1392 | 1406 | ||
@@ -1441,21 +1455,21 @@ static int parse_options(char *options, struct super_block *sb, | |||
1441 | switch (token) { | 1455 | switch (token) { |
1442 | case Opt_bsd_df: | 1456 | case Opt_bsd_df: |
1443 | ext4_msg(sb, KERN_WARNING, deprecated_msg, p, "2.6.38"); | 1457 | ext4_msg(sb, KERN_WARNING, deprecated_msg, p, "2.6.38"); |
1444 | clear_opt(sbi->s_mount_opt, MINIX_DF); | 1458 | clear_opt(sb, MINIX_DF); |
1445 | break; | 1459 | break; |
1446 | case Opt_minix_df: | 1460 | case Opt_minix_df: |
1447 | ext4_msg(sb, KERN_WARNING, deprecated_msg, p, "2.6.38"); | 1461 | ext4_msg(sb, KERN_WARNING, deprecated_msg, p, "2.6.38"); |
1448 | set_opt(sbi->s_mount_opt, MINIX_DF); | 1462 | set_opt(sb, MINIX_DF); |
1449 | 1463 | ||
1450 | break; | 1464 | break; |
1451 | case Opt_grpid: | 1465 | case Opt_grpid: |
1452 | ext4_msg(sb, KERN_WARNING, deprecated_msg, p, "2.6.38"); | 1466 | ext4_msg(sb, KERN_WARNING, deprecated_msg, p, "2.6.38"); |
1453 | set_opt(sbi->s_mount_opt, GRPID); | 1467 | set_opt(sb, GRPID); |
1454 | 1468 | ||
1455 | break; | 1469 | break; |
1456 | case Opt_nogrpid: | 1470 | case Opt_nogrpid: |
1457 | ext4_msg(sb, KERN_WARNING, deprecated_msg, p, "2.6.38"); | 1471 | ext4_msg(sb, KERN_WARNING, deprecated_msg, p, "2.6.38"); |
1458 | clear_opt(sbi->s_mount_opt, GRPID); | 1472 | clear_opt(sb, GRPID); |
1459 | 1473 | ||
1460 | break; | 1474 | break; |
1461 | case Opt_resuid: | 1475 | case Opt_resuid: |
@@ -1473,38 +1487,38 @@ static int parse_options(char *options, struct super_block *sb, | |||
1473 | /* *sb_block = match_int(&args[0]); */ | 1487 | /* *sb_block = match_int(&args[0]); */ |
1474 | break; | 1488 | break; |
1475 | case Opt_err_panic: | 1489 | case Opt_err_panic: |
1476 | clear_opt(sbi->s_mount_opt, ERRORS_CONT); | 1490 | clear_opt(sb, ERRORS_CONT); |
1477 | clear_opt(sbi->s_mount_opt, ERRORS_RO); | 1491 | clear_opt(sb, ERRORS_RO); |
1478 | set_opt(sbi->s_mount_opt, ERRORS_PANIC); | 1492 | set_opt(sb, ERRORS_PANIC); |
1479 | break; | 1493 | break; |
1480 | case Opt_err_ro: | 1494 | case Opt_err_ro: |
1481 | clear_opt(sbi->s_mount_opt, ERRORS_CONT); | 1495 | clear_opt(sb, ERRORS_CONT); |
1482 | clear_opt(sbi->s_mount_opt, ERRORS_PANIC); | 1496 | clear_opt(sb, ERRORS_PANIC); |
1483 | set_opt(sbi->s_mount_opt, ERRORS_RO); | 1497 | set_opt(sb, ERRORS_RO); |
1484 | break; | 1498 | break; |
1485 | case Opt_err_cont: | 1499 | case Opt_err_cont: |
1486 | clear_opt(sbi->s_mount_opt, ERRORS_RO); | 1500 | clear_opt(sb, ERRORS_RO); |
1487 | clear_opt(sbi->s_mount_opt, ERRORS_PANIC); | 1501 | clear_opt(sb, ERRORS_PANIC); |
1488 | set_opt(sbi->s_mount_opt, ERRORS_CONT); | 1502 | set_opt(sb, ERRORS_CONT); |
1489 | break; | 1503 | break; |
1490 | case Opt_nouid32: | 1504 | case Opt_nouid32: |
1491 | set_opt(sbi->s_mount_opt, NO_UID32); | 1505 | set_opt(sb, NO_UID32); |
1492 | break; | 1506 | break; |
1493 | case Opt_debug: | 1507 | case Opt_debug: |
1494 | set_opt(sbi->s_mount_opt, DEBUG); | 1508 | set_opt(sb, DEBUG); |
1495 | break; | 1509 | break; |
1496 | case Opt_oldalloc: | 1510 | case Opt_oldalloc: |
1497 | set_opt(sbi->s_mount_opt, OLDALLOC); | 1511 | set_opt(sb, OLDALLOC); |
1498 | break; | 1512 | break; |
1499 | case Opt_orlov: | 1513 | case Opt_orlov: |
1500 | clear_opt(sbi->s_mount_opt, OLDALLOC); | 1514 | clear_opt(sb, OLDALLOC); |
1501 | break; | 1515 | break; |
1502 | #ifdef CONFIG_EXT4_FS_XATTR | 1516 | #ifdef CONFIG_EXT4_FS_XATTR |
1503 | case Opt_user_xattr: | 1517 | case Opt_user_xattr: |
1504 | set_opt(sbi->s_mount_opt, XATTR_USER); | 1518 | set_opt(sb, XATTR_USER); |
1505 | break; | 1519 | break; |
1506 | case Opt_nouser_xattr: | 1520 | case Opt_nouser_xattr: |
1507 | clear_opt(sbi->s_mount_opt, XATTR_USER); | 1521 | clear_opt(sb, XATTR_USER); |
1508 | break; | 1522 | break; |
1509 | #else | 1523 | #else |
1510 | case Opt_user_xattr: | 1524 | case Opt_user_xattr: |
@@ -1514,10 +1528,10 @@ static int parse_options(char *options, struct super_block *sb, | |||
1514 | #endif | 1528 | #endif |
1515 | #ifdef CONFIG_EXT4_FS_POSIX_ACL | 1529 | #ifdef CONFIG_EXT4_FS_POSIX_ACL |
1516 | case Opt_acl: | 1530 | case Opt_acl: |
1517 | set_opt(sbi->s_mount_opt, POSIX_ACL); | 1531 | set_opt(sb, POSIX_ACL); |
1518 | break; | 1532 | break; |
1519 | case Opt_noacl: | 1533 | case Opt_noacl: |
1520 | clear_opt(sbi->s_mount_opt, POSIX_ACL); | 1534 | clear_opt(sb, POSIX_ACL); |
1521 | break; | 1535 | break; |
1522 | #else | 1536 | #else |
1523 | case Opt_acl: | 1537 | case Opt_acl: |
@@ -1536,7 +1550,7 @@ static int parse_options(char *options, struct super_block *sb, | |||
1536 | "Cannot specify journal on remount"); | 1550 | "Cannot specify journal on remount"); |
1537 | return 0; | 1551 | return 0; |
1538 | } | 1552 | } |
1539 | set_opt(sbi->s_mount_opt, UPDATE_JOURNAL); | 1553 | set_opt(sb, UPDATE_JOURNAL); |
1540 | break; | 1554 | break; |
1541 | case Opt_journal_dev: | 1555 | case Opt_journal_dev: |
1542 | if (is_remount) { | 1556 | if (is_remount) { |
@@ -1549,14 +1563,14 @@ static int parse_options(char *options, struct super_block *sb, | |||
1549 | *journal_devnum = option; | 1563 | *journal_devnum = option; |
1550 | break; | 1564 | break; |
1551 | case Opt_journal_checksum: | 1565 | case Opt_journal_checksum: |
1552 | set_opt(sbi->s_mount_opt, JOURNAL_CHECKSUM); | 1566 | set_opt(sb, JOURNAL_CHECKSUM); |
1553 | break; | 1567 | break; |
1554 | case Opt_journal_async_commit: | 1568 | case Opt_journal_async_commit: |
1555 | set_opt(sbi->s_mount_opt, JOURNAL_ASYNC_COMMIT); | 1569 | set_opt(sb, JOURNAL_ASYNC_COMMIT); |
1556 | set_opt(sbi->s_mount_opt, JOURNAL_CHECKSUM); | 1570 | set_opt(sb, JOURNAL_CHECKSUM); |
1557 | break; | 1571 | break; |
1558 | case Opt_noload: | 1572 | case Opt_noload: |
1559 | set_opt(sbi->s_mount_opt, NOLOAD); | 1573 | set_opt(sb, NOLOAD); |
1560 | break; | 1574 | break; |
1561 | case Opt_commit: | 1575 | case Opt_commit: |
1562 | if (match_int(&args[0], &option)) | 1576 | if (match_int(&args[0], &option)) |
@@ -1599,15 +1613,15 @@ static int parse_options(char *options, struct super_block *sb, | |||
1599 | return 0; | 1613 | return 0; |
1600 | } | 1614 | } |
1601 | } else { | 1615 | } else { |
1602 | clear_opt(sbi->s_mount_opt, DATA_FLAGS); | 1616 | clear_opt(sb, DATA_FLAGS); |
1603 | sbi->s_mount_opt |= data_opt; | 1617 | sbi->s_mount_opt |= data_opt; |
1604 | } | 1618 | } |
1605 | break; | 1619 | break; |
1606 | case Opt_data_err_abort: | 1620 | case Opt_data_err_abort: |
1607 | set_opt(sbi->s_mount_opt, DATA_ERR_ABORT); | 1621 | set_opt(sb, DATA_ERR_ABORT); |
1608 | break; | 1622 | break; |
1609 | case Opt_data_err_ignore: | 1623 | case Opt_data_err_ignore: |
1610 | clear_opt(sbi->s_mount_opt, DATA_ERR_ABORT); | 1624 | clear_opt(sb, DATA_ERR_ABORT); |
1611 | break; | 1625 | break; |
1612 | #ifdef CONFIG_QUOTA | 1626 | #ifdef CONFIG_QUOTA |
1613 | case Opt_usrjquota: | 1627 | case Opt_usrjquota: |
@@ -1647,12 +1661,12 @@ set_qf_format: | |||
1647 | break; | 1661 | break; |
1648 | case Opt_quota: | 1662 | case Opt_quota: |
1649 | case Opt_usrquota: | 1663 | case Opt_usrquota: |
1650 | set_opt(sbi->s_mount_opt, QUOTA); | 1664 | set_opt(sb, QUOTA); |
1651 | set_opt(sbi->s_mount_opt, USRQUOTA); | 1665 | set_opt(sb, USRQUOTA); |
1652 | break; | 1666 | break; |
1653 | case Opt_grpquota: | 1667 | case Opt_grpquota: |
1654 | set_opt(sbi->s_mount_opt, QUOTA); | 1668 | set_opt(sb, QUOTA); |
1655 | set_opt(sbi->s_mount_opt, GRPQUOTA); | 1669 | set_opt(sb, GRPQUOTA); |
1656 | break; | 1670 | break; |
1657 | case Opt_noquota: | 1671 | case Opt_noquota: |
1658 | if (sb_any_quota_loaded(sb)) { | 1672 | if (sb_any_quota_loaded(sb)) { |
@@ -1660,9 +1674,9 @@ set_qf_format: | |||
1660 | "options when quota turned on"); | 1674 | "options when quota turned on"); |
1661 | return 0; | 1675 | return 0; |
1662 | } | 1676 | } |
1663 | clear_opt(sbi->s_mount_opt, QUOTA); | 1677 | clear_opt(sb, QUOTA); |
1664 | clear_opt(sbi->s_mount_opt, USRQUOTA); | 1678 | clear_opt(sb, USRQUOTA); |
1665 | clear_opt(sbi->s_mount_opt, GRPQUOTA); | 1679 | clear_opt(sb, GRPQUOTA); |
1666 | break; | 1680 | break; |
1667 | #else | 1681 | #else |
1668 | case Opt_quota: | 1682 | case Opt_quota: |
@@ -1688,7 +1702,7 @@ set_qf_format: | |||
1688 | sbi->s_mount_flags |= EXT4_MF_FS_ABORTED; | 1702 | sbi->s_mount_flags |= EXT4_MF_FS_ABORTED; |
1689 | break; | 1703 | break; |
1690 | case Opt_nobarrier: | 1704 | case Opt_nobarrier: |
1691 | clear_opt(sbi->s_mount_opt, BARRIER); | 1705 | clear_opt(sb, BARRIER); |
1692 | break; | 1706 | break; |
1693 | case Opt_barrier: | 1707 | case Opt_barrier: |
1694 | if (args[0].from) { | 1708 | if (args[0].from) { |
@@ -1697,9 +1711,9 @@ set_qf_format: | |||
1697 | } else | 1711 | } else |
1698 | option = 1; /* No argument, default to 1 */ | 1712 | option = 1; /* No argument, default to 1 */ |
1699 | if (option) | 1713 | if (option) |
1700 | set_opt(sbi->s_mount_opt, BARRIER); | 1714 | set_opt(sb, BARRIER); |
1701 | else | 1715 | else |
1702 | clear_opt(sbi->s_mount_opt, BARRIER); | 1716 | clear_opt(sb, BARRIER); |
1703 | break; | 1717 | break; |
1704 | case Opt_ignore: | 1718 | case Opt_ignore: |
1705 | break; | 1719 | break; |
@@ -1723,17 +1737,17 @@ set_qf_format: | |||
1723 | "Ignoring deprecated bh option"); | 1737 | "Ignoring deprecated bh option"); |
1724 | break; | 1738 | break; |
1725 | case Opt_i_version: | 1739 | case Opt_i_version: |
1726 | set_opt(sbi->s_mount_opt, I_VERSION); | 1740 | set_opt(sb, I_VERSION); |
1727 | sb->s_flags |= MS_I_VERSION; | 1741 | sb->s_flags |= MS_I_VERSION; |
1728 | break; | 1742 | break; |
1729 | case Opt_nodelalloc: | 1743 | case Opt_nodelalloc: |
1730 | clear_opt(sbi->s_mount_opt, DELALLOC); | 1744 | clear_opt(sb, DELALLOC); |
1731 | break; | 1745 | break; |
1732 | case Opt_mblk_io_submit: | 1746 | case Opt_mblk_io_submit: |
1733 | set_opt(sbi->s_mount_opt, MBLK_IO_SUBMIT); | 1747 | set_opt(sb, MBLK_IO_SUBMIT); |
1734 | break; | 1748 | break; |
1735 | case Opt_nomblk_io_submit: | 1749 | case Opt_nomblk_io_submit: |
1736 | clear_opt(sbi->s_mount_opt, MBLK_IO_SUBMIT); | 1750 | clear_opt(sb, MBLK_IO_SUBMIT); |
1737 | break; | 1751 | break; |
1738 | case Opt_stripe: | 1752 | case Opt_stripe: |
1739 | if (match_int(&args[0], &option)) | 1753 | if (match_int(&args[0], &option)) |
@@ -1743,13 +1757,13 @@ set_qf_format: | |||
1743 | sbi->s_stripe = option; | 1757 | sbi->s_stripe = option; |
1744 | break; | 1758 | break; |
1745 | case Opt_delalloc: | 1759 | case Opt_delalloc: |
1746 | set_opt(sbi->s_mount_opt, DELALLOC); | 1760 | set_opt(sb, DELALLOC); |
1747 | break; | 1761 | break; |
1748 | case Opt_block_validity: | 1762 | case Opt_block_validity: |
1749 | set_opt(sbi->s_mount_opt, BLOCK_VALIDITY); | 1763 | set_opt(sb, BLOCK_VALIDITY); |
1750 | break; | 1764 | break; |
1751 | case Opt_noblock_validity: | 1765 | case Opt_noblock_validity: |
1752 | clear_opt(sbi->s_mount_opt, BLOCK_VALIDITY); | 1766 | clear_opt(sb, BLOCK_VALIDITY); |
1753 | break; | 1767 | break; |
1754 | case Opt_inode_readahead_blks: | 1768 | case Opt_inode_readahead_blks: |
1755 | if (match_int(&args[0], &option)) | 1769 | if (match_int(&args[0], &option)) |
@@ -1773,7 +1787,7 @@ set_qf_format: | |||
1773 | option); | 1787 | option); |
1774 | break; | 1788 | break; |
1775 | case Opt_noauto_da_alloc: | 1789 | case Opt_noauto_da_alloc: |
1776 | set_opt(sbi->s_mount_opt,NO_AUTO_DA_ALLOC); | 1790 | set_opt(sb, NO_AUTO_DA_ALLOC); |
1777 | break; | 1791 | break; |
1778 | case Opt_auto_da_alloc: | 1792 | case Opt_auto_da_alloc: |
1779 | if (args[0].from) { | 1793 | if (args[0].from) { |
@@ -1782,24 +1796,24 @@ set_qf_format: | |||
1782 | } else | 1796 | } else |
1783 | option = 1; /* No argument, default to 1 */ | 1797 | option = 1; /* No argument, default to 1 */ |
1784 | if (option) | 1798 | if (option) |
1785 | clear_opt(sbi->s_mount_opt, NO_AUTO_DA_ALLOC); | 1799 | clear_opt(sb, NO_AUTO_DA_ALLOC); |
1786 | else | 1800 | else |
1787 | set_opt(sbi->s_mount_opt,NO_AUTO_DA_ALLOC); | 1801 | set_opt(sb,NO_AUTO_DA_ALLOC); |
1788 | break; | 1802 | break; |
1789 | case Opt_discard: | 1803 | case Opt_discard: |
1790 | set_opt(sbi->s_mount_opt, DISCARD); | 1804 | set_opt(sb, DISCARD); |
1791 | break; | 1805 | break; |
1792 | case Opt_nodiscard: | 1806 | case Opt_nodiscard: |
1793 | clear_opt(sbi->s_mount_opt, DISCARD); | 1807 | clear_opt(sb, DISCARD); |
1794 | break; | 1808 | break; |
1795 | case Opt_dioread_nolock: | 1809 | case Opt_dioread_nolock: |
1796 | set_opt(sbi->s_mount_opt, DIOREAD_NOLOCK); | 1810 | set_opt(sb, DIOREAD_NOLOCK); |
1797 | break; | 1811 | break; |
1798 | case Opt_dioread_lock: | 1812 | case Opt_dioread_lock: |
1799 | clear_opt(sbi->s_mount_opt, DIOREAD_NOLOCK); | 1813 | clear_opt(sb, DIOREAD_NOLOCK); |
1800 | break; | 1814 | break; |
1801 | case Opt_init_inode_table: | 1815 | case Opt_init_inode_table: |
1802 | set_opt(sbi->s_mount_opt, INIT_INODE_TABLE); | 1816 | set_opt(sb, INIT_INODE_TABLE); |
1803 | if (args[0].from) { | 1817 | if (args[0].from) { |
1804 | if (match_int(&args[0], &option)) | 1818 | if (match_int(&args[0], &option)) |
1805 | return 0; | 1819 | return 0; |
@@ -1810,7 +1824,7 @@ set_qf_format: | |||
1810 | sbi->s_li_wait_mult = option; | 1824 | sbi->s_li_wait_mult = option; |
1811 | break; | 1825 | break; |
1812 | case Opt_noinit_inode_table: | 1826 | case Opt_noinit_inode_table: |
1813 | clear_opt(sbi->s_mount_opt, INIT_INODE_TABLE); | 1827 | clear_opt(sb, INIT_INODE_TABLE); |
1814 | break; | 1828 | break; |
1815 | default: | 1829 | default: |
1816 | ext4_msg(sb, KERN_ERR, | 1830 | ext4_msg(sb, KERN_ERR, |
@@ -1822,10 +1836,10 @@ set_qf_format: | |||
1822 | #ifdef CONFIG_QUOTA | 1836 | #ifdef CONFIG_QUOTA |
1823 | if (sbi->s_qf_names[USRQUOTA] || sbi->s_qf_names[GRPQUOTA]) { | 1837 | if (sbi->s_qf_names[USRQUOTA] || sbi->s_qf_names[GRPQUOTA]) { |
1824 | if (test_opt(sb, USRQUOTA) && sbi->s_qf_names[USRQUOTA]) | 1838 | if (test_opt(sb, USRQUOTA) && sbi->s_qf_names[USRQUOTA]) |
1825 | clear_opt(sbi->s_mount_opt, USRQUOTA); | 1839 | clear_opt(sb, USRQUOTA); |
1826 | 1840 | ||
1827 | if (test_opt(sb, GRPQUOTA) && sbi->s_qf_names[GRPQUOTA]) | 1841 | if (test_opt(sb, GRPQUOTA) && sbi->s_qf_names[GRPQUOTA]) |
1828 | clear_opt(sbi->s_mount_opt, GRPQUOTA); | 1842 | clear_opt(sb, GRPQUOTA); |
1829 | 1843 | ||
1830 | if (test_opt(sb, GRPQUOTA) || test_opt(sb, USRQUOTA)) { | 1844 | if (test_opt(sb, GRPQUOTA) || test_opt(sb, USRQUOTA)) { |
1831 | ext4_msg(sb, KERN_ERR, "old and new quota " | 1845 | ext4_msg(sb, KERN_ERR, "old and new quota " |
@@ -1895,12 +1909,12 @@ static int ext4_setup_super(struct super_block *sb, struct ext4_super_block *es, | |||
1895 | ext4_commit_super(sb, 1); | 1909 | ext4_commit_super(sb, 1); |
1896 | if (test_opt(sb, DEBUG)) | 1910 | if (test_opt(sb, DEBUG)) |
1897 | printk(KERN_INFO "[EXT4 FS bs=%lu, gc=%u, " | 1911 | printk(KERN_INFO "[EXT4 FS bs=%lu, gc=%u, " |
1898 | "bpg=%lu, ipg=%lu, mo=%04x]\n", | 1912 | "bpg=%lu, ipg=%lu, mo=%04x, mo2=%04x]\n", |
1899 | sb->s_blocksize, | 1913 | sb->s_blocksize, |
1900 | sbi->s_groups_count, | 1914 | sbi->s_groups_count, |
1901 | EXT4_BLOCKS_PER_GROUP(sb), | 1915 | EXT4_BLOCKS_PER_GROUP(sb), |
1902 | EXT4_INODES_PER_GROUP(sb), | 1916 | EXT4_INODES_PER_GROUP(sb), |
1903 | sbi->s_mount_opt); | 1917 | sbi->s_mount_opt, sbi->s_mount_opt2); |
1904 | 1918 | ||
1905 | return res; | 1919 | return res; |
1906 | } | 1920 | } |
@@ -1930,14 +1944,13 @@ static int ext4_fill_flex_info(struct super_block *sb) | |||
1930 | size = flex_group_count * sizeof(struct flex_groups); | 1944 | size = flex_group_count * sizeof(struct flex_groups); |
1931 | sbi->s_flex_groups = kzalloc(size, GFP_KERNEL); | 1945 | sbi->s_flex_groups = kzalloc(size, GFP_KERNEL); |
1932 | if (sbi->s_flex_groups == NULL) { | 1946 | if (sbi->s_flex_groups == NULL) { |
1933 | sbi->s_flex_groups = vmalloc(size); | 1947 | sbi->s_flex_groups = vzalloc(size); |
1934 | if (sbi->s_flex_groups) | 1948 | if (sbi->s_flex_groups == NULL) { |
1935 | memset(sbi->s_flex_groups, 0, size); | 1949 | ext4_msg(sb, KERN_ERR, |
1936 | } | 1950 | "not enough memory for %u flex groups", |
1937 | if (sbi->s_flex_groups == NULL) { | 1951 | flex_group_count); |
1938 | ext4_msg(sb, KERN_ERR, "not enough memory for " | 1952 | goto failed; |
1939 | "%u flex groups", flex_group_count); | 1953 | } |
1940 | goto failed; | ||
1941 | } | 1954 | } |
1942 | 1955 | ||
1943 | for (i = 0; i < sbi->s_groups_count; i++) { | 1956 | for (i = 0; i < sbi->s_groups_count; i++) { |
@@ -2916,7 +2929,7 @@ static int ext4_register_li_request(struct super_block *sb, | |||
2916 | struct ext4_sb_info *sbi = EXT4_SB(sb); | 2929 | struct ext4_sb_info *sbi = EXT4_SB(sb); |
2917 | struct ext4_li_request *elr; | 2930 | struct ext4_li_request *elr; |
2918 | ext4_group_t ngroups = EXT4_SB(sb)->s_groups_count; | 2931 | ext4_group_t ngroups = EXT4_SB(sb)->s_groups_count; |
2919 | int ret; | 2932 | int ret = 0; |
2920 | 2933 | ||
2921 | if (sbi->s_li_request != NULL) | 2934 | if (sbi->s_li_request != NULL) |
2922 | return 0; | 2935 | return 0; |
@@ -3071,41 +3084,41 @@ static int ext4_fill_super(struct super_block *sb, void *data, int silent) | |||
3071 | 3084 | ||
3072 | /* Set defaults before we parse the mount options */ | 3085 | /* Set defaults before we parse the mount options */ |
3073 | def_mount_opts = le32_to_cpu(es->s_default_mount_opts); | 3086 | def_mount_opts = le32_to_cpu(es->s_default_mount_opts); |
3074 | set_opt(sbi->s_mount_opt, INIT_INODE_TABLE); | 3087 | set_opt(sb, INIT_INODE_TABLE); |
3075 | if (def_mount_opts & EXT4_DEFM_DEBUG) | 3088 | if (def_mount_opts & EXT4_DEFM_DEBUG) |
3076 | set_opt(sbi->s_mount_opt, DEBUG); | 3089 | set_opt(sb, DEBUG); |
3077 | if (def_mount_opts & EXT4_DEFM_BSDGROUPS) { | 3090 | if (def_mount_opts & EXT4_DEFM_BSDGROUPS) { |
3078 | ext4_msg(sb, KERN_WARNING, deprecated_msg, "bsdgroups", | 3091 | ext4_msg(sb, KERN_WARNING, deprecated_msg, "bsdgroups", |
3079 | "2.6.38"); | 3092 | "2.6.38"); |
3080 | set_opt(sbi->s_mount_opt, GRPID); | 3093 | set_opt(sb, GRPID); |
3081 | } | 3094 | } |
3082 | if (def_mount_opts & EXT4_DEFM_UID16) | 3095 | if (def_mount_opts & EXT4_DEFM_UID16) |
3083 | set_opt(sbi->s_mount_opt, NO_UID32); | 3096 | set_opt(sb, NO_UID32); |
3084 | #ifdef CONFIG_EXT4_FS_XATTR | 3097 | #ifdef CONFIG_EXT4_FS_XATTR |
3085 | if (def_mount_opts & EXT4_DEFM_XATTR_USER) | 3098 | if (def_mount_opts & EXT4_DEFM_XATTR_USER) |
3086 | set_opt(sbi->s_mount_opt, XATTR_USER); | 3099 | set_opt(sb, XATTR_USER); |
3087 | #endif | 3100 | #endif |
3088 | #ifdef CONFIG_EXT4_FS_POSIX_ACL | 3101 | #ifdef CONFIG_EXT4_FS_POSIX_ACL |
3089 | if (def_mount_opts & EXT4_DEFM_ACL) | 3102 | if (def_mount_opts & EXT4_DEFM_ACL) |
3090 | set_opt(sbi->s_mount_opt, POSIX_ACL); | 3103 | set_opt(sb, POSIX_ACL); |
3091 | #endif | 3104 | #endif |
3092 | if ((def_mount_opts & EXT4_DEFM_JMODE) == EXT4_DEFM_JMODE_DATA) | 3105 | if ((def_mount_opts & EXT4_DEFM_JMODE) == EXT4_DEFM_JMODE_DATA) |
3093 | set_opt(sbi->s_mount_opt, JOURNAL_DATA); | 3106 | set_opt(sb, JOURNAL_DATA); |
3094 | else if ((def_mount_opts & EXT4_DEFM_JMODE) == EXT4_DEFM_JMODE_ORDERED) | 3107 | else if ((def_mount_opts & EXT4_DEFM_JMODE) == EXT4_DEFM_JMODE_ORDERED) |
3095 | set_opt(sbi->s_mount_opt, ORDERED_DATA); | 3108 | set_opt(sb, ORDERED_DATA); |
3096 | else if ((def_mount_opts & EXT4_DEFM_JMODE) == EXT4_DEFM_JMODE_WBACK) | 3109 | else if ((def_mount_opts & EXT4_DEFM_JMODE) == EXT4_DEFM_JMODE_WBACK) |
3097 | set_opt(sbi->s_mount_opt, WRITEBACK_DATA); | 3110 | set_opt(sb, WRITEBACK_DATA); |
3098 | 3111 | ||
3099 | if (le16_to_cpu(sbi->s_es->s_errors) == EXT4_ERRORS_PANIC) | 3112 | if (le16_to_cpu(sbi->s_es->s_errors) == EXT4_ERRORS_PANIC) |
3100 | set_opt(sbi->s_mount_opt, ERRORS_PANIC); | 3113 | set_opt(sb, ERRORS_PANIC); |
3101 | else if (le16_to_cpu(sbi->s_es->s_errors) == EXT4_ERRORS_CONTINUE) | 3114 | else if (le16_to_cpu(sbi->s_es->s_errors) == EXT4_ERRORS_CONTINUE) |
3102 | set_opt(sbi->s_mount_opt, ERRORS_CONT); | 3115 | set_opt(sb, ERRORS_CONT); |
3103 | else | 3116 | else |
3104 | set_opt(sbi->s_mount_opt, ERRORS_RO); | 3117 | set_opt(sb, ERRORS_RO); |
3105 | if (def_mount_opts & EXT4_DEFM_BLOCK_VALIDITY) | 3118 | if (def_mount_opts & EXT4_DEFM_BLOCK_VALIDITY) |
3106 | set_opt(sbi->s_mount_opt, BLOCK_VALIDITY); | 3119 | set_opt(sb, BLOCK_VALIDITY); |
3107 | if (def_mount_opts & EXT4_DEFM_DISCARD) | 3120 | if (def_mount_opts & EXT4_DEFM_DISCARD) |
3108 | set_opt(sbi->s_mount_opt, DISCARD); | 3121 | set_opt(sb, DISCARD); |
3109 | 3122 | ||
3110 | sbi->s_resuid = le16_to_cpu(es->s_def_resuid); | 3123 | sbi->s_resuid = le16_to_cpu(es->s_def_resuid); |
3111 | sbi->s_resgid = le16_to_cpu(es->s_def_resgid); | 3124 | sbi->s_resgid = le16_to_cpu(es->s_def_resgid); |
@@ -3114,7 +3127,7 @@ static int ext4_fill_super(struct super_block *sb, void *data, int silent) | |||
3114 | sbi->s_max_batch_time = EXT4_DEF_MAX_BATCH_TIME; | 3127 | sbi->s_max_batch_time = EXT4_DEF_MAX_BATCH_TIME; |
3115 | 3128 | ||
3116 | if ((def_mount_opts & EXT4_DEFM_NOBARRIER) == 0) | 3129 | if ((def_mount_opts & EXT4_DEFM_NOBARRIER) == 0) |
3117 | set_opt(sbi->s_mount_opt, BARRIER); | 3130 | set_opt(sb, BARRIER); |
3118 | 3131 | ||
3119 | /* | 3132 | /* |
3120 | * enable delayed allocation by default | 3133 | * enable delayed allocation by default |
@@ -3122,7 +3135,7 @@ static int ext4_fill_super(struct super_block *sb, void *data, int silent) | |||
3122 | */ | 3135 | */ |
3123 | if (!IS_EXT3_SB(sb) && | 3136 | if (!IS_EXT3_SB(sb) && |
3124 | ((def_mount_opts & EXT4_DEFM_NODELALLOC) == 0)) | 3137 | ((def_mount_opts & EXT4_DEFM_NODELALLOC) == 0)) |
3125 | set_opt(sbi->s_mount_opt, DELALLOC); | 3138 | set_opt(sb, DELALLOC); |
3126 | 3139 | ||
3127 | if (!parse_options((char *) sbi->s_es->s_mount_opts, sb, | 3140 | if (!parse_options((char *) sbi->s_es->s_mount_opts, sb, |
3128 | &journal_devnum, &journal_ioprio, NULL, 0)) { | 3141 | &journal_devnum, &journal_ioprio, NULL, 0)) { |
@@ -3425,8 +3438,8 @@ static int ext4_fill_super(struct super_block *sb, void *data, int silent) | |||
3425 | "suppressed and not mounted read-only"); | 3438 | "suppressed and not mounted read-only"); |
3426 | goto failed_mount_wq; | 3439 | goto failed_mount_wq; |
3427 | } else { | 3440 | } else { |
3428 | clear_opt(sbi->s_mount_opt, DATA_FLAGS); | 3441 | clear_opt(sb, DATA_FLAGS); |
3429 | set_opt(sbi->s_mount_opt, WRITEBACK_DATA); | 3442 | set_opt(sb, WRITEBACK_DATA); |
3430 | sbi->s_journal = NULL; | 3443 | sbi->s_journal = NULL; |
3431 | needs_recovery = 0; | 3444 | needs_recovery = 0; |
3432 | goto no_journal; | 3445 | goto no_journal; |
@@ -3464,9 +3477,9 @@ static int ext4_fill_super(struct super_block *sb, void *data, int silent) | |||
3464 | */ | 3477 | */ |
3465 | if (jbd2_journal_check_available_features | 3478 | if (jbd2_journal_check_available_features |
3466 | (sbi->s_journal, 0, 0, JBD2_FEATURE_INCOMPAT_REVOKE)) | 3479 | (sbi->s_journal, 0, 0, JBD2_FEATURE_INCOMPAT_REVOKE)) |
3467 | set_opt(sbi->s_mount_opt, ORDERED_DATA); | 3480 | set_opt(sb, ORDERED_DATA); |
3468 | else | 3481 | else |
3469 | set_opt(sbi->s_mount_opt, JOURNAL_DATA); | 3482 | set_opt(sb, JOURNAL_DATA); |
3470 | break; | 3483 | break; |
3471 | 3484 | ||
3472 | case EXT4_MOUNT_ORDERED_DATA: | 3485 | case EXT4_MOUNT_ORDERED_DATA: |
@@ -3556,18 +3569,18 @@ no_journal: | |||
3556 | (test_opt(sb, DATA_FLAGS) == EXT4_MOUNT_JOURNAL_DATA)) { | 3569 | (test_opt(sb, DATA_FLAGS) == EXT4_MOUNT_JOURNAL_DATA)) { |
3557 | ext4_msg(sb, KERN_WARNING, "Ignoring delalloc option - " | 3570 | ext4_msg(sb, KERN_WARNING, "Ignoring delalloc option - " |
3558 | "requested data journaling mode"); | 3571 | "requested data journaling mode"); |
3559 | clear_opt(sbi->s_mount_opt, DELALLOC); | 3572 | clear_opt(sb, DELALLOC); |
3560 | } | 3573 | } |
3561 | if (test_opt(sb, DIOREAD_NOLOCK)) { | 3574 | if (test_opt(sb, DIOREAD_NOLOCK)) { |
3562 | if (test_opt(sb, DATA_FLAGS) == EXT4_MOUNT_JOURNAL_DATA) { | 3575 | if (test_opt(sb, DATA_FLAGS) == EXT4_MOUNT_JOURNAL_DATA) { |
3563 | ext4_msg(sb, KERN_WARNING, "Ignoring dioread_nolock " | 3576 | ext4_msg(sb, KERN_WARNING, "Ignoring dioread_nolock " |
3564 | "option - requested data journaling mode"); | 3577 | "option - requested data journaling mode"); |
3565 | clear_opt(sbi->s_mount_opt, DIOREAD_NOLOCK); | 3578 | clear_opt(sb, DIOREAD_NOLOCK); |
3566 | } | 3579 | } |
3567 | if (sb->s_blocksize < PAGE_SIZE) { | 3580 | if (sb->s_blocksize < PAGE_SIZE) { |
3568 | ext4_msg(sb, KERN_WARNING, "Ignoring dioread_nolock " | 3581 | ext4_msg(sb, KERN_WARNING, "Ignoring dioread_nolock " |
3569 | "option - block size is too small"); | 3582 | "option - block size is too small"); |
3570 | clear_opt(sbi->s_mount_opt, DIOREAD_NOLOCK); | 3583 | clear_opt(sb, DIOREAD_NOLOCK); |
3571 | } | 3584 | } |
3572 | } | 3585 | } |
3573 | 3586 | ||
@@ -4166,6 +4179,22 @@ static int ext4_unfreeze(struct super_block *sb) | |||
4166 | return 0; | 4179 | return 0; |
4167 | } | 4180 | } |
4168 | 4181 | ||
4182 | /* | ||
4183 | * Structure to save mount options for ext4_remount's benefit | ||
4184 | */ | ||
4185 | struct ext4_mount_options { | ||
4186 | unsigned long s_mount_opt; | ||
4187 | unsigned long s_mount_opt2; | ||
4188 | uid_t s_resuid; | ||
4189 | gid_t s_resgid; | ||
4190 | unsigned long s_commit_interval; | ||
4191 | u32 s_min_batch_time, s_max_batch_time; | ||
4192 | #ifdef CONFIG_QUOTA | ||
4193 | int s_jquota_fmt; | ||
4194 | char *s_qf_names[MAXQUOTAS]; | ||
4195 | #endif | ||
4196 | }; | ||
4197 | |||
4169 | static int ext4_remount(struct super_block *sb, int *flags, char *data) | 4198 | static int ext4_remount(struct super_block *sb, int *flags, char *data) |
4170 | { | 4199 | { |
4171 | struct ext4_super_block *es; | 4200 | struct ext4_super_block *es; |
@@ -4186,6 +4215,7 @@ static int ext4_remount(struct super_block *sb, int *flags, char *data) | |||
4186 | lock_super(sb); | 4215 | lock_super(sb); |
4187 | old_sb_flags = sb->s_flags; | 4216 | old_sb_flags = sb->s_flags; |
4188 | old_opts.s_mount_opt = sbi->s_mount_opt; | 4217 | old_opts.s_mount_opt = sbi->s_mount_opt; |
4218 | old_opts.s_mount_opt2 = sbi->s_mount_opt2; | ||
4189 | old_opts.s_resuid = sbi->s_resuid; | 4219 | old_opts.s_resuid = sbi->s_resuid; |
4190 | old_opts.s_resgid = sbi->s_resgid; | 4220 | old_opts.s_resgid = sbi->s_resgid; |
4191 | old_opts.s_commit_interval = sbi->s_commit_interval; | 4221 | old_opts.s_commit_interval = sbi->s_commit_interval; |
@@ -4339,6 +4369,7 @@ static int ext4_remount(struct super_block *sb, int *flags, char *data) | |||
4339 | restore_opts: | 4369 | restore_opts: |
4340 | sb->s_flags = old_sb_flags; | 4370 | sb->s_flags = old_sb_flags; |
4341 | sbi->s_mount_opt = old_opts.s_mount_opt; | 4371 | sbi->s_mount_opt = old_opts.s_mount_opt; |
4372 | sbi->s_mount_opt2 = old_opts.s_mount_opt2; | ||
4342 | sbi->s_resuid = old_opts.s_resuid; | 4373 | sbi->s_resuid = old_opts.s_resuid; |
4343 | sbi->s_resgid = old_opts.s_resgid; | 4374 | sbi->s_resgid = old_opts.s_resgid; |
4344 | sbi->s_commit_interval = old_opts.s_commit_interval; | 4375 | sbi->s_commit_interval = old_opts.s_commit_interval; |