* put new inode record(s) into inode tree
*/
for (j = 0; j < chunks_pblock; j++) {
- if ((irec_p = find_inode_rec(agno, start_agino))
+ if ((irec_p = find_inode_rec(mp, agno, start_agino))
== NULL) {
- irec_p = set_inode_free_alloc(agno,
+ irec_p = set_inode_free_alloc(mp, agno,
start_agino);
for (i = 1; i < XFS_INODES_PER_CHUNK; i++)
set_inode_free(irec_p, i);
start_agino = XFS_OFFBNO_TO_AGINO(mp, start_agbno, 0);
*start_ino = XFS_AGINO_TO_INO(mp, agno, start_agino);
- irec_p = set_inode_free_alloc(agno,
+ irec_p = set_inode_free_alloc(mp, agno,
XFS_OFFBNO_TO_AGINO(mp, start_agbno, 0));
for (i = 1; i < XFS_INODES_PER_CHUNK; i++)
*/
irec_before_p = irec_after_p = NULL;
- find_inode_rec_range(agno, XFS_OFFBNO_TO_AGINO(mp, start_agbno, 0),
+ find_inode_rec_range(mp, agno, XFS_OFFBNO_TO_AGINO(mp, start_agbno, 0),
XFS_OFFBNO_TO_AGINO(mp, end_agbno, mp->m_sb.sb_inopblock - 1),
&irec_before_p, &irec_after_p);
start_agino = XFS_OFFBNO_TO_AGINO(mp, chunk_start_agbno, 0);
*start_ino = XFS_AGINO_TO_INO(mp, agno, start_agino);
- ASSERT(find_inode_rec(agno, start_agino) == NULL);
+ ASSERT(find_inode_rec(mp, agno, start_agino) == NULL);
- irec_p = set_inode_free_alloc(agno, start_agino);
+ irec_p = set_inode_free_alloc(mp, agno, start_agino);
for (i = 1; i < XFS_INODES_PER_CHUNK; i++)
set_inode_free(irec_p, i);
ino_tree_node_t *irec = NULL;
if (verify_aginode_chunk(mp, agno, agino, &start_agino))
- irec = find_inode_rec(agno, start_agino);
+ irec = find_inode_rec(mp, agno, start_agino);
return(irec);
}
if ((ino_rec = next_ino_rec(ino_rec)) != NULL)
num_inos += XFS_INODES_PER_CHUNK;
- get_inode_rec(agno, prev_ino_rec);
+ get_inode_rec(mp, agno, prev_ino_rec);
free_inode_rec(agno, prev_ino_rec);
}
XFS_INODES_PER_CHUNK)
continue;
- if ((nrec = find_inode_rec(agno, agino)) == NULL)
+ if ((nrec = find_inode_rec(mp, agno, agino)) == NULL)
if (!verify_aginum(mp, agno, agino))
if (verify_aginode_chunk(mp, agno,
agino, &start))
got_some = 1;
}
- get_uncertain_inode_rec(agno, irec);
+ get_uncertain_inode_rec(mp, agno, irec);
free_inode_rec(agno, irec);
irec = findfirst_uncertain_inode_rec(agno);
XFS_INODES_PER_CHUNK)
continue;
- if ((nrec = find_inode_rec(agno, agino)) != NULL)
+ if ((nrec = find_inode_rec(mp, agno, agino)) != NULL)
continue;
/*
* now return the uncertain inode record to the free pool
* and pull another one off the list for processing
*/
- get_uncertain_inode_rec(agno, irec);
+ get_uncertain_inode_rec(mp, agno, irec);
free_inode_rec(agno, irec);
irec = findfirst_uncertain_inode_rec(agno);
xfs_buf_t *bp;
int size;
- if ((irec = find_inode_rec(agno, agino)) == NULL)
+ if ((irec = find_inode_rec(mp, agno, agino)) == NULL)
return(NULL);
size = XFS_FSB_TO_BB(mp, MAX(1, XFS_INODES_PER_CHUNK/inodes_per_block));
_("entry in shortform dir %llu references group quota inode %llu\n"),
ino, lino);
junkit = 1;
- } else if ((irec_p = find_inode_rec(XFS_INO_TO_AGNO(mp, lino),
+ } else if ((irec_p = find_inode_rec(mp,
+ XFS_INO_TO_AGNO(mp, lino),
XFS_INO_TO_AGINO(mp, lino))) != NULL) {
/*
* if inode is marked free and we're in inode
_("\twould clear ino number in entry %d...\n"),
i);
}
- } else if ((irec_p = find_inode_rec(
+ } else if ((irec_p = find_inode_rec(mp,
XFS_INO_TO_AGNO(mp, lino),
XFS_INO_TO_AGINO(mp, lino))) != NULL) {
/*
} else if (lino == mp->m_sb.sb_gquotino) {
junkit = 1;
junkreason = _("group quota");
- } else if ((irec_p = find_inode_rec(XFS_INO_TO_AGNO(mp, lino),
+ } else if ((irec_p = find_inode_rec(mp,
+ XFS_INO_TO_AGNO(mp, lino),
XFS_INO_TO_AGINO(mp, lino))) != NULL) {
/*
* if inode is marked free and we're in inode
} else if (ent_ino == mp->m_sb.sb_gquotino) {
clearreason = _("group quota");
} else {
- irec_p = find_inode_rec(XFS_INO_TO_AGNO(mp, ent_ino),
+ irec_p = find_inode_rec(mp,
+ XFS_INO_TO_AGNO(mp, ent_ino),
XFS_INO_TO_AGINO(mp, ent_ino));
if (irec_p == NULL) {
if (ino_discovery) {
/*
* get pulls the inode record from the good inode tree
*/
-void get_inode_rec(xfs_agnumber_t agno, ino_tree_node_t *ino_rec);
+void get_inode_rec(struct xfs_mount *mp, xfs_agnumber_t agno,
+ ino_tree_node_t *ino_rec);
extern avltree_desc_t **inode_tree_ptrs;
static inline ino_tree_node_t *
return((ino_tree_node_t *) inode_tree_ptrs[agno]->avl_firstino);
}
static inline ino_tree_node_t *
-find_inode_rec(xfs_agnumber_t agno, xfs_agino_t ino)
+find_inode_rec(struct xfs_mount *mp, xfs_agnumber_t agno, xfs_agino_t ino)
{
+ /*
+ * Is the AG inside the file system
+ */
+ if (agno >= mp->m_sb.sb_agcount)
+ return NULL;
return((ino_tree_node_t *)
avl_findrange(inode_tree_ptrs[agno], ino));
}
-void find_inode_rec_range(xfs_agnumber_t agno,
+void find_inode_rec_range(struct xfs_mount *mp, xfs_agnumber_t agno,
xfs_agino_t start_ino, xfs_agino_t end_ino,
ino_tree_node_t **first, ino_tree_node_t **last);
* automatically marks it as "existing". Note -- all the inode
* add/set/get routines assume a valid inode number.
*/
-ino_tree_node_t *set_inode_used_alloc(xfs_agnumber_t agno, xfs_agino_t ino);
-ino_tree_node_t *set_inode_free_alloc(xfs_agnumber_t agno, xfs_agino_t ino);
+ino_tree_node_t *set_inode_used_alloc(struct xfs_mount *mp, xfs_agnumber_t agno,
+ xfs_agino_t ino);
+ino_tree_node_t *set_inode_free_alloc(struct xfs_mount *mp, xfs_agnumber_t agno,
+ xfs_agino_t ino);
void print_inode_list(xfs_agnumber_t agno);
void print_uncertain_inode_list(xfs_agnumber_t agno);
xfs_ino_t ino, int free);
void add_aginode_uncertain(xfs_agnumber_t agno,
xfs_agino_t agino, int free);
-void get_uncertain_inode_rec(xfs_agnumber_t agno,
+void get_uncertain_inode_rec(struct xfs_mount *mp,
+ xfs_agnumber_t agno,
ino_tree_node_t *ino_rec);
void clear_uncertain_ino_cache(xfs_agnumber_t agno);
* pull the indicated inode record out of the uncertain inode tree
*/
void
-get_uncertain_inode_rec(xfs_agnumber_t agno, ino_tree_node_t *ino_rec)
+get_uncertain_inode_rec(struct xfs_mount *mp, xfs_agnumber_t agno,
+ ino_tree_node_t *ino_rec)
{
ASSERT(inode_tree_ptrs != NULL);
+ ASSERT(agno < mp->m_sb.sb_agcount);
ASSERT(inode_tree_ptrs[agno] != NULL);
avl_delete(inode_uncertain_tree_ptrs[agno], &ino_rec->avl_node);
* don't.
*/
static ino_tree_node_t *
-add_inode(xfs_agnumber_t agno, xfs_agino_t ino)
+add_inode(struct xfs_mount *mp, xfs_agnumber_t agno, xfs_agino_t ino)
{
ino_tree_node_t *ino_rec;
* pull the indicated inode record out of the inode tree
*/
void
-get_inode_rec(xfs_agnumber_t agno, ino_tree_node_t *ino_rec)
+get_inode_rec(struct xfs_mount *mp, xfs_agnumber_t agno, ino_tree_node_t *ino_rec)
{
ASSERT(inode_tree_ptrs != NULL);
+ ASSERT(agno < mp->m_sb.sb_agcount);
ASSERT(inode_tree_ptrs[agno] != NULL);
avl_delete(inode_tree_ptrs[agno], &ino_rec->avl_node);
}
void
-find_inode_rec_range(xfs_agnumber_t agno, xfs_agino_t start_ino,
- xfs_agino_t end_ino, ino_tree_node_t **first,
- ino_tree_node_t **last)
+find_inode_rec_range(struct xfs_mount *mp, xfs_agnumber_t agno,
+ xfs_agino_t start_ino, xfs_agino_t end_ino,
+ ino_tree_node_t **first, ino_tree_node_t **last)
{
*first = *last = NULL;
- avl_findranges(inode_tree_ptrs[agno], start_ino,
- end_ino, (avlnode_t **) first, (avlnode_t **) last);
+ /*
+ * Is the AG inside the file system ?
+ */
+ if (agno < mp->m_sb.sb_agcount)
+ avl_findranges(inode_tree_ptrs[agno], start_ino,
+ end_ino, (avlnode_t **) first, (avlnode_t **) last);
}
/*
* whichever alignment is larger.
*/
ino_tree_node_t *
-set_inode_used_alloc(xfs_agnumber_t agno, xfs_agino_t ino)
+set_inode_used_alloc(struct xfs_mount *mp, xfs_agnumber_t agno, xfs_agino_t ino)
{
ino_tree_node_t *ino_rec;
* is too see if the chunk overlaps another chunk
* already in the tree
*/
- ino_rec = add_inode(agno, ino);
+ ino_rec = add_inode(mp, agno, ino);
ASSERT(ino_rec != NULL);
ASSERT(ino >= ino_rec->ino_startnum &&
}
ino_tree_node_t *
-set_inode_free_alloc(xfs_agnumber_t agno, xfs_agino_t ino)
+set_inode_free_alloc(struct xfs_mount *mp, xfs_agnumber_t agno, xfs_agino_t ino)
{
ino_tree_node_t *ino_rec;
- ino_rec = add_inode(agno, ino);
+ ino_rec = add_inode(mp, agno, ino);
ASSERT(ino_rec != NULL);
ASSERT(ino >= ino_rec->ino_startnum &&
/*
* make sure we know about the root inode chunk
*/
- if ((ino_rec = find_inode_rec(0, mp->m_sb.sb_rootino)) == NULL) {
+ if ((ino_rec = find_inode_rec(mp, 0, mp->m_sb.sb_rootino)) == NULL) {
ASSERT(mp->m_sb.sb_rbmino == mp->m_sb.sb_rootino + 1 &&
mp->m_sb.sb_rsumino == mp->m_sb.sb_rootino + 2);
do_warn(_("root inode chunk not found\n"));
/*
* mark the first 3 used, the rest are free
*/
- ino_rec = set_inode_used_alloc(0,
+ ino_rec = set_inode_used_alloc(mp, 0,
(xfs_agino_t) mp->m_sb.sb_rootino);
set_inode_used(ino_rec, 1);
set_inode_used(ino_rec, 2);
* inode. if so, put it on the uncertain inode list
* and set block map appropriately.
*/
- if (find_inode_rec(agno, current_ino) == NULL) {
+ if (find_inode_rec(mp, agno, current_ino) == NULL) {
add_aginode_uncertain(agno, current_ino, 1);
agbno = XFS_AGINO_TO_AGBNO(mp, current_ino);
if (verify_inum(mp, mp->m_sb.sb_uquotino))
irec = NULL;
else
- irec = find_inode_rec(
+ irec = find_inode_rec(mp,
XFS_INO_TO_AGNO(mp, mp->m_sb.sb_uquotino),
XFS_INO_TO_AGINO(mp, mp->m_sb.sb_uquotino));
if (verify_inum(mp, mp->m_sb.sb_gquotino))
irec = NULL;
else
- irec = find_inode_rec(
+ irec = find_inode_rec(mp,
XFS_INO_TO_AGNO(mp, mp->m_sb.sb_gquotino),
XFS_INO_TO_AGINO(mp, mp->m_sb.sb_gquotino));
set_progress_msg(PROG_FMT_DUP_EXTENT, (__uint64_t) glob_agcount);
- irec = find_inode_rec(XFS_INO_TO_AGNO(mp, mp->m_sb.sb_rootino),
+ irec = find_inode_rec(mp, XFS_INO_TO_AGNO(mp, mp->m_sb.sb_rootino),
XFS_INO_TO_AGINO(mp, mp->m_sb.sb_rootino));
/*
ino_tree_node_t *irec;
int i;
- irec = find_inode_rec(XFS_INO_TO_AGNO(mp, mp->m_sb.sb_rootino),
+ irec = find_inode_rec(mp, XFS_INO_TO_AGNO(mp, mp->m_sb.sb_rootino),
XFS_INO_TO_AGINO(mp, mp->m_sb.sb_rootino));
for (i = 0; i < 3; i++)
libxfs_trans_commit(tp, XFS_TRANS_RELEASE_LOG_RES|XFS_TRANS_SYNC);
- irec = find_inode_rec(XFS_INO_TO_AGNO(mp, mp->m_sb.sb_rootino),
+ irec = find_inode_rec(mp, XFS_INO_TO_AGNO(mp, mp->m_sb.sb_rootino),
XFS_INO_TO_AGINO(mp, mp->m_sb.sb_rootino));
set_inode_isadir(irec, XFS_INO_TO_AGINO(mp, mp->m_sb.sb_rootino) -
irec->ino_startnum);
* for .. in the new directory
*/
pip->i_d.di_nlink++;
- add_inode_ref(find_inode_rec(XFS_INO_TO_AGNO(mp, mp->m_sb.sb_rootino),
+ add_inode_ref(find_inode_rec(mp,
+ XFS_INO_TO_AGNO(mp, mp->m_sb.sb_rootino),
XFS_INO_TO_AGINO(mp, mp->m_sb.sb_rootino)), 0);
do_error(_("%d - couldn't iget disconnected inode\n"), err);
if (isa_dir) {
- irec = find_inode_rec(XFS_INO_TO_AGNO(mp, orphanage_ino),
+ irec = find_inode_rec(mp, XFS_INO_TO_AGNO(mp, orphanage_ino),
XFS_INO_TO_AGINO(mp, orphanage_ino));
if (irec)
ino_offset = XFS_INO_TO_AGINO(mp, orphanage_ino) -
/*
* ok, now handle the rest of the cases besides '.' and '..'
*/
- irec = find_inode_rec(XFS_INO_TO_AGNO(mp, lino),
+ irec = find_inode_rec(mp, XFS_INO_TO_AGNO(mp, lino),
XFS_INO_TO_AGINO(mp, lino));
if (irec == NULL) {
fname[dep->namelen] = '\0';
ASSERT(inum != NULLFSINO);
- irec = find_inode_rec(XFS_INO_TO_AGNO(mp, inum),
+ irec = find_inode_rec(mp, XFS_INO_TO_AGNO(mp, inum),
XFS_INO_TO_AGINO(mp, inum));
if (irec == NULL) {
nbad++;
ASSERT(no_modify || lino != NULLFSINO);
ASSERT(no_modify || !verify_inum(mp, lino));
- irec = find_inode_rec(XFS_INO_TO_AGNO(mp, lino),
+ irec = find_inode_rec(mp, XFS_INO_TO_AGNO(mp, lino),
XFS_INO_TO_AGINO(mp, lino));
if (irec == NULL) {
do_warn(_("entry \"%s\" in shortform dir %llu "
continue;
}
- irec = find_inode_rec(XFS_INO_TO_AGNO(mp, lino),
+ irec = find_inode_rec(mp, XFS_INO_TO_AGNO(mp, lino),
XFS_INO_TO_AGINO(mp, lino));
if (irec == NULL) {
ino_tree_node_t *irec;
int offset;
- irec = find_inode_rec(XFS_INO_TO_AGNO(mp, mp->m_sb.sb_rbmino),
+ irec = find_inode_rec(mp, XFS_INO_TO_AGNO(mp, mp->m_sb.sb_rbmino),
XFS_INO_TO_AGINO(mp, mp->m_sb.sb_rbmino));
ASSERT(irec != NULL);
add_inode_reached(irec, offset);
- irec = find_inode_rec(XFS_INO_TO_AGNO(mp, mp->m_sb.sb_rsumino),
+ irec = find_inode_rec(mp, XFS_INO_TO_AGNO(mp, mp->m_sb.sb_rsumino),
XFS_INO_TO_AGINO(mp, mp->m_sb.sb_rsumino));
offset = XFS_INO_TO_AGINO(mp, mp->m_sb.sb_rsumino) -
if (fs_quotas) {
if (mp->m_sb.sb_uquotino
&& mp->m_sb.sb_uquotino != NULLFSINO) {
- irec = find_inode_rec(XFS_INO_TO_AGNO(mp,
+ irec = find_inode_rec(mp, XFS_INO_TO_AGNO(mp,
mp->m_sb.sb_uquotino),
XFS_INO_TO_AGINO(mp, mp->m_sb.sb_uquotino));
offset = XFS_INO_TO_AGINO(mp, mp->m_sb.sb_uquotino)
}
if (mp->m_sb.sb_gquotino
&& mp->m_sb.sb_gquotino != NULLFSINO) {
- irec = find_inode_rec(XFS_INO_TO_AGNO(mp,
+ irec = find_inode_rec(mp, XFS_INO_TO_AGNO(mp,
mp->m_sb.sb_gquotino),
XFS_INO_TO_AGINO(mp, mp->m_sb.sb_gquotino));
offset = XFS_INO_TO_AGINO(mp, mp->m_sb.sb_gquotino)
do_log(_(" - traversing filesystem ...\n"));
- irec = find_inode_rec(XFS_INO_TO_AGNO(mp, mp->m_sb.sb_rootino),
+ irec = find_inode_rec(mp, XFS_INO_TO_AGNO(mp, mp->m_sb.sb_rootino),
XFS_INO_TO_AGINO(mp, mp->m_sb.sb_rootino));
/*
/*
* ensure only one avl entry per chunk
*/
- find_inode_rec_range(agno, ino, ino + XFS_INODES_PER_CHUNK,
+ find_inode_rec_range(mp, agno, ino, ino + XFS_INODES_PER_CHUNK,
&first_rec, &last_rec);
if (first_rec != NULL) {
/*
if (!suspect) {
if (XFS_INOBT_IS_FREE_DISK(rp, 0)) {
nfree++;
- ino_rec = set_inode_free_alloc(agno, ino);
+ ino_rec = set_inode_free_alloc(mp, agno, ino);
} else {
- ino_rec = set_inode_used_alloc(agno, ino);
+ ino_rec = set_inode_used_alloc(mp, agno, ino);
}
for (j = 1; j < XFS_INODES_PER_CHUNK; j++) {
if (XFS_INOBT_IS_FREE_DISK(rp, j)) {