diff options
Diffstat (limited to 'fs/btrfs/super.c')
| -rw-r--r-- | fs/btrfs/super.c | 74 |
1 files changed, 50 insertions, 24 deletions
diff --git a/fs/btrfs/super.c b/fs/btrfs/super.c index 83d6f9f9c220..915ac14c2064 100644 --- a/fs/btrfs/super.c +++ b/fs/btrfs/super.c | |||
| @@ -243,12 +243,18 @@ void __btrfs_abort_transaction(struct btrfs_trans_handle *trans, | |||
| 243 | struct btrfs_root *root, const char *function, | 243 | struct btrfs_root *root, const char *function, |
| 244 | unsigned int line, int errno) | 244 | unsigned int line, int errno) |
| 245 | { | 245 | { |
| 246 | WARN_ONCE(1, KERN_DEBUG "btrfs: Transaction aborted"); | 246 | WARN_ONCE(1, KERN_DEBUG "btrfs: Transaction aborted\n"); |
| 247 | trans->aborted = errno; | 247 | trans->aborted = errno; |
| 248 | /* Nothing used. The other threads that have joined this | 248 | /* Nothing used. The other threads that have joined this |
| 249 | * transaction may be able to continue. */ | 249 | * transaction may be able to continue. */ |
| 250 | if (!trans->blocks_used) { | 250 | if (!trans->blocks_used) { |
| 251 | btrfs_printk(root->fs_info, "Aborting unused transaction.\n"); | 251 | char nbuf[16]; |
| 252 | const char *errstr; | ||
| 253 | |||
| 254 | errstr = btrfs_decode_error(root->fs_info, errno, nbuf); | ||
| 255 | btrfs_printk(root->fs_info, | ||
| 256 | "%s:%d: Aborting unused transaction(%s).\n", | ||
| 257 | function, line, errstr); | ||
| 252 | return; | 258 | return; |
| 253 | } | 259 | } |
| 254 | trans->transaction->aborted = errno; | 260 | trans->transaction->aborted = errno; |
| @@ -407,7 +413,15 @@ int btrfs_parse_options(struct btrfs_root *root, char *options) | |||
| 407 | btrfs_set_opt(info->mount_opt, NODATASUM); | 413 | btrfs_set_opt(info->mount_opt, NODATASUM); |
| 408 | break; | 414 | break; |
| 409 | case Opt_nodatacow: | 415 | case Opt_nodatacow: |
| 410 | printk(KERN_INFO "btrfs: setting nodatacow\n"); | 416 | if (!btrfs_test_opt(root, COMPRESS) || |
| 417 | !btrfs_test_opt(root, FORCE_COMPRESS)) { | ||
| 418 | printk(KERN_INFO "btrfs: setting nodatacow, compression disabled\n"); | ||
| 419 | } else { | ||
| 420 | printk(KERN_INFO "btrfs: setting nodatacow\n"); | ||
| 421 | } | ||
| 422 | info->compress_type = BTRFS_COMPRESS_NONE; | ||
| 423 | btrfs_clear_opt(info->mount_opt, COMPRESS); | ||
| 424 | btrfs_clear_opt(info->mount_opt, FORCE_COMPRESS); | ||
| 411 | btrfs_set_opt(info->mount_opt, NODATACOW); | 425 | btrfs_set_opt(info->mount_opt, NODATACOW); |
| 412 | btrfs_set_opt(info->mount_opt, NODATASUM); | 426 | btrfs_set_opt(info->mount_opt, NODATASUM); |
| 413 | break; | 427 | break; |
| @@ -422,10 +436,14 @@ int btrfs_parse_options(struct btrfs_root *root, char *options) | |||
| 422 | compress_type = "zlib"; | 436 | compress_type = "zlib"; |
| 423 | info->compress_type = BTRFS_COMPRESS_ZLIB; | 437 | info->compress_type = BTRFS_COMPRESS_ZLIB; |
| 424 | btrfs_set_opt(info->mount_opt, COMPRESS); | 438 | btrfs_set_opt(info->mount_opt, COMPRESS); |
| 439 | btrfs_clear_opt(info->mount_opt, NODATACOW); | ||
| 440 | btrfs_clear_opt(info->mount_opt, NODATASUM); | ||
| 425 | } else if (strcmp(args[0].from, "lzo") == 0) { | 441 | } else if (strcmp(args[0].from, "lzo") == 0) { |
| 426 | compress_type = "lzo"; | 442 | compress_type = "lzo"; |
| 427 | info->compress_type = BTRFS_COMPRESS_LZO; | 443 | info->compress_type = BTRFS_COMPRESS_LZO; |
| 428 | btrfs_set_opt(info->mount_opt, COMPRESS); | 444 | btrfs_set_opt(info->mount_opt, COMPRESS); |
| 445 | btrfs_clear_opt(info->mount_opt, NODATACOW); | ||
| 446 | btrfs_clear_opt(info->mount_opt, NODATASUM); | ||
| 429 | btrfs_set_fs_incompat(info, COMPRESS_LZO); | 447 | btrfs_set_fs_incompat(info, COMPRESS_LZO); |
| 430 | } else if (strncmp(args[0].from, "no", 2) == 0) { | 448 | } else if (strncmp(args[0].from, "no", 2) == 0) { |
| 431 | compress_type = "no"; | 449 | compress_type = "no"; |
| @@ -543,11 +561,11 @@ int btrfs_parse_options(struct btrfs_root *root, char *options) | |||
| 543 | btrfs_set_opt(info->mount_opt, ENOSPC_DEBUG); | 561 | btrfs_set_opt(info->mount_opt, ENOSPC_DEBUG); |
| 544 | break; | 562 | break; |
| 545 | case Opt_defrag: | 563 | case Opt_defrag: |
| 546 | printk(KERN_INFO "btrfs: enabling auto defrag"); | 564 | printk(KERN_INFO "btrfs: enabling auto defrag\n"); |
| 547 | btrfs_set_opt(info->mount_opt, AUTO_DEFRAG); | 565 | btrfs_set_opt(info->mount_opt, AUTO_DEFRAG); |
| 548 | break; | 566 | break; |
| 549 | case Opt_recovery: | 567 | case Opt_recovery: |
| 550 | printk(KERN_INFO "btrfs: enabling auto recovery"); | 568 | printk(KERN_INFO "btrfs: enabling auto recovery\n"); |
| 551 | btrfs_set_opt(info->mount_opt, RECOVERY); | 569 | btrfs_set_opt(info->mount_opt, RECOVERY); |
| 552 | break; | 570 | break; |
| 553 | case Opt_skip_balance: | 571 | case Opt_skip_balance: |
| @@ -846,18 +864,15 @@ int btrfs_sync_fs(struct super_block *sb, int wait) | |||
| 846 | return 0; | 864 | return 0; |
| 847 | } | 865 | } |
| 848 | 866 | ||
| 849 | btrfs_wait_ordered_extents(root, 0, 0); | 867 | btrfs_wait_ordered_extents(root, 0); |
| 850 | |||
| 851 | spin_lock(&fs_info->trans_lock); | ||
| 852 | if (!fs_info->running_transaction) { | ||
| 853 | spin_unlock(&fs_info->trans_lock); | ||
| 854 | return 0; | ||
| 855 | } | ||
| 856 | spin_unlock(&fs_info->trans_lock); | ||
| 857 | 868 | ||
| 858 | trans = btrfs_join_transaction(root); | 869 | trans = btrfs_attach_transaction(root); |
| 859 | if (IS_ERR(trans)) | 870 | if (IS_ERR(trans)) { |
| 871 | /* no transaction, don't bother */ | ||
| 872 | if (PTR_ERR(trans) == -ENOENT) | ||
| 873 | return 0; | ||
| 860 | return PTR_ERR(trans); | 874 | return PTR_ERR(trans); |
| 875 | } | ||
| 861 | return btrfs_commit_transaction(trans, root); | 876 | return btrfs_commit_transaction(trans, root); |
| 862 | } | 877 | } |
| 863 | 878 | ||
| @@ -1508,17 +1523,21 @@ static long btrfs_control_ioctl(struct file *file, unsigned int cmd, | |||
| 1508 | 1523 | ||
| 1509 | static int btrfs_freeze(struct super_block *sb) | 1524 | static int btrfs_freeze(struct super_block *sb) |
| 1510 | { | 1525 | { |
| 1511 | struct btrfs_fs_info *fs_info = btrfs_sb(sb); | 1526 | struct btrfs_trans_handle *trans; |
| 1512 | mutex_lock(&fs_info->transaction_kthread_mutex); | 1527 | struct btrfs_root *root = btrfs_sb(sb)->tree_root; |
| 1513 | mutex_lock(&fs_info->cleaner_mutex); | 1528 | |
| 1514 | return 0; | 1529 | trans = btrfs_attach_transaction(root); |
| 1530 | if (IS_ERR(trans)) { | ||
| 1531 | /* no transaction, don't bother */ | ||
| 1532 | if (PTR_ERR(trans) == -ENOENT) | ||
| 1533 | return 0; | ||
| 1534 | return PTR_ERR(trans); | ||
| 1535 | } | ||
| 1536 | return btrfs_commit_transaction(trans, root); | ||
| 1515 | } | 1537 | } |
| 1516 | 1538 | ||
| 1517 | static int btrfs_unfreeze(struct super_block *sb) | 1539 | static int btrfs_unfreeze(struct super_block *sb) |
| 1518 | { | 1540 | { |
| 1519 | struct btrfs_fs_info *fs_info = btrfs_sb(sb); | ||
| 1520 | mutex_unlock(&fs_info->cleaner_mutex); | ||
| 1521 | mutex_unlock(&fs_info->transaction_kthread_mutex); | ||
| 1522 | return 0; | 1541 | return 0; |
| 1523 | } | 1542 | } |
| 1524 | 1543 | ||
| @@ -1595,7 +1614,7 @@ static int btrfs_interface_init(void) | |||
| 1595 | static void btrfs_interface_exit(void) | 1614 | static void btrfs_interface_exit(void) |
| 1596 | { | 1615 | { |
| 1597 | if (misc_deregister(&btrfs_misc) < 0) | 1616 | if (misc_deregister(&btrfs_misc) < 0) |
| 1598 | printk(KERN_INFO "misc_deregister failed for control device"); | 1617 | printk(KERN_INFO "btrfs: misc_deregister failed for control device\n"); |
| 1599 | } | 1618 | } |
| 1600 | 1619 | ||
| 1601 | static int __init init_btrfs_fs(void) | 1620 | static int __init init_btrfs_fs(void) |
| @@ -1620,10 +1639,14 @@ static int __init init_btrfs_fs(void) | |||
| 1620 | if (err) | 1639 | if (err) |
| 1621 | goto free_extent_io; | 1640 | goto free_extent_io; |
| 1622 | 1641 | ||
| 1623 | err = btrfs_delayed_inode_init(); | 1642 | err = ordered_data_init(); |
| 1624 | if (err) | 1643 | if (err) |
| 1625 | goto free_extent_map; | 1644 | goto free_extent_map; |
| 1626 | 1645 | ||
| 1646 | err = btrfs_delayed_inode_init(); | ||
| 1647 | if (err) | ||
| 1648 | goto free_ordered_data; | ||
| 1649 | |||
| 1627 | err = btrfs_interface_init(); | 1650 | err = btrfs_interface_init(); |
| 1628 | if (err) | 1651 | if (err) |
| 1629 | goto free_delayed_inode; | 1652 | goto free_delayed_inode; |
| @@ -1641,6 +1664,8 @@ unregister_ioctl: | |||
| 1641 | btrfs_interface_exit(); | 1664 | btrfs_interface_exit(); |
| 1642 | free_delayed_inode: | 1665 | free_delayed_inode: |
| 1643 | btrfs_delayed_inode_exit(); | 1666 | btrfs_delayed_inode_exit(); |
| 1667 | free_ordered_data: | ||
| 1668 | ordered_data_exit(); | ||
| 1644 | free_extent_map: | 1669 | free_extent_map: |
| 1645 | extent_map_exit(); | 1670 | extent_map_exit(); |
| 1646 | free_extent_io: | 1671 | free_extent_io: |
| @@ -1657,6 +1682,7 @@ static void __exit exit_btrfs_fs(void) | |||
| 1657 | { | 1682 | { |
| 1658 | btrfs_destroy_cachep(); | 1683 | btrfs_destroy_cachep(); |
| 1659 | btrfs_delayed_inode_exit(); | 1684 | btrfs_delayed_inode_exit(); |
| 1685 | ordered_data_exit(); | ||
| 1660 | extent_map_exit(); | 1686 | extent_map_exit(); |
| 1661 | extent_io_exit(); | 1687 | extent_io_exit(); |
| 1662 | btrfs_interface_exit(); | 1688 | btrfs_interface_exit(); |
