diff options
Diffstat (limited to 'fs/btrfs/file.c')
-rw-r--r-- | fs/btrfs/file.c | 21 |
1 files changed, 9 insertions, 12 deletions
diff --git a/fs/btrfs/file.c b/fs/btrfs/file.c index c660527af838..eb742c07e7a4 100644 --- a/fs/btrfs/file.c +++ b/fs/btrfs/file.c | |||
@@ -425,13 +425,8 @@ static noinline int btrfs_copy_from_user(loff_t pos, int num_pages, | |||
425 | struct page *page = prepared_pages[pg]; | 425 | struct page *page = prepared_pages[pg]; |
426 | /* | 426 | /* |
427 | * Copy data from userspace to the current page | 427 | * Copy data from userspace to the current page |
428 | * | ||
429 | * Disable pagefault to avoid recursive lock since | ||
430 | * the pages are already locked | ||
431 | */ | 428 | */ |
432 | pagefault_disable(); | ||
433 | copied = iov_iter_copy_from_user_atomic(page, i, offset, count); | 429 | copied = iov_iter_copy_from_user_atomic(page, i, offset, count); |
434 | pagefault_enable(); | ||
435 | 430 | ||
436 | /* Flush processor's dcache for this page */ | 431 | /* Flush processor's dcache for this page */ |
437 | flush_dcache_page(page); | 432 | flush_dcache_page(page); |
@@ -1665,7 +1660,7 @@ again: | |||
1665 | static ssize_t __btrfs_direct_write(struct kiocb *iocb, | 1660 | static ssize_t __btrfs_direct_write(struct kiocb *iocb, |
1666 | const struct iovec *iov, | 1661 | const struct iovec *iov, |
1667 | unsigned long nr_segs, loff_t pos, | 1662 | unsigned long nr_segs, loff_t pos, |
1668 | loff_t *ppos, size_t count, size_t ocount) | 1663 | size_t count, size_t ocount) |
1669 | { | 1664 | { |
1670 | struct file *file = iocb->ki_filp; | 1665 | struct file *file = iocb->ki_filp; |
1671 | struct iov_iter i; | 1666 | struct iov_iter i; |
@@ -1674,7 +1669,7 @@ static ssize_t __btrfs_direct_write(struct kiocb *iocb, | |||
1674 | loff_t endbyte; | 1669 | loff_t endbyte; |
1675 | int err; | 1670 | int err; |
1676 | 1671 | ||
1677 | written = generic_file_direct_write(iocb, iov, &nr_segs, pos, ppos, | 1672 | written = generic_file_direct_write(iocb, iov, &nr_segs, pos, |
1678 | count, ocount); | 1673 | count, ocount); |
1679 | 1674 | ||
1680 | if (written < 0 || written == count) | 1675 | if (written < 0 || written == count) |
@@ -1693,7 +1688,7 @@ static ssize_t __btrfs_direct_write(struct kiocb *iocb, | |||
1693 | if (err) | 1688 | if (err) |
1694 | goto out; | 1689 | goto out; |
1695 | written += written_buffered; | 1690 | written += written_buffered; |
1696 | *ppos = pos + written_buffered; | 1691 | iocb->ki_pos = pos + written_buffered; |
1697 | invalidate_mapping_pages(file->f_mapping, pos >> PAGE_CACHE_SHIFT, | 1692 | invalidate_mapping_pages(file->f_mapping, pos >> PAGE_CACHE_SHIFT, |
1698 | endbyte >> PAGE_CACHE_SHIFT); | 1693 | endbyte >> PAGE_CACHE_SHIFT); |
1699 | out: | 1694 | out: |
@@ -1725,8 +1720,8 @@ static ssize_t btrfs_file_aio_write(struct kiocb *iocb, | |||
1725 | struct file *file = iocb->ki_filp; | 1720 | struct file *file = iocb->ki_filp; |
1726 | struct inode *inode = file_inode(file); | 1721 | struct inode *inode = file_inode(file); |
1727 | struct btrfs_root *root = BTRFS_I(inode)->root; | 1722 | struct btrfs_root *root = BTRFS_I(inode)->root; |
1728 | loff_t *ppos = &iocb->ki_pos; | ||
1729 | u64 start_pos; | 1723 | u64 start_pos; |
1724 | u64 end_pos; | ||
1730 | ssize_t num_written = 0; | 1725 | ssize_t num_written = 0; |
1731 | ssize_t err = 0; | 1726 | ssize_t err = 0; |
1732 | size_t count, ocount; | 1727 | size_t count, ocount; |
@@ -1781,7 +1776,9 @@ static ssize_t btrfs_file_aio_write(struct kiocb *iocb, | |||
1781 | 1776 | ||
1782 | start_pos = round_down(pos, root->sectorsize); | 1777 | start_pos = round_down(pos, root->sectorsize); |
1783 | if (start_pos > i_size_read(inode)) { | 1778 | if (start_pos > i_size_read(inode)) { |
1784 | err = btrfs_cont_expand(inode, i_size_read(inode), start_pos); | 1779 | /* Expand hole size to cover write data, preventing empty gap */ |
1780 | end_pos = round_up(pos + iov->iov_len, root->sectorsize); | ||
1781 | err = btrfs_cont_expand(inode, i_size_read(inode), end_pos); | ||
1785 | if (err) { | 1782 | if (err) { |
1786 | mutex_unlock(&inode->i_mutex); | 1783 | mutex_unlock(&inode->i_mutex); |
1787 | goto out; | 1784 | goto out; |
@@ -1793,7 +1790,7 @@ static ssize_t btrfs_file_aio_write(struct kiocb *iocb, | |||
1793 | 1790 | ||
1794 | if (unlikely(file->f_flags & O_DIRECT)) { | 1791 | if (unlikely(file->f_flags & O_DIRECT)) { |
1795 | num_written = __btrfs_direct_write(iocb, iov, nr_segs, | 1792 | num_written = __btrfs_direct_write(iocb, iov, nr_segs, |
1796 | pos, ppos, count, ocount); | 1793 | pos, count, ocount); |
1797 | } else { | 1794 | } else { |
1798 | struct iov_iter i; | 1795 | struct iov_iter i; |
1799 | 1796 | ||
@@ -1801,7 +1798,7 @@ static ssize_t btrfs_file_aio_write(struct kiocb *iocb, | |||
1801 | 1798 | ||
1802 | num_written = __btrfs_buffered_write(file, &i, pos); | 1799 | num_written = __btrfs_buffered_write(file, &i, pos); |
1803 | if (num_written > 0) | 1800 | if (num_written > 0) |
1804 | *ppos = pos + num_written; | 1801 | iocb->ki_pos = pos + num_written; |
1805 | } | 1802 | } |
1806 | 1803 | ||
1807 | mutex_unlock(&inode->i_mutex); | 1804 | mutex_unlock(&inode->i_mutex); |