diff options
Diffstat (limited to 'fs/ocfs2/aops.c')
-rw-r--r-- | fs/ocfs2/aops.c | 59 |
1 files changed, 21 insertions, 38 deletions
diff --git a/fs/ocfs2/aops.c b/fs/ocfs2/aops.c index c22543b33420..a067a6cffb01 100644 --- a/fs/ocfs2/aops.c +++ b/fs/ocfs2/aops.c | |||
@@ -27,6 +27,7 @@ | |||
27 | #include <linux/swap.h> | 27 | #include <linux/swap.h> |
28 | #include <linux/pipe_fs_i.h> | 28 | #include <linux/pipe_fs_i.h> |
29 | #include <linux/mpage.h> | 29 | #include <linux/mpage.h> |
30 | #include <linux/quotaops.h> | ||
30 | 31 | ||
31 | #define MLOG_MASK_PREFIX ML_FILE_IO | 32 | #define MLOG_MASK_PREFIX ML_FILE_IO |
32 | #include <cluster/masklog.h> | 33 | #include <cluster/masklog.h> |
@@ -68,20 +69,13 @@ static int ocfs2_symlink_get_block(struct inode *inode, sector_t iblock, | |||
68 | goto bail; | 69 | goto bail; |
69 | } | 70 | } |
70 | 71 | ||
71 | status = ocfs2_read_block(inode, OCFS2_I(inode)->ip_blkno, &bh); | 72 | status = ocfs2_read_inode_block(inode, &bh); |
72 | if (status < 0) { | 73 | if (status < 0) { |
73 | mlog_errno(status); | 74 | mlog_errno(status); |
74 | goto bail; | 75 | goto bail; |
75 | } | 76 | } |
76 | fe = (struct ocfs2_dinode *) bh->b_data; | 77 | fe = (struct ocfs2_dinode *) bh->b_data; |
77 | 78 | ||
78 | if (!OCFS2_IS_VALID_DINODE(fe)) { | ||
79 | mlog(ML_ERROR, "Invalid dinode #%llu: signature = %.*s\n", | ||
80 | (unsigned long long)le64_to_cpu(fe->i_blkno), 7, | ||
81 | fe->i_signature); | ||
82 | goto bail; | ||
83 | } | ||
84 | |||
85 | if ((u64)iblock >= ocfs2_clusters_to_blocks(inode->i_sb, | 79 | if ((u64)iblock >= ocfs2_clusters_to_blocks(inode->i_sb, |
86 | le32_to_cpu(fe->i_clusters))) { | 80 | le32_to_cpu(fe->i_clusters))) { |
87 | mlog(ML_ERROR, "block offset is outside the allocated size: " | 81 | mlog(ML_ERROR, "block offset is outside the allocated size: " |
@@ -262,7 +256,7 @@ static int ocfs2_readpage_inline(struct inode *inode, struct page *page) | |||
262 | BUG_ON(!PageLocked(page)); | 256 | BUG_ON(!PageLocked(page)); |
263 | BUG_ON(!(OCFS2_I(inode)->ip_dyn_features & OCFS2_INLINE_DATA_FL)); | 257 | BUG_ON(!(OCFS2_I(inode)->ip_dyn_features & OCFS2_INLINE_DATA_FL)); |
264 | 258 | ||
265 | ret = ocfs2_read_block(inode, OCFS2_I(inode)->ip_blkno, &di_bh); | 259 | ret = ocfs2_read_inode_block(inode, &di_bh); |
266 | if (ret) { | 260 | if (ret) { |
267 | mlog_errno(ret); | 261 | mlog_errno(ret); |
268 | goto out; | 262 | goto out; |
@@ -481,12 +475,6 @@ handle_t *ocfs2_start_walk_page_trans(struct inode *inode, | |||
481 | 475 | ||
482 | if (ocfs2_should_order_data(inode)) { | 476 | if (ocfs2_should_order_data(inode)) { |
483 | ret = ocfs2_jbd2_file_inode(handle, inode); | 477 | ret = ocfs2_jbd2_file_inode(handle, inode); |
484 | #ifdef CONFIG_OCFS2_COMPAT_JBD | ||
485 | ret = walk_page_buffers(handle, | ||
486 | page_buffers(page), | ||
487 | from, to, NULL, | ||
488 | ocfs2_journal_dirty_data); | ||
489 | #endif | ||
490 | if (ret < 0) | 478 | if (ret < 0) |
491 | mlog_errno(ret); | 479 | mlog_errno(ret); |
492 | } | 480 | } |
@@ -1072,15 +1060,8 @@ static void ocfs2_write_failure(struct inode *inode, | |||
1072 | tmppage = wc->w_pages[i]; | 1060 | tmppage = wc->w_pages[i]; |
1073 | 1061 | ||
1074 | if (page_has_buffers(tmppage)) { | 1062 | if (page_has_buffers(tmppage)) { |
1075 | if (ocfs2_should_order_data(inode)) { | 1063 | if (ocfs2_should_order_data(inode)) |
1076 | ocfs2_jbd2_file_inode(wc->w_handle, inode); | 1064 | ocfs2_jbd2_file_inode(wc->w_handle, inode); |
1077 | #ifdef CONFIG_OCFS2_COMPAT_JBD | ||
1078 | walk_page_buffers(wc->w_handle, | ||
1079 | page_buffers(tmppage), | ||
1080 | from, to, NULL, | ||
1081 | ocfs2_journal_dirty_data); | ||
1082 | #endif | ||
1083 | } | ||
1084 | 1065 | ||
1085 | block_commit_write(tmppage, from, to); | 1066 | block_commit_write(tmppage, from, to); |
1086 | } | 1067 | } |
@@ -1531,8 +1512,8 @@ static int ocfs2_write_begin_inline(struct address_space *mapping, | |||
1531 | goto out; | 1512 | goto out; |
1532 | } | 1513 | } |
1533 | 1514 | ||
1534 | ret = ocfs2_journal_access(handle, inode, wc->w_di_bh, | 1515 | ret = ocfs2_journal_access_di(handle, inode, wc->w_di_bh, |
1535 | OCFS2_JOURNAL_ACCESS_WRITE); | 1516 | OCFS2_JOURNAL_ACCESS_WRITE); |
1536 | if (ret) { | 1517 | if (ret) { |
1537 | ocfs2_commit_trans(osb, handle); | 1518 | ocfs2_commit_trans(osb, handle); |
1538 | 1519 | ||
@@ -1750,15 +1731,20 @@ int ocfs2_write_begin_nolock(struct address_space *mapping, | |||
1750 | 1731 | ||
1751 | wc->w_handle = handle; | 1732 | wc->w_handle = handle; |
1752 | 1733 | ||
1734 | if (clusters_to_alloc && vfs_dq_alloc_space_nodirty(inode, | ||
1735 | ocfs2_clusters_to_bytes(osb->sb, clusters_to_alloc))) { | ||
1736 | ret = -EDQUOT; | ||
1737 | goto out_commit; | ||
1738 | } | ||
1753 | /* | 1739 | /* |
1754 | * We don't want this to fail in ocfs2_write_end(), so do it | 1740 | * We don't want this to fail in ocfs2_write_end(), so do it |
1755 | * here. | 1741 | * here. |
1756 | */ | 1742 | */ |
1757 | ret = ocfs2_journal_access(handle, inode, wc->w_di_bh, | 1743 | ret = ocfs2_journal_access_di(handle, inode, wc->w_di_bh, |
1758 | OCFS2_JOURNAL_ACCESS_WRITE); | 1744 | OCFS2_JOURNAL_ACCESS_WRITE); |
1759 | if (ret) { | 1745 | if (ret) { |
1760 | mlog_errno(ret); | 1746 | mlog_errno(ret); |
1761 | goto out_commit; | 1747 | goto out_quota; |
1762 | } | 1748 | } |
1763 | 1749 | ||
1764 | /* | 1750 | /* |
@@ -1771,14 +1757,14 @@ int ocfs2_write_begin_nolock(struct address_space *mapping, | |||
1771 | mmap_page); | 1757 | mmap_page); |
1772 | if (ret) { | 1758 | if (ret) { |
1773 | mlog_errno(ret); | 1759 | mlog_errno(ret); |
1774 | goto out_commit; | 1760 | goto out_quota; |
1775 | } | 1761 | } |
1776 | 1762 | ||
1777 | ret = ocfs2_write_cluster_by_desc(mapping, data_ac, meta_ac, wc, pos, | 1763 | ret = ocfs2_write_cluster_by_desc(mapping, data_ac, meta_ac, wc, pos, |
1778 | len); | 1764 | len); |
1779 | if (ret) { | 1765 | if (ret) { |
1780 | mlog_errno(ret); | 1766 | mlog_errno(ret); |
1781 | goto out_commit; | 1767 | goto out_quota; |
1782 | } | 1768 | } |
1783 | 1769 | ||
1784 | if (data_ac) | 1770 | if (data_ac) |
@@ -1790,6 +1776,10 @@ success: | |||
1790 | *pagep = wc->w_target_page; | 1776 | *pagep = wc->w_target_page; |
1791 | *fsdata = wc; | 1777 | *fsdata = wc; |
1792 | return 0; | 1778 | return 0; |
1779 | out_quota: | ||
1780 | if (clusters_to_alloc) | ||
1781 | vfs_dq_free_space(inode, | ||
1782 | ocfs2_clusters_to_bytes(osb->sb, clusters_to_alloc)); | ||
1793 | out_commit: | 1783 | out_commit: |
1794 | ocfs2_commit_trans(osb, handle); | 1784 | ocfs2_commit_trans(osb, handle); |
1795 | 1785 | ||
@@ -1919,15 +1909,8 @@ int ocfs2_write_end_nolock(struct address_space *mapping, | |||
1919 | } | 1909 | } |
1920 | 1910 | ||
1921 | if (page_has_buffers(tmppage)) { | 1911 | if (page_has_buffers(tmppage)) { |
1922 | if (ocfs2_should_order_data(inode)) { | 1912 | if (ocfs2_should_order_data(inode)) |
1923 | ocfs2_jbd2_file_inode(wc->w_handle, inode); | 1913 | ocfs2_jbd2_file_inode(wc->w_handle, inode); |
1924 | #ifdef CONFIG_OCFS2_COMPAT_JBD | ||
1925 | walk_page_buffers(wc->w_handle, | ||
1926 | page_buffers(tmppage), | ||
1927 | from, to, NULL, | ||
1928 | ocfs2_journal_dirty_data); | ||
1929 | #endif | ||
1930 | } | ||
1931 | block_commit_write(tmppage, from, to); | 1914 | block_commit_write(tmppage, from, to); |
1932 | } | 1915 | } |
1933 | } | 1916 | } |