diff options
author | Joel Becker <joel.becker@oracle.com> | 2008-11-13 17:49:19 -0500 |
---|---|---|
committer | Mark Fasheh <mfasheh@suse.com> | 2009-01-05 11:36:53 -0500 |
commit | 970e4936d7d15f35d00fd15a14f5343ba78b2fc8 (patch) | |
tree | 92057c7deab6b9d8e5c3889d6a354b5989a3b68d /fs/ocfs2/buffer_head_io.h | |
parent | 4ae1d69bedc8d174cb8a558694607e013157cde1 (diff) |
ocfs2: Validate metadata only when it's read from disk.
Add an optional validation hook to ocfs2_read_blocks(). Now the
validation function is only called when a block was actually read off of
disk. It is not called when the buffer was in cache.
We add a buffer state bit BH_NeedsValidate to flag these buffers. It
must always be one higher than the last JBD2 buffer state bit.
The dinode, dirblock, extent_block, and xattr_block validators are
lifted to this scheme directly. The group_descriptor validator needs to
be split into two pieces. The first part only needs the gd buffer and
is passed to ocfs2_read_block(). The second part requires the dinode as
well, and is called every time. It's only 3 compares, so it's tiny.
This also allows us to clean up the non-fatal gd check used by resize.c.
It now has no magic argument.
Signed-off-by: Joel Becker <joel.becker@oracle.com>
Signed-off-by: Mark Fasheh <mfasheh@suse.com>
Diffstat (limited to 'fs/ocfs2/buffer_head_io.h')
-rw-r--r-- | fs/ocfs2/buffer_head_io.h | 27 |
1 files changed, 16 insertions, 11 deletions
diff --git a/fs/ocfs2/buffer_head_io.h b/fs/ocfs2/buffer_head_io.h index 75e1dcb1ade7..c75d682dadd8 100644 --- a/fs/ocfs2/buffer_head_io.h +++ b/fs/ocfs2/buffer_head_io.h | |||
@@ -31,21 +31,24 @@ | |||
31 | void ocfs2_end_buffer_io_sync(struct buffer_head *bh, | 31 | void ocfs2_end_buffer_io_sync(struct buffer_head *bh, |
32 | int uptodate); | 32 | int uptodate); |
33 | 33 | ||
34 | static inline int ocfs2_read_block(struct inode *inode, | ||
35 | u64 off, | ||
36 | struct buffer_head **bh); | ||
37 | |||
38 | int ocfs2_write_block(struct ocfs2_super *osb, | 34 | int ocfs2_write_block(struct ocfs2_super *osb, |
39 | struct buffer_head *bh, | 35 | struct buffer_head *bh, |
40 | struct inode *inode); | 36 | struct inode *inode); |
41 | int ocfs2_read_blocks(struct inode *inode, | ||
42 | u64 block, | ||
43 | int nr, | ||
44 | struct buffer_head *bhs[], | ||
45 | int flags); | ||
46 | int ocfs2_read_blocks_sync(struct ocfs2_super *osb, u64 block, | 37 | int ocfs2_read_blocks_sync(struct ocfs2_super *osb, u64 block, |
47 | unsigned int nr, struct buffer_head *bhs[]); | 38 | unsigned int nr, struct buffer_head *bhs[]); |
48 | 39 | ||
40 | /* | ||
41 | * If not NULL, validate() will be called on a buffer that is freshly | ||
42 | * read from disk. It will not be called if the buffer was in cache. | ||
43 | * Note that if validate() is being used for this buffer, it needs to | ||
44 | * be set even for a READAHEAD call, as it marks the buffer for later | ||
45 | * validation. | ||
46 | */ | ||
47 | int ocfs2_read_blocks(struct inode *inode, u64 block, int nr, | ||
48 | struct buffer_head *bhs[], int flags, | ||
49 | int (*validate)(struct super_block *sb, | ||
50 | struct buffer_head *bh)); | ||
51 | |||
49 | int ocfs2_write_super_or_backup(struct ocfs2_super *osb, | 52 | int ocfs2_write_super_or_backup(struct ocfs2_super *osb, |
50 | struct buffer_head *bh); | 53 | struct buffer_head *bh); |
51 | 54 | ||
@@ -53,7 +56,9 @@ int ocfs2_write_super_or_backup(struct ocfs2_super *osb, | |||
53 | #define OCFS2_BH_READAHEAD 8 | 56 | #define OCFS2_BH_READAHEAD 8 |
54 | 57 | ||
55 | static inline int ocfs2_read_block(struct inode *inode, u64 off, | 58 | static inline int ocfs2_read_block(struct inode *inode, u64 off, |
56 | struct buffer_head **bh) | 59 | struct buffer_head **bh, |
60 | int (*validate)(struct super_block *sb, | ||
61 | struct buffer_head *bh)) | ||
57 | { | 62 | { |
58 | int status = 0; | 63 | int status = 0; |
59 | 64 | ||
@@ -63,7 +68,7 @@ static inline int ocfs2_read_block(struct inode *inode, u64 off, | |||
63 | goto bail; | 68 | goto bail; |
64 | } | 69 | } |
65 | 70 | ||
66 | status = ocfs2_read_blocks(inode, off, 1, bh, 0); | 71 | status = ocfs2_read_blocks(inode, off, 1, bh, 0, validate); |
67 | 72 | ||
68 | bail: | 73 | bail: |
69 | return status; | 74 | return status; |