diff options
author | Joel Becker <joel.becker@oracle.com> | 2008-11-13 17:49:11 -0500 |
---|---|---|
committer | Mark Fasheh <mfasheh@suse.com> | 2009-01-05 11:36:52 -0500 |
commit | b657c95c11088d77fc1bfc9c84d940f778bf9d12 (patch) | |
tree | 7e52e73aabbdbc55f644ad26735edc25a652ac32 /fs/ocfs2/aops.c | |
parent | a68979b857283daf4acc405e476dcc8812a3ff2b (diff) |
ocfs2: Wrap inode block reads in a dedicated function.
The ocfs2 code currently reads inodes off disk with a simple
ocfs2_read_block() call. Each place that does this has a different set
of sanity checks it performs. Some check only the signature. A couple
validate the block number (the block read vs di->i_blkno). A couple
others check for VALID_FL. Only one place validates i_fs_generation. A
couple check nothing. Even when an error is found, they don't all do
the same thing.
We wrap inode reading into ocfs2_read_inode_block(). This will validate
all the above fields, going readonly if they are invalid (they never
should be). ocfs2_read_inode_block_full() is provided for the places
that want to pass read_block flags. Every caller is passing a struct
inode with a valid ip_blkno, so we don't need a separate blkno argument
either.
We will remove the validation checks from the rest of the code in a
later commit, as they are no longer necessary.
Signed-off-by: Joel Becker <joel.becker@oracle.com>
Signed-off-by: Mark Fasheh <mfasheh@suse.com>
Diffstat (limited to 'fs/ocfs2/aops.c')
-rw-r--r-- | fs/ocfs2/aops.c | 11 |
1 files changed, 2 insertions, 9 deletions
diff --git a/fs/ocfs2/aops.c b/fs/ocfs2/aops.c index c22543b33420..e219f8b546ac 100644 --- a/fs/ocfs2/aops.c +++ b/fs/ocfs2/aops.c | |||
@@ -68,20 +68,13 @@ static int ocfs2_symlink_get_block(struct inode *inode, sector_t iblock, | |||
68 | goto bail; | 68 | goto bail; |
69 | } | 69 | } |
70 | 70 | ||
71 | status = ocfs2_read_block(inode, OCFS2_I(inode)->ip_blkno, &bh); | 71 | status = ocfs2_read_inode_block(inode, &bh); |
72 | if (status < 0) { | 72 | if (status < 0) { |
73 | mlog_errno(status); | 73 | mlog_errno(status); |
74 | goto bail; | 74 | goto bail; |
75 | } | 75 | } |
76 | fe = (struct ocfs2_dinode *) bh->b_data; | 76 | fe = (struct ocfs2_dinode *) bh->b_data; |
77 | 77 | ||
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, | 78 | if ((u64)iblock >= ocfs2_clusters_to_blocks(inode->i_sb, |
86 | le32_to_cpu(fe->i_clusters))) { | 79 | le32_to_cpu(fe->i_clusters))) { |
87 | mlog(ML_ERROR, "block offset is outside the allocated size: " | 80 | mlog(ML_ERROR, "block offset is outside the allocated size: " |
@@ -262,7 +255,7 @@ static int ocfs2_readpage_inline(struct inode *inode, struct page *page) | |||
262 | BUG_ON(!PageLocked(page)); | 255 | BUG_ON(!PageLocked(page)); |
263 | BUG_ON(!(OCFS2_I(inode)->ip_dyn_features & OCFS2_INLINE_DATA_FL)); | 256 | BUG_ON(!(OCFS2_I(inode)->ip_dyn_features & OCFS2_INLINE_DATA_FL)); |
264 | 257 | ||
265 | ret = ocfs2_read_block(inode, OCFS2_I(inode)->ip_blkno, &di_bh); | 258 | ret = ocfs2_read_inode_block(inode, &di_bh); |
266 | if (ret) { | 259 | if (ret) { |
267 | mlog_errno(ret); | 260 | mlog_errno(ret); |
268 | goto out; | 261 | goto out; |