diff options
Diffstat (limited to 'fs/ext4/super.c')
-rw-r--r-- | fs/ext4/super.c | 288 |
1 files changed, 156 insertions, 132 deletions
diff --git a/fs/ext4/super.c b/fs/ext4/super.c index cd37f9d5e447..29c80f6d8b27 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; |
@@ -898,9 +902,12 @@ void ext4_clear_inode(struct inode *inode) | |||
898 | end_writeback(inode); | 902 | end_writeback(inode); |
899 | dquot_drop(inode); | 903 | dquot_drop(inode); |
900 | ext4_discard_preallocations(inode); | 904 | ext4_discard_preallocations(inode); |
901 | if (EXT4_JOURNAL(inode)) | 905 | if (EXT4_I(inode)->jinode) { |
902 | jbd2_journal_release_jbd_inode(EXT4_SB(inode->i_sb)->s_journal, | 906 | jbd2_journal_release_jbd_inode(EXT4_JOURNAL(inode), |
903 | &EXT4_I(inode)->jinode); | 907 | EXT4_I(inode)->jinode); |
908 | jbd2_free_inode(EXT4_I(inode)->jinode); | ||
909 | EXT4_I(inode)->jinode = NULL; | ||
910 | } | ||
904 | } | 911 | } |
905 | 912 | ||
906 | static inline void ext4_show_quota_options(struct seq_file *seq, | 913 | static inline void ext4_show_quota_options(struct seq_file *seq, |
@@ -1393,7 +1400,7 @@ static int set_qf_name(struct super_block *sb, int qtype, substring_t *args) | |||
1393 | sbi->s_qf_names[qtype] = NULL; | 1400 | sbi->s_qf_names[qtype] = NULL; |
1394 | return 0; | 1401 | return 0; |
1395 | } | 1402 | } |
1396 | set_opt(sbi->s_mount_opt, QUOTA); | 1403 | set_opt(sb, QUOTA); |
1397 | return 1; | 1404 | return 1; |
1398 | } | 1405 | } |
1399 | 1406 | ||
@@ -1448,21 +1455,21 @@ static int parse_options(char *options, struct super_block *sb, | |||
1448 | switch (token) { | 1455 | switch (token) { |
1449 | case Opt_bsd_df: | 1456 | case Opt_bsd_df: |
1450 | ext4_msg(sb, KERN_WARNING, deprecated_msg, p, "2.6.38"); | 1457 | ext4_msg(sb, KERN_WARNING, deprecated_msg, p, "2.6.38"); |
1451 | clear_opt(sbi->s_mount_opt, MINIX_DF); | 1458 | clear_opt(sb, MINIX_DF); |
1452 | break; | 1459 | break; |
1453 | case Opt_minix_df: | 1460 | case Opt_minix_df: |
1454 | ext4_msg(sb, KERN_WARNING, deprecated_msg, p, "2.6.38"); | 1461 | ext4_msg(sb, KERN_WARNING, deprecated_msg, p, "2.6.38"); |
1455 | set_opt(sbi->s_mount_opt, MINIX_DF); | 1462 | set_opt(sb, MINIX_DF); |
1456 | 1463 | ||
1457 | break; | 1464 | break; |
1458 | case Opt_grpid: | 1465 | case Opt_grpid: |
1459 | ext4_msg(sb, KERN_WARNING, deprecated_msg, p, "2.6.38"); | 1466 | ext4_msg(sb, KERN_WARNING, deprecated_msg, p, "2.6.38"); |
1460 | set_opt(sbi->s_mount_opt, GRPID); | 1467 | set_opt(sb, GRPID); |
1461 | 1468 | ||
1462 | break; | 1469 | break; |
1463 | case Opt_nogrpid: | 1470 | case Opt_nogrpid: |
1464 | ext4_msg(sb, KERN_WARNING, deprecated_msg, p, "2.6.38"); | 1471 | ext4_msg(sb, KERN_WARNING, deprecated_msg, p, "2.6.38"); |
1465 | clear_opt(sbi->s_mount_opt, GRPID); | 1472 | clear_opt(sb, GRPID); |
1466 | 1473 | ||
1467 | break; | 1474 | break; |
1468 | case Opt_resuid: | 1475 | case Opt_resuid: |
@@ -1480,38 +1487,38 @@ static int parse_options(char *options, struct super_block *sb, | |||
1480 | /* *sb_block = match_int(&args[0]); */ | 1487 | /* *sb_block = match_int(&args[0]); */ |
1481 | break; | 1488 | break; |
1482 | case Opt_err_panic: | 1489 | case Opt_err_panic: |
1483 | clear_opt(sbi->s_mount_opt, ERRORS_CONT); | 1490 | clear_opt(sb, ERRORS_CONT); |
1484 | clear_opt(sbi->s_mount_opt, ERRORS_RO); | 1491 | clear_opt(sb, ERRORS_RO); |
1485 | set_opt(sbi->s_mount_opt, ERRORS_PANIC); | 1492 | set_opt(sb, ERRORS_PANIC); |
1486 | break; | 1493 | break; |
1487 | case Opt_err_ro: | 1494 | case Opt_err_ro: |
1488 | clear_opt(sbi->s_mount_opt, ERRORS_CONT); | 1495 | clear_opt(sb, ERRORS_CONT); |
1489 | clear_opt(sbi->s_mount_opt, ERRORS_PANIC); | 1496 | clear_opt(sb, ERRORS_PANIC); |
1490 | set_opt(sbi->s_mount_opt, ERRORS_RO); | 1497 | set_opt(sb, ERRORS_RO); |
1491 | break; | 1498 | break; |
1492 | case Opt_err_cont: | 1499 | case Opt_err_cont: |
1493 | clear_opt(sbi->s_mount_opt, ERRORS_RO); | 1500 | clear_opt(sb, ERRORS_RO); |
1494 | clear_opt(sbi->s_mount_opt, ERRORS_PANIC); | 1501 | clear_opt(sb, ERRORS_PANIC); |
1495 | set_opt(sbi->s_mount_opt, ERRORS_CONT); | 1502 | set_opt(sb, ERRORS_CONT); |
1496 | break; | 1503 | break; |
1497 | case Opt_nouid32: | 1504 | case Opt_nouid32: |
1498 | set_opt(sbi->s_mount_opt, NO_UID32); | 1505 | set_opt(sb, NO_UID32); |
1499 | break; | 1506 | break; |
1500 | case Opt_debug: | 1507 | case Opt_debug: |
1501 | set_opt(sbi->s_mount_opt, DEBUG); | 1508 | set_opt(sb, DEBUG); |
1502 | break; | 1509 | break; |
1503 | case Opt_oldalloc: | 1510 | case Opt_oldalloc: |
1504 | set_opt(sbi->s_mount_opt, OLDALLOC); | 1511 | set_opt(sb, OLDALLOC); |
1505 | break; | 1512 | break; |
1506 | case Opt_orlov: | 1513 | case Opt_orlov: |
1507 | clear_opt(sbi->s_mount_opt, OLDALLOC); | 1514 | clear_opt(sb, OLDALLOC); |
1508 | break; | 1515 | break; |
1509 | #ifdef CONFIG_EXT4_FS_XATTR | 1516 | #ifdef CONFIG_EXT4_FS_XATTR |
1510 | case Opt_user_xattr: | 1517 | case Opt_user_xattr: |
1511 | set_opt(sbi->s_mount_opt, XATTR_USER); | 1518 | set_opt(sb, XATTR_USER); |
1512 | break; | 1519 | break; |
1513 | case Opt_nouser_xattr: | 1520 | case Opt_nouser_xattr: |
1514 | clear_opt(sbi->s_mount_opt, XATTR_USER); | 1521 | clear_opt(sb, XATTR_USER); |
1515 | break; | 1522 | break; |
1516 | #else | 1523 | #else |
1517 | case Opt_user_xattr: | 1524 | case Opt_user_xattr: |
@@ -1521,10 +1528,10 @@ static int parse_options(char *options, struct super_block *sb, | |||
1521 | #endif | 1528 | #endif |
1522 | #ifdef CONFIG_EXT4_FS_POSIX_ACL | 1529 | #ifdef CONFIG_EXT4_FS_POSIX_ACL |
1523 | case Opt_acl: | 1530 | case Opt_acl: |
1524 | set_opt(sbi->s_mount_opt, POSIX_ACL); | 1531 | set_opt(sb, POSIX_ACL); |
1525 | break; | 1532 | break; |
1526 | case Opt_noacl: | 1533 | case Opt_noacl: |
1527 | clear_opt(sbi->s_mount_opt, POSIX_ACL); | 1534 | clear_opt(sb, POSIX_ACL); |
1528 | break; | 1535 | break; |
1529 | #else | 1536 | #else |
1530 | case Opt_acl: | 1537 | case Opt_acl: |
@@ -1543,7 +1550,7 @@ static int parse_options(char *options, struct super_block *sb, | |||
1543 | "Cannot specify journal on remount"); | 1550 | "Cannot specify journal on remount"); |
1544 | return 0; | 1551 | return 0; |
1545 | } | 1552 | } |
1546 | set_opt(sbi->s_mount_opt, UPDATE_JOURNAL); | 1553 | set_opt(sb, UPDATE_JOURNAL); |
1547 | break; | 1554 | break; |
1548 | case Opt_journal_dev: | 1555 | case Opt_journal_dev: |
1549 | if (is_remount) { | 1556 | if (is_remount) { |
@@ -1556,14 +1563,14 @@ static int parse_options(char *options, struct super_block *sb, | |||
1556 | *journal_devnum = option; | 1563 | *journal_devnum = option; |
1557 | break; | 1564 | break; |
1558 | case Opt_journal_checksum: | 1565 | case Opt_journal_checksum: |
1559 | set_opt(sbi->s_mount_opt, JOURNAL_CHECKSUM); | 1566 | set_opt(sb, JOURNAL_CHECKSUM); |
1560 | break; | 1567 | break; |
1561 | case Opt_journal_async_commit: | 1568 | case Opt_journal_async_commit: |
1562 | set_opt(sbi->s_mount_opt, JOURNAL_ASYNC_COMMIT); | 1569 | set_opt(sb, JOURNAL_ASYNC_COMMIT); |
1563 | set_opt(sbi->s_mount_opt, JOURNAL_CHECKSUM); | 1570 | set_opt(sb, JOURNAL_CHECKSUM); |
1564 | break; | 1571 | break; |
1565 | case Opt_noload: | 1572 | case Opt_noload: |
1566 | set_opt(sbi->s_mount_opt, NOLOAD); | 1573 | set_opt(sb, NOLOAD); |
1567 | break; | 1574 | break; |
1568 | case Opt_commit: | 1575 | case Opt_commit: |
1569 | if (match_int(&args[0], &option)) | 1576 | if (match_int(&args[0], &option)) |
@@ -1606,15 +1613,15 @@ static int parse_options(char *options, struct super_block *sb, | |||
1606 | return 0; | 1613 | return 0; |
1607 | } | 1614 | } |
1608 | } else { | 1615 | } else { |
1609 | clear_opt(sbi->s_mount_opt, DATA_FLAGS); | 1616 | clear_opt(sb, DATA_FLAGS); |
1610 | sbi->s_mount_opt |= data_opt; | 1617 | sbi->s_mount_opt |= data_opt; |
1611 | } | 1618 | } |
1612 | break; | 1619 | break; |
1613 | case Opt_data_err_abort: | 1620 | case Opt_data_err_abort: |
1614 | set_opt(sbi->s_mount_opt, DATA_ERR_ABORT); | 1621 | set_opt(sb, DATA_ERR_ABORT); |
1615 | break; | 1622 | break; |
1616 | case Opt_data_err_ignore: | 1623 | case Opt_data_err_ignore: |
1617 | clear_opt(sbi->s_mount_opt, DATA_ERR_ABORT); | 1624 | clear_opt(sb, DATA_ERR_ABORT); |
1618 | break; | 1625 | break; |
1619 | #ifdef CONFIG_QUOTA | 1626 | #ifdef CONFIG_QUOTA |
1620 | case Opt_usrjquota: | 1627 | case Opt_usrjquota: |
@@ -1654,12 +1661,12 @@ set_qf_format: | |||
1654 | break; | 1661 | break; |
1655 | case Opt_quota: | 1662 | case Opt_quota: |
1656 | case Opt_usrquota: | 1663 | case Opt_usrquota: |
1657 | set_opt(sbi->s_mount_opt, QUOTA); | 1664 | set_opt(sb, QUOTA); |
1658 | set_opt(sbi->s_mount_opt, USRQUOTA); | 1665 | set_opt(sb, USRQUOTA); |
1659 | break; | 1666 | break; |
1660 | case Opt_grpquota: | 1667 | case Opt_grpquota: |
1661 | set_opt(sbi->s_mount_opt, QUOTA); | 1668 | set_opt(sb, QUOTA); |
1662 | set_opt(sbi->s_mount_opt, GRPQUOTA); | 1669 | set_opt(sb, GRPQUOTA); |
1663 | break; | 1670 | break; |
1664 | case Opt_noquota: | 1671 | case Opt_noquota: |
1665 | if (sb_any_quota_loaded(sb)) { | 1672 | if (sb_any_quota_loaded(sb)) { |
@@ -1667,9 +1674,9 @@ set_qf_format: | |||
1667 | "options when quota turned on"); | 1674 | "options when quota turned on"); |
1668 | return 0; | 1675 | return 0; |
1669 | } | 1676 | } |
1670 | clear_opt(sbi->s_mount_opt, QUOTA); | 1677 | clear_opt(sb, QUOTA); |
1671 | clear_opt(sbi->s_mount_opt, USRQUOTA); | 1678 | clear_opt(sb, USRQUOTA); |
1672 | clear_opt(sbi->s_mount_opt, GRPQUOTA); | 1679 | clear_opt(sb, GRPQUOTA); |
1673 | break; | 1680 | break; |
1674 | #else | 1681 | #else |
1675 | case Opt_quota: | 1682 | case Opt_quota: |
@@ -1695,7 +1702,7 @@ set_qf_format: | |||
1695 | sbi->s_mount_flags |= EXT4_MF_FS_ABORTED; | 1702 | sbi->s_mount_flags |= EXT4_MF_FS_ABORTED; |
1696 | break; | 1703 | break; |
1697 | case Opt_nobarrier: | 1704 | case Opt_nobarrier: |
1698 | clear_opt(sbi->s_mount_opt, BARRIER); | 1705 | clear_opt(sb, BARRIER); |
1699 | break; | 1706 | break; |
1700 | case Opt_barrier: | 1707 | case Opt_barrier: |
1701 | if (args[0].from) { | 1708 | if (args[0].from) { |
@@ -1704,9 +1711,9 @@ set_qf_format: | |||
1704 | } else | 1711 | } else |
1705 | option = 1; /* No argument, default to 1 */ | 1712 | option = 1; /* No argument, default to 1 */ |
1706 | if (option) | 1713 | if (option) |
1707 | set_opt(sbi->s_mount_opt, BARRIER); | 1714 | set_opt(sb, BARRIER); |
1708 | else | 1715 | else |
1709 | clear_opt(sbi->s_mount_opt, BARRIER); | 1716 | clear_opt(sb, BARRIER); |
1710 | break; | 1717 | break; |
1711 | case Opt_ignore: | 1718 | case Opt_ignore: |
1712 | break; | 1719 | break; |
@@ -1730,17 +1737,17 @@ set_qf_format: | |||
1730 | "Ignoring deprecated bh option"); | 1737 | "Ignoring deprecated bh option"); |
1731 | break; | 1738 | break; |
1732 | case Opt_i_version: | 1739 | case Opt_i_version: |
1733 | set_opt(sbi->s_mount_opt, I_VERSION); | 1740 | set_opt(sb, I_VERSION); |
1734 | sb->s_flags |= MS_I_VERSION; | 1741 | sb->s_flags |= MS_I_VERSION; |
1735 | break; | 1742 | break; |
1736 | case Opt_nodelalloc: | 1743 | case Opt_nodelalloc: |
1737 | clear_opt(sbi->s_mount_opt, DELALLOC); | 1744 | clear_opt(sb, DELALLOC); |
1738 | break; | 1745 | break; |
1739 | case Opt_mblk_io_submit: | 1746 | case Opt_mblk_io_submit: |
1740 | set_opt(sbi->s_mount_opt, MBLK_IO_SUBMIT); | 1747 | set_opt(sb, MBLK_IO_SUBMIT); |
1741 | break; | 1748 | break; |
1742 | case Opt_nomblk_io_submit: | 1749 | case Opt_nomblk_io_submit: |
1743 | clear_opt(sbi->s_mount_opt, MBLK_IO_SUBMIT); | 1750 | clear_opt(sb, MBLK_IO_SUBMIT); |
1744 | break; | 1751 | break; |
1745 | case Opt_stripe: | 1752 | case Opt_stripe: |
1746 | if (match_int(&args[0], &option)) | 1753 | if (match_int(&args[0], &option)) |
@@ -1750,13 +1757,13 @@ set_qf_format: | |||
1750 | sbi->s_stripe = option; | 1757 | sbi->s_stripe = option; |
1751 | break; | 1758 | break; |
1752 | case Opt_delalloc: | 1759 | case Opt_delalloc: |
1753 | set_opt(sbi->s_mount_opt, DELALLOC); | 1760 | set_opt(sb, DELALLOC); |
1754 | break; | 1761 | break; |
1755 | case Opt_block_validity: | 1762 | case Opt_block_validity: |
1756 | set_opt(sbi->s_mount_opt, BLOCK_VALIDITY); | 1763 | set_opt(sb, BLOCK_VALIDITY); |
1757 | break; | 1764 | break; |
1758 | case Opt_noblock_validity: | 1765 | case Opt_noblock_validity: |
1759 | clear_opt(sbi->s_mount_opt, BLOCK_VALIDITY); | 1766 | clear_opt(sb, BLOCK_VALIDITY); |
1760 | break; | 1767 | break; |
1761 | case Opt_inode_readahead_blks: | 1768 | case Opt_inode_readahead_blks: |
1762 | if (match_int(&args[0], &option)) | 1769 | if (match_int(&args[0], &option)) |
@@ -1780,7 +1787,7 @@ set_qf_format: | |||
1780 | option); | 1787 | option); |
1781 | break; | 1788 | break; |
1782 | case Opt_noauto_da_alloc: | 1789 | case Opt_noauto_da_alloc: |
1783 | set_opt(sbi->s_mount_opt,NO_AUTO_DA_ALLOC); | 1790 | set_opt(sb, NO_AUTO_DA_ALLOC); |
1784 | break; | 1791 | break; |
1785 | case Opt_auto_da_alloc: | 1792 | case Opt_auto_da_alloc: |
1786 | if (args[0].from) { | 1793 | if (args[0].from) { |
@@ -1789,24 +1796,24 @@ set_qf_format: | |||
1789 | } else | 1796 | } else |
1790 | option = 1; /* No argument, default to 1 */ | 1797 | option = 1; /* No argument, default to 1 */ |
1791 | if (option) | 1798 | if (option) |
1792 | clear_opt(sbi->s_mount_opt, NO_AUTO_DA_ALLOC); | 1799 | clear_opt(sb, NO_AUTO_DA_ALLOC); |
1793 | else | 1800 | else |
1794 | set_opt(sbi->s_mount_opt,NO_AUTO_DA_ALLOC); | 1801 | set_opt(sb,NO_AUTO_DA_ALLOC); |
1795 | break; | 1802 | break; |
1796 | case Opt_discard: | 1803 | case Opt_discard: |
1797 | set_opt(sbi->s_mount_opt, DISCARD); | 1804 | set_opt(sb, DISCARD); |
1798 | break; | 1805 | break; |
1799 | case Opt_nodiscard: | 1806 | case Opt_nodiscard: |
1800 | clear_opt(sbi->s_mount_opt, DISCARD); | 1807 | clear_opt(sb, DISCARD); |
1801 | break; | 1808 | break; |
1802 | case Opt_dioread_nolock: | 1809 | case Opt_dioread_nolock: |
1803 | set_opt(sbi->s_mount_opt, DIOREAD_NOLOCK); | 1810 | set_opt(sb, DIOREAD_NOLOCK); |
1804 | break; | 1811 | break; |
1805 | case Opt_dioread_lock: | 1812 | case Opt_dioread_lock: |
1806 | clear_opt(sbi->s_mount_opt, DIOREAD_NOLOCK); | 1813 | clear_opt(sb, DIOREAD_NOLOCK); |
1807 | break; | 1814 | break; |
1808 | case Opt_init_inode_table: | 1815 | case Opt_init_inode_table: |
1809 | set_opt(sbi->s_mount_opt, INIT_INODE_TABLE); | 1816 | set_opt(sb, INIT_INODE_TABLE); |
1810 | if (args[0].from) { | 1817 | if (args[0].from) { |
1811 | if (match_int(&args[0], &option)) | 1818 | if (match_int(&args[0], &option)) |
1812 | return 0; | 1819 | return 0; |
@@ -1817,7 +1824,7 @@ set_qf_format: | |||
1817 | sbi->s_li_wait_mult = option; | 1824 | sbi->s_li_wait_mult = option; |
1818 | break; | 1825 | break; |
1819 | case Opt_noinit_inode_table: | 1826 | case Opt_noinit_inode_table: |
1820 | clear_opt(sbi->s_mount_opt, INIT_INODE_TABLE); | 1827 | clear_opt(sb, INIT_INODE_TABLE); |
1821 | break; | 1828 | break; |
1822 | default: | 1829 | default: |
1823 | ext4_msg(sb, KERN_ERR, | 1830 | ext4_msg(sb, KERN_ERR, |
@@ -1829,10 +1836,10 @@ set_qf_format: | |||
1829 | #ifdef CONFIG_QUOTA | 1836 | #ifdef CONFIG_QUOTA |
1830 | if (sbi->s_qf_names[USRQUOTA] || sbi->s_qf_names[GRPQUOTA]) { | 1837 | if (sbi->s_qf_names[USRQUOTA] || sbi->s_qf_names[GRPQUOTA]) { |
1831 | if (test_opt(sb, USRQUOTA) && sbi->s_qf_names[USRQUOTA]) | 1838 | if (test_opt(sb, USRQUOTA) && sbi->s_qf_names[USRQUOTA]) |
1832 | clear_opt(sbi->s_mount_opt, USRQUOTA); | 1839 | clear_opt(sb, USRQUOTA); |
1833 | 1840 | ||
1834 | if (test_opt(sb, GRPQUOTA) && sbi->s_qf_names[GRPQUOTA]) | 1841 | if (test_opt(sb, GRPQUOTA) && sbi->s_qf_names[GRPQUOTA]) |
1835 | clear_opt(sbi->s_mount_opt, GRPQUOTA); | 1842 | clear_opt(sb, GRPQUOTA); |
1836 | 1843 | ||
1837 | if (test_opt(sb, GRPQUOTA) || test_opt(sb, USRQUOTA)) { | 1844 | if (test_opt(sb, GRPQUOTA) || test_opt(sb, USRQUOTA)) { |
1838 | ext4_msg(sb, KERN_ERR, "old and new quota " | 1845 | ext4_msg(sb, KERN_ERR, "old and new quota " |
@@ -1902,12 +1909,12 @@ static int ext4_setup_super(struct super_block *sb, struct ext4_super_block *es, | |||
1902 | ext4_commit_super(sb, 1); | 1909 | ext4_commit_super(sb, 1); |
1903 | if (test_opt(sb, DEBUG)) | 1910 | if (test_opt(sb, DEBUG)) |
1904 | printk(KERN_INFO "[EXT4 FS bs=%lu, gc=%u, " | 1911 | printk(KERN_INFO "[EXT4 FS bs=%lu, gc=%u, " |
1905 | "bpg=%lu, ipg=%lu, mo=%04x]\n", | 1912 | "bpg=%lu, ipg=%lu, mo=%04x, mo2=%04x]\n", |
1906 | sb->s_blocksize, | 1913 | sb->s_blocksize, |
1907 | sbi->s_groups_count, | 1914 | sbi->s_groups_count, |
1908 | EXT4_BLOCKS_PER_GROUP(sb), | 1915 | EXT4_BLOCKS_PER_GROUP(sb), |
1909 | EXT4_INODES_PER_GROUP(sb), | 1916 | EXT4_INODES_PER_GROUP(sb), |
1910 | sbi->s_mount_opt); | 1917 | sbi->s_mount_opt, sbi->s_mount_opt2); |
1911 | 1918 | ||
1912 | return res; | 1919 | return res; |
1913 | } | 1920 | } |
@@ -1937,14 +1944,13 @@ static int ext4_fill_flex_info(struct super_block *sb) | |||
1937 | size = flex_group_count * sizeof(struct flex_groups); | 1944 | size = flex_group_count * sizeof(struct flex_groups); |
1938 | sbi->s_flex_groups = kzalloc(size, GFP_KERNEL); | 1945 | sbi->s_flex_groups = kzalloc(size, GFP_KERNEL); |
1939 | if (sbi->s_flex_groups == NULL) { | 1946 | if (sbi->s_flex_groups == NULL) { |
1940 | sbi->s_flex_groups = vmalloc(size); | 1947 | sbi->s_flex_groups = vzalloc(size); |
1941 | if (sbi->s_flex_groups) | 1948 | if (sbi->s_flex_groups == NULL) { |
1942 | memset(sbi->s_flex_groups, 0, size); | 1949 | ext4_msg(sb, KERN_ERR, |
1943 | } | 1950 | "not enough memory for %u flex groups", |
1944 | if (sbi->s_flex_groups == NULL) { | 1951 | flex_group_count); |
1945 | ext4_msg(sb, KERN_ERR, "not enough memory for " | 1952 | goto failed; |
1946 | "%u flex groups", flex_group_count); | 1953 | } |
1947 | goto failed; | ||
1948 | } | 1954 | } |
1949 | 1955 | ||
1950 | for (i = 0; i < sbi->s_groups_count; i++) { | 1956 | for (i = 0; i < sbi->s_groups_count; i++) { |
@@ -2923,7 +2929,7 @@ static int ext4_register_li_request(struct super_block *sb, | |||
2923 | struct ext4_sb_info *sbi = EXT4_SB(sb); | 2929 | struct ext4_sb_info *sbi = EXT4_SB(sb); |
2924 | struct ext4_li_request *elr; | 2930 | struct ext4_li_request *elr; |
2925 | ext4_group_t ngroups = EXT4_SB(sb)->s_groups_count; | 2931 | ext4_group_t ngroups = EXT4_SB(sb)->s_groups_count; |
2926 | int ret; | 2932 | int ret = 0; |
2927 | 2933 | ||
2928 | if (sbi->s_li_request != NULL) | 2934 | if (sbi->s_li_request != NULL) |
2929 | return 0; | 2935 | return 0; |
@@ -3078,41 +3084,41 @@ static int ext4_fill_super(struct super_block *sb, void *data, int silent) | |||
3078 | 3084 | ||
3079 | /* Set defaults before we parse the mount options */ | 3085 | /* Set defaults before we parse the mount options */ |
3080 | def_mount_opts = le32_to_cpu(es->s_default_mount_opts); | 3086 | def_mount_opts = le32_to_cpu(es->s_default_mount_opts); |
3081 | set_opt(sbi->s_mount_opt, INIT_INODE_TABLE); | 3087 | set_opt(sb, INIT_INODE_TABLE); |
3082 | if (def_mount_opts & EXT4_DEFM_DEBUG) | 3088 | if (def_mount_opts & EXT4_DEFM_DEBUG) |
3083 | set_opt(sbi->s_mount_opt, DEBUG); | 3089 | set_opt(sb, DEBUG); |
3084 | if (def_mount_opts & EXT4_DEFM_BSDGROUPS) { | 3090 | if (def_mount_opts & EXT4_DEFM_BSDGROUPS) { |
3085 | ext4_msg(sb, KERN_WARNING, deprecated_msg, "bsdgroups", | 3091 | ext4_msg(sb, KERN_WARNING, deprecated_msg, "bsdgroups", |
3086 | "2.6.38"); | 3092 | "2.6.38"); |
3087 | set_opt(sbi->s_mount_opt, GRPID); | 3093 | set_opt(sb, GRPID); |
3088 | } | 3094 | } |
3089 | if (def_mount_opts & EXT4_DEFM_UID16) | 3095 | if (def_mount_opts & EXT4_DEFM_UID16) |
3090 | set_opt(sbi->s_mount_opt, NO_UID32); | 3096 | set_opt(sb, NO_UID32); |
3091 | #ifdef CONFIG_EXT4_FS_XATTR | 3097 | #ifdef CONFIG_EXT4_FS_XATTR |
3092 | if (def_mount_opts & EXT4_DEFM_XATTR_USER) | 3098 | if (def_mount_opts & EXT4_DEFM_XATTR_USER) |
3093 | set_opt(sbi->s_mount_opt, XATTR_USER); | 3099 | set_opt(sb, XATTR_USER); |
3094 | #endif | 3100 | #endif |
3095 | #ifdef CONFIG_EXT4_FS_POSIX_ACL | 3101 | #ifdef CONFIG_EXT4_FS_POSIX_ACL |
3096 | if (def_mount_opts & EXT4_DEFM_ACL) | 3102 | if (def_mount_opts & EXT4_DEFM_ACL) |
3097 | set_opt(sbi->s_mount_opt, POSIX_ACL); | 3103 | set_opt(sb, POSIX_ACL); |
3098 | #endif | 3104 | #endif |
3099 | if ((def_mount_opts & EXT4_DEFM_JMODE) == EXT4_DEFM_JMODE_DATA) | 3105 | if ((def_mount_opts & EXT4_DEFM_JMODE) == EXT4_DEFM_JMODE_DATA) |
3100 | set_opt(sbi->s_mount_opt, JOURNAL_DATA); | 3106 | set_opt(sb, JOURNAL_DATA); |
3101 | 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) |
3102 | set_opt(sbi->s_mount_opt, ORDERED_DATA); | 3108 | set_opt(sb, ORDERED_DATA); |
3103 | 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) |
3104 | set_opt(sbi->s_mount_opt, WRITEBACK_DATA); | 3110 | set_opt(sb, WRITEBACK_DATA); |
3105 | 3111 | ||
3106 | 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) |
3107 | set_opt(sbi->s_mount_opt, ERRORS_PANIC); | 3113 | set_opt(sb, ERRORS_PANIC); |
3108 | 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) |
3109 | set_opt(sbi->s_mount_opt, ERRORS_CONT); | 3115 | set_opt(sb, ERRORS_CONT); |
3110 | else | 3116 | else |
3111 | set_opt(sbi->s_mount_opt, ERRORS_RO); | 3117 | set_opt(sb, ERRORS_RO); |
3112 | if (def_mount_opts & EXT4_DEFM_BLOCK_VALIDITY) | 3118 | if (def_mount_opts & EXT4_DEFM_BLOCK_VALIDITY) |
3113 | set_opt(sbi->s_mount_opt, BLOCK_VALIDITY); | 3119 | set_opt(sb, BLOCK_VALIDITY); |
3114 | if (def_mount_opts & EXT4_DEFM_DISCARD) | 3120 | if (def_mount_opts & EXT4_DEFM_DISCARD) |
3115 | set_opt(sbi->s_mount_opt, DISCARD); | 3121 | set_opt(sb, DISCARD); |
3116 | 3122 | ||
3117 | sbi->s_resuid = le16_to_cpu(es->s_def_resuid); | 3123 | sbi->s_resuid = le16_to_cpu(es->s_def_resuid); |
3118 | sbi->s_resgid = le16_to_cpu(es->s_def_resgid); | 3124 | sbi->s_resgid = le16_to_cpu(es->s_def_resgid); |
@@ -3121,7 +3127,7 @@ static int ext4_fill_super(struct super_block *sb, void *data, int silent) | |||
3121 | sbi->s_max_batch_time = EXT4_DEF_MAX_BATCH_TIME; | 3127 | sbi->s_max_batch_time = EXT4_DEF_MAX_BATCH_TIME; |
3122 | 3128 | ||
3123 | if ((def_mount_opts & EXT4_DEFM_NOBARRIER) == 0) | 3129 | if ((def_mount_opts & EXT4_DEFM_NOBARRIER) == 0) |
3124 | set_opt(sbi->s_mount_opt, BARRIER); | 3130 | set_opt(sb, BARRIER); |
3125 | 3131 | ||
3126 | /* | 3132 | /* |
3127 | * enable delayed allocation by default | 3133 | * enable delayed allocation by default |
@@ -3129,7 +3135,7 @@ static int ext4_fill_super(struct super_block *sb, void *data, int silent) | |||
3129 | */ | 3135 | */ |
3130 | if (!IS_EXT3_SB(sb) && | 3136 | if (!IS_EXT3_SB(sb) && |
3131 | ((def_mount_opts & EXT4_DEFM_NODELALLOC) == 0)) | 3137 | ((def_mount_opts & EXT4_DEFM_NODELALLOC) == 0)) |
3132 | set_opt(sbi->s_mount_opt, DELALLOC); | 3138 | set_opt(sb, DELALLOC); |
3133 | 3139 | ||
3134 | if (!parse_options((char *) sbi->s_es->s_mount_opts, sb, | 3140 | if (!parse_options((char *) sbi->s_es->s_mount_opts, sb, |
3135 | &journal_devnum, &journal_ioprio, NULL, 0)) { | 3141 | &journal_devnum, &journal_ioprio, NULL, 0)) { |
@@ -3432,8 +3438,8 @@ static int ext4_fill_super(struct super_block *sb, void *data, int silent) | |||
3432 | "suppressed and not mounted read-only"); | 3438 | "suppressed and not mounted read-only"); |
3433 | goto failed_mount_wq; | 3439 | goto failed_mount_wq; |
3434 | } else { | 3440 | } else { |
3435 | clear_opt(sbi->s_mount_opt, DATA_FLAGS); | 3441 | clear_opt(sb, DATA_FLAGS); |
3436 | set_opt(sbi->s_mount_opt, WRITEBACK_DATA); | 3442 | set_opt(sb, WRITEBACK_DATA); |
3437 | sbi->s_journal = NULL; | 3443 | sbi->s_journal = NULL; |
3438 | needs_recovery = 0; | 3444 | needs_recovery = 0; |
3439 | goto no_journal; | 3445 | goto no_journal; |
@@ -3471,9 +3477,9 @@ static int ext4_fill_super(struct super_block *sb, void *data, int silent) | |||
3471 | */ | 3477 | */ |
3472 | if (jbd2_journal_check_available_features | 3478 | if (jbd2_journal_check_available_features |
3473 | (sbi->s_journal, 0, 0, JBD2_FEATURE_INCOMPAT_REVOKE)) | 3479 | (sbi->s_journal, 0, 0, JBD2_FEATURE_INCOMPAT_REVOKE)) |
3474 | set_opt(sbi->s_mount_opt, ORDERED_DATA); | 3480 | set_opt(sb, ORDERED_DATA); |
3475 | else | 3481 | else |
3476 | set_opt(sbi->s_mount_opt, JOURNAL_DATA); | 3482 | set_opt(sb, JOURNAL_DATA); |
3477 | break; | 3483 | break; |
3478 | 3484 | ||
3479 | case EXT4_MOUNT_ORDERED_DATA: | 3485 | case EXT4_MOUNT_ORDERED_DATA: |
@@ -3563,18 +3569,18 @@ no_journal: | |||
3563 | (test_opt(sb, DATA_FLAGS) == EXT4_MOUNT_JOURNAL_DATA)) { | 3569 | (test_opt(sb, DATA_FLAGS) == EXT4_MOUNT_JOURNAL_DATA)) { |
3564 | ext4_msg(sb, KERN_WARNING, "Ignoring delalloc option - " | 3570 | ext4_msg(sb, KERN_WARNING, "Ignoring delalloc option - " |
3565 | "requested data journaling mode"); | 3571 | "requested data journaling mode"); |
3566 | clear_opt(sbi->s_mount_opt, DELALLOC); | 3572 | clear_opt(sb, DELALLOC); |
3567 | } | 3573 | } |
3568 | if (test_opt(sb, DIOREAD_NOLOCK)) { | 3574 | if (test_opt(sb, DIOREAD_NOLOCK)) { |
3569 | if (test_opt(sb, DATA_FLAGS) == EXT4_MOUNT_JOURNAL_DATA) { | 3575 | if (test_opt(sb, DATA_FLAGS) == EXT4_MOUNT_JOURNAL_DATA) { |
3570 | ext4_msg(sb, KERN_WARNING, "Ignoring dioread_nolock " | 3576 | ext4_msg(sb, KERN_WARNING, "Ignoring dioread_nolock " |
3571 | "option - requested data journaling mode"); | 3577 | "option - requested data journaling mode"); |
3572 | clear_opt(sbi->s_mount_opt, DIOREAD_NOLOCK); | 3578 | clear_opt(sb, DIOREAD_NOLOCK); |
3573 | } | 3579 | } |
3574 | if (sb->s_blocksize < PAGE_SIZE) { | 3580 | if (sb->s_blocksize < PAGE_SIZE) { |
3575 | ext4_msg(sb, KERN_WARNING, "Ignoring dioread_nolock " | 3581 | ext4_msg(sb, KERN_WARNING, "Ignoring dioread_nolock " |
3576 | "option - block size is too small"); | 3582 | "option - block size is too small"); |
3577 | clear_opt(sbi->s_mount_opt, DIOREAD_NOLOCK); | 3583 | clear_opt(sb, DIOREAD_NOLOCK); |
3578 | } | 3584 | } |
3579 | } | 3585 | } |
3580 | 3586 | ||
@@ -4173,6 +4179,22 @@ static int ext4_unfreeze(struct super_block *sb) | |||
4173 | return 0; | 4179 | return 0; |
4174 | } | 4180 | } |
4175 | 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 | |||
4176 | 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) |
4177 | { | 4199 | { |
4178 | struct ext4_super_block *es; | 4200 | struct ext4_super_block *es; |
@@ -4193,6 +4215,7 @@ static int ext4_remount(struct super_block *sb, int *flags, char *data) | |||
4193 | lock_super(sb); | 4215 | lock_super(sb); |
4194 | old_sb_flags = sb->s_flags; | 4216 | old_sb_flags = sb->s_flags; |
4195 | 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; | ||
4196 | old_opts.s_resuid = sbi->s_resuid; | 4219 | old_opts.s_resuid = sbi->s_resuid; |
4197 | old_opts.s_resgid = sbi->s_resgid; | 4220 | old_opts.s_resgid = sbi->s_resgid; |
4198 | old_opts.s_commit_interval = sbi->s_commit_interval; | 4221 | old_opts.s_commit_interval = sbi->s_commit_interval; |
@@ -4346,6 +4369,7 @@ static int ext4_remount(struct super_block *sb, int *flags, char *data) | |||
4346 | restore_opts: | 4369 | restore_opts: |
4347 | sb->s_flags = old_sb_flags; | 4370 | sb->s_flags = old_sb_flags; |
4348 | 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; | ||
4349 | sbi->s_resuid = old_opts.s_resuid; | 4373 | sbi->s_resuid = old_opts.s_resuid; |
4350 | sbi->s_resgid = old_opts.s_resgid; | 4374 | sbi->s_resgid = old_opts.s_resgid; |
4351 | sbi->s_commit_interval = old_opts.s_commit_interval; | 4375 | sbi->s_commit_interval = old_opts.s_commit_interval; |