diff options
Diffstat (limited to 'fs/ocfs2/buffer_head_io.c')
-rw-r--r-- | fs/ocfs2/buffer_head_io.c | 35 |
1 files changed, 12 insertions, 23 deletions
diff --git a/fs/ocfs2/buffer_head_io.c b/fs/ocfs2/buffer_head_io.c index ca4ab7ce85bf..718dbe5607ca 100644 --- a/fs/ocfs2/buffer_head_io.c +++ b/fs/ocfs2/buffer_head_io.c | |||
@@ -170,22 +170,20 @@ bail: | |||
170 | return status; | 170 | return status; |
171 | } | 171 | } |
172 | 172 | ||
173 | int ocfs2_read_blocks(struct ocfs2_super *osb, u64 block, int nr, | 173 | int ocfs2_read_blocks(struct inode *inode, u64 block, int nr, |
174 | struct buffer_head *bhs[], int flags, | 174 | struct buffer_head *bhs[], int flags) |
175 | struct inode *inode) | ||
176 | { | 175 | { |
177 | int status = 0; | 176 | int status = 0; |
178 | struct super_block *sb; | ||
179 | int i, ignore_cache = 0; | 177 | int i, ignore_cache = 0; |
180 | struct buffer_head *bh; | 178 | struct buffer_head *bh; |
181 | 179 | ||
182 | mlog_entry("(block=(%llu), nr=(%d), flags=%d, inode=%p)\n", | 180 | mlog_entry("(inode=%p, block=(%llu), nr=(%d), flags=%d)\n", |
183 | (unsigned long long)block, nr, flags, inode); | 181 | inode, (unsigned long long)block, nr, flags); |
184 | 182 | ||
185 | BUG_ON((flags & OCFS2_BH_READAHEAD) && | 183 | BUG_ON(!inode); |
186 | (!inode || !(flags & OCFS2_BH_CACHED))); | 184 | BUG_ON((flags & OCFS2_BH_READAHEAD) && !(flags & OCFS2_BH_CACHED)); |
187 | 185 | ||
188 | if (osb == NULL || osb->sb == NULL || bhs == NULL) { | 186 | if (bhs == NULL) { |
189 | status = -EINVAL; | 187 | status = -EINVAL; |
190 | mlog_errno(status); | 188 | mlog_errno(status); |
191 | goto bail; | 189 | goto bail; |
@@ -204,19 +202,12 @@ int ocfs2_read_blocks(struct ocfs2_super *osb, u64 block, int nr, | |||
204 | goto bail; | 202 | goto bail; |
205 | } | 203 | } |
206 | 204 | ||
207 | sb = osb->sb; | 205 | mutex_lock(&OCFS2_I(inode)->ip_io_mutex); |
208 | |||
209 | if (flags & OCFS2_BH_CACHED && !inode) | ||
210 | flags &= ~OCFS2_BH_CACHED; | ||
211 | |||
212 | if (inode) | ||
213 | mutex_lock(&OCFS2_I(inode)->ip_io_mutex); | ||
214 | for (i = 0 ; i < nr ; i++) { | 206 | for (i = 0 ; i < nr ; i++) { |
215 | if (bhs[i] == NULL) { | 207 | if (bhs[i] == NULL) { |
216 | bhs[i] = sb_getblk(sb, block++); | 208 | bhs[i] = sb_getblk(inode->i_sb, block++); |
217 | if (bhs[i] == NULL) { | 209 | if (bhs[i] == NULL) { |
218 | if (inode) | 210 | mutex_unlock(&OCFS2_I(inode)->ip_io_mutex); |
219 | mutex_unlock(&OCFS2_I(inode)->ip_io_mutex); | ||
220 | status = -EIO; | 211 | status = -EIO; |
221 | mlog_errno(status); | 212 | mlog_errno(status); |
222 | goto bail; | 213 | goto bail; |
@@ -347,11 +338,9 @@ int ocfs2_read_blocks(struct ocfs2_super *osb, u64 block, int nr, | |||
347 | /* Always set the buffer in the cache, even if it was | 338 | /* Always set the buffer in the cache, even if it was |
348 | * a forced read, or read-ahead which hasn't yet | 339 | * a forced read, or read-ahead which hasn't yet |
349 | * completed. */ | 340 | * completed. */ |
350 | if (inode) | 341 | ocfs2_set_buffer_uptodate(inode, bh); |
351 | ocfs2_set_buffer_uptodate(inode, bh); | ||
352 | } | 342 | } |
353 | if (inode) | 343 | mutex_unlock(&OCFS2_I(inode)->ip_io_mutex); |
354 | mutex_unlock(&OCFS2_I(inode)->ip_io_mutex); | ||
355 | 344 | ||
356 | mlog(ML_BH_IO, "block=(%llu), nr=(%d), cached=%s, flags=0x%x\n", | 345 | mlog(ML_BH_IO, "block=(%llu), nr=(%d), cached=%s, flags=0x%x\n", |
357 | (unsigned long long)block, nr, | 346 | (unsigned long long)block, nr, |