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 blks_per_cluster; /* # of blocks per cluster */ 213 int inodes_per_cluster;/* # of inodes per cluster */ 214 int nirbuf; /* size of irbuf */ 215 int rval; /* return value error code */ 216 int tmp; /* result value from btree calls */ 217 int ubcount; /* size of user's buffer */ 218 int ubleft; /* bytes left in user's buffer */ 219 char __user *ubufp; /* pointer into user's buffer */ 220 int ubelem; /* spaces used in user's buffer */ 221 int ubused; /* bytes used by formatter */ 222 223 /* 224 * Get the last inode value, see if there's nothing to do. 225 */ 226 ino = (xfs_ino_t)*lastinop; 227 lastino = ino; 228 agno = XFS_INO_TO_AGNO(mp, ino); 229 agino = XFS_INO_TO_AGINO(mp, ino); 230 if (agno >= mp->m_sb.sb_agcount || 231 ino != XFS_AGINO_TO_INO(mp, agno, agino)) { 232 *done = 1; 233 *ubcountp = 0; 234 return 0; 235 } 236 if (!ubcountp || *ubcountp <= 0) { 237 return EINVAL; 238 } 239 ubcount = *ubcountp; /* statstruct's */ 240 ubleft = ubcount * statstruct_size; /* bytes */ 241 *ubcountp = ubelem = 0; 242 *done = 0; 243 fmterror = 0; 244 ubufp = ubuffer; 245 blks_per_cluster = xfs_icluster_size_fsb(mp); 246 inodes_per_cluster = blks_per_cluster << mp->m_sb.sb_inopblog; 247 irbuf = kmem_zalloc_greedy(&irbsize, PAGE_SIZE, PAGE_SIZE * 4); 248 if (!irbuf) 249 return ENOMEM; 250 251 nirbuf = irbsize / sizeof(*irbuf); 252 253 /* 254 * Loop over the allocation groups, starting from the last 255 * inode returned; 0 means start of the allocation group. 256 */ 257 rval = 0; 258 while (XFS_BULKSTAT_UBLEFT(ubleft) && agno < mp->m_sb.sb_agcount) { 259 cond_resched(); 260 error = xfs_ialloc_read_agi(mp, NULL, agno, &agbp); 261 if (error) { 262 /* 263 * Skip this allocation group and go to the next one. 264 */ 265 agno++; 266 agino = 0; 267 continue; 268 } 269 agi = XFS_BUF_TO_AGI(agbp); 270 /* 271 * Allocate and initialize a btree cursor for ialloc btree. 272 */ 273 cur = xfs_inobt_init_cursor(mp, NULL, agbp, agno); 274 irbp = irbuf; 275 irbufend = irbuf + nirbuf; 276 end_of_ag = 0; 277 /* 278 * If we're returning in the middle of an allocation group, 279 * we need to get the remainder of the chunk we're in. 280 */ 281 if (agino > 0) { 282 xfs_inobt_rec_incore_t r; 283 284 /* 285 * Lookup the inode chunk that this inode lives in. 286 */ 287 error = xfs_inobt_lookup(cur, agino, XFS_LOOKUP_LE, 288 &tmp); 289 if (!error && /* no I/O error */ 290 tmp && /* lookup succeeded */ 291 /* got the record, should always work */ 292 !(error = xfs_inobt_get_rec(cur, &r, &i)) && 293 i == 1 && 294 /* this is the right chunk */ 295 agino < r.ir_startino + XFS_INODES_PER_CHUNK && 296 /* lastino was not last in chunk */ 297 (chunkidx = agino - r.ir_startino + 1) < 298 XFS_INODES_PER_CHUNK && 299 /* there are some left allocated */ 300 xfs_inobt_maskn(chunkidx, 301 XFS_INODES_PER_CHUNK - chunkidx) & 302 ~r.ir_free) { 303 /* 304 * Grab the chunk record. Mark all the 305 * uninteresting inodes (because they're 306 * before our start point) free. 307 */ 308 for (i = 0; i < chunkidx; i++) { 309 if (XFS_INOBT_MASK(i) & ~r.ir_free) 310 r.ir_freecount++; 311 } 312 r.ir_free |= xfs_inobt_maskn(0, chunkidx); 313 irbp->ir_startino = r.ir_startino; 314 irbp->ir_freecount = r.ir_freecount; 315 irbp->ir_free = r.ir_free; 316 irbp++; 317 agino = r.ir_startino + XFS_INODES_PER_CHUNK; 318 icount = XFS_INODES_PER_CHUNK - r.ir_freecount; 319 } else { 320 /* 321 * If any of those tests failed, bump the 322 * inode number (just in case). 323 */ 324 agino++; 325 icount = 0; 326 } 327 /* 328 * In any case, increment to the next record. 329 */ 330 if (!error) 331 error = xfs_btree_increment(cur, 0, &tmp); 332 } else { 333 /* 334 * Start of ag. Lookup the first inode chunk. 335 */ 336 error = xfs_inobt_lookup(cur, 0, XFS_LOOKUP_GE, &tmp); 337 icount = 0; 338 } 339 /* 340 * Loop through inode btree records in this ag, 341 * until we run out of inodes or space in the buffer. 342 */ 343 while (irbp < irbufend && icount < ubcount) { 344 xfs_inobt_rec_incore_t r; 345 346 /* 347 * Loop as long as we're unable to read the 348 * inode btree. 349 */ 350 while (error) { 351 agino += XFS_INODES_PER_CHUNK; 352 if (XFS_AGINO_TO_AGBNO(mp, agino) >= 353 be32_to_cpu(agi->agi_length)) 354 break; 355 error = xfs_inobt_lookup(cur, agino, 356 XFS_LOOKUP_GE, &tmp); 357 cond_resched(); 358 } 359 /* 360 * If ran off the end of the ag either with an error, 361 * or the normal way, set end and stop collecting. 362 */ 363 if (error) { 364 end_of_ag = 1; 365 break; 366 } 367 368 error = xfs_inobt_get_rec(cur, &r, &i); 369 if (error || i == 0) { 370 end_of_ag = 1; 371 break; 372 } 373 374 /* 375 * If this chunk has any allocated inodes, save it. 376 * Also start read-ahead now for this chunk. 377 */ 378 if (r.ir_freecount < XFS_INODES_PER_CHUNK) { 379 struct blk_plug plug; 380 /* 381 * Loop over all clusters in the next chunk. 382 * Do a readahead if there are any allocated 383 * inodes in that cluster. 384 */ 385 blk_start_plug(&plug); 386 agbno = XFS_AGINO_TO_AGBNO(mp, r.ir_startino); 387 for (chunkidx = 0; 388 chunkidx < XFS_INODES_PER_CHUNK; 389 chunkidx += inodes_per_cluster, 390 agbno += blks_per_cluster) { 391 if (xfs_inobt_maskn(chunkidx, 392 inodes_per_cluster) & ~r.ir_free) 393 xfs_btree_reada_bufs(mp, agno, 394 agbno, blks_per_cluster, 395 &xfs_inode_buf_ops); 396 } 397 blk_finish_plug(&plug); 398 irbp->ir_startino = r.ir_startino; 399 irbp->ir_freecount = r.ir_freecount; 400 irbp->ir_free = r.ir_free; 401 irbp++; 402 icount += XFS_INODES_PER_CHUNK - r.ir_freecount; 403 } 404 /* 405 * Set agino to after this chunk and bump the cursor. 406 */ 407 agino = r.ir_startino + XFS_INODES_PER_CHUNK; 408 error = xfs_btree_increment(cur, 0, &tmp); 409 cond_resched(); 410 } 411 /* 412 * Drop the btree buffers and the agi buffer. 413 * We can't hold any of the locks these represent 414 * when calling iget. 415 */ 416 xfs_btree_del_cursor(cur, XFS_BTREE_NOERROR); 417 xfs_buf_relse(agbp); 418 /* 419 * Now format all the good inodes into the user's buffer. 420 */ 421 irbufend = irbp; 422 for (irbp = irbuf; 423 irbp < irbufend && XFS_BULKSTAT_UBLEFT(ubleft); irbp++) { 424 /* 425 * Now process this chunk of inodes. 426 */ 427 for (agino = irbp->ir_startino, chunkidx = clustidx = 0; 428 XFS_BULKSTAT_UBLEFT(ubleft) && 429 irbp->ir_freecount < XFS_INODES_PER_CHUNK; 430 chunkidx++, clustidx++, agino++) { 431 ASSERT(chunkidx < XFS_INODES_PER_CHUNK); 432 433 ino = XFS_AGINO_TO_INO(mp, agno, agino); 434 /* 435 * Skip if this inode is free. 436 */ 437 if (XFS_INOBT_MASK(chunkidx) & irbp->ir_free) { 438 lastino = ino; 439 continue; 440 } 441 /* 442 * Count used inodes as free so we can tell 443 * when the chunk is used up. 444 */ 445 irbp->ir_freecount++; 446 447 /* 448 * Get the inode and fill in a single buffer. 449 */ 450 ubused = statstruct_size; 451 error = formatter(mp, ino, ubufp, ubleft, 452 &ubused, &fmterror); 453 if (fmterror == BULKSTAT_RV_NOTHING) { 454 if (error && error != ENOENT && 455 error != EINVAL) { 456 ubleft = 0; 457 rval = error; 458 break; 459 } 460 lastino = ino; 461 continue; 462 } 463 if (fmterror == BULKSTAT_RV_GIVEUP) { 464 ubleft = 0; 465 ASSERT(error); 466 rval = error; 467 break; 468 } 469 if (ubufp) 470 ubufp += ubused; 471 ubleft -= ubused; 472 ubelem++; 473 lastino = ino; 474 } 475 476 cond_resched(); 477 } 478 /* 479 * Set up for the next loop iteration. 480 */ 481 if (XFS_BULKSTAT_UBLEFT(ubleft)) { 482 if (end_of_ag) { 483 agno++; 484 agino = 0; 485 } else 486 agino = XFS_INO_TO_AGINO(mp, lastino); 487 } else 488 break; 489 } 490 /* 491 * Done, we're either out of filesystem or space to put the data. 492 */ 493 kmem_free(irbuf); 494 *ubcountp = ubelem; 495 /* 496 * Found some inodes, return them now and return the error next time. 497 */ 498 if (ubelem) 499 rval = 0; 500 if (agno >= mp->m_sb.sb_agcount) { 501 /* 502 * If we ran out of filesystem, mark lastino as off 503 * the end of the filesystem, so the next call 504 * will return immediately. 505 */ 506 *lastinop = (xfs_ino_t)XFS_AGINO_TO_INO(mp, agno, 0); 507 *done = 1; 508 } else 509 *lastinop = (xfs_ino_t)lastino; 510 511 return rval; 512 } 513 514 /* 515 * Return stat information in bulk (by-inode) for the filesystem. 516 * Special case for non-sequential one inode bulkstat. 517 */ 518 int /* error status */ 519 xfs_bulkstat_single( 520 xfs_mount_t *mp, /* mount point for filesystem */ 521 xfs_ino_t *lastinop, /* inode to return */ 522 char __user *buffer, /* buffer with inode stats */ 523 int *done) /* 1 if there are more stats to get */ 524 { 525 int count; /* count value for bulkstat call */ 526 int error; /* return value */ 527 xfs_ino_t ino; /* filesystem inode number */ 528 int res; /* result from bs1 */ 529 530 /* 531 * note that requesting valid inode numbers which are not allocated 532 * to inodes will most likely cause xfs_imap_to_bp to generate warning 533 * messages about bad magic numbers. This is ok. The fact that 534 * the inode isn't actually an inode is handled by the 535 * error check below. Done this way to make the usual case faster 536 * at the expense of the error case. 537 */ 538 539 ino = *lastinop; 540 error = xfs_bulkstat_one(mp, ino, buffer, sizeof(xfs_bstat_t), 541 NULL, &res); 542 if (error) { 543 /* 544 * Special case way failed, do it the "long" way 545 * to see if that works. 546 */ 547 (*lastinop)--; 548 count = 1; 549 if (xfs_bulkstat(mp, lastinop, &count, xfs_bulkstat_one, 550 sizeof(xfs_bstat_t), buffer, done)) 551 return error; 552 if (count == 0 || (xfs_ino_t)*lastinop != ino) 553 return error == EFSCORRUPTED ? 554 XFS_ERROR(EINVAL) : error; 555 else 556 return 0; 557 } 558 *done = 0; 559 return 0; 560 } 561 562 int 563 xfs_inumbers_fmt( 564 void __user *ubuffer, /* buffer to write to */ 565 const xfs_inogrp_t *buffer, /* buffer to read from */ 566 long count, /* # of elements to read */ 567 long *written) /* # of bytes written */ 568 { 569 if (copy_to_user(ubuffer, buffer, count * sizeof(*buffer))) 570 return -EFAULT; 571 *written = count * sizeof(*buffer); 572 return 0; 573 } 574 575 /* 576 * Return inode number table for the filesystem. 577 */ 578 int /* error status */ 579 xfs_inumbers( 580 xfs_mount_t *mp, /* mount point for filesystem */ 581 xfs_ino_t *lastino, /* last inode returned */ 582 int *count, /* size of buffer/count returned */ 583 void __user *ubuffer,/* buffer with inode descriptions */ 584 inumbers_fmt_pf formatter) 585 { 586 xfs_buf_t *agbp; 587 xfs_agino_t agino; 588 xfs_agnumber_t agno; 589 int bcount; 590 xfs_inogrp_t *buffer; 591 int bufidx; 592 xfs_btree_cur_t *cur; 593 int error; 594 xfs_inobt_rec_incore_t r; 595 int i; 596 xfs_ino_t ino; 597 int left; 598 int tmp; 599 600 ino = (xfs_ino_t)*lastino; 601 agno = XFS_INO_TO_AGNO(mp, ino); 602 agino = XFS_INO_TO_AGINO(mp, ino); 603 left = *count; 604 *count = 0; 605 bcount = MIN(left, (int)(PAGE_SIZE / sizeof(*buffer))); 606 buffer = kmem_alloc(bcount * sizeof(*buffer), KM_SLEEP); 607 error = bufidx = 0; 608 cur = NULL; 609 agbp = NULL; 610 while (left > 0 && agno < mp->m_sb.sb_agcount) { 611 if (agbp == NULL) { 612 error = xfs_ialloc_read_agi(mp, NULL, agno, &agbp); 613 if (error) { 614 /* 615 * If we can't read the AGI of this ag, 616 * then just skip to the next one. 617 */ 618 ASSERT(cur == NULL); 619 agbp = NULL; 620 agno++; 621 agino = 0; 622 continue; 623 } 624 cur = xfs_inobt_init_cursor(mp, NULL, agbp, agno); 625 error = xfs_inobt_lookup(cur, agino, XFS_LOOKUP_GE, 626 &tmp); 627 if (error) { 628 xfs_btree_del_cursor(cur, XFS_BTREE_ERROR); 629 cur = NULL; 630 xfs_buf_relse(agbp); 631 agbp = NULL; 632 /* 633 * Move up the last inode in the current 634 * chunk. The lookup_ge will always get 635 * us the first inode in the next chunk. 636 */ 637 agino += XFS_INODES_PER_CHUNK - 1; 638 continue; 639 } 640 } 641 error = xfs_inobt_get_rec(cur, &r, &i); 642 if (error || i == 0) { 643 xfs_buf_relse(agbp); 644 agbp = NULL; 645 xfs_btree_del_cursor(cur, XFS_BTREE_NOERROR); 646 cur = NULL; 647 agno++; 648 agino = 0; 649 continue; 650 } 651 agino = r.ir_startino + XFS_INODES_PER_CHUNK - 1; 652 buffer[bufidx].xi_startino = 653 XFS_AGINO_TO_INO(mp, agno, r.ir_startino); 654 buffer[bufidx].xi_alloccount = 655 XFS_INODES_PER_CHUNK - r.ir_freecount; 656 buffer[bufidx].xi_allocmask = ~r.ir_free; 657 bufidx++; 658 left--; 659 if (bufidx == bcount) { 660 long written; 661 if (formatter(ubuffer, buffer, bufidx, &written)) { 662 error = XFS_ERROR(EFAULT); 663 break; 664 } 665 ubuffer += written; 666 *count += bufidx; 667 bufidx = 0; 668 } 669 if (left) { 670 error = xfs_btree_increment(cur, 0, &tmp); 671 if (error) { 672 xfs_btree_del_cursor(cur, XFS_BTREE_ERROR); 673 cur = NULL; 674 xfs_buf_relse(agbp); 675 agbp = NULL; 676 /* 677 * The agino value has already been bumped. 678 * Just try to skip up to it. 679 */ 680 agino += XFS_INODES_PER_CHUNK; 681 continue; 682 } 683 } 684 } 685 if (!error) { 686 if (bufidx) { 687 long written; 688 if (formatter(ubuffer, buffer, bufidx, &written)) 689 error = XFS_ERROR(EFAULT); 690 else 691 *count += bufidx; 692 } 693 *lastino = XFS_AGINO_TO_INO(mp, agno, agino); 694 } 695 kmem_free(buffer); 696 if (cur) 697 xfs_btree_del_cursor(cur, (error ? XFS_BTREE_ERROR : 698 XFS_BTREE_NOERROR)); 699 if (agbp) 700 xfs_buf_relse(agbp); 701 return error; 702 } 703