diff options
author | Joel Becker <Joel.Becker@oracle.com> | 2008-11-25 09:31:27 -0500 |
---|---|---|
committer | Mark Fasheh <mfasheh@suse.com> | 2009-01-05 11:40:24 -0500 |
commit | 85eb8b73d66530bb7b931789ae7a5ec9744eed34 (patch) | |
tree | 4590be147364e0437f23a0d6bf72ccc900852eb9 /fs/ocfs2/quota_global.c | |
parent | 57a09a7b3d9445a17c78d544f1e49d4d7d61705a (diff) |
ocfs2: Fix ocfs2_read_quota_block() error handling.
ocfs2_bread() has become ocfs2_read_virt_blocks(), with a prototype to
match ocfs2_read_blocks(). The quota code, converting from
ocfs2_bread(), wraps the call to ocfs2_read_virt_blocks() in
ocfs2_read_quota_block(). Unfortunately, the prototype of
ocfs2_read_quota_block() matches the old prototype of ocfs2_bread().
The problem is that ocfs2_bread() returned the buffer head, and callers
assumed that a NULL pointer was indicative of error. It wasn't. This
is why ocfs2_bread() took an int*err argument as well.
The new prototype of ocfs2_read_virt_blocks() avoids this error handling
confusion. Let's change ocfs2_read_quota_block() to match.
Signed-off-by: Joel Becker <joel.becker@oracle.com>
Acked-by: Jan Kara <jack@suse.cz>
Signed-off-by: Mark Fasheh <mfasheh@suse.com>
Diffstat (limited to 'fs/ocfs2/quota_global.c')
-rw-r--r-- | fs/ocfs2/quota_global.c | 34 |
1 files changed, 20 insertions, 14 deletions
diff --git a/fs/ocfs2/quota_global.c b/fs/ocfs2/quota_global.c index 10ecb33298d8..2bdcddd3f1c4 100644 --- a/fs/ocfs2/quota_global.c +++ b/fs/ocfs2/quota_global.c | |||
@@ -87,16 +87,21 @@ struct qtree_fmt_operations ocfs2_global_ops = { | |||
87 | .is_id = ocfs2_global_is_id, | 87 | .is_id = ocfs2_global_is_id, |
88 | }; | 88 | }; |
89 | 89 | ||
90 | struct buffer_head *ocfs2_read_quota_block(struct inode *inode, | 90 | int ocfs2_read_quota_block(struct inode *inode, u64 v_block, |
91 | int block, int *err) | 91 | struct buffer_head **bh) |
92 | { | 92 | { |
93 | struct buffer_head *tmp = NULL; | 93 | int rc = 0; |
94 | struct buffer_head *tmp = *bh; | ||
94 | 95 | ||
95 | *err = ocfs2_read_virt_blocks(inode, block, 1, &tmp, 0, NULL); | 96 | rc = ocfs2_read_virt_blocks(inode, v_block, 1, &tmp, 0, NULL); |
96 | if (*err) | 97 | if (rc) |
97 | mlog_errno(*err); | 98 | mlog_errno(rc); |
99 | |||
100 | /* If ocfs2_read_virt_blocks() got us a new bh, pass it up. */ | ||
101 | if (!rc && !*bh) | ||
102 | *bh = tmp; | ||
98 | 103 | ||
99 | return tmp; | 104 | return rc; |
100 | } | 105 | } |
101 | 106 | ||
102 | static struct buffer_head *ocfs2_get_quota_block(struct inode *inode, | 107 | static struct buffer_head *ocfs2_get_quota_block(struct inode *inode, |
@@ -143,8 +148,9 @@ ssize_t ocfs2_quota_read(struct super_block *sb, int type, char *data, | |||
143 | toread = len; | 148 | toread = len; |
144 | while (toread > 0) { | 149 | while (toread > 0) { |
145 | tocopy = min((size_t)(sb->s_blocksize - offset), toread); | 150 | tocopy = min((size_t)(sb->s_blocksize - offset), toread); |
146 | bh = ocfs2_read_quota_block(gqinode, blk, &err); | 151 | bh = NULL; |
147 | if (!bh) { | 152 | err = ocfs2_read_quota_block(gqinode, blk, &bh); |
153 | if (err) { | ||
148 | mlog_errno(err); | 154 | mlog_errno(err); |
149 | return err; | 155 | return err; |
150 | } | 156 | } |
@@ -169,7 +175,7 @@ ssize_t ocfs2_quota_write(struct super_block *sb, int type, | |||
169 | int offset = off & (sb->s_blocksize - 1); | 175 | int offset = off & (sb->s_blocksize - 1); |
170 | sector_t blk = off >> sb->s_blocksize_bits; | 176 | sector_t blk = off >> sb->s_blocksize_bits; |
171 | int err = 0, new = 0; | 177 | int err = 0, new = 0; |
172 | struct buffer_head *bh; | 178 | struct buffer_head *bh = NULL; |
173 | handle_t *handle = journal_current_handle(); | 179 | handle_t *handle = journal_current_handle(); |
174 | 180 | ||
175 | if (!handle) { | 181 | if (!handle) { |
@@ -200,13 +206,13 @@ ssize_t ocfs2_quota_write(struct super_block *sb, int type, | |||
200 | /* Not rewriting whole block? */ | 206 | /* Not rewriting whole block? */ |
201 | if ((offset || len < sb->s_blocksize - OCFS2_QBLK_RESERVED_SPACE) && | 207 | if ((offset || len < sb->s_blocksize - OCFS2_QBLK_RESERVED_SPACE) && |
202 | !new) { | 208 | !new) { |
203 | bh = ocfs2_read_quota_block(gqinode, blk, &err); | 209 | err = ocfs2_read_quota_block(gqinode, blk, &bh); |
204 | if (!bh) { | 210 | if (err) { |
205 | mlog_errno(err); | 211 | mlog_errno(err); |
206 | return err; | 212 | return err; |
207 | } | 213 | } |
208 | err = ocfs2_journal_access(handle, gqinode, bh, | 214 | err = ocfs2_journal_access(handle, gqinode, bh, |
209 | OCFS2_JOURNAL_ACCESS_WRITE); | 215 | OCFS2_JOURNAL_ACCESS_WRITE); |
210 | } else { | 216 | } else { |
211 | bh = ocfs2_get_quota_block(gqinode, blk, &err); | 217 | bh = ocfs2_get_quota_block(gqinode, blk, &err); |
212 | if (!bh) { | 218 | if (!bh) { |
@@ -214,7 +220,7 @@ ssize_t ocfs2_quota_write(struct super_block *sb, int type, | |||
214 | return err; | 220 | return err; |
215 | } | 221 | } |
216 | err = ocfs2_journal_access(handle, gqinode, bh, | 222 | err = ocfs2_journal_access(handle, gqinode, bh, |
217 | OCFS2_JOURNAL_ACCESS_CREATE); | 223 | OCFS2_JOURNAL_ACCESS_CREATE); |
218 | } | 224 | } |
219 | if (err < 0) { | 225 | if (err < 0) { |
220 | brelse(bh); | 226 | brelse(bh); |