diff options
Diffstat (limited to 'fs/btrfs/super.c')
-rw-r--r-- | fs/btrfs/super.c | 94 |
1 files changed, 62 insertions, 32 deletions
diff --git a/fs/btrfs/super.c b/fs/btrfs/super.c index 54bd91ece35b..60f7cbe815e9 100644 --- a/fs/btrfs/super.c +++ b/fs/btrfs/super.c | |||
@@ -262,7 +262,7 @@ void __btrfs_abort_transaction(struct btrfs_trans_handle *trans, | |||
262 | trans->aborted = errno; | 262 | trans->aborted = errno; |
263 | /* Nothing used. The other threads that have joined this | 263 | /* Nothing used. The other threads that have joined this |
264 | * transaction may be able to continue. */ | 264 | * transaction may be able to continue. */ |
265 | if (!trans->blocks_used) { | 265 | if (!trans->blocks_used && list_empty(&trans->new_bgs)) { |
266 | const char *errstr; | 266 | const char *errstr; |
267 | 267 | ||
268 | errstr = btrfs_decode_error(errno); | 268 | errstr = btrfs_decode_error(errno); |
@@ -642,11 +642,11 @@ int btrfs_parse_options(struct btrfs_root *root, char *options) | |||
642 | "disabling disk space caching"); | 642 | "disabling disk space caching"); |
643 | break; | 643 | break; |
644 | case Opt_inode_cache: | 644 | case Opt_inode_cache: |
645 | btrfs_set_and_info(root, CHANGE_INODE_CACHE, | 645 | btrfs_set_pending_and_info(info, INODE_MAP_CACHE, |
646 | "enabling inode map caching"); | 646 | "enabling inode map caching"); |
647 | break; | 647 | break; |
648 | case Opt_noinode_cache: | 648 | case Opt_noinode_cache: |
649 | btrfs_clear_and_info(root, CHANGE_INODE_CACHE, | 649 | btrfs_clear_pending_and_info(info, INODE_MAP_CACHE, |
650 | "disabling inode map caching"); | 650 | "disabling inode map caching"); |
651 | break; | 651 | break; |
652 | case Opt_clear_cache: | 652 | case Opt_clear_cache: |
@@ -993,9 +993,17 @@ int btrfs_sync_fs(struct super_block *sb, int wait) | |||
993 | trans = btrfs_attach_transaction_barrier(root); | 993 | trans = btrfs_attach_transaction_barrier(root); |
994 | if (IS_ERR(trans)) { | 994 | if (IS_ERR(trans)) { |
995 | /* no transaction, don't bother */ | 995 | /* no transaction, don't bother */ |
996 | if (PTR_ERR(trans) == -ENOENT) | 996 | if (PTR_ERR(trans) == -ENOENT) { |
997 | return 0; | 997 | /* |
998 | return PTR_ERR(trans); | 998 | * Exit unless we have some pending changes |
999 | * that need to go through commit | ||
1000 | */ | ||
1001 | if (fs_info->pending_changes == 0) | ||
1002 | return 0; | ||
1003 | trans = btrfs_start_transaction(root, 0); | ||
1004 | } else { | ||
1005 | return PTR_ERR(trans); | ||
1006 | } | ||
999 | } | 1007 | } |
1000 | return btrfs_commit_transaction(trans, root); | 1008 | return btrfs_commit_transaction(trans, root); |
1001 | } | 1009 | } |
@@ -1644,8 +1652,20 @@ static int btrfs_calc_avail_data_space(struct btrfs_root *root, u64 *free_bytes) | |||
1644 | int i = 0, nr_devices; | 1652 | int i = 0, nr_devices; |
1645 | int ret; | 1653 | int ret; |
1646 | 1654 | ||
1655 | /* | ||
1656 | * We aren't under the device list lock, so this is racey-ish, but good | ||
1657 | * enough for our purposes. | ||
1658 | */ | ||
1647 | nr_devices = fs_info->fs_devices->open_devices; | 1659 | nr_devices = fs_info->fs_devices->open_devices; |
1648 | BUG_ON(!nr_devices); | 1660 | if (!nr_devices) { |
1661 | smp_mb(); | ||
1662 | nr_devices = fs_info->fs_devices->open_devices; | ||
1663 | ASSERT(nr_devices); | ||
1664 | if (!nr_devices) { | ||
1665 | *free_bytes = 0; | ||
1666 | return 0; | ||
1667 | } | ||
1668 | } | ||
1649 | 1669 | ||
1650 | devices_info = kmalloc_array(nr_devices, sizeof(*devices_info), | 1670 | devices_info = kmalloc_array(nr_devices, sizeof(*devices_info), |
1651 | GFP_NOFS); | 1671 | GFP_NOFS); |
@@ -1670,11 +1690,17 @@ static int btrfs_calc_avail_data_space(struct btrfs_root *root, u64 *free_bytes) | |||
1670 | else | 1690 | else |
1671 | min_stripe_size = BTRFS_STRIPE_LEN; | 1691 | min_stripe_size = BTRFS_STRIPE_LEN; |
1672 | 1692 | ||
1673 | list_for_each_entry(device, &fs_devices->devices, dev_list) { | 1693 | if (fs_info->alloc_start) |
1694 | mutex_lock(&fs_devices->device_list_mutex); | ||
1695 | rcu_read_lock(); | ||
1696 | list_for_each_entry_rcu(device, &fs_devices->devices, dev_list) { | ||
1674 | if (!device->in_fs_metadata || !device->bdev || | 1697 | if (!device->in_fs_metadata || !device->bdev || |
1675 | device->is_tgtdev_for_dev_replace) | 1698 | device->is_tgtdev_for_dev_replace) |
1676 | continue; | 1699 | continue; |
1677 | 1700 | ||
1701 | if (i >= nr_devices) | ||
1702 | break; | ||
1703 | |||
1678 | avail_space = device->total_bytes - device->bytes_used; | 1704 | avail_space = device->total_bytes - device->bytes_used; |
1679 | 1705 | ||
1680 | /* align with stripe_len */ | 1706 | /* align with stripe_len */ |
@@ -1689,24 +1715,32 @@ static int btrfs_calc_avail_data_space(struct btrfs_root *root, u64 *free_bytes) | |||
1689 | skip_space = 1024 * 1024; | 1715 | skip_space = 1024 * 1024; |
1690 | 1716 | ||
1691 | /* user can set the offset in fs_info->alloc_start. */ | 1717 | /* user can set the offset in fs_info->alloc_start. */ |
1692 | if (fs_info->alloc_start + BTRFS_STRIPE_LEN <= | 1718 | if (fs_info->alloc_start && |
1693 | device->total_bytes) | 1719 | fs_info->alloc_start + BTRFS_STRIPE_LEN <= |
1720 | device->total_bytes) { | ||
1721 | rcu_read_unlock(); | ||
1694 | skip_space = max(fs_info->alloc_start, skip_space); | 1722 | skip_space = max(fs_info->alloc_start, skip_space); |
1695 | 1723 | ||
1696 | /* | 1724 | /* |
1697 | * btrfs can not use the free space in [0, skip_space - 1], | 1725 | * btrfs can not use the free space in |
1698 | * we must subtract it from the total. In order to implement | 1726 | * [0, skip_space - 1], we must subtract it from the |
1699 | * it, we account the used space in this range first. | 1727 | * total. In order to implement it, we account the used |
1700 | */ | 1728 | * space in this range first. |
1701 | ret = btrfs_account_dev_extents_size(device, 0, skip_space - 1, | 1729 | */ |
1702 | &used_space); | 1730 | ret = btrfs_account_dev_extents_size(device, 0, |
1703 | if (ret) { | 1731 | skip_space - 1, |
1704 | kfree(devices_info); | 1732 | &used_space); |
1705 | return ret; | 1733 | if (ret) { |
1706 | } | 1734 | kfree(devices_info); |
1735 | mutex_unlock(&fs_devices->device_list_mutex); | ||
1736 | return ret; | ||
1737 | } | ||
1707 | 1738 | ||
1708 | /* calc the free space in [0, skip_space - 1] */ | 1739 | rcu_read_lock(); |
1709 | skip_space -= used_space; | 1740 | |
1741 | /* calc the free space in [0, skip_space - 1] */ | ||
1742 | skip_space -= used_space; | ||
1743 | } | ||
1710 | 1744 | ||
1711 | /* | 1745 | /* |
1712 | * we can use the free space in [0, skip_space - 1], subtract | 1746 | * we can use the free space in [0, skip_space - 1], subtract |
@@ -1725,6 +1759,9 @@ static int btrfs_calc_avail_data_space(struct btrfs_root *root, u64 *free_bytes) | |||
1725 | 1759 | ||
1726 | i++; | 1760 | i++; |
1727 | } | 1761 | } |
1762 | rcu_read_unlock(); | ||
1763 | if (fs_info->alloc_start) | ||
1764 | mutex_unlock(&fs_devices->device_list_mutex); | ||
1728 | 1765 | ||
1729 | nr_devices = i; | 1766 | nr_devices = i; |
1730 | 1767 | ||
@@ -1787,8 +1824,6 @@ static int btrfs_statfs(struct dentry *dentry, struct kstatfs *buf) | |||
1787 | * holding chunk_muext to avoid allocating new chunks, holding | 1824 | * holding chunk_muext to avoid allocating new chunks, holding |
1788 | * device_list_mutex to avoid the device being removed | 1825 | * device_list_mutex to avoid the device being removed |
1789 | */ | 1826 | */ |
1790 | mutex_lock(&fs_info->fs_devices->device_list_mutex); | ||
1791 | mutex_lock(&fs_info->chunk_mutex); | ||
1792 | rcu_read_lock(); | 1827 | rcu_read_lock(); |
1793 | list_for_each_entry_rcu(found, head, list) { | 1828 | list_for_each_entry_rcu(found, head, list) { |
1794 | if (found->flags & BTRFS_BLOCK_GROUP_DATA) { | 1829 | if (found->flags & BTRFS_BLOCK_GROUP_DATA) { |
@@ -1824,17 +1859,12 @@ static int btrfs_statfs(struct dentry *dentry, struct kstatfs *buf) | |||
1824 | buf->f_bfree -= block_rsv->size >> bits; | 1859 | buf->f_bfree -= block_rsv->size >> bits; |
1825 | spin_unlock(&block_rsv->lock); | 1860 | spin_unlock(&block_rsv->lock); |
1826 | 1861 | ||
1827 | buf->f_bavail = total_free_data; | 1862 | buf->f_bavail = div_u64(total_free_data, factor); |
1828 | ret = btrfs_calc_avail_data_space(fs_info->tree_root, &total_free_data); | 1863 | ret = btrfs_calc_avail_data_space(fs_info->tree_root, &total_free_data); |
1829 | if (ret) { | 1864 | if (ret) |
1830 | mutex_unlock(&fs_info->chunk_mutex); | ||
1831 | mutex_unlock(&fs_info->fs_devices->device_list_mutex); | ||
1832 | return ret; | 1865 | return ret; |
1833 | } | ||
1834 | buf->f_bavail += div_u64(total_free_data, factor); | 1866 | buf->f_bavail += div_u64(total_free_data, factor); |
1835 | buf->f_bavail = buf->f_bavail >> bits; | 1867 | buf->f_bavail = buf->f_bavail >> bits; |
1836 | mutex_unlock(&fs_info->chunk_mutex); | ||
1837 | mutex_unlock(&fs_info->fs_devices->device_list_mutex); | ||
1838 | 1868 | ||
1839 | buf->f_type = BTRFS_SUPER_MAGIC; | 1869 | buf->f_type = BTRFS_SUPER_MAGIC; |
1840 | buf->f_bsize = dentry->d_sb->s_blocksize; | 1870 | buf->f_bsize = dentry->d_sb->s_blocksize; |