diff options
author | Al Viro <viro@zeniv.linux.org.uk> | 2015-06-19 00:53:06 -0400 |
---|---|---|
committer | Al Viro <viro@zeniv.linux.org.uk> | 2015-07-06 17:39:57 -0400 |
commit | 177848a018cb2cb196feac2990814ac8d7bb3c8e (patch) | |
tree | f0d0b3241a9d8f109fcaaed709249de716dfae78 /fs/ufs | |
parent | 8d9dcf14367388674f4d792f494e6f1d6536ac95 (diff) |
ufs_inode_get{frag,block}(): leave sb_getblk() to caller
just return the damn block number
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Diffstat (limited to 'fs/ufs')
-rw-r--r-- | fs/ufs/inode.c | 88 |
1 files changed, 55 insertions, 33 deletions
diff --git a/fs/ufs/inode.c b/fs/ufs/inode.c index 156ba3c26906..eeccf45fcd57 100644 --- a/fs/ufs/inode.c +++ b/fs/ufs/inode.c | |||
@@ -218,7 +218,7 @@ changed: | |||
218 | * @new: we set it if we allocate new block | 218 | * @new: we set it if we allocate new block |
219 | * @locked_page: for ufs_new_fragments() | 219 | * @locked_page: for ufs_new_fragments() |
220 | */ | 220 | */ |
221 | static struct buffer_head * | 221 | static u64 |
222 | ufs_inode_getfrag(struct inode *inode, u64 fragment, | 222 | ufs_inode_getfrag(struct inode *inode, u64 fragment, |
223 | sector_t new_fragment, unsigned int required, int *err, | 223 | sector_t new_fragment, unsigned int required, int *err, |
224 | long *phys, int *new, struct page *locked_page) | 224 | long *phys, int *new, struct page *locked_page) |
@@ -267,7 +267,7 @@ ufs_inode_getfrag(struct inode *inode, u64 fragment, | |||
267 | uspi->s_fpb - lastblockoff, | 267 | uspi->s_fpb - lastblockoff, |
268 | err, locked_page); | 268 | err, locked_page); |
269 | if (!tmp) | 269 | if (!tmp) |
270 | return NULL; | 270 | return 0; |
271 | lastfrag = ufsi->i_lastfrag; | 271 | lastfrag = ufsi->i_lastfrag; |
272 | } | 272 | } |
273 | tmp = ufs_data_ptr_to_cpu(sb, | 273 | tmp = ufs_data_ptr_to_cpu(sb, |
@@ -304,7 +304,7 @@ ufs_inode_getfrag(struct inode *inode, u64 fragment, | |||
304 | } | 304 | } |
305 | if (!tmp) { | 305 | if (!tmp) { |
306 | *err = -ENOSPC; | 306 | *err = -ENOSPC; |
307 | return NULL; | 307 | return 0; |
308 | } | 308 | } |
309 | 309 | ||
310 | if (phys) { | 310 | if (phys) { |
@@ -316,13 +316,7 @@ ufs_inode_getfrag(struct inode *inode, u64 fragment, | |||
316 | ufs_sync_inode (inode); | 316 | ufs_sync_inode (inode); |
317 | mark_inode_dirty(inode); | 317 | mark_inode_dirty(inode); |
318 | out: | 318 | out: |
319 | tmp += uspi->s_sbbase + blockoff; | 319 | return tmp + uspi->s_sbbase; |
320 | if (!phys) { | ||
321 | return sb_getblk(sb, tmp); | ||
322 | } else { | ||
323 | *phys = tmp; | ||
324 | return NULL; | ||
325 | } | ||
326 | 320 | ||
327 | /* This part : To be implemented .... | 321 | /* This part : To be implemented .... |
328 | Required only for writing, not required for READ-ONLY. | 322 | Required only for writing, not required for READ-ONLY. |
@@ -353,26 +347,22 @@ repeat2: | |||
353 | * @new: see ufs_inode_getfrag() | 347 | * @new: see ufs_inode_getfrag() |
354 | * @locked_page: see ufs_inode_getfrag() | 348 | * @locked_page: see ufs_inode_getfrag() |
355 | */ | 349 | */ |
356 | static struct buffer_head * | 350 | static u64 |
357 | ufs_inode_getblock(struct inode *inode, struct buffer_head *bh, | 351 | ufs_inode_getblock(struct inode *inode, struct buffer_head *bh, |
358 | u64 fragment, sector_t new_fragment, int *err, | 352 | u64 fragment, sector_t new_fragment, int *err, |
359 | long *phys, int *new, struct page *locked_page) | 353 | long *phys, int *new, struct page *locked_page) |
360 | { | 354 | { |
361 | struct super_block *sb = inode->i_sb; | 355 | struct super_block *sb = inode->i_sb; |
362 | struct ufs_sb_private_info *uspi = UFS_SB(sb)->s_uspi; | 356 | struct ufs_sb_private_info *uspi = UFS_SB(sb)->s_uspi; |
363 | struct buffer_head * result; | ||
364 | unsigned blockoff; | ||
365 | u64 tmp = 0, goal, block; | 357 | u64 tmp = 0, goal, block; |
366 | void *p; | 358 | void *p; |
367 | 359 | ||
368 | block = ufs_fragstoblks (fragment); | 360 | block = ufs_fragstoblks (fragment); |
369 | blockoff = ufs_fragnum (fragment); | ||
370 | 361 | ||
371 | UFSD("ENTER, ino %lu, fragment %llu, new_fragment %llu, metadata %d\n", | 362 | UFSD("ENTER, ino %lu, fragment %llu, new_fragment %llu, metadata %d\n", |
372 | inode->i_ino, (unsigned long long)fragment, | 363 | inode->i_ino, (unsigned long long)fragment, |
373 | (unsigned long long)new_fragment, !phys); | 364 | (unsigned long long)new_fragment, !phys); |
374 | 365 | ||
375 | result = NULL; | ||
376 | if (!bh) | 366 | if (!bh) |
377 | goto out; | 367 | goto out; |
378 | if (!buffer_uptodate(bh)) { | 368 | if (!buffer_uptodate(bh)) { |
@@ -411,16 +401,10 @@ ufs_inode_getblock(struct inode *inode, struct buffer_head *bh, | |||
411 | mark_inode_dirty(inode); | 401 | mark_inode_dirty(inode); |
412 | out: | 402 | out: |
413 | brelse (bh); | 403 | brelse (bh); |
414 | if (tmp) { | ||
415 | tmp += uspi->s_sbbase + blockoff; | ||
416 | if (phys) { | ||
417 | *phys = tmp; | ||
418 | } else { | ||
419 | result = sb_getblk(sb, tmp); | ||
420 | } | ||
421 | } | ||
422 | UFSD("EXIT\n"); | 404 | UFSD("EXIT\n"); |
423 | return result; | 405 | if (tmp) |
406 | tmp += uspi->s_sbbase; | ||
407 | return tmp; | ||
424 | } | 408 | } |
425 | 409 | ||
426 | /** | 410 | /** |
@@ -439,11 +423,12 @@ static int ufs_getfrag_block(struct inode *inode, sector_t fragment, struct buff | |||
439 | int depth = ufs_block_to_path(inode, fragment >> uspi->s_fpbshift, offsets); | 423 | int depth = ufs_block_to_path(inode, fragment >> uspi->s_fpbshift, offsets); |
440 | unsigned long ptr,phys; | 424 | unsigned long ptr,phys; |
441 | u64 phys64 = 0; | 425 | u64 phys64 = 0; |
426 | unsigned frag = fragment & uspi->s_fpbmask; | ||
442 | 427 | ||
443 | if (!create) { | 428 | if (!create) { |
444 | phys64 = ufs_frag_map(inode, offsets, depth); | 429 | phys64 = ufs_frag_map(inode, offsets, depth); |
445 | if (phys64) { | 430 | if (phys64) { |
446 | phys64 += fragment & uspi->s_fpbmask; | 431 | phys64 += frag; |
447 | map_bh(bh_result, sb, phys64); | 432 | map_bh(bh_result, sb, phys64); |
448 | } | 433 | } |
449 | return 0; | 434 | return 0; |
@@ -466,42 +451,79 @@ static int ufs_getfrag_block(struct inode *inode, sector_t fragment, struct buff | |||
466 | ptr = fragment; | 451 | ptr = fragment; |
467 | 452 | ||
468 | if (depth == 1) { | 453 | if (depth == 1) { |
469 | bh = ufs_inode_getfrag(inode, ptr, fragment, 1, &err, &phys, | 454 | phys64 = ufs_inode_getfrag(inode, ptr, fragment, 1, &err, &phys, |
470 | &new, bh_result->b_page); | 455 | &new, bh_result->b_page); |
456 | if (phys64) { | ||
457 | phys64 += frag; | ||
458 | phys = phys64; | ||
459 | } | ||
471 | goto out; | 460 | goto out; |
472 | } | 461 | } |
473 | ptr -= UFS_NDIR_FRAGMENT; | 462 | ptr -= UFS_NDIR_FRAGMENT; |
474 | if (depth == 2) { | 463 | if (depth == 2) { |
475 | bh = ufs_inode_getfrag(inode, | 464 | phys64 = ufs_inode_getfrag(inode, |
476 | UFS_IND_FRAGMENT + (ptr >> uspi->s_apbshift), | 465 | UFS_IND_FRAGMENT + (ptr >> uspi->s_apbshift), |
477 | fragment, uspi->s_fpb, &err, NULL, NULL, | 466 | fragment, uspi->s_fpb, &err, NULL, NULL, |
478 | bh_result->b_page); | 467 | bh_result->b_page); |
468 | if (phys64) { | ||
469 | phys64 += (ptr >> uspi->s_apbshift) & uspi->s_fpbmask; | ||
470 | bh = sb_getblk(sb, phys64); | ||
471 | } else { | ||
472 | bh = NULL; | ||
473 | } | ||
479 | goto get_indirect; | 474 | goto get_indirect; |
480 | } | 475 | } |
481 | ptr -= 1 << (uspi->s_apbshift + uspi->s_fpbshift); | 476 | ptr -= 1 << (uspi->s_apbshift + uspi->s_fpbshift); |
482 | if (depth == 3) { | 477 | if (depth == 3) { |
483 | bh = ufs_inode_getfrag(inode, | 478 | phys64 = ufs_inode_getfrag(inode, |
484 | UFS_DIND_FRAGMENT + (ptr >> uspi->s_2apbshift), | 479 | UFS_DIND_FRAGMENT + (ptr >> uspi->s_2apbshift), |
485 | fragment, uspi->s_fpb, &err, NULL, NULL, | 480 | fragment, uspi->s_fpb, &err, NULL, NULL, |
486 | bh_result->b_page); | 481 | bh_result->b_page); |
482 | if (phys64) { | ||
483 | phys64 += (ptr >> uspi->s_2apbshift) & uspi->s_fpbmask; | ||
484 | bh = sb_getblk(sb, phys64); | ||
485 | } else { | ||
486 | bh = NULL; | ||
487 | } | ||
487 | goto get_double; | 488 | goto get_double; |
488 | } | 489 | } |
489 | ptr -= 1 << (uspi->s_2apbshift + uspi->s_fpbshift); | 490 | ptr -= 1 << (uspi->s_2apbshift + uspi->s_fpbshift); |
490 | bh = ufs_inode_getfrag(inode, | 491 | phys64 = ufs_inode_getfrag(inode, |
491 | UFS_TIND_FRAGMENT + (ptr >> uspi->s_3apbshift), | 492 | UFS_TIND_FRAGMENT + (ptr >> uspi->s_3apbshift), |
492 | fragment, uspi->s_fpb, &err, NULL, NULL, | 493 | fragment, uspi->s_fpb, &err, NULL, NULL, |
493 | bh_result->b_page); | 494 | bh_result->b_page); |
494 | bh = ufs_inode_getblock(inode, bh, | 495 | if (phys64) { |
496 | phys64 += (ptr >> uspi->s_3apbshift) & uspi->s_fpbmask; | ||
497 | bh = sb_getblk(sb, phys64); | ||
498 | } else { | ||
499 | bh = NULL; | ||
500 | } | ||
501 | phys64 = ufs_inode_getblock(inode, bh, | ||
495 | (ptr >> uspi->s_2apbshift) & uspi->s_apbmask, | 502 | (ptr >> uspi->s_2apbshift) & uspi->s_apbmask, |
496 | fragment, &err, NULL, NULL, NULL); | 503 | fragment, &err, NULL, NULL, NULL); |
504 | if (phys64) { | ||
505 | phys64 += (ptr >> uspi->s_2apbshift) & uspi->s_fpbmask, | ||
506 | bh = sb_getblk(sb, phys64); | ||
507 | } else { | ||
508 | bh = NULL; | ||
509 | } | ||
497 | get_double: | 510 | get_double: |
498 | bh = ufs_inode_getblock(inode, bh, | 511 | phys64 = ufs_inode_getblock(inode, bh, |
499 | (ptr >> uspi->s_apbshift) & uspi->s_apbmask, | 512 | (ptr >> uspi->s_apbshift) & uspi->s_apbmask, |
500 | fragment, &err, NULL, NULL, NULL); | 513 | fragment, &err, NULL, NULL, NULL); |
514 | if (phys64) { | ||
515 | phys64 += (ptr >> uspi->s_apbshift) & uspi->s_fpbmask, | ||
516 | bh = sb_getblk(sb, phys64); | ||
517 | } else { | ||
518 | bh = NULL; | ||
519 | } | ||
501 | get_indirect: | 520 | get_indirect: |
502 | bh = ufs_inode_getblock(inode, bh, ptr & uspi->s_apbmask, fragment, | 521 | phys64 = ufs_inode_getblock(inode, bh, ptr & uspi->s_apbmask, fragment, |
503 | &err, &phys, &new, bh_result->b_page); | 522 | &err, &phys, &new, bh_result->b_page); |
504 | 523 | if (phys64) { | |
524 | phys64 += frag; | ||
525 | phys = phys64; | ||
526 | } | ||
505 | out: | 527 | out: |
506 | if (err) | 528 | if (err) |
507 | goto abort; | 529 | goto abort; |