aboutsummaryrefslogtreecommitdiffstats
path: root/fs/ocfs2/quota_global.c
diff options
context:
space:
mode:
authorJoel Becker <Joel.Becker@oracle.com>2008-11-25 09:31:27 -0500
committerMark Fasheh <mfasheh@suse.com>2009-01-05 11:40:24 -0500
commit85eb8b73d66530bb7b931789ae7a5ec9744eed34 (patch)
tree4590be147364e0437f23a0d6bf72ccc900852eb9 /fs/ocfs2/quota_global.c
parent57a09a7b3d9445a17c78d544f1e49d4d7d61705a (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.c34
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
90struct buffer_head *ocfs2_read_quota_block(struct inode *inode, 90int 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
102static struct buffer_head *ocfs2_get_quota_block(struct inode *inode, 107static 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);