aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--fs/xfs/xfs_itable.c56
1 files changed, 24 insertions, 32 deletions
diff --git a/fs/xfs/xfs_itable.c b/fs/xfs/xfs_itable.c
index 7ea2b113db1b..acae3355ab22 100644
--- a/fs/xfs/xfs_itable.c
+++ b/fs/xfs/xfs_itable.c
@@ -348,30 +348,23 @@ xfs_bulkstat(
348 xfs_agino_t agino; /* inode # in allocation group */ 348 xfs_agino_t agino; /* inode # in allocation group */
349 xfs_agnumber_t agno; /* allocation group number */ 349 xfs_agnumber_t agno; /* allocation group number */
350 xfs_btree_cur_t *cur; /* btree cursor for ialloc btree */ 350 xfs_btree_cur_t *cur; /* btree cursor for ialloc btree */
351 int end_of_ag; /* set if we've seen the ag end */
352 int error; /* error code */
353 int icount; /* count of inodes good in irbuf */
354 size_t irbsize; /* size of irec buffer in bytes */ 351 size_t irbsize; /* size of irec buffer in bytes */
355 xfs_ino_t ino; /* inode number (filesystem) */
356 xfs_inobt_rec_incore_t *irbp; /* current irec buffer pointer */
357 xfs_inobt_rec_incore_t *irbuf; /* start of irec buffer */ 352 xfs_inobt_rec_incore_t *irbuf; /* start of irec buffer */
358 xfs_inobt_rec_incore_t *irbufend; /* end of good irec buffer entries */
359 xfs_ino_t lastino; /* last inode number returned */ 353 xfs_ino_t lastino; /* last inode number returned */
360 int nirbuf; /* size of irbuf */ 354 int nirbuf; /* size of irbuf */
361 int rval; /* return value error code */ 355 int rval; /* return value error code */
362 int ubcount; /* size of user's buffer */ 356 int ubcount; /* size of user's buffer */
363 int stat;
364 struct xfs_bulkstat_agichunk ac; 357 struct xfs_bulkstat_agichunk ac;
358 int error = 0;
365 359
366 /* 360 /*
367 * Get the last inode value, see if there's nothing to do. 361 * Get the last inode value, see if there's nothing to do.
368 */ 362 */
369 ino = (xfs_ino_t)*lastinop; 363 lastino = *lastinop;
370 lastino = ino; 364 agno = XFS_INO_TO_AGNO(mp, lastino);
371 agno = XFS_INO_TO_AGNO(mp, ino); 365 agino = XFS_INO_TO_AGINO(mp, lastino);
372 agino = XFS_INO_TO_AGINO(mp, ino);
373 if (agno >= mp->m_sb.sb_agcount || 366 if (agno >= mp->m_sb.sb_agcount ||
374 ino != XFS_AGINO_TO_INO(mp, agno, agino)) { 367 lastino != XFS_AGINO_TO_INO(mp, agno, agino)) {
375 *done = 1; 368 *done = 1;
376 *ubcountp = 0; 369 *ubcountp = 0;
377 return 0; 370 return 0;
@@ -396,8 +389,13 @@ xfs_bulkstat(
396 * inode returned; 0 means start of the allocation group. 389 * inode returned; 0 means start of the allocation group.
397 */ 390 */
398 rval = 0; 391 rval = 0;
399 while (XFS_BULKSTAT_UBLEFT(ac.ac_ubleft) && agno < mp->m_sb.sb_agcount) { 392 while (agno < mp->m_sb.sb_agcount) {
400 cond_resched(); 393 struct xfs_inobt_rec_incore *irbp = irbuf;
394 struct xfs_inobt_rec_incore *irbufend = irbuf + nirbuf;
395 bool end_of_ag = false;
396 int icount = 0;
397 int stat;
398
401 error = xfs_ialloc_read_agi(mp, NULL, agno, &agbp); 399 error = xfs_ialloc_read_agi(mp, NULL, agno, &agbp);
402 if (error) 400 if (error)
403 break; 401 break;
@@ -407,10 +405,6 @@ xfs_bulkstat(
407 */ 405 */
408 cur = xfs_inobt_init_cursor(mp, NULL, agbp, agno, 406 cur = xfs_inobt_init_cursor(mp, NULL, agbp, agno,
409 XFS_BTNUM_INO); 407 XFS_BTNUM_INO);
410 irbp = irbuf;
411 irbufend = irbuf + nirbuf;
412 end_of_ag = 0;
413 icount = 0;
414 if (agino > 0) { 408 if (agino > 0) {
415 /* 409 /*
416 * In the middle of an allocation group, we need to get 410 * In the middle of an allocation group, we need to get
@@ -435,7 +429,7 @@ xfs_bulkstat(
435 error = xfs_inobt_lookup(cur, 0, XFS_LOOKUP_GE, &stat); 429 error = xfs_inobt_lookup(cur, 0, XFS_LOOKUP_GE, &stat);
436 } 430 }
437 if (error || stat == 0) { 431 if (error || stat == 0) {
438 end_of_ag = 1; 432 end_of_ag = true;
439 goto del_cursor; 433 goto del_cursor;
440 } 434 }
441 435
@@ -448,7 +442,7 @@ xfs_bulkstat(
448 442
449 error = xfs_inobt_get_rec(cur, &r, &stat); 443 error = xfs_inobt_get_rec(cur, &r, &stat);
450 if (error || stat == 0) { 444 if (error || stat == 0) {
451 end_of_ag = 1; 445 end_of_ag = true;
452 goto del_cursor; 446 goto del_cursor;
453 } 447 }
454 448
@@ -470,7 +464,7 @@ xfs_bulkstat(
470 agino = r.ir_startino + XFS_INODES_PER_CHUNK; 464 agino = r.ir_startino + XFS_INODES_PER_CHUNK;
471 error = xfs_btree_increment(cur, 0, &stat); 465 error = xfs_btree_increment(cur, 0, &stat);
472 if (error || stat == 0) { 466 if (error || stat == 0) {
473 end_of_ag = 1; 467 end_of_ag = true;
474 goto del_cursor; 468 goto del_cursor;
475 } 469 }
476 cond_resched(); 470 cond_resched();
@@ -491,7 +485,7 @@ del_cursor:
491 */ 485 */
492 irbufend = irbp; 486 irbufend = irbp;
493 for (irbp = irbuf; 487 for (irbp = irbuf;
494 irbp < irbufend && XFS_BULKSTAT_UBLEFT(ac.ac_ubleft); 488 irbp < irbufend && ac.ac_ubleft >= statstruct_size;
495 irbp++) { 489 irbp++) {
496 error = xfs_bulkstat_ag_ichunk(mp, agno, irbp, 490 error = xfs_bulkstat_ag_ichunk(mp, agno, irbp,
497 formatter, statstruct_size, &ac, 491 formatter, statstruct_size, &ac,
@@ -502,17 +496,15 @@ del_cursor:
502 cond_resched(); 496 cond_resched();
503 } 497 }
504 498
505 /* 499 /* If we've run out of space, we are done */
506 * Set up for the next loop iteration. 500 if (ac.ac_ubleft < statstruct_size)
507 */
508 if (XFS_BULKSTAT_UBLEFT(ac.ac_ubleft)) {
509 if (end_of_ag) {
510 agno++;
511 agino = 0;
512 } else
513 agino = XFS_INO_TO_AGINO(mp, lastino);
514 } else
515 break; 501 break;
502
503 if (end_of_ag) {
504 agno++;
505 agino = 0;
506 } else
507 agino = XFS_INO_TO_AGINO(mp, lastino);
516 } 508 }
517 /* 509 /*
518 * Done, we're either out of filesystem or space to put the data. 510 * Done, we're either out of filesystem or space to put the data.