aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--fs/btrfs/file.c37
1 files changed, 17 insertions, 20 deletions
diff --git a/fs/btrfs/file.c b/fs/btrfs/file.c
index 098bb8f690c9..cadfebaaf8c4 100644
--- a/fs/btrfs/file.c
+++ b/fs/btrfs/file.c
@@ -1525,27 +1525,24 @@ static noinline ssize_t __btrfs_buffered_write(struct file *file,
1525 1525
1526 reserve_bytes = num_pages << PAGE_CACHE_SHIFT; 1526 reserve_bytes = num_pages << PAGE_CACHE_SHIFT;
1527 1527
1528 if (BTRFS_I(inode)->flags & (BTRFS_INODE_NODATACOW | 1528 if ((BTRFS_I(inode)->flags & (BTRFS_INODE_NODATACOW |
1529 BTRFS_INODE_PREALLOC)) { 1529 BTRFS_INODE_PREALLOC)) &&
1530 ret = check_can_nocow(inode, pos, &write_bytes); 1530 check_can_nocow(inode, pos, &write_bytes) > 0) {
1531 if (ret < 0) 1531 /*
1532 break; 1532 * For nodata cow case, no need to reserve
1533 if (ret > 0) { 1533 * data space.
1534 /* 1534 */
1535 * For nodata cow case, no need to reserve 1535 only_release_metadata = true;
1536 * data space. 1536 /*
1537 */ 1537 * our prealloc extent may be smaller than
1538 only_release_metadata = true; 1538 * write_bytes, so scale down.
1539 /* 1539 */
1540 * our prealloc extent may be smaller than 1540 num_pages = DIV_ROUND_UP(write_bytes + offset,
1541 * write_bytes, so scale down. 1541 PAGE_CACHE_SIZE);
1542 */ 1542 reserve_bytes = num_pages << PAGE_CACHE_SHIFT;
1543 num_pages = DIV_ROUND_UP(write_bytes + offset, 1543 goto reserve_metadata;
1544 PAGE_CACHE_SIZE);
1545 reserve_bytes = num_pages << PAGE_CACHE_SHIFT;
1546 goto reserve_metadata;
1547 }
1548 } 1544 }
1545
1549 ret = btrfs_check_data_free_space(inode, pos, write_bytes); 1546 ret = btrfs_check_data_free_space(inode, pos, write_bytes);
1550 if (ret < 0) 1547 if (ret < 0)
1551 break; 1548 break;