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