diff options
| -rw-r--r-- | fs/btrfs/file.c | 37 |
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; |
