diff options
Diffstat (limited to 'fs/btrfs/file.c')
-rw-r--r-- | fs/btrfs/file.c | 51 |
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: | |||
1360 | fail: | 1360 | fail: |
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); |
1743 | out: | 1743 | out: |
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 | */ |
1906 | int btrfs_sync_file(struct file *file, loff_t start, loff_t end, int datasync) | 1906 | int 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 |