aboutsummaryrefslogtreecommitdiffstats
path: root/fs/ufs
diff options
context:
space:
mode:
authorAl Viro <viro@zeniv.linux.org.uk>2015-06-19 00:53:06 -0400
committerAl Viro <viro@zeniv.linux.org.uk>2015-07-06 17:39:57 -0400
commit177848a018cb2cb196feac2990814ac8d7bb3c8e (patch)
treef0d0b3241a9d8f109fcaaed709249de716dfae78 /fs/ufs
parent8d9dcf14367388674f4d792f494e6f1d6536ac95 (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.c88
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 */
221static struct buffer_head * 221static u64
222ufs_inode_getfrag(struct inode *inode, u64 fragment, 222ufs_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);
318out: 318out:
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 */
356static struct buffer_head * 350static u64
357ufs_inode_getblock(struct inode *inode, struct buffer_head *bh, 351ufs_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);
412out: 402out:
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 }
497get_double: 510get_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 }
501get_indirect: 520get_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 }
505out: 527out:
506 if (err) 528 if (err)
507 goto abort; 529 goto abort;