aboutsummaryrefslogtreecommitdiffstats
path: root/fs/btrfs/file.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/btrfs/file.c')
-rw-r--r--fs/btrfs/file.c51
1 files changed, 27 insertions, 24 deletions
diff --git a/fs/btrfs/file.c b/fs/btrfs/file.c
index 15a09cb156ce..8d7b5a45c005 100644
--- a/fs/btrfs/file.c
+++ b/fs/btrfs/file.c
@@ -414,11 +414,11 @@ static noinline int btrfs_copy_from_user(loff_t pos, size_t write_bytes,
414 size_t copied = 0; 414 size_t copied = 0;
415 size_t total_copied = 0; 415 size_t total_copied = 0;
416 int pg = 0; 416 int pg = 0;
417 int offset = pos & (PAGE_CACHE_SIZE - 1); 417 int offset = pos & (PAGE_SIZE - 1);
418 418
419 while (write_bytes > 0) { 419 while (write_bytes > 0) {
420 size_t count = min_t(size_t, 420 size_t count = min_t(size_t,
421 PAGE_CACHE_SIZE - offset, write_bytes); 421 PAGE_SIZE - offset, write_bytes);
422 struct page *page = prepared_pages[pg]; 422 struct page *page = prepared_pages[pg];
423 /* 423 /*
424 * Copy data from userspace to the current page 424 * Copy data from userspace to the current page
@@ -448,7 +448,7 @@ static noinline int btrfs_copy_from_user(loff_t pos, size_t write_bytes,
448 if (unlikely(copied == 0)) 448 if (unlikely(copied == 0))
449 break; 449 break;
450 450
451 if (copied < PAGE_CACHE_SIZE - offset) { 451 if (copied < PAGE_SIZE - offset) {
452 offset += copied; 452 offset += copied;
453 } else { 453 } else {
454 pg++; 454 pg++;
@@ -473,7 +473,7 @@ static void btrfs_drop_pages(struct page **pages, size_t num_pages)
473 */ 473 */
474 ClearPageChecked(pages[i]); 474 ClearPageChecked(pages[i]);
475 unlock_page(pages[i]); 475 unlock_page(pages[i]);
476 page_cache_release(pages[i]); 476 put_page(pages[i]);
477 } 477 }
478} 478}
479 479
@@ -1297,7 +1297,7 @@ static int prepare_uptodate_page(struct inode *inode,
1297{ 1297{
1298 int ret = 0; 1298 int ret = 0;
1299 1299
1300 if (((pos & (PAGE_CACHE_SIZE - 1)) || force_uptodate) && 1300 if (((pos & (PAGE_SIZE - 1)) || force_uptodate) &&
1301 !PageUptodate(page)) { 1301 !PageUptodate(page)) {
1302 ret = btrfs_readpage(NULL, page); 1302 ret = btrfs_readpage(NULL, page);
1303 if (ret) 1303 if (ret)
@@ -1323,7 +1323,7 @@ static noinline int prepare_pages(struct inode *inode, struct page **pages,
1323 size_t write_bytes, bool force_uptodate) 1323 size_t write_bytes, bool force_uptodate)
1324{ 1324{
1325 int i; 1325 int i;
1326 unsigned long index = pos >> PAGE_CACHE_SHIFT; 1326 unsigned long index = pos >> PAGE_SHIFT;
1327 gfp_t mask = btrfs_alloc_write_mask(inode->i_mapping); 1327 gfp_t mask = btrfs_alloc_write_mask(inode->i_mapping);
1328 int err = 0; 1328 int err = 0;
1329 int faili; 1329 int faili;
@@ -1345,7 +1345,7 @@ again:
1345 err = prepare_uptodate_page(inode, pages[i], 1345 err = prepare_uptodate_page(inode, pages[i],
1346 pos + write_bytes, false); 1346 pos + write_bytes, false);
1347 if (err) { 1347 if (err) {
1348 page_cache_release(pages[i]); 1348 put_page(pages[i]);
1349 if (err == -EAGAIN) { 1349 if (err == -EAGAIN) {
1350 err = 0; 1350 err = 0;
1351 goto again; 1351 goto again;
@@ -1360,7 +1360,7 @@ again:
1360fail: 1360fail:
1361 while (faili >= 0) { 1361 while (faili >= 0) {
1362 unlock_page(pages[faili]); 1362 unlock_page(pages[faili]);
1363 page_cache_release(pages[faili]); 1363 put_page(pages[faili]);
1364 faili--; 1364 faili--;
1365 } 1365 }
1366 return err; 1366 return err;
@@ -1408,7 +1408,7 @@ lock_and_cleanup_extent_if_need(struct inode *inode, struct page **pages,
1408 cached_state, GFP_NOFS); 1408 cached_state, GFP_NOFS);
1409 for (i = 0; i < num_pages; i++) { 1409 for (i = 0; i < num_pages; i++) {
1410 unlock_page(pages[i]); 1410 unlock_page(pages[i]);
1411 page_cache_release(pages[i]); 1411 put_page(pages[i]);
1412 } 1412 }
1413 btrfs_start_ordered_extent(inode, ordered, 1); 1413 btrfs_start_ordered_extent(inode, ordered, 1);
1414 btrfs_put_ordered_extent(ordered); 1414 btrfs_put_ordered_extent(ordered);
@@ -1497,8 +1497,8 @@ static noinline ssize_t __btrfs_buffered_write(struct file *file,
1497 bool force_page_uptodate = false; 1497 bool force_page_uptodate = false;
1498 bool need_unlock; 1498 bool need_unlock;
1499 1499
1500 nrptrs = min(DIV_ROUND_UP(iov_iter_count(i), PAGE_CACHE_SIZE), 1500 nrptrs = min(DIV_ROUND_UP(iov_iter_count(i), PAGE_SIZE),
1501 PAGE_CACHE_SIZE / (sizeof(struct page *))); 1501 PAGE_SIZE / (sizeof(struct page *)));
1502 nrptrs = min(nrptrs, current->nr_dirtied_pause - current->nr_dirtied); 1502 nrptrs = min(nrptrs, current->nr_dirtied_pause - current->nr_dirtied);
1503 nrptrs = max(nrptrs, 8); 1503 nrptrs = max(nrptrs, 8);
1504 pages = kmalloc_array(nrptrs, sizeof(struct page *), GFP_KERNEL); 1504 pages = kmalloc_array(nrptrs, sizeof(struct page *), GFP_KERNEL);
@@ -1506,13 +1506,13 @@ static noinline ssize_t __btrfs_buffered_write(struct file *file,
1506 return -ENOMEM; 1506 return -ENOMEM;
1507 1507
1508 while (iov_iter_count(i) > 0) { 1508 while (iov_iter_count(i) > 0) {
1509 size_t offset = pos & (PAGE_CACHE_SIZE - 1); 1509 size_t offset = pos & (PAGE_SIZE - 1);
1510 size_t sector_offset; 1510 size_t sector_offset;
1511 size_t write_bytes = min(iov_iter_count(i), 1511 size_t write_bytes = min(iov_iter_count(i),
1512 nrptrs * (size_t)PAGE_CACHE_SIZE - 1512 nrptrs * (size_t)PAGE_SIZE -
1513 offset); 1513 offset);
1514 size_t num_pages = DIV_ROUND_UP(write_bytes + offset, 1514 size_t num_pages = DIV_ROUND_UP(write_bytes + offset,
1515 PAGE_CACHE_SIZE); 1515 PAGE_SIZE);
1516 size_t reserve_bytes; 1516 size_t reserve_bytes;
1517 size_t dirty_pages; 1517 size_t dirty_pages;
1518 size_t copied; 1518 size_t copied;
@@ -1547,7 +1547,7 @@ static noinline ssize_t __btrfs_buffered_write(struct file *file,
1547 * write_bytes, so scale down. 1547 * write_bytes, so scale down.
1548 */ 1548 */
1549 num_pages = DIV_ROUND_UP(write_bytes + offset, 1549 num_pages = DIV_ROUND_UP(write_bytes + offset,
1550 PAGE_CACHE_SIZE); 1550 PAGE_SIZE);
1551 reserve_bytes = round_up(write_bytes + sector_offset, 1551 reserve_bytes = round_up(write_bytes + sector_offset,
1552 root->sectorsize); 1552 root->sectorsize);
1553 goto reserve_metadata; 1553 goto reserve_metadata;
@@ -1609,7 +1609,7 @@ again:
1609 } else { 1609 } else {
1610 force_page_uptodate = false; 1610 force_page_uptodate = false;
1611 dirty_pages = DIV_ROUND_UP(copied + offset, 1611 dirty_pages = DIV_ROUND_UP(copied + offset,
1612 PAGE_CACHE_SIZE); 1612 PAGE_SIZE);
1613 } 1613 }
1614 1614
1615 /* 1615 /*
@@ -1641,7 +1641,7 @@ again:
1641 u64 __pos; 1641 u64 __pos;
1642 1642
1643 __pos = round_down(pos, root->sectorsize) + 1643 __pos = round_down(pos, root->sectorsize) +
1644 (dirty_pages << PAGE_CACHE_SHIFT); 1644 (dirty_pages << PAGE_SHIFT);
1645 btrfs_delalloc_release_space(inode, __pos, 1645 btrfs_delalloc_release_space(inode, __pos,
1646 release_bytes); 1646 release_bytes);
1647 } 1647 }
@@ -1682,7 +1682,7 @@ again:
1682 cond_resched(); 1682 cond_resched();
1683 1683
1684 balance_dirty_pages_ratelimited(inode->i_mapping); 1684 balance_dirty_pages_ratelimited(inode->i_mapping);
1685 if (dirty_pages < (root->nodesize >> PAGE_CACHE_SHIFT) + 1) 1685 if (dirty_pages < (root->nodesize >> PAGE_SHIFT) + 1)
1686 btrfs_btree_balance_dirty(root); 1686 btrfs_btree_balance_dirty(root);
1687 1687
1688 pos += copied; 1688 pos += copied;
@@ -1738,8 +1738,8 @@ static ssize_t __btrfs_direct_write(struct kiocb *iocb,
1738 goto out; 1738 goto out;
1739 written += written_buffered; 1739 written += written_buffered;
1740 iocb->ki_pos = pos + written_buffered; 1740 iocb->ki_pos = pos + written_buffered;
1741 invalidate_mapping_pages(file->f_mapping, pos >> PAGE_CACHE_SHIFT, 1741 invalidate_mapping_pages(file->f_mapping, pos >> PAGE_SHIFT,
1742 endbyte >> PAGE_CACHE_SHIFT); 1742 endbyte >> PAGE_SHIFT);
1743out: 1743out:
1744 return written ? written : err; 1744 return written ? written : err;
1745} 1745}
@@ -1905,7 +1905,7 @@ static int start_ordered_ops(struct inode *inode, loff_t start, loff_t end)
1905 */ 1905 */
1906int btrfs_sync_file(struct file *file, loff_t start, loff_t end, int datasync) 1906int btrfs_sync_file(struct file *file, loff_t start, loff_t end, int datasync)
1907{ 1907{
1908 struct dentry *dentry = file->f_path.dentry; 1908 struct dentry *dentry = file_dentry(file);
1909 struct inode *inode = d_inode(dentry); 1909 struct inode *inode = d_inode(dentry);
1910 struct btrfs_root *root = BTRFS_I(inode)->root; 1910 struct btrfs_root *root = BTRFS_I(inode)->root;
1911 struct btrfs_trans_handle *trans; 1911 struct btrfs_trans_handle *trans;
@@ -2682,9 +2682,12 @@ static long btrfs_fallocate(struct file *file, int mode,
2682 return ret; 2682 return ret;
2683 2683
2684 inode_lock(inode); 2684 inode_lock(inode);
2685 ret = inode_newsize_ok(inode, alloc_end); 2685
2686 if (ret) 2686 if (!(mode & FALLOC_FL_KEEP_SIZE) && offset + len > inode->i_size) {
2687 goto out; 2687 ret = inode_newsize_ok(inode, offset + len);
2688 if (ret)
2689 goto out;
2690 }
2688 2691
2689 /* 2692 /*
2690 * TODO: Move these two operations after we have checked 2693 * TODO: Move these two operations after we have checked