diff options
| -rw-r--r-- | fs/btrfs/file.c | 44 |
1 files changed, 22 insertions, 22 deletions
diff --git a/fs/btrfs/file.c b/fs/btrfs/file.c index 159a93450e26..8a538abb597a 100644 --- a/fs/btrfs/file.c +++ b/fs/btrfs/file.c | |||
| @@ -1534,30 +1534,30 @@ static noinline ssize_t __btrfs_buffered_write(struct file *file, | |||
| 1534 | reserve_bytes = round_up(write_bytes + sector_offset, | 1534 | reserve_bytes = round_up(write_bytes + sector_offset, |
| 1535 | root->sectorsize); | 1535 | root->sectorsize); |
| 1536 | 1536 | ||
| 1537 | if ((BTRFS_I(inode)->flags & (BTRFS_INODE_NODATACOW | | ||
| 1538 | BTRFS_INODE_PREALLOC)) && | ||
| 1539 | check_can_nocow(inode, pos, &write_bytes) > 0) { | ||
| 1540 | /* | ||
| 1541 | * For nodata cow case, no need to reserve | ||
| 1542 | * data space. | ||
| 1543 | */ | ||
| 1544 | only_release_metadata = true; | ||
| 1545 | /* | ||
| 1546 | * our prealloc extent may be smaller than | ||
| 1547 | * write_bytes, so scale down. | ||
| 1548 | */ | ||
| 1549 | num_pages = DIV_ROUND_UP(write_bytes + offset, | ||
| 1550 | PAGE_SIZE); | ||
| 1551 | reserve_bytes = round_up(write_bytes + sector_offset, | ||
| 1552 | root->sectorsize); | ||
| 1553 | goto reserve_metadata; | ||
| 1554 | } | ||
| 1555 | |||
| 1556 | ret = btrfs_check_data_free_space(inode, pos, write_bytes); | 1537 | ret = btrfs_check_data_free_space(inode, pos, write_bytes); |
| 1557 | if (ret < 0) | 1538 | if (ret < 0) { |
| 1558 | break; | 1539 | if ((BTRFS_I(inode)->flags & (BTRFS_INODE_NODATACOW | |
| 1540 | BTRFS_INODE_PREALLOC)) && | ||
| 1541 | check_can_nocow(inode, pos, &write_bytes) > 0) { | ||
| 1542 | /* | ||
| 1543 | * For nodata cow case, no need to reserve | ||
| 1544 | * data space. | ||
| 1545 | */ | ||
| 1546 | only_release_metadata = true; | ||
| 1547 | /* | ||
| 1548 | * our prealloc extent may be smaller than | ||
| 1549 | * write_bytes, so scale down. | ||
| 1550 | */ | ||
| 1551 | num_pages = DIV_ROUND_UP(write_bytes + offset, | ||
| 1552 | PAGE_SIZE); | ||
| 1553 | reserve_bytes = round_up(write_bytes + | ||
| 1554 | sector_offset, | ||
| 1555 | root->sectorsize); | ||
| 1556 | } else { | ||
| 1557 | break; | ||
| 1558 | } | ||
| 1559 | } | ||
| 1559 | 1560 | ||
| 1560 | reserve_metadata: | ||
| 1561 | ret = btrfs_delalloc_reserve_metadata(inode, reserve_bytes); | 1561 | ret = btrfs_delalloc_reserve_metadata(inode, reserve_bytes); |
| 1562 | if (ret) { | 1562 | if (ret) { |
| 1563 | if (!only_release_metadata) | 1563 | if (!only_release_metadata) |
