1 /* 2 * Copyright (c) 2000-2002,2005 Silicon Graphics, Inc. 3 * All Rights Reserved. 4 * 5 * This program is free software; you can redistribute it and/or 6 * modify it under the terms of the GNU General Public License as 7 * published by the Free Software Foundation. 8 * 9 * This program is distributed in the hope that it would be useful, 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 * GNU General Public License for more details. 13 * 14 * You should have received a copy of the GNU General Public License 15 * along with this program; if not, write the Free Software Foundation, 16 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA 17 */ 18 #include "xfs.h" 19 #include "xfs_fs.h" 20 #include "xfs_shared.h" 21 #include "xfs_format.h" 22 #include "xfs_log_format.h" 23 #include "xfs_trans_resv.h" 24 #include "xfs_inum.h" 25 #include "xfs_sb.h" 26 #include "xfs_ag.h" 27 #include "xfs_mount.h" 28 #include "xfs_inode.h" 29 #include "xfs_btree.h" 30 #include "xfs_ialloc.h" 31 #include "xfs_ialloc_btree.h" 32 #include "xfs_itable.h" 33 #include "xfs_error.h" 34 #include "xfs_trace.h" 35 #include "xfs_icache.h" 36 #include "xfs_dinode.h" 37 38 STATIC int 39 xfs_internal_inum( 40 xfs_mount_t *mp, 41 xfs_ino_t ino) 42 { 43 return (ino == mp->m_sb.sb_rbmino || ino == mp->m_sb.sb_rsumino || 44 (xfs_sb_version_hasquota(&mp->m_sb) && 45 xfs_is_quota_inode(&mp->m_sb, ino))); 46 } 47 48 /* 49 * Return stat information for one inode. 50 * Return 0 if ok, else errno. 51 */ 52 int 53 xfs_bulkstat_one_int( 54 struct xfs_mount *mp, /* mount point for filesystem */ 55 xfs_ino_t ino, /* inode to get data for */ 56 void __user *buffer, /* buffer to place output in */ 57 int ubsize, /* size of buffer */ 58 bulkstat_one_fmt_pf formatter, /* formatter, copy to user */ 59 int *ubused, /* bytes used by me */ 60 int *stat) /* BULKSTAT_RV_... */ 61 { 62 struct xfs_icdinode *dic; /* dinode core info pointer */ 63 struct xfs_inode *ip; /* incore inode pointer */ 64 struct xfs_bstat *buf; /* return buffer */ 65 int error = 0; /* error value */ 66 67 *stat = BULKSTAT_RV_NOTHING; 68 69 if (!buffer || xfs_internal_inum(mp, ino)) 70 return XFS_ERROR(EINVAL); 71 72 buf = kmem_alloc(sizeof(*buf), KM_SLEEP | KM_MAYFAIL); 73 if (!buf) 74 return XFS_ERROR(ENOMEM); 75 76 error = xfs_iget(mp, NULL, ino, 77 (XFS_IGET_DONTCACHE | XFS_IGET_UNTRUSTED), 78 XFS_ILOCK_SHARED, &ip); 79 if (error) { 80 *stat = BULKSTAT_RV_NOTHING; 81 goto out_free; 82 } 83 84 ASSERT(ip != NULL); 85 ASSERT(ip->i_imap.im_blkno != 0); 86 87 dic = &ip->i_d; 88 89 /* xfs_iget returns the following without needing 90 * further change. 91 */ 92 buf->bs_nlink = dic->di_nlink; 93 buf->bs_projid_lo = dic->di_projid_lo; 94 buf->bs_projid_hi = dic->di_projid_hi; 95 buf->bs_ino = ino; 96 buf->bs_mode = dic->di_mode; 97 buf->bs_uid = dic->di_uid; 98 buf->bs_gid = dic->di_gid; 99 buf->bs_size = dic->di_size; 100 buf->bs_atime.tv_sec = dic->di_atime.t_sec; 101 buf->bs_atime.tv_nsec = dic->di_atime.t_nsec; 102 buf->bs_mtime.tv_sec = dic->di_mtime.t_sec; 103 buf->bs_mtime.tv_nsec = dic->di_mtime.t_nsec; 104 buf->bs_ctime.tv_sec = dic->di_ctime.t_sec; 105 buf->bs_ctime.tv_nsec = dic->di_ctime.t_nsec; 106 buf->bs_xflags = xfs_ip2xflags(ip); 107 buf->bs_extsize = dic->di_extsize << mp->m_sb.sb_blocklog; 108 buf->bs_extents = dic->di_nextents; 109 buf->bs_gen = dic->di_gen; 110 memset(buf->bs_pad, 0, sizeof(buf->bs_pad)); 111 buf->bs_dmevmask = dic->di_dmevmask; 112 buf->bs_dmstate = dic->di_dmstate; 113 buf->bs_aextents = dic->di_anextents; 114 buf->bs_forkoff = XFS_IFORK_BOFF(ip); 115 116 switch (dic->di_format) { 117 case XFS_DINODE_FMT_DEV: 118 buf->bs_rdev = ip->i_df.if_u2.if_rdev; 119 buf->bs_blksize = BLKDEV_IOSIZE; 120 buf->bs_blocks = 0; 121 break; 122 case XFS_DINODE_FMT_LOCAL: 123 case XFS_DINODE_FMT_UUID: 124 buf->bs_rdev = 0; 125 buf->bs_blksize = mp->m_sb.sb_blocksize; 126 buf->bs_blocks = 0; 127 break; 128 case XFS_DINODE_FMT_EXTENTS: 129 case XFS_DINODE_FMT_BTREE: 130 buf->bs_rdev = 0; 131 buf->bs_blksize = mp->m_sb.sb_blocksize; 132 buf->bs_blocks = dic->di_nblocks + ip->i_delayed_blks; 133 break; 134 } 135 xfs_iunlock(ip, XFS_ILOCK_SHARED); 136 IRELE(ip); 137 138 error = formatter(buffer, ubsize, ubused, buf); 139 140 if (!error) 141 *stat = BULKSTAT_RV_DIDONE; 142 143 out_free: 144 kmem_free(buf); 145 return error; 146 } 147 148 /* Return 0 on success or positive error */ 149 STATIC int 150 xfs_bulkstat_one_fmt( 151 void __user *ubuffer, 152 int ubsize, 153 int *ubused, 154 const xfs_bstat_t *buffer) 155 { 156 if (ubsize < sizeof(*buffer)) 157 return XFS_ERROR(ENOMEM); 158 if (copy_to_user(ubuffer, buffer, sizeof(*buffer))) 159 return XFS_ERROR(EFAULT); 160 if (ubused) 161 *ubused = sizeof(*buffer); 162 return 0; 163 } 164 165 int 166 xfs_bulkstat_one( 167 xfs_mount_t *mp, /* mount point for filesystem */ 168 xfs_ino_t ino, /* inode number to get data for */ 169 void __user *buffer, /* buffer to place output in */ 170 int ubsize, /* size of buffer */ 171 int *ubused, /* bytes used by me */ 172 int *stat) /* BULKSTAT_RV_... */ 173 { 174 return xfs_bulkstat_one_int(mp, ino, buffer, ubsize, 175 xfs_bulkstat_one_fmt, ubused, stat); 176 } 177 178 #define XFS_BULKSTAT_UBLEFT(ubleft) ((ubleft) >= statstruct_size) 179 180 /* 181 * Return stat information in bulk (by-inode) for the filesystem. 182 */ 183 int /* error status */ 184 xfs_bulkstat( 185 xfs_mount_t *mp, /* mount point for filesystem */ 186 xfs_ino_t *lastinop, /* last inode returned */ 187 int *ubcountp, /* size of buffer/count returned */ 188 bulkstat_one_pf formatter, /* func that'd fill a single buf */ 189 size_t statstruct_size, /* sizeof struct filling */ 190 char __user *ubuffer, /* buffer with inode stats */ 191 int *done) /* 1 if there are more stats to get */ 192 { 193 xfs_agblock_t agbno=0;/* allocation group block number */ 194 xfs_buf_t *agbp; /* agi header buffer */ 195 xfs_agi_t *agi; /* agi header data */ 196 xfs_agino_t agino; /* inode # in allocation group */ 197 xfs_agnumber_t agno; /* allocation group number */ 198 int chunkidx; /* current index into inode chunk */ 199 int clustidx; /* current index into inode cluster */ 200 xfs_btree_cur_t *cur; /* btree cursor for ialloc btree */ 201 int end_of_ag; /* set if we've seen the ag end */ 202 int error; /* error code */ 203 int fmterror;/* bulkstat formatter result */ 204 int i; /* loop index */ 205 int icount; /* count of inodes good in irbuf */ 206 size_t irbsize; /* size of irec buffer in bytes */ 207 xfs_ino_t ino; /* inode number (filesystem) */ 208 xfs_inobt_rec_incore_t *irbp; /* current irec buffer pointer */ 209 xfs_inobt_rec_incore_t *irbuf; /* start of irec buffer */ 210 xfs_inobt_rec_incore_t *irbufend; /* end of good irec buffer entries */ 211 xfs_ino_t lastino; /* last inode number returned */ 212 int nbcluster; /* # of blocks in a cluster */ 213 int nicluster; /* # of inodes in a cluster */ 214 int nimask; /* mask for inode clusters */ 215 int nirbuf; /* size of irbuf */ 216 int rval; /* return value error code */ 217 int tmp; /* result value from btree calls */ 218 int ubcount; /* size of user's buffer */ 219 int ubleft; /* bytes left in user's buffer */ 220 char __user *ubufp; /* pointer into user's buffer */ 221 int ubelem; /* spaces used in user's buffer */ 222 int ubused; /* bytes used by formatter */ 223 224 /* 225 * Get the last inode value, see if there's nothing to do. 226 */ 227 ino = (xfs_ino_t)*lastinop; 228 lastino = ino; 229 agno = XFS_INO_TO_AGNO(mp, ino); 230 agino = XFS_INO_TO_AGINO(mp, ino); 231 if (agno >= mp->m_sb.sb_agcount || 232 ino != XFS_AGINO_TO_INO(mp, agno, agino)) { 233 *done = 1; 234 *ubcountp = 0; 235 return 0; 236 } 237 if (!ubcountp || *ubcountp <= 0) { 238 return EINVAL; 239 } 240 ubcount = *ubcountp; /* statstruct's */ 241 ubleft = ubcount * statstruct_size; /* bytes */ 242 *ubcountp = ubelem = 0; 243 *done = 0; 244 fmterror = 0; 245 ubufp = ubuffer; 246 nicluster = mp->m_sb.sb_blocksize >= XFS_INODE_CLUSTER_SIZE(mp) ? 247 mp->m_sb.sb_inopblock : 248 (XFS_INODE_CLUSTER_SIZE(mp) >> mp->m_sb.sb_inodelog); 249 nimask = ~(nicluster - 1); 250 nbcluster = nicluster >> mp->m_sb.sb_inopblog; 251 irbuf = kmem_zalloc_greedy(&irbsize, PAGE_SIZE, PAGE_SIZE * 4); 252 if (!irbuf) 253 return ENOMEM; 254 255 nirbuf = irbsize / sizeof(*irbuf); 256 257 /* 258 * Loop over the allocation groups, starting from the last 259 * inode returned; 0 means start of the allocation group. 260 */ 261 rval = 0; 262 while (XFS_BULKSTAT_UBLEFT(ubleft) && agno < mp->m_sb.sb_agcount) { 263 cond_resched(); 264 error = xfs_ialloc_read_agi(mp, NULL, agno, &agbp); 265 if (error) { 266 /* 267 * Skip this allocation group and go to the next one. 268 */ 269 agno++; 270 agino = 0; 271 continue; 272 } 273 agi = XFS_BUF_TO_AGI(agbp); 274 /* 275 * Allocate and initialize a btree cursor for ialloc btree. 276 */ 277 cur = xfs_inobt_init_cursor(mp, NULL, agbp, agno); 278 irbp = irbuf; 279 irbufend = irbuf + nirbuf; 280 end_of_ag = 0; 281 /* 282 * If we're returning in the middle of an allocation group, 283 * we need to get the remainder of the chunk we're in. 284 */ 285 if (agino > 0) { 286 xfs_inobt_rec_incore_t r; 287 288 /* 289 * Lookup the inode chunk that this inode lives in. 290 */ 291 error = xfs_inobt_lookup(cur, agino, XFS_LOOKUP_LE, 292 &tmp); 293 if (!error && /* no I/O error */ 294 tmp && /* lookup succeeded */ 295 /* got the record, should always work */ 296 !(error = xfs_inobt_get_rec(cur, &r, &i)) && 297 i == 1 && 298 /* this is the right chunk */ 299 agino < r.ir_startino + XFS_INODES_PER_CHUNK && 300 /* lastino was not last in chunk */ 301 (chunkidx = agino - r.ir_startino + 1) < 302 XFS_INODES_PER_CHUNK && 303 /* there are some left allocated */ 304 xfs_inobt_maskn(chunkidx, 305 XFS_INODES_PER_CHUNK - chunkidx) & 306 ~r.ir_free) { 307 /* 308 * Grab the chunk record. Mark all the 309 * uninteresting inodes (because they're 310 * before our start point) free. 311 */ 312 for (i = 0; i < chunkidx; i++) { 313 if (XFS_INOBT_MASK(i) & ~r.ir_free) 314 r.ir_freecount++; 315 } 316 r.ir_free |= xfs_inobt_maskn(0, chunkidx); 317 irbp->ir_startino = r.ir_startino; 318 irbp->ir_freecount = r.ir_freecount; 319 irbp->ir_free = r.ir_free; 320 irbp++; 321 agino = r.ir_startino + XFS_INODES_PER_CHUNK; 322 icount = XFS_INODES_PER_CHUNK - r.ir_freecount; 323 } else { 324 /* 325 * If any of those tests failed, bump the 326 * inode number (just in case). 327 */ 328 agino++; 329 icount = 0; 330 } 331 /* 332 * In any case, increment to the next record. 333 */ 334 if (!error) 335 error = xfs_btree_increment(cur, 0, &tmp); 336 } else { 337 /* 338 * Start of ag. Lookup the first inode chunk. 339 */ 340 error = xfs_inobt_lookup(cur, 0, XFS_LOOKUP_GE, &tmp); 341 icount = 0; 342 } 343 /* 344 * Loop through inode btree records in this ag, 345 * until we run out of inodes or space in the buffer. 346 */ 347 while (irbp < irbufend && icount < ubcount) { 348 xfs_inobt_rec_incore_t r; 349 350 /* 351 * Loop as long as we're unable to read the 352 * inode btree. 353 */ 354 while (error) { 355 agino += XFS_INODES_PER_CHUNK; 356 if (XFS_AGINO_TO_AGBNO(mp, agino) >= 357 be32_to_cpu(agi->agi_length)) 358 break; 359 error = xfs_inobt_lookup(cur, agino, 360 XFS_LOOKUP_GE, &tmp); 361 cond_resched(); 362 } 363 /* 364 * If ran off the end of the ag either with an error, 365 * or the normal way, set end and stop collecting. 366 */ 367 if (error) { 368 end_of_ag = 1; 369 break; 370 } 371 372 error = xfs_inobt_get_rec(cur, &r, &i); 373 if (error || i == 0) { 374 end_of_ag = 1; 375 break; 376 } 377 378 /* 379 * If this chunk has any allocated inodes, save it. 380 * Also start read-ahead now for this chunk. 381 */ 382 if (r.ir_freecount < XFS_INODES_PER_CHUNK) { 383 struct blk_plug plug; 384 /* 385 * Loop over all clusters in the next chunk. 386 * Do a readahead if there are any allocated 387 * inodes in that cluster. 388 */ 389 blk_start_plug(&plug); 390 agbno = XFS_AGINO_TO_AGBNO(mp, r.ir_startino); 391 for (chunkidx = 0; 392 chunkidx < XFS_INODES_PER_CHUNK; 393 chunkidx += nicluster, 394 agbno += nbcluster) { 395 if (xfs_inobt_maskn(chunkidx, nicluster) 396 & ~r.ir_free) 397 xfs_btree_reada_bufs(mp, agno, 398 agbno, nbcluster, 399 &xfs_inode_buf_ops); 400 } 401 blk_finish_plug(&plug); 402 irbp->ir_startino = r.ir_startino; 403 irbp->ir_freecount = r.ir_freecount; 404 irbp->ir_free = r.ir_free; 405 irbp++; 406 icount += XFS_INODES_PER_CHUNK - r.ir_freecount; 407 } 408 /* 409 * Set agino to after this chunk and bump the cursor. 410 */ 411 agino = r.ir_startino + XFS_INODES_PER_CHUNK; 412 error = xfs_btree_increment(cur, 0, &tmp); 413 cond_resched(); 414 } 415 /* 416 * Drop the btree buffers and the agi buffer. 417 * We can't hold any of the locks these represent 418 * when calling iget. 419 */ 420 xfs_btree_del_cursor(cur, XFS_BTREE_NOERROR); 421 xfs_buf_relse(agbp); 422 /* 423 * Now format all the good inodes into the user's buffer. 424 */ 425 irbufend = irbp; 426 for (irbp = irbuf; 427 irbp < irbufend && XFS_BULKSTAT_UBLEFT(ubleft); irbp++) { 428 /* 429 * Now process this chunk of inodes. 430 */ 431 for (agino = irbp->ir_startino, chunkidx = clustidx = 0; 432 XFS_BULKSTAT_UBLEFT(ubleft) && 433 irbp->ir_freecount < XFS_INODES_PER_CHUNK; 434 chunkidx++, clustidx++, agino++) { 435 ASSERT(chunkidx < XFS_INODES_PER_CHUNK); 436 437 ino = XFS_AGINO_TO_INO(mp, agno, agino); 438 /* 439 * Skip if this inode is free. 440 */ 441 if (XFS_INOBT_MASK(chunkidx) & irbp->ir_free) { 442 lastino = ino; 443 continue; 444 } 445 /* 446 * Count used inodes as free so we can tell 447 * when the chunk is used up. 448 */ 449 irbp->ir_freecount++; 450 451 /* 452 * Get the inode and fill in a single buffer. 453 */ 454 ubused = statstruct_size; 455 error = formatter(mp, ino, ubufp, ubleft, 456 &ubused, &fmterror); 457 if (fmterror == BULKSTAT_RV_NOTHING) { 458 if (error && error != ENOENT && 459 error != EINVAL) { 460 ubleft = 0; 461 rval = error; 462 break; 463 } 464 lastino = ino; 465 continue; 466 } 467 if (fmterror == BULKSTAT_RV_GIVEUP) { 468 ubleft = 0; 469 ASSERT(error); 470 rval = error; 471 break; 472 } 473 if (ubufp) 474 ubufp += ubused; 475 ubleft -= ubused; 476 ubelem++; 477 lastino = ino; 478 } 479 480 cond_resched(); 481 } 482 /* 483 * Set up for the next loop iteration. 484 */ 485 if (XFS_BULKSTAT_UBLEFT(ubleft)) { 486 if (end_of_ag) { 487 agno++; 488 agino = 0; 489 } else 490 agino = XFS_INO_TO_AGINO(mp, lastino); 491 } else 492 break; 493 } 494 /* 495 * Done, we're either out of filesystem or space to put the data. 496 */ 497 kmem_free(irbuf); 498 *ubcountp = ubelem; 499 /* 500 * Found some inodes, return them now and return the error next time. 501 */ 502 if (ubelem) 503 rval = 0; 504 if (agno >= mp->m_sb.sb_agcount) { 505 /* 506 * If we ran out of filesystem, mark lastino as off 507 * the end of the filesystem, so the next call 508 * will return immediately. 509 */ 510 *lastinop = (xfs_ino_t)XFS_AGINO_TO_INO(mp, agno, 0); 511 *done = 1; 512 } else 513 *lastinop = (xfs_ino_t)lastino; 514 515 return rval; 516 } 517 518 /* 519 * Return stat information in bulk (by-inode) for the filesystem. 520 * Special case for non-sequential one inode bulkstat. 521 */ 522 int /* error status */ 523 xfs_bulkstat_single( 524 xfs_mount_t *mp, /* mount point for filesystem */ 525 xfs_ino_t *lastinop, /* inode to return */ 526 char __user *buffer, /* buffer with inode stats */ 527 int *done) /* 1 if there are more stats to get */ 528 { 529 int count; /* count value for bulkstat call */ 530 int error; /* return value */ 531 xfs_ino_t ino; /* filesystem inode number */ 532 int res; /* result from bs1 */ 533 534 /* 535 * note that requesting valid inode numbers which are not allocated 536 * to inodes will most likely cause xfs_imap_to_bp to generate warning 537 * messages about bad magic numbers. This is ok. The fact that 538 * the inode isn't actually an inode is handled by the 539 * error check below. Done this way to make the usual case faster 540 * at the expense of the error case. 541 */ 542 543 ino = *lastinop; 544 error = xfs_bulkstat_one(mp, ino, buffer, sizeof(xfs_bstat_t), 545 NULL, &res); 546 if (error) { 547 /* 548 * Special case way failed, do it the "long" way 549 * to see if that works. 550 */ 551 (*lastinop)--; 552 count = 1; 553 if (xfs_bulkstat(mp, lastinop, &count, xfs_bulkstat_one, 554 sizeof(xfs_bstat_t), buffer, done)) 555 return error; 556 if (count == 0 || (xfs_ino_t)*lastinop != ino) 557 return error == EFSCORRUPTED ? 558 XFS_ERROR(EINVAL) : error; 559 else 560 return 0; 561 } 562 *done = 0; 563 return 0; 564 } 565 566 int 567 xfs_inumbers_fmt( 568 void __user *ubuffer, /* buffer to write to */ 569 const xfs_inogrp_t *buffer, /* buffer to read from */ 570 long count, /* # of elements to read */ 571 long *written) /* # of bytes written */ 572 { 573 if (copy_to_user(ubuffer, buffer, count * sizeof(*buffer))) 574 return -EFAULT; 575 *written = count * sizeof(*buffer); 576 return 0; 577 } 578 579 /* 580 * Return inode number table for the filesystem. 581 */ 582 int /* error status */ 583 xfs_inumbers( 584 xfs_mount_t *mp, /* mount point for filesystem */ 585 xfs_ino_t *lastino, /* last inode returned */ 586 int *count, /* size of buffer/count returned */ 587 void __user *ubuffer,/* buffer with inode descriptions */ 588 inumbers_fmt_pf formatter) 589 { 590 xfs_buf_t *agbp; 591 xfs_agino_t agino; 592 xfs_agnumber_t agno; 593 int bcount; 594 xfs_inogrp_t *buffer; 595 int bufidx; 596 xfs_btree_cur_t *cur; 597 int error; 598 xfs_inobt_rec_incore_t r; 599 int i; 600 xfs_ino_t ino; 601 int left; 602 int tmp; 603 604 ino = (xfs_ino_t)*lastino; 605 agno = XFS_INO_TO_AGNO(mp, ino); 606 agino = XFS_INO_TO_AGINO(mp, ino); 607 left = *count; 608 *count = 0; 609 bcount = MIN(left, (int)(PAGE_SIZE / sizeof(*buffer))); 610 buffer = kmem_alloc(bcount * sizeof(*buffer), KM_SLEEP); 611 error = bufidx = 0; 612 cur = NULL; 613 agbp = NULL; 614 while (left > 0 && agno < mp->m_sb.sb_agcount) { 615 if (agbp == NULL) { 616 error = xfs_ialloc_read_agi(mp, NULL, agno, &agbp); 617 if (error) { 618 /* 619 * If we can't read the AGI of this ag, 620 * then just skip to the next one. 621 */ 622 ASSERT(cur == NULL); 623 agbp = NULL; 624 agno++; 625 agino = 0; 626 continue; 627 } 628 cur = xfs_inobt_init_cursor(mp, NULL, agbp, agno); 629 error = xfs_inobt_lookup(cur, agino, XFS_LOOKUP_GE, 630 &tmp); 631 if (error) { 632 xfs_btree_del_cursor(cur, XFS_BTREE_ERROR); 633 cur = NULL; 634 xfs_buf_relse(agbp); 635 agbp = NULL; 636 /* 637 * Move up the last inode in the current 638 * chunk. The lookup_ge will always get 639 * us the first inode in the next chunk. 640 */ 641 agino += XFS_INODES_PER_CHUNK - 1; 642 continue; 643 } 644 } 645 error = xfs_inobt_get_rec(cur, &r, &i); 646 if (error || i == 0) { 647 xfs_buf_relse(agbp); 648 agbp = NULL; 649 xfs_btree_del_cursor(cur, XFS_BTREE_NOERROR); 650 cur = NULL; 651 agno++; 652 agino = 0; 653 continue; 654 } 655 agino = r.ir_startino + XFS_INODES_PER_CHUNK - 1; 656 buffer[bufidx].xi_startino = 657 XFS_AGINO_TO_INO(mp, agno, r.ir_startino); 658 buffer[bufidx].xi_alloccount = 659 XFS_INODES_PER_CHUNK - r.ir_freecount; 660 buffer[bufidx].xi_allocmask = ~r.ir_free; 661 bufidx++; 662 left--; 663 if (bufidx == bcount) { 664 long written; 665 if (formatter(ubuffer, buffer, bufidx, &written)) { 666 error = XFS_ERROR(EFAULT); 667 break; 668 } 669 ubuffer += written; 670 *count += bufidx; 671 bufidx = 0; 672 } 673 if (left) { 674 error = xfs_btree_increment(cur, 0, &tmp); 675 if (error) { 676 xfs_btree_del_cursor(cur, XFS_BTREE_ERROR); 677 cur = NULL; 678 xfs_buf_relse(agbp); 679 agbp = NULL; 680 /* 681 * The agino value has already been bumped. 682 * Just try to skip up to it. 683 */ 684 agino += XFS_INODES_PER_CHUNK; 685 continue; 686 } 687 } 688 } 689 if (!error) { 690 if (bufidx) { 691 long written; 692 if (formatter(ubuffer, buffer, bufidx, &written)) 693 error = XFS_ERROR(EFAULT); 694 else 695 *count += bufidx; 696 } 697 *lastino = XFS_AGINO_TO_INO(mp, agno, agino); 698 } 699 kmem_free(buffer); 700 if (cur) 701 xfs_btree_del_cursor(cur, (error ? XFS_BTREE_ERROR : 702 XFS_BTREE_NOERROR)); 703 if (agbp) 704 xfs_buf_relse(agbp); 705 return error; 706 } 707