diff options
Diffstat (limited to 'fs/ocfs2/aops.c')
| -rw-r--r-- | fs/ocfs2/aops.c | 42 |
1 files changed, 28 insertions, 14 deletions
diff --git a/fs/ocfs2/aops.c b/fs/ocfs2/aops.c index 9a5c931439bd..742893ea7390 100644 --- a/fs/ocfs2/aops.c +++ b/fs/ocfs2/aops.c | |||
| @@ -196,15 +196,14 @@ int ocfs2_get_block(struct inode *inode, sector_t iblock, | |||
| 196 | dump_stack(); | 196 | dump_stack(); |
| 197 | goto bail; | 197 | goto bail; |
| 198 | } | 198 | } |
| 199 | |||
| 200 | past_eof = ocfs2_blocks_for_bytes(inode->i_sb, i_size_read(inode)); | ||
| 201 | mlog(0, "Inode %lu, past_eof = %llu\n", inode->i_ino, | ||
| 202 | (unsigned long long)past_eof); | ||
| 203 | |||
| 204 | if (create && (iblock >= past_eof)) | ||
| 205 | set_buffer_new(bh_result); | ||
| 206 | } | 199 | } |
| 207 | 200 | ||
| 201 | past_eof = ocfs2_blocks_for_bytes(inode->i_sb, i_size_read(inode)); | ||
| 202 | mlog(0, "Inode %lu, past_eof = %llu\n", inode->i_ino, | ||
| 203 | (unsigned long long)past_eof); | ||
| 204 | if (create && (iblock >= past_eof)) | ||
| 205 | set_buffer_new(bh_result); | ||
| 206 | |||
| 208 | bail: | 207 | bail: |
| 209 | if (err < 0) | 208 | if (err < 0) |
| 210 | err = -EIO; | 209 | err = -EIO; |
| @@ -1590,21 +1589,20 @@ out: | |||
| 1590 | * write path can treat it as an non-allocating write, which has no | 1589 | * write path can treat it as an non-allocating write, which has no |
| 1591 | * special case code for sparse/nonsparse files. | 1590 | * special case code for sparse/nonsparse files. |
| 1592 | */ | 1591 | */ |
| 1593 | static int ocfs2_expand_nonsparse_inode(struct inode *inode, loff_t pos, | 1592 | static int ocfs2_expand_nonsparse_inode(struct inode *inode, |
| 1594 | unsigned len, | 1593 | struct buffer_head *di_bh, |
| 1594 | loff_t pos, unsigned len, | ||
| 1595 | struct ocfs2_write_ctxt *wc) | 1595 | struct ocfs2_write_ctxt *wc) |
| 1596 | { | 1596 | { |
| 1597 | int ret; | 1597 | int ret; |
| 1598 | struct ocfs2_super *osb = OCFS2_SB(inode->i_sb); | ||
| 1599 | loff_t newsize = pos + len; | 1598 | loff_t newsize = pos + len; |
| 1600 | 1599 | ||
| 1601 | if (ocfs2_sparse_alloc(osb)) | 1600 | BUG_ON(ocfs2_sparse_alloc(OCFS2_SB(inode->i_sb))); |
| 1602 | return 0; | ||
| 1603 | 1601 | ||
| 1604 | if (newsize <= i_size_read(inode)) | 1602 | if (newsize <= i_size_read(inode)) |
| 1605 | return 0; | 1603 | return 0; |
| 1606 | 1604 | ||
| 1607 | ret = ocfs2_extend_no_holes(inode, newsize, pos); | 1605 | ret = ocfs2_extend_no_holes(inode, di_bh, newsize, pos); |
| 1608 | if (ret) | 1606 | if (ret) |
| 1609 | mlog_errno(ret); | 1607 | mlog_errno(ret); |
| 1610 | 1608 | ||
| @@ -1614,6 +1612,18 @@ static int ocfs2_expand_nonsparse_inode(struct inode *inode, loff_t pos, | |||
| 1614 | return ret; | 1612 | return ret; |
| 1615 | } | 1613 | } |
| 1616 | 1614 | ||
| 1615 | static int ocfs2_zero_tail(struct inode *inode, struct buffer_head *di_bh, | ||
| 1616 | loff_t pos) | ||
| 1617 | { | ||
| 1618 | int ret = 0; | ||
| 1619 | |||
| 1620 | BUG_ON(!ocfs2_sparse_alloc(OCFS2_SB(inode->i_sb))); | ||
| 1621 | if (pos > i_size_read(inode)) | ||
| 1622 | ret = ocfs2_zero_extend(inode, di_bh, pos); | ||
| 1623 | |||
| 1624 | return ret; | ||
| 1625 | } | ||
| 1626 | |||
| 1617 | int ocfs2_write_begin_nolock(struct address_space *mapping, | 1627 | int ocfs2_write_begin_nolock(struct address_space *mapping, |
| 1618 | loff_t pos, unsigned len, unsigned flags, | 1628 | loff_t pos, unsigned len, unsigned flags, |
| 1619 | struct page **pagep, void **fsdata, | 1629 | struct page **pagep, void **fsdata, |
| @@ -1649,7 +1659,11 @@ int ocfs2_write_begin_nolock(struct address_space *mapping, | |||
| 1649 | } | 1659 | } |
| 1650 | } | 1660 | } |
| 1651 | 1661 | ||
| 1652 | ret = ocfs2_expand_nonsparse_inode(inode, pos, len, wc); | 1662 | if (ocfs2_sparse_alloc(osb)) |
| 1663 | ret = ocfs2_zero_tail(inode, di_bh, pos); | ||
| 1664 | else | ||
| 1665 | ret = ocfs2_expand_nonsparse_inode(inode, di_bh, pos, len, | ||
| 1666 | wc); | ||
| 1653 | if (ret) { | 1667 | if (ret) { |
| 1654 | mlog_errno(ret); | 1668 | mlog_errno(ret); |
| 1655 | goto out; | 1669 | goto out; |
