3159 lines · c
1// SPDX-License-Identifier: GPL-2.02/*3 * Copyright (c) 2000-2002,2005 Silicon Graphics, Inc.4 * All Rights Reserved.5 */6#include "xfs.h"7#include "xfs_fs.h"8#include "xfs_shared.h"9#include "xfs_format.h"10#include "xfs_log_format.h"11#include "xfs_trans_resv.h"12#include "xfs_bit.h"13#include "xfs_mount.h"14#include "xfs_inode.h"15#include "xfs_btree.h"16#include "xfs_ialloc.h"17#include "xfs_ialloc_btree.h"18#include "xfs_alloc.h"19#include "xfs_errortag.h"20#include "xfs_error.h"21#include "xfs_bmap.h"22#include "xfs_trans.h"23#include "xfs_buf_item.h"24#include "xfs_icreate_item.h"25#include "xfs_icache.h"26#include "xfs_trace.h"27#include "xfs_log.h"28#include "xfs_rmap.h"29#include "xfs_ag.h"30#include "xfs_health.h"31 32/*33 * Lookup a record by ino in the btree given by cur.34 */35int /* error */36xfs_inobt_lookup(37 struct xfs_btree_cur *cur, /* btree cursor */38 xfs_agino_t ino, /* starting inode of chunk */39 xfs_lookup_t dir, /* <=, >=, == */40 int *stat) /* success/failure */41{42 cur->bc_rec.i.ir_startino = ino;43 cur->bc_rec.i.ir_holemask = 0;44 cur->bc_rec.i.ir_count = 0;45 cur->bc_rec.i.ir_freecount = 0;46 cur->bc_rec.i.ir_free = 0;47 return xfs_btree_lookup(cur, dir, stat);48}49 50/*51 * Update the record referred to by cur to the value given.52 * This either works (return 0) or gets an EFSCORRUPTED error.53 */54STATIC int /* error */55xfs_inobt_update(56 struct xfs_btree_cur *cur, /* btree cursor */57 xfs_inobt_rec_incore_t *irec) /* btree record */58{59 union xfs_btree_rec rec;60 61 rec.inobt.ir_startino = cpu_to_be32(irec->ir_startino);62 if (xfs_has_sparseinodes(cur->bc_mp)) {63 rec.inobt.ir_u.sp.ir_holemask = cpu_to_be16(irec->ir_holemask);64 rec.inobt.ir_u.sp.ir_count = irec->ir_count;65 rec.inobt.ir_u.sp.ir_freecount = irec->ir_freecount;66 } else {67 /* ir_holemask/ir_count not supported on-disk */68 rec.inobt.ir_u.f.ir_freecount = cpu_to_be32(irec->ir_freecount);69 }70 rec.inobt.ir_free = cpu_to_be64(irec->ir_free);71 return xfs_btree_update(cur, &rec);72}73 74/* Convert on-disk btree record to incore inobt record. */75void76xfs_inobt_btrec_to_irec(77 struct xfs_mount *mp,78 const union xfs_btree_rec *rec,79 struct xfs_inobt_rec_incore *irec)80{81 irec->ir_startino = be32_to_cpu(rec->inobt.ir_startino);82 if (xfs_has_sparseinodes(mp)) {83 irec->ir_holemask = be16_to_cpu(rec->inobt.ir_u.sp.ir_holemask);84 irec->ir_count = rec->inobt.ir_u.sp.ir_count;85 irec->ir_freecount = rec->inobt.ir_u.sp.ir_freecount;86 } else {87 /*88 * ir_holemask/ir_count not supported on-disk. Fill in hardcoded89 * values for full inode chunks.90 */91 irec->ir_holemask = XFS_INOBT_HOLEMASK_FULL;92 irec->ir_count = XFS_INODES_PER_CHUNK;93 irec->ir_freecount =94 be32_to_cpu(rec->inobt.ir_u.f.ir_freecount);95 }96 irec->ir_free = be64_to_cpu(rec->inobt.ir_free);97}98 99/* Compute the freecount of an incore inode record. */100uint8_t101xfs_inobt_rec_freecount(102 const struct xfs_inobt_rec_incore *irec)103{104 uint64_t realfree = irec->ir_free;105 106 if (xfs_inobt_issparse(irec->ir_holemask))107 realfree &= xfs_inobt_irec_to_allocmask(irec);108 return hweight64(realfree);109}110 111/* Simple checks for inode records. */112xfs_failaddr_t113xfs_inobt_check_irec(114 struct xfs_perag *pag,115 const struct xfs_inobt_rec_incore *irec)116{117 /* Record has to be properly aligned within the AG. */118 if (!xfs_verify_agino(pag, irec->ir_startino))119 return __this_address;120 if (!xfs_verify_agino(pag,121 irec->ir_startino + XFS_INODES_PER_CHUNK - 1))122 return __this_address;123 if (irec->ir_count < XFS_INODES_PER_HOLEMASK_BIT ||124 irec->ir_count > XFS_INODES_PER_CHUNK)125 return __this_address;126 if (irec->ir_freecount > XFS_INODES_PER_CHUNK)127 return __this_address;128 129 if (xfs_inobt_rec_freecount(irec) != irec->ir_freecount)130 return __this_address;131 132 return NULL;133}134 135static inline int136xfs_inobt_complain_bad_rec(137 struct xfs_btree_cur *cur,138 xfs_failaddr_t fa,139 const struct xfs_inobt_rec_incore *irec)140{141 struct xfs_mount *mp = cur->bc_mp;142 143 xfs_warn(mp,144 "%sbt record corruption in AG %d detected at %pS!",145 cur->bc_ops->name, cur->bc_ag.pag->pag_agno, fa);146 xfs_warn(mp,147"start inode 0x%x, count 0x%x, free 0x%x freemask 0x%llx, holemask 0x%x",148 irec->ir_startino, irec->ir_count, irec->ir_freecount,149 irec->ir_free, irec->ir_holemask);150 xfs_btree_mark_sick(cur);151 return -EFSCORRUPTED;152}153 154/*155 * Get the data from the pointed-to record.156 */157int158xfs_inobt_get_rec(159 struct xfs_btree_cur *cur,160 struct xfs_inobt_rec_incore *irec,161 int *stat)162{163 struct xfs_mount *mp = cur->bc_mp;164 union xfs_btree_rec *rec;165 xfs_failaddr_t fa;166 int error;167 168 error = xfs_btree_get_rec(cur, &rec, stat);169 if (error || *stat == 0)170 return error;171 172 xfs_inobt_btrec_to_irec(mp, rec, irec);173 fa = xfs_inobt_check_irec(cur->bc_ag.pag, irec);174 if (fa)175 return xfs_inobt_complain_bad_rec(cur, fa, irec);176 177 return 0;178}179 180/*181 * Insert a single inobt record. Cursor must already point to desired location.182 */183int184xfs_inobt_insert_rec(185 struct xfs_btree_cur *cur,186 uint16_t holemask,187 uint8_t count,188 int32_t freecount,189 xfs_inofree_t free,190 int *stat)191{192 cur->bc_rec.i.ir_holemask = holemask;193 cur->bc_rec.i.ir_count = count;194 cur->bc_rec.i.ir_freecount = freecount;195 cur->bc_rec.i.ir_free = free;196 return xfs_btree_insert(cur, stat);197}198 199/*200 * Insert records describing a newly allocated inode chunk into the inobt.201 */202STATIC int203xfs_inobt_insert(204 struct xfs_perag *pag,205 struct xfs_trans *tp,206 struct xfs_buf *agbp,207 xfs_agino_t newino,208 xfs_agino_t newlen,209 bool is_finobt)210{211 struct xfs_btree_cur *cur;212 xfs_agino_t thisino;213 int i;214 int error;215 216 if (is_finobt)217 cur = xfs_finobt_init_cursor(pag, tp, agbp);218 else219 cur = xfs_inobt_init_cursor(pag, tp, agbp);220 221 for (thisino = newino;222 thisino < newino + newlen;223 thisino += XFS_INODES_PER_CHUNK) {224 error = xfs_inobt_lookup(cur, thisino, XFS_LOOKUP_EQ, &i);225 if (error) {226 xfs_btree_del_cursor(cur, XFS_BTREE_ERROR);227 return error;228 }229 ASSERT(i == 0);230 231 error = xfs_inobt_insert_rec(cur, XFS_INOBT_HOLEMASK_FULL,232 XFS_INODES_PER_CHUNK,233 XFS_INODES_PER_CHUNK,234 XFS_INOBT_ALL_FREE, &i);235 if (error) {236 xfs_btree_del_cursor(cur, XFS_BTREE_ERROR);237 return error;238 }239 ASSERT(i == 1);240 }241 242 xfs_btree_del_cursor(cur, XFS_BTREE_NOERROR);243 244 return 0;245}246 247/*248 * Verify that the number of free inodes in the AGI is correct.249 */250#ifdef DEBUG251static int252xfs_check_agi_freecount(253 struct xfs_btree_cur *cur)254{255 if (cur->bc_nlevels == 1) {256 xfs_inobt_rec_incore_t rec;257 int freecount = 0;258 int error;259 int i;260 261 error = xfs_inobt_lookup(cur, 0, XFS_LOOKUP_GE, &i);262 if (error)263 return error;264 265 do {266 error = xfs_inobt_get_rec(cur, &rec, &i);267 if (error)268 return error;269 270 if (i) {271 freecount += rec.ir_freecount;272 error = xfs_btree_increment(cur, 0, &i);273 if (error)274 return error;275 }276 } while (i == 1);277 278 if (!xfs_is_shutdown(cur->bc_mp))279 ASSERT(freecount == cur->bc_ag.pag->pagi_freecount);280 }281 return 0;282}283#else284#define xfs_check_agi_freecount(cur) 0285#endif286 287/*288 * Initialise a new set of inodes. When called without a transaction context289 * (e.g. from recovery) we initiate a delayed write of the inode buffers rather290 * than logging them (which in a transaction context puts them into the AIL291 * for writeback rather than the xfsbufd queue).292 */293int294xfs_ialloc_inode_init(295 struct xfs_mount *mp,296 struct xfs_trans *tp,297 struct list_head *buffer_list,298 int icount,299 xfs_agnumber_t agno,300 xfs_agblock_t agbno,301 xfs_agblock_t length,302 unsigned int gen)303{304 struct xfs_buf *fbuf;305 struct xfs_dinode *free;306 int nbufs;307 int version;308 int i, j;309 xfs_daddr_t d;310 xfs_ino_t ino = 0;311 int error;312 313 /*314 * Loop over the new block(s), filling in the inodes. For small block315 * sizes, manipulate the inodes in buffers which are multiples of the316 * blocks size.317 */318 nbufs = length / M_IGEO(mp)->blocks_per_cluster;319 320 /*321 * Figure out what version number to use in the inodes we create. If322 * the superblock version has caught up to the one that supports the new323 * inode format, then use the new inode version. Otherwise use the old324 * version so that old kernels will continue to be able to use the file325 * system.326 *327 * For v3 inodes, we also need to write the inode number into the inode,328 * so calculate the first inode number of the chunk here as329 * XFS_AGB_TO_AGINO() only works within a filesystem block, not330 * across multiple filesystem blocks (such as a cluster) and so cannot331 * be used in the cluster buffer loop below.332 *333 * Further, because we are writing the inode directly into the buffer334 * and calculating a CRC on the entire inode, we have ot log the entire335 * inode so that the entire range the CRC covers is present in the log.336 * That means for v3 inode we log the entire buffer rather than just the337 * inode cores.338 */339 if (xfs_has_v3inodes(mp)) {340 version = 3;341 ino = XFS_AGINO_TO_INO(mp, agno, XFS_AGB_TO_AGINO(mp, agbno));342 343 /*344 * log the initialisation that is about to take place as an345 * logical operation. This means the transaction does not346 * need to log the physical changes to the inode buffers as log347 * recovery will know what initialisation is actually needed.348 * Hence we only need to log the buffers as "ordered" buffers so349 * they track in the AIL as if they were physically logged.350 */351 if (tp)352 xfs_icreate_log(tp, agno, agbno, icount,353 mp->m_sb.sb_inodesize, length, gen);354 } else355 version = 2;356 357 for (j = 0; j < nbufs; j++) {358 /*359 * Get the block.360 */361 d = XFS_AGB_TO_DADDR(mp, agno, agbno +362 (j * M_IGEO(mp)->blocks_per_cluster));363 error = xfs_trans_get_buf(tp, mp->m_ddev_targp, d,364 mp->m_bsize * M_IGEO(mp)->blocks_per_cluster,365 XBF_UNMAPPED, &fbuf);366 if (error)367 return error;368 369 /* Initialize the inode buffers and log them appropriately. */370 fbuf->b_ops = &xfs_inode_buf_ops;371 xfs_buf_zero(fbuf, 0, BBTOB(fbuf->b_length));372 for (i = 0; i < M_IGEO(mp)->inodes_per_cluster; i++) {373 int ioffset = i << mp->m_sb.sb_inodelog;374 375 free = xfs_make_iptr(mp, fbuf, i);376 free->di_magic = cpu_to_be16(XFS_DINODE_MAGIC);377 free->di_version = version;378 free->di_gen = cpu_to_be32(gen);379 free->di_next_unlinked = cpu_to_be32(NULLAGINO);380 381 if (version == 3) {382 free->di_ino = cpu_to_be64(ino);383 ino++;384 uuid_copy(&free->di_uuid,385 &mp->m_sb.sb_meta_uuid);386 xfs_dinode_calc_crc(mp, free);387 } else if (tp) {388 /* just log the inode core */389 xfs_trans_log_buf(tp, fbuf, ioffset,390 ioffset + XFS_DINODE_SIZE(mp) - 1);391 }392 }393 394 if (tp) {395 /*396 * Mark the buffer as an inode allocation buffer so it397 * sticks in AIL at the point of this allocation398 * transaction. This ensures the they are on disk before399 * the tail of the log can be moved past this400 * transaction (i.e. by preventing relogging from moving401 * it forward in the log).402 */403 xfs_trans_inode_alloc_buf(tp, fbuf);404 if (version == 3) {405 /*406 * Mark the buffer as ordered so that they are407 * not physically logged in the transaction but408 * still tracked in the AIL as part of the409 * transaction and pin the log appropriately.410 */411 xfs_trans_ordered_buf(tp, fbuf);412 }413 } else {414 fbuf->b_flags |= XBF_DONE;415 xfs_buf_delwri_queue(fbuf, buffer_list);416 xfs_buf_relse(fbuf);417 }418 }419 return 0;420}421 422/*423 * Align startino and allocmask for a recently allocated sparse chunk such that424 * they are fit for insertion (or merge) into the on-disk inode btrees.425 *426 * Background:427 *428 * When enabled, sparse inode support increases the inode alignment from cluster429 * size to inode chunk size. This means that the minimum range between two430 * non-adjacent inode records in the inobt is large enough for a full inode431 * record. This allows for cluster sized, cluster aligned block allocation432 * without need to worry about whether the resulting inode record overlaps with433 * another record in the tree. Without this basic rule, we would have to deal434 * with the consequences of overlap by potentially undoing recent allocations in435 * the inode allocation codepath.436 *437 * Because of this alignment rule (which is enforced on mount), there are two438 * inobt possibilities for newly allocated sparse chunks. One is that the439 * aligned inode record for the chunk covers a range of inodes not already440 * covered in the inobt (i.e., it is safe to insert a new sparse record). The441 * other is that a record already exists at the aligned startino that considers442 * the newly allocated range as sparse. In the latter case, record content is443 * merged in hope that sparse inode chunks fill to full chunks over time.444 */445STATIC void446xfs_align_sparse_ino(447 struct xfs_mount *mp,448 xfs_agino_t *startino,449 uint16_t *allocmask)450{451 xfs_agblock_t agbno;452 xfs_agblock_t mod;453 int offset;454 455 agbno = XFS_AGINO_TO_AGBNO(mp, *startino);456 mod = agbno % mp->m_sb.sb_inoalignmt;457 if (!mod)458 return;459 460 /* calculate the inode offset and align startino */461 offset = XFS_AGB_TO_AGINO(mp, mod);462 *startino -= offset;463 464 /*465 * Since startino has been aligned down, left shift allocmask such that466 * it continues to represent the same physical inodes relative to the467 * new startino.468 */469 *allocmask <<= offset / XFS_INODES_PER_HOLEMASK_BIT;470}471 472/*473 * Determine whether the source inode record can merge into the target. Both474 * records must be sparse, the inode ranges must match and there must be no475 * allocation overlap between the records.476 */477STATIC bool478__xfs_inobt_can_merge(479 struct xfs_inobt_rec_incore *trec, /* tgt record */480 struct xfs_inobt_rec_incore *srec) /* src record */481{482 uint64_t talloc;483 uint64_t salloc;484 485 /* records must cover the same inode range */486 if (trec->ir_startino != srec->ir_startino)487 return false;488 489 /* both records must be sparse */490 if (!xfs_inobt_issparse(trec->ir_holemask) ||491 !xfs_inobt_issparse(srec->ir_holemask))492 return false;493 494 /* both records must track some inodes */495 if (!trec->ir_count || !srec->ir_count)496 return false;497 498 /* can't exceed capacity of a full record */499 if (trec->ir_count + srec->ir_count > XFS_INODES_PER_CHUNK)500 return false;501 502 /* verify there is no allocation overlap */503 talloc = xfs_inobt_irec_to_allocmask(trec);504 salloc = xfs_inobt_irec_to_allocmask(srec);505 if (talloc & salloc)506 return false;507 508 return true;509}510 511/*512 * Merge the source inode record into the target. The caller must call513 * __xfs_inobt_can_merge() to ensure the merge is valid.514 */515STATIC void516__xfs_inobt_rec_merge(517 struct xfs_inobt_rec_incore *trec, /* target */518 struct xfs_inobt_rec_incore *srec) /* src */519{520 ASSERT(trec->ir_startino == srec->ir_startino);521 522 /* combine the counts */523 trec->ir_count += srec->ir_count;524 trec->ir_freecount += srec->ir_freecount;525 526 /*527 * Merge the holemask and free mask. For both fields, 0 bits refer to528 * allocated inodes. We combine the allocated ranges with bitwise AND.529 */530 trec->ir_holemask &= srec->ir_holemask;531 trec->ir_free &= srec->ir_free;532}533 534/*535 * Insert a new sparse inode chunk into the associated inode allocation btree.536 * The inode record for the sparse chunk is pre-aligned to a startino that537 * should match any pre-existing sparse inode record in the tree. This allows538 * sparse chunks to fill over time.539 *540 * If no preexisting record exists, the provided record is inserted.541 * If there is a preexisting record, the provided record is merged with the542 * existing record and updated in place. The merged record is returned in nrec.543 *544 * It is considered corruption if a merge is requested and not possible. Given545 * the sparse inode alignment constraints, this should never happen.546 */547STATIC int548xfs_inobt_insert_sprec(549 struct xfs_perag *pag,550 struct xfs_trans *tp,551 struct xfs_buf *agbp,552 struct xfs_inobt_rec_incore *nrec) /* in/out: new/merged rec. */553{554 struct xfs_mount *mp = pag->pag_mount;555 struct xfs_btree_cur *cur;556 int error;557 int i;558 struct xfs_inobt_rec_incore rec;559 560 cur = xfs_inobt_init_cursor(pag, tp, agbp);561 562 /* the new record is pre-aligned so we know where to look */563 error = xfs_inobt_lookup(cur, nrec->ir_startino, XFS_LOOKUP_EQ, &i);564 if (error)565 goto error;566 /* if nothing there, insert a new record and return */567 if (i == 0) {568 error = xfs_inobt_insert_rec(cur, nrec->ir_holemask,569 nrec->ir_count, nrec->ir_freecount,570 nrec->ir_free, &i);571 if (error)572 goto error;573 if (XFS_IS_CORRUPT(mp, i != 1)) {574 xfs_btree_mark_sick(cur);575 error = -EFSCORRUPTED;576 goto error;577 }578 579 goto out;580 }581 582 /*583 * A record exists at this startino. Merge the records.584 */585 error = xfs_inobt_get_rec(cur, &rec, &i);586 if (error)587 goto error;588 if (XFS_IS_CORRUPT(mp, i != 1)) {589 xfs_btree_mark_sick(cur);590 error = -EFSCORRUPTED;591 goto error;592 }593 if (XFS_IS_CORRUPT(mp, rec.ir_startino != nrec->ir_startino)) {594 xfs_btree_mark_sick(cur);595 error = -EFSCORRUPTED;596 goto error;597 }598 599 /*600 * This should never fail. If we have coexisting records that601 * cannot merge, something is seriously wrong.602 */603 if (XFS_IS_CORRUPT(mp, !__xfs_inobt_can_merge(nrec, &rec))) {604 xfs_btree_mark_sick(cur);605 error = -EFSCORRUPTED;606 goto error;607 }608 609 trace_xfs_irec_merge_pre(mp, pag->pag_agno, rec.ir_startino,610 rec.ir_holemask, nrec->ir_startino,611 nrec->ir_holemask);612 613 /* merge to nrec to output the updated record */614 __xfs_inobt_rec_merge(nrec, &rec);615 616 trace_xfs_irec_merge_post(mp, pag->pag_agno, nrec->ir_startino,617 nrec->ir_holemask);618 619 error = xfs_inobt_rec_check_count(mp, nrec);620 if (error)621 goto error;622 623 error = xfs_inobt_update(cur, nrec);624 if (error)625 goto error;626 627out:628 xfs_btree_del_cursor(cur, XFS_BTREE_NOERROR);629 return 0;630error:631 xfs_btree_del_cursor(cur, XFS_BTREE_ERROR);632 return error;633}634 635/*636 * Insert a new sparse inode chunk into the free inode btree. The inode637 * record for the sparse chunk is pre-aligned to a startino that should match638 * any pre-existing sparse inode record in the tree. This allows sparse chunks639 * to fill over time.640 *641 * The new record is always inserted, overwriting a pre-existing record if642 * there is one.643 */644STATIC int645xfs_finobt_insert_sprec(646 struct xfs_perag *pag,647 struct xfs_trans *tp,648 struct xfs_buf *agbp,649 struct xfs_inobt_rec_incore *nrec) /* in/out: new rec. */650{651 struct xfs_mount *mp = pag->pag_mount;652 struct xfs_btree_cur *cur;653 int error;654 int i;655 656 cur = xfs_finobt_init_cursor(pag, tp, agbp);657 658 /* the new record is pre-aligned so we know where to look */659 error = xfs_inobt_lookup(cur, nrec->ir_startino, XFS_LOOKUP_EQ, &i);660 if (error)661 goto error;662 /* if nothing there, insert a new record and return */663 if (i == 0) {664 error = xfs_inobt_insert_rec(cur, nrec->ir_holemask,665 nrec->ir_count, nrec->ir_freecount,666 nrec->ir_free, &i);667 if (error)668 goto error;669 if (XFS_IS_CORRUPT(mp, i != 1)) {670 xfs_btree_mark_sick(cur);671 error = -EFSCORRUPTED;672 goto error;673 }674 } else {675 error = xfs_inobt_update(cur, nrec);676 if (error)677 goto error;678 }679 680 xfs_btree_del_cursor(cur, XFS_BTREE_NOERROR);681 return 0;682error:683 xfs_btree_del_cursor(cur, XFS_BTREE_ERROR);684 return error;685}686 687 688/*689 * Allocate new inodes in the allocation group specified by agbp. Returns 0 if690 * inodes were allocated in this AG; -EAGAIN if there was no space in this AG so691 * the caller knows it can try another AG, a hard -ENOSPC when over the maximum692 * inode count threshold, or the usual negative error code for other errors.693 */694STATIC int695xfs_ialloc_ag_alloc(696 struct xfs_perag *pag,697 struct xfs_trans *tp,698 struct xfs_buf *agbp)699{700 struct xfs_agi *agi;701 struct xfs_alloc_arg args;702 int error;703 xfs_agino_t newino; /* new first inode's number */704 xfs_agino_t newlen; /* new number of inodes */705 int isaligned = 0; /* inode allocation at stripe */706 /* unit boundary */707 /* init. to full chunk */708 struct xfs_inobt_rec_incore rec;709 struct xfs_ino_geometry *igeo = M_IGEO(tp->t_mountp);710 uint16_t allocmask = (uint16_t) -1;711 int do_sparse = 0;712 713 memset(&args, 0, sizeof(args));714 args.tp = tp;715 args.mp = tp->t_mountp;716 args.fsbno = NULLFSBLOCK;717 args.oinfo = XFS_RMAP_OINFO_INODES;718 args.pag = pag;719 720#ifdef DEBUG721 /* randomly do sparse inode allocations */722 if (xfs_has_sparseinodes(tp->t_mountp) &&723 igeo->ialloc_min_blks < igeo->ialloc_blks)724 do_sparse = get_random_u32_below(2);725#endif726 727 /*728 * Locking will ensure that we don't have two callers in here729 * at one time.730 */731 newlen = igeo->ialloc_inos;732 if (igeo->maxicount &&733 percpu_counter_read_positive(&args.mp->m_icount) + newlen >734 igeo->maxicount)735 return -ENOSPC;736 args.minlen = args.maxlen = igeo->ialloc_blks;737 /*738 * First try to allocate inodes contiguous with the last-allocated739 * chunk of inodes. If the filesystem is striped, this will fill740 * an entire stripe unit with inodes.741 */742 agi = agbp->b_addr;743 newino = be32_to_cpu(agi->agi_newino);744 args.agbno = XFS_AGINO_TO_AGBNO(args.mp, newino) +745 igeo->ialloc_blks;746 if (do_sparse)747 goto sparse_alloc;748 if (likely(newino != NULLAGINO &&749 (args.agbno < be32_to_cpu(agi->agi_length)))) {750 args.prod = 1;751 752 /*753 * We need to take into account alignment here to ensure that754 * we don't modify the free list if we fail to have an exact755 * block. If we don't have an exact match, and every oher756 * attempt allocation attempt fails, we'll end up cancelling757 * a dirty transaction and shutting down.758 *759 * For an exact allocation, alignment must be 1,760 * however we need to take cluster alignment into account when761 * fixing up the freelist. Use the minalignslop field to762 * indicate that extra blocks might be required for alignment,763 * but not to use them in the actual exact allocation.764 */765 args.alignment = 1;766 args.minalignslop = igeo->cluster_align - 1;767 768 /* Allow space for the inode btree to split. */769 args.minleft = igeo->inobt_maxlevels;770 error = xfs_alloc_vextent_exact_bno(&args,771 XFS_AGB_TO_FSB(args.mp, pag->pag_agno,772 args.agbno));773 if (error)774 return error;775 776 /*777 * This request might have dirtied the transaction if the AG can778 * satisfy the request, but the exact block was not available.779 * If the allocation did fail, subsequent requests will relax780 * the exact agbno requirement and increase the alignment781 * instead. It is critical that the total size of the request782 * (len + alignment + slop) does not increase from this point783 * on, so reset minalignslop to ensure it is not included in784 * subsequent requests.785 */786 args.minalignslop = 0;787 }788 789 if (unlikely(args.fsbno == NULLFSBLOCK)) {790 /*791 * Set the alignment for the allocation.792 * If stripe alignment is turned on then align at stripe unit793 * boundary.794 * If the cluster size is smaller than a filesystem block795 * then we're doing I/O for inodes in filesystem block size796 * pieces, so don't need alignment anyway.797 */798 isaligned = 0;799 if (igeo->ialloc_align) {800 ASSERT(!xfs_has_noalign(args.mp));801 args.alignment = args.mp->m_dalign;802 isaligned = 1;803 } else804 args.alignment = igeo->cluster_align;805 /*806 * Allocate a fixed-size extent of inodes.807 */808 args.prod = 1;809 /*810 * Allow space for the inode btree to split.811 */812 args.minleft = igeo->inobt_maxlevels;813 error = xfs_alloc_vextent_near_bno(&args,814 XFS_AGB_TO_FSB(args.mp, pag->pag_agno,815 be32_to_cpu(agi->agi_root)));816 if (error)817 return error;818 }819 820 /*821 * If stripe alignment is turned on, then try again with cluster822 * alignment.823 */824 if (isaligned && args.fsbno == NULLFSBLOCK) {825 args.alignment = igeo->cluster_align;826 error = xfs_alloc_vextent_near_bno(&args,827 XFS_AGB_TO_FSB(args.mp, pag->pag_agno,828 be32_to_cpu(agi->agi_root)));829 if (error)830 return error;831 }832 833 /*834 * Finally, try a sparse allocation if the filesystem supports it and835 * the sparse allocation length is smaller than a full chunk.836 */837 if (xfs_has_sparseinodes(args.mp) &&838 igeo->ialloc_min_blks < igeo->ialloc_blks &&839 args.fsbno == NULLFSBLOCK) {840sparse_alloc:841 args.alignment = args.mp->m_sb.sb_spino_align;842 args.prod = 1;843 844 args.minlen = igeo->ialloc_min_blks;845 args.maxlen = args.minlen;846 847 /*848 * The inode record will be aligned to full chunk size. We must849 * prevent sparse allocation from AG boundaries that result in850 * invalid inode records, such as records that start at agbno 0851 * or extend beyond the AG.852 *853 * Set min agbno to the first aligned, non-zero agbno and max to854 * the last aligned agbno that is at least one full chunk from855 * the end of the AG.856 */857 args.min_agbno = args.mp->m_sb.sb_inoalignmt;858 args.max_agbno = round_down(args.mp->m_sb.sb_agblocks,859 args.mp->m_sb.sb_inoalignmt) -860 igeo->ialloc_blks;861 862 error = xfs_alloc_vextent_near_bno(&args,863 XFS_AGB_TO_FSB(args.mp, pag->pag_agno,864 be32_to_cpu(agi->agi_root)));865 if (error)866 return error;867 868 newlen = XFS_AGB_TO_AGINO(args.mp, args.len);869 ASSERT(newlen <= XFS_INODES_PER_CHUNK);870 allocmask = (1 << (newlen / XFS_INODES_PER_HOLEMASK_BIT)) - 1;871 }872 873 if (args.fsbno == NULLFSBLOCK)874 return -EAGAIN;875 876 ASSERT(args.len == args.minlen);877 878 /*879 * Stamp and write the inode buffers.880 *881 * Seed the new inode cluster with a random generation number. This882 * prevents short-term reuse of generation numbers if a chunk is883 * freed and then immediately reallocated. We use random numbers884 * rather than a linear progression to prevent the next generation885 * number from being easily guessable.886 */887 error = xfs_ialloc_inode_init(args.mp, tp, NULL, newlen, pag->pag_agno,888 args.agbno, args.len, get_random_u32());889 890 if (error)891 return error;892 /*893 * Convert the results.894 */895 newino = XFS_AGB_TO_AGINO(args.mp, args.agbno);896 897 if (xfs_inobt_issparse(~allocmask)) {898 /*899 * We've allocated a sparse chunk. Align the startino and mask.900 */901 xfs_align_sparse_ino(args.mp, &newino, &allocmask);902 903 rec.ir_startino = newino;904 rec.ir_holemask = ~allocmask;905 rec.ir_count = newlen;906 rec.ir_freecount = newlen;907 rec.ir_free = XFS_INOBT_ALL_FREE;908 909 /*910 * Insert the sparse record into the inobt and allow for a merge911 * if necessary. If a merge does occur, rec is updated to the912 * merged record.913 */914 error = xfs_inobt_insert_sprec(pag, tp, agbp, &rec);915 if (error == -EFSCORRUPTED) {916 xfs_alert(args.mp,917 "invalid sparse inode record: ino 0x%llx holemask 0x%x count %u",918 XFS_AGINO_TO_INO(args.mp, pag->pag_agno,919 rec.ir_startino),920 rec.ir_holemask, rec.ir_count);921 xfs_force_shutdown(args.mp, SHUTDOWN_CORRUPT_INCORE);922 }923 if (error)924 return error;925 926 /*927 * We can't merge the part we've just allocated as for the inobt928 * due to finobt semantics. The original record may or may not929 * exist independent of whether physical inodes exist in this930 * sparse chunk.931 *932 * We must update the finobt record based on the inobt record.933 * rec contains the fully merged and up to date inobt record934 * from the previous call. Set merge false to replace any935 * existing record with this one.936 */937 if (xfs_has_finobt(args.mp)) {938 error = xfs_finobt_insert_sprec(pag, tp, agbp, &rec);939 if (error)940 return error;941 }942 } else {943 /* full chunk - insert new records to both btrees */944 error = xfs_inobt_insert(pag, tp, agbp, newino, newlen, false);945 if (error)946 return error;947 948 if (xfs_has_finobt(args.mp)) {949 error = xfs_inobt_insert(pag, tp, agbp, newino,950 newlen, true);951 if (error)952 return error;953 }954 }955 956 /*957 * Update AGI counts and newino.958 */959 be32_add_cpu(&agi->agi_count, newlen);960 be32_add_cpu(&agi->agi_freecount, newlen);961 pag->pagi_freecount += newlen;962 pag->pagi_count += newlen;963 agi->agi_newino = cpu_to_be32(newino);964 965 /*966 * Log allocation group header fields967 */968 xfs_ialloc_log_agi(tp, agbp,969 XFS_AGI_COUNT | XFS_AGI_FREECOUNT | XFS_AGI_NEWINO);970 /*971 * Modify/log superblock values for inode count and inode free count.972 */973 xfs_trans_mod_sb(tp, XFS_TRANS_SB_ICOUNT, (long)newlen);974 xfs_trans_mod_sb(tp, XFS_TRANS_SB_IFREE, (long)newlen);975 return 0;976}977 978/*979 * Try to retrieve the next record to the left/right from the current one.980 */981STATIC int982xfs_ialloc_next_rec(983 struct xfs_btree_cur *cur,984 xfs_inobt_rec_incore_t *rec,985 int *done,986 int left)987{988 int error;989 int i;990 991 if (left)992 error = xfs_btree_decrement(cur, 0, &i);993 else994 error = xfs_btree_increment(cur, 0, &i);995 996 if (error)997 return error;998 *done = !i;999 if (i) {1000 error = xfs_inobt_get_rec(cur, rec, &i);1001 if (error)1002 return error;1003 if (XFS_IS_CORRUPT(cur->bc_mp, i != 1)) {1004 xfs_btree_mark_sick(cur);1005 return -EFSCORRUPTED;1006 }1007 }1008 1009 return 0;1010}1011 1012STATIC int1013xfs_ialloc_get_rec(1014 struct xfs_btree_cur *cur,1015 xfs_agino_t agino,1016 xfs_inobt_rec_incore_t *rec,1017 int *done)1018{1019 int error;1020 int i;1021 1022 error = xfs_inobt_lookup(cur, agino, XFS_LOOKUP_EQ, &i);1023 if (error)1024 return error;1025 *done = !i;1026 if (i) {1027 error = xfs_inobt_get_rec(cur, rec, &i);1028 if (error)1029 return error;1030 if (XFS_IS_CORRUPT(cur->bc_mp, i != 1)) {1031 xfs_btree_mark_sick(cur);1032 return -EFSCORRUPTED;1033 }1034 }1035 1036 return 0;1037}1038 1039/*1040 * Return the offset of the first free inode in the record. If the inode chunk1041 * is sparsely allocated, we convert the record holemask to inode granularity1042 * and mask off the unallocated regions from the inode free mask.1043 */1044STATIC int1045xfs_inobt_first_free_inode(1046 struct xfs_inobt_rec_incore *rec)1047{1048 xfs_inofree_t realfree;1049 1050 /* if there are no holes, return the first available offset */1051 if (!xfs_inobt_issparse(rec->ir_holemask))1052 return xfs_lowbit64(rec->ir_free);1053 1054 realfree = xfs_inobt_irec_to_allocmask(rec);1055 realfree &= rec->ir_free;1056 1057 return xfs_lowbit64(realfree);1058}1059 1060/*1061 * If this AG has corrupt inodes, check if allocating this inode would fail1062 * with corruption errors. Returns 0 if we're clear, or EAGAIN to try again1063 * somewhere else.1064 */1065static int1066xfs_dialloc_check_ino(1067 struct xfs_perag *pag,1068 struct xfs_trans *tp,1069 xfs_ino_t ino)1070{1071 struct xfs_imap imap;1072 struct xfs_buf *bp;1073 int error;1074 1075 error = xfs_imap(pag, tp, ino, &imap, 0);1076 if (error)1077 return -EAGAIN;1078 1079 error = xfs_imap_to_bp(pag->pag_mount, tp, &imap, &bp);1080 if (error)1081 return -EAGAIN;1082 1083 xfs_trans_brelse(tp, bp);1084 return 0;1085}1086 1087/*1088 * Allocate an inode using the inobt-only algorithm.1089 */1090STATIC int1091xfs_dialloc_ag_inobt(1092 struct xfs_perag *pag,1093 struct xfs_trans *tp,1094 struct xfs_buf *agbp,1095 xfs_ino_t parent,1096 xfs_ino_t *inop)1097{1098 struct xfs_mount *mp = tp->t_mountp;1099 struct xfs_agi *agi = agbp->b_addr;1100 xfs_agnumber_t pagno = XFS_INO_TO_AGNO(mp, parent);1101 xfs_agino_t pagino = XFS_INO_TO_AGINO(mp, parent);1102 struct xfs_btree_cur *cur, *tcur;1103 struct xfs_inobt_rec_incore rec, trec;1104 xfs_ino_t ino;1105 int error;1106 int offset;1107 int i, j;1108 int searchdistance = 10;1109 1110 ASSERT(xfs_perag_initialised_agi(pag));1111 ASSERT(xfs_perag_allows_inodes(pag));1112 ASSERT(pag->pagi_freecount > 0);1113 1114 restart_pagno:1115 cur = xfs_inobt_init_cursor(pag, tp, agbp);1116 /*1117 * If pagino is 0 (this is the root inode allocation) use newino.1118 * This must work because we've just allocated some.1119 */1120 if (!pagino)1121 pagino = be32_to_cpu(agi->agi_newino);1122 1123 error = xfs_check_agi_freecount(cur);1124 if (error)1125 goto error0;1126 1127 /*1128 * If in the same AG as the parent, try to get near the parent.1129 */1130 if (pagno == pag->pag_agno) {1131 int doneleft; /* done, to the left */1132 int doneright; /* done, to the right */1133 1134 error = xfs_inobt_lookup(cur, pagino, XFS_LOOKUP_LE, &i);1135 if (error)1136 goto error0;1137 if (XFS_IS_CORRUPT(mp, i != 1)) {1138 xfs_btree_mark_sick(cur);1139 error = -EFSCORRUPTED;1140 goto error0;1141 }1142 1143 error = xfs_inobt_get_rec(cur, &rec, &j);1144 if (error)1145 goto error0;1146 if (XFS_IS_CORRUPT(mp, j != 1)) {1147 xfs_btree_mark_sick(cur);1148 error = -EFSCORRUPTED;1149 goto error0;1150 }1151 1152 if (rec.ir_freecount > 0) {1153 /*1154 * Found a free inode in the same chunk1155 * as the parent, done.1156 */1157 goto alloc_inode;1158 }1159 1160 1161 /*1162 * In the same AG as parent, but parent's chunk is full.1163 */1164 1165 /* duplicate the cursor, search left & right simultaneously */1166 error = xfs_btree_dup_cursor(cur, &tcur);1167 if (error)1168 goto error0;1169 1170 /*1171 * Skip to last blocks looked up if same parent inode.1172 */1173 if (pagino != NULLAGINO &&1174 pag->pagl_pagino == pagino &&1175 pag->pagl_leftrec != NULLAGINO &&1176 pag->pagl_rightrec != NULLAGINO) {1177 error = xfs_ialloc_get_rec(tcur, pag->pagl_leftrec,1178 &trec, &doneleft);1179 if (error)1180 goto error1;1181 1182 error = xfs_ialloc_get_rec(cur, pag->pagl_rightrec,1183 &rec, &doneright);1184 if (error)1185 goto error1;1186 } else {1187 /* search left with tcur, back up 1 record */1188 error = xfs_ialloc_next_rec(tcur, &trec, &doneleft, 1);1189 if (error)1190 goto error1;1191 1192 /* search right with cur, go forward 1 record. */1193 error = xfs_ialloc_next_rec(cur, &rec, &doneright, 0);1194 if (error)1195 goto error1;1196 }1197 1198 /*1199 * Loop until we find an inode chunk with a free inode.1200 */1201 while (--searchdistance > 0 && (!doneleft || !doneright)) {1202 int useleft; /* using left inode chunk this time */1203 1204 /* figure out the closer block if both are valid. */1205 if (!doneleft && !doneright) {1206 useleft = pagino -1207 (trec.ir_startino + XFS_INODES_PER_CHUNK - 1) <1208 rec.ir_startino - pagino;1209 } else {1210 useleft = !doneleft;1211 }1212 1213 /* free inodes to the left? */1214 if (useleft && trec.ir_freecount) {1215 xfs_btree_del_cursor(cur, XFS_BTREE_NOERROR);1216 cur = tcur;1217 1218 pag->pagl_leftrec = trec.ir_startino;1219 pag->pagl_rightrec = rec.ir_startino;1220 pag->pagl_pagino = pagino;1221 rec = trec;1222 goto alloc_inode;1223 }1224 1225 /* free inodes to the right? */1226 if (!useleft && rec.ir_freecount) {1227 xfs_btree_del_cursor(tcur, XFS_BTREE_NOERROR);1228 1229 pag->pagl_leftrec = trec.ir_startino;1230 pag->pagl_rightrec = rec.ir_startino;1231 pag->pagl_pagino = pagino;1232 goto alloc_inode;1233 }1234 1235 /* get next record to check */1236 if (useleft) {1237 error = xfs_ialloc_next_rec(tcur, &trec,1238 &doneleft, 1);1239 } else {1240 error = xfs_ialloc_next_rec(cur, &rec,1241 &doneright, 0);1242 }1243 if (error)1244 goto error1;1245 }1246 1247 if (searchdistance <= 0) {1248 /*1249 * Not in range - save last search1250 * location and allocate a new inode1251 */1252 xfs_btree_del_cursor(tcur, XFS_BTREE_NOERROR);1253 pag->pagl_leftrec = trec.ir_startino;1254 pag->pagl_rightrec = rec.ir_startino;1255 pag->pagl_pagino = pagino;1256 1257 } else {1258 /*1259 * We've reached the end of the btree. because1260 * we are only searching a small chunk of the1261 * btree each search, there is obviously free1262 * inodes closer to the parent inode than we1263 * are now. restart the search again.1264 */1265 pag->pagl_pagino = NULLAGINO;1266 pag->pagl_leftrec = NULLAGINO;1267 pag->pagl_rightrec = NULLAGINO;1268 xfs_btree_del_cursor(tcur, XFS_BTREE_NOERROR);1269 xfs_btree_del_cursor(cur, XFS_BTREE_NOERROR);1270 goto restart_pagno;1271 }1272 }1273 1274 /*1275 * In a different AG from the parent.1276 * See if the most recently allocated block has any free.1277 */1278 if (agi->agi_newino != cpu_to_be32(NULLAGINO)) {1279 error = xfs_inobt_lookup(cur, be32_to_cpu(agi->agi_newino),1280 XFS_LOOKUP_EQ, &i);1281 if (error)1282 goto error0;1283 1284 if (i == 1) {1285 error = xfs_inobt_get_rec(cur, &rec, &j);1286 if (error)1287 goto error0;1288 1289 if (j == 1 && rec.ir_freecount > 0) {1290 /*1291 * The last chunk allocated in the group1292 * still has a free inode.1293 */1294 goto alloc_inode;1295 }1296 }1297 }1298 1299 /*1300 * None left in the last group, search the whole AG1301 */1302 error = xfs_inobt_lookup(cur, 0, XFS_LOOKUP_GE, &i);1303 if (error)1304 goto error0;1305 if (XFS_IS_CORRUPT(mp, i != 1)) {1306 xfs_btree_mark_sick(cur);1307 error = -EFSCORRUPTED;1308 goto error0;1309 }1310 1311 for (;;) {1312 error = xfs_inobt_get_rec(cur, &rec, &i);1313 if (error)1314 goto error0;1315 if (XFS_IS_CORRUPT(mp, i != 1)) {1316 xfs_btree_mark_sick(cur);1317 error = -EFSCORRUPTED;1318 goto error0;1319 }1320 if (rec.ir_freecount > 0)1321 break;1322 error = xfs_btree_increment(cur, 0, &i);1323 if (error)1324 goto error0;1325 if (XFS_IS_CORRUPT(mp, i != 1)) {1326 xfs_btree_mark_sick(cur);1327 error = -EFSCORRUPTED;1328 goto error0;1329 }1330 }1331 1332alloc_inode:1333 offset = xfs_inobt_first_free_inode(&rec);1334 ASSERT(offset >= 0);1335 ASSERT(offset < XFS_INODES_PER_CHUNK);1336 ASSERT((XFS_AGINO_TO_OFFSET(mp, rec.ir_startino) %1337 XFS_INODES_PER_CHUNK) == 0);1338 ino = XFS_AGINO_TO_INO(mp, pag->pag_agno, rec.ir_startino + offset);1339 1340 if (xfs_ag_has_sickness(pag, XFS_SICK_AG_INODES)) {1341 error = xfs_dialloc_check_ino(pag, tp, ino);1342 if (error)1343 goto error0;1344 }1345 1346 rec.ir_free &= ~XFS_INOBT_MASK(offset);1347 rec.ir_freecount--;1348 error = xfs_inobt_update(cur, &rec);1349 if (error)1350 goto error0;1351 be32_add_cpu(&agi->agi_freecount, -1);1352 xfs_ialloc_log_agi(tp, agbp, XFS_AGI_FREECOUNT);1353 pag->pagi_freecount--;1354 1355 error = xfs_check_agi_freecount(cur);1356 if (error)1357 goto error0;1358 1359 xfs_btree_del_cursor(cur, XFS_BTREE_NOERROR);1360 xfs_trans_mod_sb(tp, XFS_TRANS_SB_IFREE, -1);1361 *inop = ino;1362 return 0;1363error1:1364 xfs_btree_del_cursor(tcur, XFS_BTREE_ERROR);1365error0:1366 xfs_btree_del_cursor(cur, XFS_BTREE_ERROR);1367 return error;1368}1369 1370/*1371 * Use the free inode btree to allocate an inode based on distance from the1372 * parent. Note that the provided cursor may be deleted and replaced.1373 */1374STATIC int1375xfs_dialloc_ag_finobt_near(1376 xfs_agino_t pagino,1377 struct xfs_btree_cur **ocur,1378 struct xfs_inobt_rec_incore *rec)1379{1380 struct xfs_btree_cur *lcur = *ocur; /* left search cursor */1381 struct xfs_btree_cur *rcur; /* right search cursor */1382 struct xfs_inobt_rec_incore rrec;1383 int error;1384 int i, j;1385 1386 error = xfs_inobt_lookup(lcur, pagino, XFS_LOOKUP_LE, &i);1387 if (error)1388 return error;1389 1390 if (i == 1) {1391 error = xfs_inobt_get_rec(lcur, rec, &i);1392 if (error)1393 return error;1394 if (XFS_IS_CORRUPT(lcur->bc_mp, i != 1)) {1395 xfs_btree_mark_sick(lcur);1396 return -EFSCORRUPTED;1397 }1398 1399 /*1400 * See if we've landed in the parent inode record. The finobt1401 * only tracks chunks with at least one free inode, so record1402 * existence is enough.1403 */1404 if (pagino >= rec->ir_startino &&1405 pagino < (rec->ir_startino + XFS_INODES_PER_CHUNK))1406 return 0;1407 }1408 1409 error = xfs_btree_dup_cursor(lcur, &rcur);1410 if (error)1411 return error;1412 1413 error = xfs_inobt_lookup(rcur, pagino, XFS_LOOKUP_GE, &j);1414 if (error)1415 goto error_rcur;1416 if (j == 1) {1417 error = xfs_inobt_get_rec(rcur, &rrec, &j);1418 if (error)1419 goto error_rcur;1420 if (XFS_IS_CORRUPT(lcur->bc_mp, j != 1)) {1421 xfs_btree_mark_sick(lcur);1422 error = -EFSCORRUPTED;1423 goto error_rcur;1424 }1425 }1426 1427 if (XFS_IS_CORRUPT(lcur->bc_mp, i != 1 && j != 1)) {1428 xfs_btree_mark_sick(lcur);1429 error = -EFSCORRUPTED;1430 goto error_rcur;1431 }1432 if (i == 1 && j == 1) {1433 /*1434 * Both the left and right records are valid. Choose the closer1435 * inode chunk to the target.1436 */1437 if ((pagino - rec->ir_startino + XFS_INODES_PER_CHUNK - 1) >1438 (rrec.ir_startino - pagino)) {1439 *rec = rrec;1440 xfs_btree_del_cursor(lcur, XFS_BTREE_NOERROR);1441 *ocur = rcur;1442 } else {1443 xfs_btree_del_cursor(rcur, XFS_BTREE_NOERROR);1444 }1445 } else if (j == 1) {1446 /* only the right record is valid */1447 *rec = rrec;1448 xfs_btree_del_cursor(lcur, XFS_BTREE_NOERROR);1449 *ocur = rcur;1450 } else if (i == 1) {1451 /* only the left record is valid */1452 xfs_btree_del_cursor(rcur, XFS_BTREE_NOERROR);1453 }1454 1455 return 0;1456 1457error_rcur:1458 xfs_btree_del_cursor(rcur, XFS_BTREE_ERROR);1459 return error;1460}1461 1462/*1463 * Use the free inode btree to find a free inode based on a newino hint. If1464 * the hint is NULL, find the first free inode in the AG.1465 */1466STATIC int1467xfs_dialloc_ag_finobt_newino(1468 struct xfs_agi *agi,1469 struct xfs_btree_cur *cur,1470 struct xfs_inobt_rec_incore *rec)1471{1472 int error;1473 int i;1474 1475 if (agi->agi_newino != cpu_to_be32(NULLAGINO)) {1476 error = xfs_inobt_lookup(cur, be32_to_cpu(agi->agi_newino),1477 XFS_LOOKUP_EQ, &i);1478 if (error)1479 return error;1480 if (i == 1) {1481 error = xfs_inobt_get_rec(cur, rec, &i);1482 if (error)1483 return error;1484 if (XFS_IS_CORRUPT(cur->bc_mp, i != 1)) {1485 xfs_btree_mark_sick(cur);1486 return -EFSCORRUPTED;1487 }1488 return 0;1489 }1490 }1491 1492 /*1493 * Find the first inode available in the AG.1494 */1495 error = xfs_inobt_lookup(cur, 0, XFS_LOOKUP_GE, &i);1496 if (error)1497 return error;1498 if (XFS_IS_CORRUPT(cur->bc_mp, i != 1)) {1499 xfs_btree_mark_sick(cur);1500 return -EFSCORRUPTED;1501 }1502 1503 error = xfs_inobt_get_rec(cur, rec, &i);1504 if (error)1505 return error;1506 if (XFS_IS_CORRUPT(cur->bc_mp, i != 1)) {1507 xfs_btree_mark_sick(cur);1508 return -EFSCORRUPTED;1509 }1510 1511 return 0;1512}1513 1514/*1515 * Update the inobt based on a modification made to the finobt. Also ensure that1516 * the records from both trees are equivalent post-modification.1517 */1518STATIC int1519xfs_dialloc_ag_update_inobt(1520 struct xfs_btree_cur *cur, /* inobt cursor */1521 struct xfs_inobt_rec_incore *frec, /* finobt record */1522 int offset) /* inode offset */1523{1524 struct xfs_inobt_rec_incore rec;1525 int error;1526 int i;1527 1528 error = xfs_inobt_lookup(cur, frec->ir_startino, XFS_LOOKUP_EQ, &i);1529 if (error)1530 return error;1531 if (XFS_IS_CORRUPT(cur->bc_mp, i != 1)) {1532 xfs_btree_mark_sick(cur);1533 return -EFSCORRUPTED;1534 }1535 1536 error = xfs_inobt_get_rec(cur, &rec, &i);1537 if (error)1538 return error;1539 if (XFS_IS_CORRUPT(cur->bc_mp, i != 1)) {1540 xfs_btree_mark_sick(cur);1541 return -EFSCORRUPTED;1542 }1543 ASSERT((XFS_AGINO_TO_OFFSET(cur->bc_mp, rec.ir_startino) %1544 XFS_INODES_PER_CHUNK) == 0);1545 1546 rec.ir_free &= ~XFS_INOBT_MASK(offset);1547 rec.ir_freecount--;1548 1549 if (XFS_IS_CORRUPT(cur->bc_mp,1550 rec.ir_free != frec->ir_free ||1551 rec.ir_freecount != frec->ir_freecount)) {1552 xfs_btree_mark_sick(cur);1553 return -EFSCORRUPTED;1554 }1555 1556 return xfs_inobt_update(cur, &rec);1557}1558 1559/*1560 * Allocate an inode using the free inode btree, if available. Otherwise, fall1561 * back to the inobt search algorithm.1562 *1563 * The caller selected an AG for us, and made sure that free inodes are1564 * available.1565 */1566static int1567xfs_dialloc_ag(1568 struct xfs_perag *pag,1569 struct xfs_trans *tp,1570 struct xfs_buf *agbp,1571 xfs_ino_t parent,1572 xfs_ino_t *inop)1573{1574 struct xfs_mount *mp = tp->t_mountp;1575 struct xfs_agi *agi = agbp->b_addr;1576 xfs_agnumber_t pagno = XFS_INO_TO_AGNO(mp, parent);1577 xfs_agino_t pagino = XFS_INO_TO_AGINO(mp, parent);1578 struct xfs_btree_cur *cur; /* finobt cursor */1579 struct xfs_btree_cur *icur; /* inobt cursor */1580 struct xfs_inobt_rec_incore rec;1581 xfs_ino_t ino;1582 int error;1583 int offset;1584 int i;1585 1586 if (!xfs_has_finobt(mp))1587 return xfs_dialloc_ag_inobt(pag, tp, agbp, parent, inop);1588 1589 /*1590 * If pagino is 0 (this is the root inode allocation) use newino.1591 * This must work because we've just allocated some.1592 */1593 if (!pagino)1594 pagino = be32_to_cpu(agi->agi_newino);1595 1596 cur = xfs_finobt_init_cursor(pag, tp, agbp);1597 1598 error = xfs_check_agi_freecount(cur);1599 if (error)1600 goto error_cur;1601 1602 /*1603 * The search algorithm depends on whether we're in the same AG as the1604 * parent. If so, find the closest available inode to the parent. If1605 * not, consider the agi hint or find the first free inode in the AG.1606 */1607 if (pag->pag_agno == pagno)1608 error = xfs_dialloc_ag_finobt_near(pagino, &cur, &rec);1609 else1610 error = xfs_dialloc_ag_finobt_newino(agi, cur, &rec);1611 if (error)1612 goto error_cur;1613 1614 offset = xfs_inobt_first_free_inode(&rec);1615 ASSERT(offset >= 0);1616 ASSERT(offset < XFS_INODES_PER_CHUNK);1617 ASSERT((XFS_AGINO_TO_OFFSET(mp, rec.ir_startino) %1618 XFS_INODES_PER_CHUNK) == 0);1619 ino = XFS_AGINO_TO_INO(mp, pag->pag_agno, rec.ir_startino + offset);1620 1621 if (xfs_ag_has_sickness(pag, XFS_SICK_AG_INODES)) {1622 error = xfs_dialloc_check_ino(pag, tp, ino);1623 if (error)1624 goto error_cur;1625 }1626 1627 /*1628 * Modify or remove the finobt record.1629 */1630 rec.ir_free &= ~XFS_INOBT_MASK(offset);1631 rec.ir_freecount--;1632 if (rec.ir_freecount)1633 error = xfs_inobt_update(cur, &rec);1634 else1635 error = xfs_btree_delete(cur, &i);1636 if (error)1637 goto error_cur;1638 1639 /*1640 * The finobt has now been updated appropriately. We haven't updated the1641 * agi and superblock yet, so we can create an inobt cursor and validate1642 * the original freecount. If all is well, make the equivalent update to1643 * the inobt using the finobt record and offset information.1644 */1645 icur = xfs_inobt_init_cursor(pag, tp, agbp);1646 1647 error = xfs_check_agi_freecount(icur);1648 if (error)1649 goto error_icur;1650 1651 error = xfs_dialloc_ag_update_inobt(icur, &rec, offset);1652 if (error)1653 goto error_icur;1654 1655 /*1656 * Both trees have now been updated. We must update the perag and1657 * superblock before we can check the freecount for each btree.1658 */1659 be32_add_cpu(&agi->agi_freecount, -1);1660 xfs_ialloc_log_agi(tp, agbp, XFS_AGI_FREECOUNT);1661 pag->pagi_freecount--;1662 1663 xfs_trans_mod_sb(tp, XFS_TRANS_SB_IFREE, -1);1664 1665 error = xfs_check_agi_freecount(icur);1666 if (error)1667 goto error_icur;1668 error = xfs_check_agi_freecount(cur);1669 if (error)1670 goto error_icur;1671 1672 xfs_btree_del_cursor(icur, XFS_BTREE_NOERROR);1673 xfs_btree_del_cursor(cur, XFS_BTREE_NOERROR);1674 *inop = ino;1675 return 0;1676 1677error_icur:1678 xfs_btree_del_cursor(icur, XFS_BTREE_ERROR);1679error_cur:1680 xfs_btree_del_cursor(cur, XFS_BTREE_ERROR);1681 return error;1682}1683 1684static int1685xfs_dialloc_roll(1686 struct xfs_trans **tpp,1687 struct xfs_buf *agibp)1688{1689 struct xfs_trans *tp = *tpp;1690 struct xfs_dquot_acct *dqinfo;1691 int error;1692 1693 /*1694 * Hold to on to the agibp across the commit so no other allocation can1695 * come in and take the free inodes we just allocated for our caller.1696 */1697 xfs_trans_bhold(tp, agibp);1698 1699 /*1700 * We want the quota changes to be associated with the next transaction,1701 * NOT this one. So, detach the dqinfo from this and attach it to the1702 * next transaction.1703 */1704 dqinfo = tp->t_dqinfo;1705 tp->t_dqinfo = NULL;1706 1707 error = xfs_trans_roll(&tp);1708 1709 /* Re-attach the quota info that we detached from prev trx. */1710 tp->t_dqinfo = dqinfo;1711 1712 /*1713 * Join the buffer even on commit error so that the buffer is released1714 * when the caller cancels the transaction and doesn't have to handle1715 * this error case specially.1716 */1717 xfs_trans_bjoin(tp, agibp);1718 *tpp = tp;1719 return error;1720}1721 1722static bool1723xfs_dialloc_good_ag(1724 struct xfs_perag *pag,1725 struct xfs_trans *tp,1726 umode_t mode,1727 int flags,1728 bool ok_alloc)1729{1730 struct xfs_mount *mp = tp->t_mountp;1731 xfs_extlen_t ineed;1732 xfs_extlen_t longest = 0;1733 int needspace;1734 int error;1735 1736 if (!pag)1737 return false;1738 if (!xfs_perag_allows_inodes(pag))1739 return false;1740 1741 if (!xfs_perag_initialised_agi(pag)) {1742 error = xfs_ialloc_read_agi(pag, tp, 0, NULL);1743 if (error)1744 return false;1745 }1746 1747 if (pag->pagi_freecount)1748 return true;1749 if (!ok_alloc)1750 return false;1751 1752 if (!xfs_perag_initialised_agf(pag)) {1753 error = xfs_alloc_read_agf(pag, tp, flags, NULL);1754 if (error)1755 return false;1756 }1757 1758 /*1759 * Check that there is enough free space for the file plus a chunk of1760 * inodes if we need to allocate some. If this is the first pass across1761 * the AGs, take into account the potential space needed for alignment1762 * of inode chunks when checking the longest contiguous free space in1763 * the AG - this prevents us from getting ENOSPC because we have free1764 * space larger than ialloc_blks but alignment constraints prevent us1765 * from using it.1766 *1767 * If we can't find an AG with space for full alignment slack to be1768 * taken into account, we must be near ENOSPC in all AGs. Hence we1769 * don't include alignment for the second pass and so if we fail1770 * allocation due to alignment issues then it is most likely a real1771 * ENOSPC condition.1772 *1773 * XXX(dgc): this calculation is now bogus thanks to the per-ag1774 * reservations that xfs_alloc_fix_freelist() now does via1775 * xfs_alloc_space_available(). When the AG fills up, pagf_freeblks will1776 * be more than large enough for the check below to succeed, but1777 * xfs_alloc_space_available() will fail because of the non-zero1778 * metadata reservation and hence we won't actually be able to allocate1779 * more inodes in this AG. We do soooo much unnecessary work near ENOSPC1780 * because of this.1781 */1782 ineed = M_IGEO(mp)->ialloc_min_blks;1783 if (flags && ineed > 1)1784 ineed += M_IGEO(mp)->cluster_align;1785 longest = pag->pagf_longest;1786 if (!longest)1787 longest = pag->pagf_flcount > 0;1788 needspace = S_ISDIR(mode) || S_ISREG(mode) || S_ISLNK(mode);1789 1790 if (pag->pagf_freeblks < needspace + ineed || longest < ineed)1791 return false;1792 return true;1793}1794 1795static int1796xfs_dialloc_try_ag(1797 struct xfs_perag *pag,1798 struct xfs_trans **tpp,1799 xfs_ino_t parent,1800 xfs_ino_t *new_ino,1801 bool ok_alloc)1802{1803 struct xfs_buf *agbp;1804 xfs_ino_t ino;1805 int error;1806 1807 /*1808 * Then read in the AGI buffer and recheck with the AGI buffer1809 * lock held.1810 */1811 error = xfs_ialloc_read_agi(pag, *tpp, 0, &agbp);1812 if (error)1813 return error;1814 1815 if (!pag->pagi_freecount) {1816 if (!ok_alloc) {1817 error = -EAGAIN;1818 goto out_release;1819 }1820 1821 error = xfs_ialloc_ag_alloc(pag, *tpp, agbp);1822 if (error < 0)1823 goto out_release;1824 1825 /*1826 * We successfully allocated space for an inode cluster in this1827 * AG. Roll the transaction so that we can allocate one of the1828 * new inodes.1829 */1830 ASSERT(pag->pagi_freecount > 0);1831 error = xfs_dialloc_roll(tpp, agbp);1832 if (error)1833 goto out_release;1834 }1835 1836 /* Allocate an inode in the found AG */1837 error = xfs_dialloc_ag(pag, *tpp, agbp, parent, &ino);1838 if (!error)1839 *new_ino = ino;1840 return error;1841 1842out_release:1843 xfs_trans_brelse(*tpp, agbp);1844 return error;1845}1846 1847/*1848 * Allocate an on-disk inode.1849 *1850 * Mode is used to tell whether the new inode is a directory and hence where to1851 * locate it. The on-disk inode that is allocated will be returned in @new_ino1852 * on success, otherwise an error will be set to indicate the failure (e.g.1853 * -ENOSPC).1854 */1855int1856xfs_dialloc(1857 struct xfs_trans **tpp,1858 const struct xfs_icreate_args *args,1859 xfs_ino_t *new_ino)1860{1861 struct xfs_mount *mp = (*tpp)->t_mountp;1862 xfs_ino_t parent = args->pip ? args->pip->i_ino : 0;1863 umode_t mode = args->mode & S_IFMT;1864 xfs_agnumber_t agno;1865 int error = 0;1866 xfs_agnumber_t start_agno;1867 struct xfs_perag *pag;1868 struct xfs_ino_geometry *igeo = M_IGEO(mp);1869 bool ok_alloc = true;1870 bool low_space = false;1871 int flags;1872 xfs_ino_t ino = NULLFSINO;1873 1874 /*1875 * Directories, symlinks, and regular files frequently allocate at least1876 * one block, so factor that potential expansion when we examine whether1877 * an AG has enough space for file creation.1878 */1879 if (S_ISDIR(mode))1880 start_agno = (atomic_inc_return(&mp->m_agirotor) - 1) %1881 mp->m_maxagi;1882 else {1883 start_agno = XFS_INO_TO_AGNO(mp, parent);1884 if (start_agno >= mp->m_maxagi)1885 start_agno = 0;1886 }1887 1888 /*1889 * If we have already hit the ceiling of inode blocks then clear1890 * ok_alloc so we scan all available agi structures for a free1891 * inode.1892 *1893 * Read rough value of mp->m_icount by percpu_counter_read_positive,1894 * which will sacrifice the preciseness but improve the performance.1895 */1896 if (igeo->maxicount &&1897 percpu_counter_read_positive(&mp->m_icount) + igeo->ialloc_inos1898 > igeo->maxicount) {1899 ok_alloc = false;1900 }1901 1902 /*1903 * If we are near to ENOSPC, we want to prefer allocation from AGs that1904 * have free inodes in them rather than use up free space allocating new1905 * inode chunks. Hence we turn off allocation for the first non-blocking1906 * pass through the AGs if we are near ENOSPC to consume free inodes1907 * that we can immediately allocate, but then we allow allocation on the1908 * second pass if we fail to find an AG with free inodes in it.1909 */1910 if (percpu_counter_read_positive(&mp->m_fdblocks) <1911 mp->m_low_space[XFS_LOWSP_1_PCNT]) {1912 ok_alloc = false;1913 low_space = true;1914 }1915 1916 /*1917 * Loop until we find an allocation group that either has free inodes1918 * or in which we can allocate some inodes. Iterate through the1919 * allocation groups upward, wrapping at the end.1920 */1921 flags = XFS_ALLOC_FLAG_TRYLOCK;1922retry:1923 for_each_perag_wrap_at(mp, start_agno, mp->m_maxagi, agno, pag) {1924 if (xfs_dialloc_good_ag(pag, *tpp, mode, flags, ok_alloc)) {1925 error = xfs_dialloc_try_ag(pag, tpp, parent,1926 &ino, ok_alloc);1927 if (error != -EAGAIN)1928 break;1929 error = 0;1930 }1931 1932 if (xfs_is_shutdown(mp)) {1933 error = -EFSCORRUPTED;1934 break;1935 }1936 }1937 if (pag)1938 xfs_perag_rele(pag);1939 if (error)1940 return error;1941 if (ino == NULLFSINO) {1942 if (flags) {1943 flags = 0;1944 if (low_space)1945 ok_alloc = true;1946 goto retry;1947 }1948 return -ENOSPC;1949 }1950 1951 /*1952 * Protect against obviously corrupt allocation btree records. Later1953 * xfs_iget checks will catch re-allocation of other active in-memory1954 * and on-disk inodes. If we don't catch reallocating the parent inode1955 * here we will deadlock in xfs_iget() so we have to do these checks1956 * first.1957 */1958 if (ino == parent || !xfs_verify_dir_ino(mp, ino)) {1959 xfs_alert(mp, "Allocated a known in-use inode 0x%llx!", ino);1960 xfs_agno_mark_sick(mp, XFS_INO_TO_AGNO(mp, ino),1961 XFS_SICK_AG_INOBT);1962 return -EFSCORRUPTED;1963 }1964 1965 *new_ino = ino;1966 return 0;1967}1968 1969/*1970 * Free the blocks of an inode chunk. We must consider that the inode chunk1971 * might be sparse and only free the regions that are allocated as part of the1972 * chunk.1973 */1974static int1975xfs_difree_inode_chunk(1976 struct xfs_trans *tp,1977 xfs_agnumber_t agno,1978 struct xfs_inobt_rec_incore *rec)1979{1980 struct xfs_mount *mp = tp->t_mountp;1981 xfs_agblock_t sagbno = XFS_AGINO_TO_AGBNO(mp,1982 rec->ir_startino);1983 int startidx, endidx;1984 int nextbit;1985 xfs_agblock_t agbno;1986 int contigblk;1987 DECLARE_BITMAP(holemask, XFS_INOBT_HOLEMASK_BITS);1988 1989 if (!xfs_inobt_issparse(rec->ir_holemask)) {1990 /* not sparse, calculate extent info directly */1991 return xfs_free_extent_later(tp,1992 XFS_AGB_TO_FSB(mp, agno, sagbno),1993 M_IGEO(mp)->ialloc_blks, &XFS_RMAP_OINFO_INODES,1994 XFS_AG_RESV_NONE, 0);1995 }1996 1997 /* holemask is only 16-bits (fits in an unsigned long) */1998 ASSERT(sizeof(rec->ir_holemask) <= sizeof(holemask[0]));1999 holemask[0] = rec->ir_holemask;2000 2001 /*2002 * Find contiguous ranges of zeroes (i.e., allocated regions) in the2003 * holemask and convert the start/end index of each range to an extent.2004 * We start with the start and end index both pointing at the first 0 in2005 * the mask.2006 */2007 startidx = endidx = find_first_zero_bit(holemask,2008 XFS_INOBT_HOLEMASK_BITS);2009 nextbit = startidx + 1;2010 while (startidx < XFS_INOBT_HOLEMASK_BITS) {2011 int error;2012 2013 nextbit = find_next_zero_bit(holemask, XFS_INOBT_HOLEMASK_BITS,2014 nextbit);2015 /*2016 * If the next zero bit is contiguous, update the end index of2017 * the current range and continue.2018 */2019 if (nextbit != XFS_INOBT_HOLEMASK_BITS &&2020 nextbit == endidx + 1) {2021 endidx = nextbit;2022 goto next;2023 }2024 2025 /*2026 * nextbit is not contiguous with the current end index. Convert2027 * the current start/end to an extent and add it to the free2028 * list.2029 */2030 agbno = sagbno + (startidx * XFS_INODES_PER_HOLEMASK_BIT) /2031 mp->m_sb.sb_inopblock;2032 contigblk = ((endidx - startidx + 1) *2033 XFS_INODES_PER_HOLEMASK_BIT) /2034 mp->m_sb.sb_inopblock;2035 2036 ASSERT(agbno % mp->m_sb.sb_spino_align == 0);2037 ASSERT(contigblk % mp->m_sb.sb_spino_align == 0);2038 error = xfs_free_extent_later(tp,2039 XFS_AGB_TO_FSB(mp, agno, agbno), contigblk,2040 &XFS_RMAP_OINFO_INODES, XFS_AG_RESV_NONE, 0);2041 if (error)2042 return error;2043 2044 /* reset range to current bit and carry on... */2045 startidx = endidx = nextbit;2046 2047next:2048 nextbit++;2049 }2050 return 0;2051}2052 2053STATIC int2054xfs_difree_inobt(2055 struct xfs_perag *pag,2056 struct xfs_trans *tp,2057 struct xfs_buf *agbp,2058 xfs_agino_t agino,2059 struct xfs_icluster *xic,2060 struct xfs_inobt_rec_incore *orec)2061{2062 struct xfs_mount *mp = pag->pag_mount;2063 struct xfs_agi *agi = agbp->b_addr;2064 struct xfs_btree_cur *cur;2065 struct xfs_inobt_rec_incore rec;2066 int ilen;2067 int error;2068 int i;2069 int off;2070 2071 ASSERT(agi->agi_magicnum == cpu_to_be32(XFS_AGI_MAGIC));2072 ASSERT(XFS_AGINO_TO_AGBNO(mp, agino) < be32_to_cpu(agi->agi_length));2073 2074 /*2075 * Initialize the cursor.2076 */2077 cur = xfs_inobt_init_cursor(pag, tp, agbp);2078 2079 error = xfs_check_agi_freecount(cur);2080 if (error)2081 goto error0;2082 2083 /*2084 * Look for the entry describing this inode.2085 */2086 if ((error = xfs_inobt_lookup(cur, agino, XFS_LOOKUP_LE, &i))) {2087 xfs_warn(mp, "%s: xfs_inobt_lookup() returned error %d.",2088 __func__, error);2089 goto error0;2090 }2091 if (XFS_IS_CORRUPT(mp, i != 1)) {2092 xfs_btree_mark_sick(cur);2093 error = -EFSCORRUPTED;2094 goto error0;2095 }2096 error = xfs_inobt_get_rec(cur, &rec, &i);2097 if (error) {2098 xfs_warn(mp, "%s: xfs_inobt_get_rec() returned error %d.",2099 __func__, error);2100 goto error0;2101 }2102 if (XFS_IS_CORRUPT(mp, i != 1)) {2103 xfs_btree_mark_sick(cur);2104 error = -EFSCORRUPTED;2105 goto error0;2106 }2107 /*2108 * Get the offset in the inode chunk.2109 */2110 off = agino - rec.ir_startino;2111 ASSERT(off >= 0 && off < XFS_INODES_PER_CHUNK);2112 ASSERT(!(rec.ir_free & XFS_INOBT_MASK(off)));2113 /*2114 * Mark the inode free & increment the count.2115 */2116 rec.ir_free |= XFS_INOBT_MASK(off);2117 rec.ir_freecount++;2118 2119 /*2120 * When an inode chunk is free, it becomes eligible for removal. Don't2121 * remove the chunk if the block size is large enough for multiple inode2122 * chunks (that might not be free).2123 */2124 if (!xfs_has_ikeep(mp) && rec.ir_free == XFS_INOBT_ALL_FREE &&2125 mp->m_sb.sb_inopblock <= XFS_INODES_PER_CHUNK) {2126 xic->deleted = true;2127 xic->first_ino = XFS_AGINO_TO_INO(mp, pag->pag_agno,2128 rec.ir_startino);2129 xic->alloc = xfs_inobt_irec_to_allocmask(&rec);2130 2131 /*2132 * Remove the inode cluster from the AGI B+Tree, adjust the2133 * AGI and Superblock inode counts, and mark the disk space2134 * to be freed when the transaction is committed.2135 */2136 ilen = rec.ir_freecount;2137 be32_add_cpu(&agi->agi_count, -ilen);2138 be32_add_cpu(&agi->agi_freecount, -(ilen - 1));2139 xfs_ialloc_log_agi(tp, agbp, XFS_AGI_COUNT | XFS_AGI_FREECOUNT);2140 pag->pagi_freecount -= ilen - 1;2141 pag->pagi_count -= ilen;2142 xfs_trans_mod_sb(tp, XFS_TRANS_SB_ICOUNT, -ilen);2143 xfs_trans_mod_sb(tp, XFS_TRANS_SB_IFREE, -(ilen - 1));2144 2145 if ((error = xfs_btree_delete(cur, &i))) {2146 xfs_warn(mp, "%s: xfs_btree_delete returned error %d.",2147 __func__, error);2148 goto error0;2149 }2150 2151 error = xfs_difree_inode_chunk(tp, pag->pag_agno, &rec);2152 if (error)2153 goto error0;2154 } else {2155 xic->deleted = false;2156 2157 error = xfs_inobt_update(cur, &rec);2158 if (error) {2159 xfs_warn(mp, "%s: xfs_inobt_update returned error %d.",2160 __func__, error);2161 goto error0;2162 }2163 2164 /*2165 * Change the inode free counts and log the ag/sb changes.2166 */2167 be32_add_cpu(&agi->agi_freecount, 1);2168 xfs_ialloc_log_agi(tp, agbp, XFS_AGI_FREECOUNT);2169 pag->pagi_freecount++;2170 xfs_trans_mod_sb(tp, XFS_TRANS_SB_IFREE, 1);2171 }2172 2173 error = xfs_check_agi_freecount(cur);2174 if (error)2175 goto error0;2176 2177 *orec = rec;2178 xfs_btree_del_cursor(cur, XFS_BTREE_NOERROR);2179 return 0;2180 2181error0:2182 xfs_btree_del_cursor(cur, XFS_BTREE_ERROR);2183 return error;2184}2185 2186/*2187 * Free an inode in the free inode btree.2188 */2189STATIC int2190xfs_difree_finobt(2191 struct xfs_perag *pag,2192 struct xfs_trans *tp,2193 struct xfs_buf *agbp,2194 xfs_agino_t agino,2195 struct xfs_inobt_rec_incore *ibtrec) /* inobt record */2196{2197 struct xfs_mount *mp = pag->pag_mount;2198 struct xfs_btree_cur *cur;2199 struct xfs_inobt_rec_incore rec;2200 int offset = agino - ibtrec->ir_startino;2201 int error;2202 int i;2203 2204 cur = xfs_finobt_init_cursor(pag, tp, agbp);2205 2206 error = xfs_inobt_lookup(cur, ibtrec->ir_startino, XFS_LOOKUP_EQ, &i);2207 if (error)2208 goto error;2209 if (i == 0) {2210 /*2211 * If the record does not exist in the finobt, we must have just2212 * freed an inode in a previously fully allocated chunk. If not,2213 * something is out of sync.2214 */2215 if (XFS_IS_CORRUPT(mp, ibtrec->ir_freecount != 1)) {2216 xfs_btree_mark_sick(cur);2217 error = -EFSCORRUPTED;2218 goto error;2219 }2220 2221 error = xfs_inobt_insert_rec(cur, ibtrec->ir_holemask,2222 ibtrec->ir_count,2223 ibtrec->ir_freecount,2224 ibtrec->ir_free, &i);2225 if (error)2226 goto error;2227 ASSERT(i == 1);2228 2229 goto out;2230 }2231 2232 /*2233 * Read and update the existing record. We could just copy the ibtrec2234 * across here, but that would defeat the purpose of having redundant2235 * metadata. By making the modifications independently, we can catch2236 * corruptions that we wouldn't see if we just copied from one record2237 * to another.2238 */2239 error = xfs_inobt_get_rec(cur, &rec, &i);2240 if (error)2241 goto error;2242 if (XFS_IS_CORRUPT(mp, i != 1)) {2243 xfs_btree_mark_sick(cur);2244 error = -EFSCORRUPTED;2245 goto error;2246 }2247 2248 rec.ir_free |= XFS_INOBT_MASK(offset);2249 rec.ir_freecount++;2250 2251 if (XFS_IS_CORRUPT(mp,2252 rec.ir_free != ibtrec->ir_free ||2253 rec.ir_freecount != ibtrec->ir_freecount)) {2254 xfs_btree_mark_sick(cur);2255 error = -EFSCORRUPTED;2256 goto error;2257 }2258 2259 /*2260 * The content of inobt records should always match between the inobt2261 * and finobt. The lifecycle of records in the finobt is different from2262 * the inobt in that the finobt only tracks records with at least one2263 * free inode. Hence, if all of the inodes are free and we aren't2264 * keeping inode chunks permanently on disk, remove the record.2265 * Otherwise, update the record with the new information.2266 *2267 * Note that we currently can't free chunks when the block size is large2268 * enough for multiple chunks. Leave the finobt record to remain in sync2269 * with the inobt.2270 */2271 if (!xfs_has_ikeep(mp) && rec.ir_free == XFS_INOBT_ALL_FREE &&2272 mp->m_sb.sb_inopblock <= XFS_INODES_PER_CHUNK) {2273 error = xfs_btree_delete(cur, &i);2274 if (error)2275 goto error;2276 ASSERT(i == 1);2277 } else {2278 error = xfs_inobt_update(cur, &rec);2279 if (error)2280 goto error;2281 }2282 2283out:2284 error = xfs_check_agi_freecount(cur);2285 if (error)2286 goto error;2287 2288 xfs_btree_del_cursor(cur, XFS_BTREE_NOERROR);2289 return 0;2290 2291error:2292 xfs_btree_del_cursor(cur, XFS_BTREE_ERROR);2293 return error;2294}2295 2296/*2297 * Free disk inode. Carefully avoids touching the incore inode, all2298 * manipulations incore are the caller's responsibility.2299 * The on-disk inode is not changed by this operation, only the2300 * btree (free inode mask) is changed.2301 */2302int2303xfs_difree(2304 struct xfs_trans *tp,2305 struct xfs_perag *pag,2306 xfs_ino_t inode,2307 struct xfs_icluster *xic)2308{2309 /* REFERENCED */2310 xfs_agblock_t agbno; /* block number containing inode */2311 struct xfs_buf *agbp; /* buffer for allocation group header */2312 xfs_agino_t agino; /* allocation group inode number */2313 int error; /* error return value */2314 struct xfs_mount *mp = tp->t_mountp;2315 struct xfs_inobt_rec_incore rec;/* btree record */2316 2317 /*2318 * Break up inode number into its components.2319 */2320 if (pag->pag_agno != XFS_INO_TO_AGNO(mp, inode)) {2321 xfs_warn(mp, "%s: agno != pag->pag_agno (%d != %d).",2322 __func__, XFS_INO_TO_AGNO(mp, inode), pag->pag_agno);2323 ASSERT(0);2324 return -EINVAL;2325 }2326 agino = XFS_INO_TO_AGINO(mp, inode);2327 if (inode != XFS_AGINO_TO_INO(mp, pag->pag_agno, agino)) {2328 xfs_warn(mp, "%s: inode != XFS_AGINO_TO_INO() (%llu != %llu).",2329 __func__, (unsigned long long)inode,2330 (unsigned long long)XFS_AGINO_TO_INO(mp, pag->pag_agno, agino));2331 ASSERT(0);2332 return -EINVAL;2333 }2334 agbno = XFS_AGINO_TO_AGBNO(mp, agino);2335 if (agbno >= mp->m_sb.sb_agblocks) {2336 xfs_warn(mp, "%s: agbno >= mp->m_sb.sb_agblocks (%d >= %d).",2337 __func__, agbno, mp->m_sb.sb_agblocks);2338 ASSERT(0);2339 return -EINVAL;2340 }2341 /*2342 * Get the allocation group header.2343 */2344 error = xfs_ialloc_read_agi(pag, tp, 0, &agbp);2345 if (error) {2346 xfs_warn(mp, "%s: xfs_ialloc_read_agi() returned error %d.",2347 __func__, error);2348 return error;2349 }2350 2351 /*2352 * Fix up the inode allocation btree.2353 */2354 error = xfs_difree_inobt(pag, tp, agbp, agino, xic, &rec);2355 if (error)2356 goto error0;2357 2358 /*2359 * Fix up the free inode btree.2360 */2361 if (xfs_has_finobt(mp)) {2362 error = xfs_difree_finobt(pag, tp, agbp, agino, &rec);2363 if (error)2364 goto error0;2365 }2366 2367 return 0;2368 2369error0:2370 return error;2371}2372 2373STATIC int2374xfs_imap_lookup(2375 struct xfs_perag *pag,2376 struct xfs_trans *tp,2377 xfs_agino_t agino,2378 xfs_agblock_t agbno,2379 xfs_agblock_t *chunk_agbno,2380 xfs_agblock_t *offset_agbno,2381 int flags)2382{2383 struct xfs_mount *mp = pag->pag_mount;2384 struct xfs_inobt_rec_incore rec;2385 struct xfs_btree_cur *cur;2386 struct xfs_buf *agbp;2387 int error;2388 int i;2389 2390 error = xfs_ialloc_read_agi(pag, tp, 0, &agbp);2391 if (error) {2392 xfs_alert(mp,2393 "%s: xfs_ialloc_read_agi() returned error %d, agno %d",2394 __func__, error, pag->pag_agno);2395 return error;2396 }2397 2398 /*2399 * Lookup the inode record for the given agino. If the record cannot be2400 * found, then it's an invalid inode number and we should abort. Once2401 * we have a record, we need to ensure it contains the inode number2402 * we are looking up.2403 */2404 cur = xfs_inobt_init_cursor(pag, tp, agbp);2405 error = xfs_inobt_lookup(cur, agino, XFS_LOOKUP_LE, &i);2406 if (!error) {2407 if (i)2408 error = xfs_inobt_get_rec(cur, &rec, &i);2409 if (!error && i == 0)2410 error = -EINVAL;2411 }2412 2413 xfs_trans_brelse(tp, agbp);2414 xfs_btree_del_cursor(cur, error);2415 if (error)2416 return error;2417 2418 /* check that the returned record contains the required inode */2419 if (rec.ir_startino > agino ||2420 rec.ir_startino + M_IGEO(mp)->ialloc_inos <= agino)2421 return -EINVAL;2422 2423 /* for untrusted inodes check it is allocated first */2424 if ((flags & XFS_IGET_UNTRUSTED) &&2425 (rec.ir_free & XFS_INOBT_MASK(agino - rec.ir_startino)))2426 return -EINVAL;2427 2428 *chunk_agbno = XFS_AGINO_TO_AGBNO(mp, rec.ir_startino);2429 *offset_agbno = agbno - *chunk_agbno;2430 return 0;2431}2432 2433/*2434 * Return the location of the inode in imap, for mapping it into a buffer.2435 */2436int2437xfs_imap(2438 struct xfs_perag *pag,2439 struct xfs_trans *tp,2440 xfs_ino_t ino, /* inode to locate */2441 struct xfs_imap *imap, /* location map structure */2442 uint flags) /* flags for inode btree lookup */2443{2444 struct xfs_mount *mp = pag->pag_mount;2445 xfs_agblock_t agbno; /* block number of inode in the alloc group */2446 xfs_agino_t agino; /* inode number within alloc group */2447 xfs_agblock_t chunk_agbno; /* first block in inode chunk */2448 xfs_agblock_t cluster_agbno; /* first block in inode cluster */2449 int error; /* error code */2450 int offset; /* index of inode in its buffer */2451 xfs_agblock_t offset_agbno; /* blks from chunk start to inode */2452 2453 ASSERT(ino != NULLFSINO);2454 2455 /*2456 * Split up the inode number into its parts.2457 */2458 agino = XFS_INO_TO_AGINO(mp, ino);2459 agbno = XFS_AGINO_TO_AGBNO(mp, agino);2460 if (agbno >= mp->m_sb.sb_agblocks ||2461 ino != XFS_AGINO_TO_INO(mp, pag->pag_agno, agino)) {2462 error = -EINVAL;2463#ifdef DEBUG2464 /*2465 * Don't output diagnostic information for untrusted inodes2466 * as they can be invalid without implying corruption.2467 */2468 if (flags & XFS_IGET_UNTRUSTED)2469 return error;2470 if (agbno >= mp->m_sb.sb_agblocks) {2471 xfs_alert(mp,2472 "%s: agbno (0x%llx) >= mp->m_sb.sb_agblocks (0x%lx)",2473 __func__, (unsigned long long)agbno,2474 (unsigned long)mp->m_sb.sb_agblocks);2475 }2476 if (ino != XFS_AGINO_TO_INO(mp, pag->pag_agno, agino)) {2477 xfs_alert(mp,2478 "%s: ino (0x%llx) != XFS_AGINO_TO_INO() (0x%llx)",2479 __func__, ino,2480 XFS_AGINO_TO_INO(mp, pag->pag_agno, agino));2481 }2482 xfs_stack_trace();2483#endif /* DEBUG */2484 return error;2485 }2486 2487 /*2488 * For bulkstat and handle lookups, we have an untrusted inode number2489 * that we have to verify is valid. We cannot do this just by reading2490 * the inode buffer as it may have been unlinked and removed leaving2491 * inodes in stale state on disk. Hence we have to do a btree lookup2492 * in all cases where an untrusted inode number is passed.2493 */2494 if (flags & XFS_IGET_UNTRUSTED) {2495 error = xfs_imap_lookup(pag, tp, agino, agbno,2496 &chunk_agbno, &offset_agbno, flags);2497 if (error)2498 return error;2499 goto out_map;2500 }2501 2502 /*2503 * If the inode cluster size is the same as the blocksize or2504 * smaller we get to the buffer by simple arithmetics.2505 */2506 if (M_IGEO(mp)->blocks_per_cluster == 1) {2507 offset = XFS_INO_TO_OFFSET(mp, ino);2508 ASSERT(offset < mp->m_sb.sb_inopblock);2509 2510 imap->im_blkno = XFS_AGB_TO_DADDR(mp, pag->pag_agno, agbno);2511 imap->im_len = XFS_FSB_TO_BB(mp, 1);2512 imap->im_boffset = (unsigned short)(offset <<2513 mp->m_sb.sb_inodelog);2514 return 0;2515 }2516 2517 /*2518 * If the inode chunks are aligned then use simple maths to2519 * find the location. Otherwise we have to do a btree2520 * lookup to find the location.2521 */2522 if (M_IGEO(mp)->inoalign_mask) {2523 offset_agbno = agbno & M_IGEO(mp)->inoalign_mask;2524 chunk_agbno = agbno - offset_agbno;2525 } else {2526 error = xfs_imap_lookup(pag, tp, agino, agbno,2527 &chunk_agbno, &offset_agbno, flags);2528 if (error)2529 return error;2530 }2531 2532out_map:2533 ASSERT(agbno >= chunk_agbno);2534 cluster_agbno = chunk_agbno +2535 ((offset_agbno / M_IGEO(mp)->blocks_per_cluster) *2536 M_IGEO(mp)->blocks_per_cluster);2537 offset = ((agbno - cluster_agbno) * mp->m_sb.sb_inopblock) +2538 XFS_INO_TO_OFFSET(mp, ino);2539 2540 imap->im_blkno = XFS_AGB_TO_DADDR(mp, pag->pag_agno, cluster_agbno);2541 imap->im_len = XFS_FSB_TO_BB(mp, M_IGEO(mp)->blocks_per_cluster);2542 imap->im_boffset = (unsigned short)(offset << mp->m_sb.sb_inodelog);2543 2544 /*2545 * If the inode number maps to a block outside the bounds2546 * of the file system then return NULL rather than calling2547 * read_buf and panicing when we get an error from the2548 * driver.2549 */2550 if ((imap->im_blkno + imap->im_len) >2551 XFS_FSB_TO_BB(mp, mp->m_sb.sb_dblocks)) {2552 xfs_alert(mp,2553 "%s: (im_blkno (0x%llx) + im_len (0x%llx)) > sb_dblocks (0x%llx)",2554 __func__, (unsigned long long) imap->im_blkno,2555 (unsigned long long) imap->im_len,2556 XFS_FSB_TO_BB(mp, mp->m_sb.sb_dblocks));2557 return -EINVAL;2558 }2559 return 0;2560}2561 2562/*2563 * Log specified fields for the ag hdr (inode section). The growth of the agi2564 * structure over time requires that we interpret the buffer as two logical2565 * regions delineated by the end of the unlinked list. This is due to the size2566 * of the hash table and its location in the middle of the agi.2567 *2568 * For example, a request to log a field before agi_unlinked and a field after2569 * agi_unlinked could cause us to log the entire hash table and use an excessive2570 * amount of log space. To avoid this behavior, log the region up through2571 * agi_unlinked in one call and the region after agi_unlinked through the end of2572 * the structure in another.2573 */2574void2575xfs_ialloc_log_agi(2576 struct xfs_trans *tp,2577 struct xfs_buf *bp,2578 uint32_t fields)2579{2580 int first; /* first byte number */2581 int last; /* last byte number */2582 static const short offsets[] = { /* field starting offsets */2583 /* keep in sync with bit definitions */2584 offsetof(xfs_agi_t, agi_magicnum),2585 offsetof(xfs_agi_t, agi_versionnum),2586 offsetof(xfs_agi_t, agi_seqno),2587 offsetof(xfs_agi_t, agi_length),2588 offsetof(xfs_agi_t, agi_count),2589 offsetof(xfs_agi_t, agi_root),2590 offsetof(xfs_agi_t, agi_level),2591 offsetof(xfs_agi_t, agi_freecount),2592 offsetof(xfs_agi_t, agi_newino),2593 offsetof(xfs_agi_t, agi_dirino),2594 offsetof(xfs_agi_t, agi_unlinked),2595 offsetof(xfs_agi_t, agi_free_root),2596 offsetof(xfs_agi_t, agi_free_level),2597 offsetof(xfs_agi_t, agi_iblocks),2598 sizeof(xfs_agi_t)2599 };2600#ifdef DEBUG2601 struct xfs_agi *agi = bp->b_addr;2602 2603 ASSERT(agi->agi_magicnum == cpu_to_be32(XFS_AGI_MAGIC));2604#endif2605 2606 /*2607 * Compute byte offsets for the first and last fields in the first2608 * region and log the agi buffer. This only logs up through2609 * agi_unlinked.2610 */2611 if (fields & XFS_AGI_ALL_BITS_R1) {2612 xfs_btree_offsets(fields, offsets, XFS_AGI_NUM_BITS_R1,2613 &first, &last);2614 xfs_trans_log_buf(tp, bp, first, last);2615 }2616 2617 /*2618 * Mask off the bits in the first region and calculate the first and2619 * last field offsets for any bits in the second region.2620 */2621 fields &= ~XFS_AGI_ALL_BITS_R1;2622 if (fields) {2623 xfs_btree_offsets(fields, offsets, XFS_AGI_NUM_BITS_R2,2624 &first, &last);2625 xfs_trans_log_buf(tp, bp, first, last);2626 }2627}2628 2629static xfs_failaddr_t2630xfs_agi_verify(2631 struct xfs_buf *bp)2632{2633 struct xfs_mount *mp = bp->b_mount;2634 struct xfs_agi *agi = bp->b_addr;2635 xfs_failaddr_t fa;2636 uint32_t agi_seqno = be32_to_cpu(agi->agi_seqno);2637 uint32_t agi_length = be32_to_cpu(agi->agi_length);2638 int i;2639 2640 if (xfs_has_crc(mp)) {2641 if (!uuid_equal(&agi->agi_uuid, &mp->m_sb.sb_meta_uuid))2642 return __this_address;2643 if (!xfs_log_check_lsn(mp, be64_to_cpu(agi->agi_lsn)))2644 return __this_address;2645 }2646 2647 /*2648 * Validate the magic number of the agi block.2649 */2650 if (!xfs_verify_magic(bp, agi->agi_magicnum))2651 return __this_address;2652 if (!XFS_AGI_GOOD_VERSION(be32_to_cpu(agi->agi_versionnum)))2653 return __this_address;2654 2655 fa = xfs_validate_ag_length(bp, agi_seqno, agi_length);2656 if (fa)2657 return fa;2658 2659 if (be32_to_cpu(agi->agi_level) < 1 ||2660 be32_to_cpu(agi->agi_level) > M_IGEO(mp)->inobt_maxlevels)2661 return __this_address;2662 2663 if (xfs_has_finobt(mp) &&2664 (be32_to_cpu(agi->agi_free_level) < 1 ||2665 be32_to_cpu(agi->agi_free_level) > M_IGEO(mp)->inobt_maxlevels))2666 return __this_address;2667 2668 for (i = 0; i < XFS_AGI_UNLINKED_BUCKETS; i++) {2669 if (agi->agi_unlinked[i] == cpu_to_be32(NULLAGINO))2670 continue;2671 if (!xfs_verify_ino(mp, be32_to_cpu(agi->agi_unlinked[i])))2672 return __this_address;2673 }2674 2675 return NULL;2676}2677 2678static void2679xfs_agi_read_verify(2680 struct xfs_buf *bp)2681{2682 struct xfs_mount *mp = bp->b_mount;2683 xfs_failaddr_t fa;2684 2685 if (xfs_has_crc(mp) &&2686 !xfs_buf_verify_cksum(bp, XFS_AGI_CRC_OFF))2687 xfs_verifier_error(bp, -EFSBADCRC, __this_address);2688 else {2689 fa = xfs_agi_verify(bp);2690 if (XFS_TEST_ERROR(fa, mp, XFS_ERRTAG_IALLOC_READ_AGI))2691 xfs_verifier_error(bp, -EFSCORRUPTED, fa);2692 }2693}2694 2695static void2696xfs_agi_write_verify(2697 struct xfs_buf *bp)2698{2699 struct xfs_mount *mp = bp->b_mount;2700 struct xfs_buf_log_item *bip = bp->b_log_item;2701 struct xfs_agi *agi = bp->b_addr;2702 xfs_failaddr_t fa;2703 2704 fa = xfs_agi_verify(bp);2705 if (fa) {2706 xfs_verifier_error(bp, -EFSCORRUPTED, fa);2707 return;2708 }2709 2710 if (!xfs_has_crc(mp))2711 return;2712 2713 if (bip)2714 agi->agi_lsn = cpu_to_be64(bip->bli_item.li_lsn);2715 xfs_buf_update_cksum(bp, XFS_AGI_CRC_OFF);2716}2717 2718const struct xfs_buf_ops xfs_agi_buf_ops = {2719 .name = "xfs_agi",2720 .magic = { cpu_to_be32(XFS_AGI_MAGIC), cpu_to_be32(XFS_AGI_MAGIC) },2721 .verify_read = xfs_agi_read_verify,2722 .verify_write = xfs_agi_write_verify,2723 .verify_struct = xfs_agi_verify,2724};2725 2726/*2727 * Read in the allocation group header (inode allocation section)2728 */2729int2730xfs_read_agi(2731 struct xfs_perag *pag,2732 struct xfs_trans *tp,2733 xfs_buf_flags_t flags,2734 struct xfs_buf **agibpp)2735{2736 struct xfs_mount *mp = pag->pag_mount;2737 int error;2738 2739 trace_xfs_read_agi(pag->pag_mount, pag->pag_agno);2740 2741 error = xfs_trans_read_buf(mp, tp, mp->m_ddev_targp,2742 XFS_AG_DADDR(mp, pag->pag_agno, XFS_AGI_DADDR(mp)),2743 XFS_FSS_TO_BB(mp, 1), flags, agibpp, &xfs_agi_buf_ops);2744 if (xfs_metadata_is_sick(error))2745 xfs_ag_mark_sick(pag, XFS_SICK_AG_AGI);2746 if (error)2747 return error;2748 if (tp)2749 xfs_trans_buf_set_type(tp, *agibpp, XFS_BLFT_AGI_BUF);2750 2751 xfs_buf_set_ref(*agibpp, XFS_AGI_REF);2752 return 0;2753}2754 2755/*2756 * Read in the agi and initialise the per-ag data. If the caller supplies a2757 * @agibpp, return the locked AGI buffer to them, otherwise release it.2758 */2759int2760xfs_ialloc_read_agi(2761 struct xfs_perag *pag,2762 struct xfs_trans *tp,2763 int flags,2764 struct xfs_buf **agibpp)2765{2766 struct xfs_buf *agibp;2767 struct xfs_agi *agi;2768 int error;2769 2770 trace_xfs_ialloc_read_agi(pag->pag_mount, pag->pag_agno);2771 2772 error = xfs_read_agi(pag, tp,2773 (flags & XFS_IALLOC_FLAG_TRYLOCK) ? XBF_TRYLOCK : 0,2774 &agibp);2775 if (error)2776 return error;2777 2778 agi = agibp->b_addr;2779 if (!xfs_perag_initialised_agi(pag)) {2780 pag->pagi_freecount = be32_to_cpu(agi->agi_freecount);2781 pag->pagi_count = be32_to_cpu(agi->agi_count);2782 set_bit(XFS_AGSTATE_AGI_INIT, &pag->pag_opstate);2783 }2784 2785 /*2786 * It's possible for these to be out of sync if2787 * we are in the middle of a forced shutdown.2788 */2789 ASSERT(pag->pagi_freecount == be32_to_cpu(agi->agi_freecount) ||2790 xfs_is_shutdown(pag->pag_mount));2791 if (agibpp)2792 *agibpp = agibp;2793 else2794 xfs_trans_brelse(tp, agibp);2795 return 0;2796}2797 2798/* How many inodes are backed by inode clusters ondisk? */2799STATIC int2800xfs_ialloc_count_ondisk(2801 struct xfs_btree_cur *cur,2802 xfs_agino_t low,2803 xfs_agino_t high,2804 unsigned int *allocated)2805{2806 struct xfs_inobt_rec_incore irec;2807 unsigned int ret = 0;2808 int has_record;2809 int error;2810 2811 error = xfs_inobt_lookup(cur, low, XFS_LOOKUP_LE, &has_record);2812 if (error)2813 return error;2814 2815 while (has_record) {2816 unsigned int i, hole_idx;2817 2818 error = xfs_inobt_get_rec(cur, &irec, &has_record);2819 if (error)2820 return error;2821 if (irec.ir_startino > high)2822 break;2823 2824 for (i = 0; i < XFS_INODES_PER_CHUNK; i++) {2825 if (irec.ir_startino + i < low)2826 continue;2827 if (irec.ir_startino + i > high)2828 break;2829 2830 hole_idx = i / XFS_INODES_PER_HOLEMASK_BIT;2831 if (!(irec.ir_holemask & (1U << hole_idx)))2832 ret++;2833 }2834 2835 error = xfs_btree_increment(cur, 0, &has_record);2836 if (error)2837 return error;2838 }2839 2840 *allocated = ret;2841 return 0;2842}2843 2844/* Is there an inode record covering a given extent? */2845int2846xfs_ialloc_has_inodes_at_extent(2847 struct xfs_btree_cur *cur,2848 xfs_agblock_t bno,2849 xfs_extlen_t len,2850 enum xbtree_recpacking *outcome)2851{2852 xfs_agino_t agino;2853 xfs_agino_t last_agino;2854 unsigned int allocated;2855 int error;2856 2857 agino = XFS_AGB_TO_AGINO(cur->bc_mp, bno);2858 last_agino = XFS_AGB_TO_AGINO(cur->bc_mp, bno + len) - 1;2859 2860 error = xfs_ialloc_count_ondisk(cur, agino, last_agino, &allocated);2861 if (error)2862 return error;2863 2864 if (allocated == 0)2865 *outcome = XBTREE_RECPACKING_EMPTY;2866 else if (allocated == last_agino - agino + 1)2867 *outcome = XBTREE_RECPACKING_FULL;2868 else2869 *outcome = XBTREE_RECPACKING_SPARSE;2870 return 0;2871}2872 2873struct xfs_ialloc_count_inodes {2874 xfs_agino_t count;2875 xfs_agino_t freecount;2876};2877 2878/* Record inode counts across all inobt records. */2879STATIC int2880xfs_ialloc_count_inodes_rec(2881 struct xfs_btree_cur *cur,2882 const union xfs_btree_rec *rec,2883 void *priv)2884{2885 struct xfs_inobt_rec_incore irec;2886 struct xfs_ialloc_count_inodes *ci = priv;2887 xfs_failaddr_t fa;2888 2889 xfs_inobt_btrec_to_irec(cur->bc_mp, rec, &irec);2890 fa = xfs_inobt_check_irec(cur->bc_ag.pag, &irec);2891 if (fa)2892 return xfs_inobt_complain_bad_rec(cur, fa, &irec);2893 2894 ci->count += irec.ir_count;2895 ci->freecount += irec.ir_freecount;2896 2897 return 0;2898}2899 2900/* Count allocated and free inodes under an inobt. */2901int2902xfs_ialloc_count_inodes(2903 struct xfs_btree_cur *cur,2904 xfs_agino_t *count,2905 xfs_agino_t *freecount)2906{2907 struct xfs_ialloc_count_inodes ci = {0};2908 int error;2909 2910 ASSERT(xfs_btree_is_ino(cur->bc_ops));2911 error = xfs_btree_query_all(cur, xfs_ialloc_count_inodes_rec, &ci);2912 if (error)2913 return error;2914 2915 *count = ci.count;2916 *freecount = ci.freecount;2917 return 0;2918}2919 2920/*2921 * Initialize inode-related geometry information.2922 *2923 * Compute the inode btree min and max levels and set maxicount.2924 *2925 * Set the inode cluster size. This may still be overridden by the file2926 * system block size if it is larger than the chosen cluster size.2927 *2928 * For v5 filesystems, scale the cluster size with the inode size to keep a2929 * constant ratio of inode per cluster buffer, but only if mkfs has set the2930 * inode alignment value appropriately for larger cluster sizes.2931 *2932 * Then compute the inode cluster alignment information.2933 */2934void2935xfs_ialloc_setup_geometry(2936 struct xfs_mount *mp)2937{2938 struct xfs_sb *sbp = &mp->m_sb;2939 struct xfs_ino_geometry *igeo = M_IGEO(mp);2940 uint64_t icount;2941 uint inodes;2942 2943 igeo->new_diflags2 = 0;2944 if (xfs_has_bigtime(mp))2945 igeo->new_diflags2 |= XFS_DIFLAG2_BIGTIME;2946 if (xfs_has_large_extent_counts(mp))2947 igeo->new_diflags2 |= XFS_DIFLAG2_NREXT64;2948 2949 /* Compute inode btree geometry. */2950 igeo->agino_log = sbp->sb_inopblog + sbp->sb_agblklog;2951 igeo->inobt_mxr[0] = xfs_inobt_maxrecs(mp, sbp->sb_blocksize, true);2952 igeo->inobt_mxr[1] = xfs_inobt_maxrecs(mp, sbp->sb_blocksize, false);2953 igeo->inobt_mnr[0] = igeo->inobt_mxr[0] / 2;2954 igeo->inobt_mnr[1] = igeo->inobt_mxr[1] / 2;2955 2956 igeo->ialloc_inos = max_t(uint16_t, XFS_INODES_PER_CHUNK,2957 sbp->sb_inopblock);2958 igeo->ialloc_blks = igeo->ialloc_inos >> sbp->sb_inopblog;2959 2960 if (sbp->sb_spino_align)2961 igeo->ialloc_min_blks = sbp->sb_spino_align;2962 else2963 igeo->ialloc_min_blks = igeo->ialloc_blks;2964 2965 /* Compute and fill in value of m_ino_geo.inobt_maxlevels. */2966 inodes = (1LL << XFS_INO_AGINO_BITS(mp)) >> XFS_INODES_PER_CHUNK_LOG;2967 igeo->inobt_maxlevels = xfs_btree_compute_maxlevels(igeo->inobt_mnr,2968 inodes);2969 ASSERT(igeo->inobt_maxlevels <= xfs_iallocbt_maxlevels_ondisk());2970 2971 /*2972 * Set the maximum inode count for this filesystem, being careful not2973 * to use obviously garbage sb_inopblog/sb_inopblock values. Regular2974 * users should never get here due to failing sb verification, but2975 * certain users (xfs_db) need to be usable even with corrupt metadata.2976 */2977 if (sbp->sb_imax_pct && igeo->ialloc_blks) {2978 /*2979 * Make sure the maximum inode count is a multiple2980 * of the units we allocate inodes in.2981 */2982 icount = sbp->sb_dblocks * sbp->sb_imax_pct;2983 do_div(icount, 100);2984 do_div(icount, igeo->ialloc_blks);2985 igeo->maxicount = XFS_FSB_TO_INO(mp,2986 icount * igeo->ialloc_blks);2987 } else {2988 igeo->maxicount = 0;2989 }2990 2991 /*2992 * Compute the desired size of an inode cluster buffer size, which2993 * starts at 8K and (on v5 filesystems) scales up with larger inode2994 * sizes.2995 *2996 * Preserve the desired inode cluster size because the sparse inodes2997 * feature uses that desired size (not the actual size) to compute the2998 * sparse inode alignment. The mount code validates this value, so we2999 * cannot change the behavior.3000 */3001 igeo->inode_cluster_size_raw = XFS_INODE_BIG_CLUSTER_SIZE;3002 if (xfs_has_v3inodes(mp)) {3003 int new_size = igeo->inode_cluster_size_raw;3004 3005 new_size *= mp->m_sb.sb_inodesize / XFS_DINODE_MIN_SIZE;3006 if (mp->m_sb.sb_inoalignmt >= XFS_B_TO_FSBT(mp, new_size))3007 igeo->inode_cluster_size_raw = new_size;3008 }3009 3010 /* Calculate inode cluster ratios. */3011 if (igeo->inode_cluster_size_raw > mp->m_sb.sb_blocksize)3012 igeo->blocks_per_cluster = XFS_B_TO_FSBT(mp,3013 igeo->inode_cluster_size_raw);3014 else3015 igeo->blocks_per_cluster = 1;3016 igeo->inode_cluster_size = XFS_FSB_TO_B(mp, igeo->blocks_per_cluster);3017 igeo->inodes_per_cluster = XFS_FSB_TO_INO(mp, igeo->blocks_per_cluster);3018 3019 /* Calculate inode cluster alignment. */3020 if (xfs_has_align(mp) &&3021 mp->m_sb.sb_inoalignmt >= igeo->blocks_per_cluster)3022 igeo->cluster_align = mp->m_sb.sb_inoalignmt;3023 else3024 igeo->cluster_align = 1;3025 igeo->inoalign_mask = igeo->cluster_align - 1;3026 igeo->cluster_align_inodes = XFS_FSB_TO_INO(mp, igeo->cluster_align);3027 3028 /*3029 * If we are using stripe alignment, check whether3030 * the stripe unit is a multiple of the inode alignment3031 */3032 if (mp->m_dalign && igeo->inoalign_mask &&3033 !(mp->m_dalign & igeo->inoalign_mask))3034 igeo->ialloc_align = mp->m_dalign;3035 else3036 igeo->ialloc_align = 0;3037 3038 if (mp->m_sb.sb_blocksize > PAGE_SIZE)3039 igeo->min_folio_order = mp->m_sb.sb_blocklog - PAGE_SHIFT;3040 else3041 igeo->min_folio_order = 0;3042}3043 3044/* Compute the location of the root directory inode that is laid out by mkfs. */3045xfs_ino_t3046xfs_ialloc_calc_rootino(3047 struct xfs_mount *mp,3048 int sunit)3049{3050 struct xfs_ino_geometry *igeo = M_IGEO(mp);3051 xfs_agblock_t first_bno;3052 3053 /*3054 * Pre-calculate the geometry of AG 0. We know what it looks like3055 * because libxfs knows how to create allocation groups now.3056 *3057 * first_bno is the first block in which mkfs could possibly have3058 * allocated the root directory inode, once we factor in the metadata3059 * that mkfs formats before it. Namely, the four AG headers...3060 */3061 first_bno = howmany(4 * mp->m_sb.sb_sectsize, mp->m_sb.sb_blocksize);3062 3063 /* ...the two free space btree roots... */3064 first_bno += 2;3065 3066 /* ...the inode btree root... */3067 first_bno += 1;3068 3069 /* ...the initial AGFL... */3070 first_bno += xfs_alloc_min_freelist(mp, NULL);3071 3072 /* ...the free inode btree root... */3073 if (xfs_has_finobt(mp))3074 first_bno++;3075 3076 /* ...the reverse mapping btree root... */3077 if (xfs_has_rmapbt(mp))3078 first_bno++;3079 3080 /* ...the reference count btree... */3081 if (xfs_has_reflink(mp))3082 first_bno++;3083 3084 /*3085 * ...and the log, if it is allocated in the first allocation group.3086 *3087 * This can happen with filesystems that only have a single3088 * allocation group, or very odd geometries created by old mkfs3089 * versions on very small filesystems.3090 */3091 if (xfs_ag_contains_log(mp, 0))3092 first_bno += mp->m_sb.sb_logblocks;3093 3094 /*3095 * Now round first_bno up to whatever allocation alignment is given3096 * by the filesystem or was passed in.3097 */3098 if (xfs_has_dalign(mp) && igeo->ialloc_align > 0)3099 first_bno = roundup(first_bno, sunit);3100 else if (xfs_has_align(mp) &&3101 mp->m_sb.sb_inoalignmt > 1)3102 first_bno = roundup(first_bno, mp->m_sb.sb_inoalignmt);3103 3104 return XFS_AGINO_TO_INO(mp, 0, XFS_AGB_TO_AGINO(mp, first_bno));3105}3106 3107/*3108 * Ensure there are not sparse inode clusters that cross the new EOAG.3109 *3110 * This is a no-op for non-spinode filesystems since clusters are always fully3111 * allocated and checking the bnobt suffices. However, a spinode filesystem3112 * could have a record where the upper inodes are free blocks. If those blocks3113 * were removed from the filesystem, the inode record would extend beyond EOAG,3114 * which will be flagged as corruption.3115 */3116int3117xfs_ialloc_check_shrink(3118 struct xfs_perag *pag,3119 struct xfs_trans *tp,3120 struct xfs_buf *agibp,3121 xfs_agblock_t new_length)3122{3123 struct xfs_inobt_rec_incore rec;3124 struct xfs_btree_cur *cur;3125 xfs_agino_t agino;3126 int has;3127 int error;3128 3129 if (!xfs_has_sparseinodes(pag->pag_mount))3130 return 0;3131 3132 cur = xfs_inobt_init_cursor(pag, tp, agibp);3133 3134 /* Look up the inobt record that would correspond to the new EOFS. */3135 agino = XFS_AGB_TO_AGINO(pag->pag_mount, new_length);3136 error = xfs_inobt_lookup(cur, agino, XFS_LOOKUP_LE, &has);3137 if (error || !has)3138 goto out;3139 3140 error = xfs_inobt_get_rec(cur, &rec, &has);3141 if (error)3142 goto out;3143 3144 if (!has) {3145 xfs_ag_mark_sick(pag, XFS_SICK_AG_INOBT);3146 error = -EFSCORRUPTED;3147 goto out;3148 }3149 3150 /* If the record covers inodes that would be beyond EOFS, bail out. */3151 if (rec.ir_startino + XFS_INODES_PER_CHUNK > agino) {3152 error = -ENOSPC;3153 goto out;3154 }3155out:3156 xfs_btree_del_cursor(cur, error);3157 return error;3158}3159