Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 2e287a73 authored by Christoph Hellwig's avatar Christoph Hellwig Committed by Felix Blyakher
Browse files

xfs: improve xfs_inobt_get_rec prototype



Most callers of xfs_inobt_get_rec need to fill a xfs_inobt_rec_incore_t, and
those who don't yet are fine with a xfs_inobt_rec_incore_t, instead of the
three individual variables, too.  So just change xfs_inobt_get_rec to write
the output into a xfs_inobt_rec_incore_t directly.

Signed-off-by: default avatarChristoph Hellwig <hch@lst.de>
Reviewed-by: default avatarAlex Elder <aelder@sgi.com>
Signed-off-by: default avatarFelix Blyakher <felixb@sgi.com>
parent 85c0b2ab
Loading
Loading
Loading
Loading
+31 −50
Original line number Original line Diff line number Diff line
@@ -135,9 +135,7 @@ xfs_inobt_update(
int					/* error */
int					/* error */
xfs_inobt_get_rec(
xfs_inobt_get_rec(
	struct xfs_btree_cur	*cur,	/* btree cursor */
	struct xfs_btree_cur	*cur,	/* btree cursor */
	xfs_agino_t		*ino,	/* output: starting inode of chunk */
	xfs_inobt_rec_incore_t	*irec,	/* btree record */
	__int32_t		*fcnt,	/* output: number of free inodes */
	xfs_inofree_t		*free,	/* output: free inode mask */
	int			*stat)	/* output: success/failure */
	int			*stat)	/* output: success/failure */
{
{
	union xfs_btree_rec	*rec;
	union xfs_btree_rec	*rec;
@@ -145,9 +143,9 @@ xfs_inobt_get_rec(


	error = xfs_btree_get_rec(cur, &rec, stat);
	error = xfs_btree_get_rec(cur, &rec, stat);
	if (!error && *stat == 1) {
	if (!error && *stat == 1) {
		*ino = be32_to_cpu(rec->inobt.ir_startino);
		irec->ir_startino = be32_to_cpu(rec->inobt.ir_startino);
		*fcnt = be32_to_cpu(rec->inobt.ir_freecount);
		irec->ir_freecount = be32_to_cpu(rec->inobt.ir_freecount);
		*free = be64_to_cpu(rec->inobt.ir_free);
		irec->ir_free = be64_to_cpu(rec->inobt.ir_free);
	}
	}
	return error;
	return error;
}
}
@@ -746,8 +744,8 @@ xfs_dialloc(
			goto error0;
			goto error0;
		XFS_WANT_CORRUPTED_GOTO(i == 1, error0);
		XFS_WANT_CORRUPTED_GOTO(i == 1, error0);
		do {
		do {
			if ((error = xfs_inobt_get_rec(cur, &rec.ir_startino,
			error = xfs_inobt_get_rec(cur, &rec, &i);
					&rec.ir_freecount, &rec.ir_free, &i)))
			if (error)
				goto error0;
				goto error0;
			XFS_WANT_CORRUPTED_GOTO(i == 1, error0);
			XFS_WANT_CORRUPTED_GOTO(i == 1, error0);
			freecount += rec.ir_freecount;
			freecount += rec.ir_freecount;
@@ -766,8 +764,7 @@ xfs_dialloc(
		if ((error = xfs_inobt_lookup_le(cur, pagino, 0, 0, &i)))
		if ((error = xfs_inobt_lookup_le(cur, pagino, 0, 0, &i)))
			goto error0;
			goto error0;
		if (i != 0 &&
		if (i != 0 &&
		    (error = xfs_inobt_get_rec(cur, &rec.ir_startino,
		    (error = xfs_inobt_get_rec(cur, &rec, &j)) == 0 &&
			    &rec.ir_freecount, &rec.ir_free, &j)) == 0 &&
		    j == 1 &&
		    j == 1 &&
		    rec.ir_freecount > 0) {
		    rec.ir_freecount > 0) {
			/*
			/*
@@ -799,10 +796,8 @@ xfs_dialloc(
				goto error1;
				goto error1;
			doneleft = !i;
			doneleft = !i;
			if (!doneleft) {
			if (!doneleft) {
				if ((error = xfs_inobt_get_rec(tcur,
				error = xfs_inobt_get_rec(tcur, &trec, &i);
						&trec.ir_startino,
				if (error)
						&trec.ir_freecount,
						&trec.ir_free, &i)))
					goto error1;
					goto error1;
				XFS_WANT_CORRUPTED_GOTO(i == 1, error1);
				XFS_WANT_CORRUPTED_GOTO(i == 1, error1);
			}
			}
@@ -813,10 +808,8 @@ xfs_dialloc(
				goto error1;
				goto error1;
			doneright = !i;
			doneright = !i;
			if (!doneright) {
			if (!doneright) {
				if ((error = xfs_inobt_get_rec(cur,
				error = xfs_inobt_get_rec(cur, &rec, &i);
						&rec.ir_startino,
				if (error)
						&rec.ir_freecount,
						&rec.ir_free, &i)))
					goto error1;
					goto error1;
				XFS_WANT_CORRUPTED_GOTO(i == 1, error1);
				XFS_WANT_CORRUPTED_GOTO(i == 1, error1);
			}
			}
@@ -876,11 +869,9 @@ xfs_dialloc(
						goto error1;
						goto error1;
					doneleft = !i;
					doneleft = !i;
					if (!doneleft) {
					if (!doneleft) {
						if ((error = xfs_inobt_get_rec(
						error = xfs_inobt_get_rec(
							    tcur,
							    tcur, &trec, &i);
							    &trec.ir_startino,
						if (error)
							    &trec.ir_freecount,
							    &trec.ir_free, &i)))
							goto error1;
							goto error1;
						XFS_WANT_CORRUPTED_GOTO(i == 1,
						XFS_WANT_CORRUPTED_GOTO(i == 1,
							error1);
							error1);
@@ -896,11 +887,9 @@ xfs_dialloc(
						goto error1;
						goto error1;
					doneright = !i;
					doneright = !i;
					if (!doneright) {
					if (!doneright) {
						if ((error = xfs_inobt_get_rec(
						error = xfs_inobt_get_rec(
							    cur,
							    cur, &rec, &i);
							    &rec.ir_startino,
						if (error)
							    &rec.ir_freecount,
							    &rec.ir_free, &i)))
							goto error1;
							goto error1;
						XFS_WANT_CORRUPTED_GOTO(i == 1,
						XFS_WANT_CORRUPTED_GOTO(i == 1,
							error1);
							error1);
@@ -919,8 +908,7 @@ xfs_dialloc(
				be32_to_cpu(agi->agi_newino), 0, 0, &i)))
				be32_to_cpu(agi->agi_newino), 0, 0, &i)))
			goto error0;
			goto error0;
		if (i == 1 &&
		if (i == 1 &&
		    (error = xfs_inobt_get_rec(cur, &rec.ir_startino,
		    (error = xfs_inobt_get_rec(cur, &rec, &j)) == 0 &&
			    &rec.ir_freecount, &rec.ir_free, &j)) == 0 &&
		    j == 1 &&
		    j == 1 &&
		    rec.ir_freecount > 0) {
		    rec.ir_freecount > 0) {
			/*
			/*
@@ -938,10 +926,8 @@ xfs_dialloc(
				goto error0;
				goto error0;
			ASSERT(i == 1);
			ASSERT(i == 1);
			for (;;) {
			for (;;) {
				if ((error = xfs_inobt_get_rec(cur,
				error = xfs_inobt_get_rec(cur, &rec, &i);
						&rec.ir_startino,
				if (error)
						&rec.ir_freecount, &rec.ir_free,
						&i)))
					goto error0;
					goto error0;
				XFS_WANT_CORRUPTED_GOTO(i == 1, error0);
				XFS_WANT_CORRUPTED_GOTO(i == 1, error0);
				if (rec.ir_freecount > 0)
				if (rec.ir_freecount > 0)
@@ -975,8 +961,8 @@ xfs_dialloc(
		if ((error = xfs_inobt_lookup_ge(cur, 0, 0, 0, &i)))
		if ((error = xfs_inobt_lookup_ge(cur, 0, 0, 0, &i)))
			goto error0;
			goto error0;
		do {
		do {
			if ((error = xfs_inobt_get_rec(cur, &rec.ir_startino,
			error = xfs_inobt_get_rec(cur, &rec, &i);
					&rec.ir_freecount, &rec.ir_free, &i)))
			if (error)
				goto error0;
				goto error0;
			XFS_WANT_CORRUPTED_GOTO(i == 1, error0);
			XFS_WANT_CORRUPTED_GOTO(i == 1, error0);
			freecount += rec.ir_freecount;
			freecount += rec.ir_freecount;
@@ -1084,8 +1070,8 @@ xfs_difree(
		if ((error = xfs_inobt_lookup_ge(cur, 0, 0, 0, &i)))
		if ((error = xfs_inobt_lookup_ge(cur, 0, 0, 0, &i)))
			goto error0;
			goto error0;
		do {
		do {
			if ((error = xfs_inobt_get_rec(cur, &rec.ir_startino,
			error = xfs_inobt_get_rec(cur, &rec, &i);
					&rec.ir_freecount, &rec.ir_free, &i)))
			if (error)
				goto error0;
				goto error0;
			if (i) {
			if (i) {
				freecount += rec.ir_freecount;
				freecount += rec.ir_freecount;
@@ -1107,8 +1093,8 @@ xfs_difree(
		goto error0;
		goto error0;
	}
	}
	XFS_WANT_CORRUPTED_GOTO(i == 1, error0);
	XFS_WANT_CORRUPTED_GOTO(i == 1, error0);
	if ((error = xfs_inobt_get_rec(cur, &rec.ir_startino, &rec.ir_freecount,
	error = xfs_inobt_get_rec(cur, &rec, &i);
			&rec.ir_free, &i))) {
	if (error) {
		cmn_err(CE_WARN,
		cmn_err(CE_WARN,
			"xfs_difree: xfs_inobt_get_rec()  returned an error %d on %s.  Returning error.",
			"xfs_difree: xfs_inobt_get_rec()  returned an error %d on %s.  Returning error.",
			error, mp->m_fsname);
			error, mp->m_fsname);
@@ -1187,10 +1173,8 @@ xfs_difree(
		if ((error = xfs_inobt_lookup_ge(cur, 0, 0, 0, &i)))
		if ((error = xfs_inobt_lookup_ge(cur, 0, 0, 0, &i)))
			goto error0;
			goto error0;
		do {
		do {
			if ((error = xfs_inobt_get_rec(cur,
			error = xfs_inobt_get_rec(cur, &rec, &i);
					&rec.ir_startino,
			if (error)
					&rec.ir_freecount,
					&rec.ir_free, &i)))
				goto error0;
				goto error0;
			if (i) {
			if (i) {
				freecount += rec.ir_freecount;
				freecount += rec.ir_freecount;
@@ -1312,9 +1296,7 @@ xfs_imap(
		chunk_agbno = agbno - offset_agbno;
		chunk_agbno = agbno - offset_agbno;
	} else {
	} else {
		xfs_btree_cur_t	*cur;	/* inode btree cursor */
		xfs_btree_cur_t	*cur;	/* inode btree cursor */
		xfs_agino_t	chunk_agino; /* first agino in inode chunk */
		xfs_inobt_rec_incore_t chunk_rec;
		__int32_t	chunk_cnt; /* count of free inodes in chunk */
		xfs_inofree_t	chunk_free; /* mask of free inodes in chunk */
		xfs_buf_t	*agbp;	/* agi buffer */
		xfs_buf_t	*agbp;	/* agi buffer */
		int		i;	/* temp state */
		int		i;	/* temp state */


@@ -1337,8 +1319,7 @@ xfs_imap(
			goto error0;
			goto error0;
		}
		}


		error = xfs_inobt_get_rec(cur, &chunk_agino, &chunk_cnt,
		error = xfs_inobt_get_rec(cur, &chunk_rec, &i);
				&chunk_free, &i);
		if (error) {
		if (error) {
			xfs_fs_cmn_err(CE_ALERT, mp, "xfs_imap: "
			xfs_fs_cmn_err(CE_ALERT, mp, "xfs_imap: "
					"xfs_inobt_get_rec() failed");
					"xfs_inobt_get_rec() failed");
@@ -1356,7 +1337,7 @@ xfs_imap(
		xfs_btree_del_cursor(cur, XFS_BTREE_NOERROR);
		xfs_btree_del_cursor(cur, XFS_BTREE_NOERROR);
		if (error)
		if (error)
			return error;
			return error;
		chunk_agbno = XFS_AGINO_TO_AGBNO(mp, chunk_agino);
		chunk_agbno = XFS_AGINO_TO_AGBNO(mp, chunk_rec.ir_startino);
		offset_agbno = agbno - chunk_agbno;
		offset_agbno = agbno - chunk_agbno;
	}
	}


+2 −2
Original line number Original line Diff line number Diff line
@@ -166,7 +166,7 @@ int xfs_inobt_lookup_le(struct xfs_btree_cur *cur, xfs_agino_t ino,
/*
/*
 * Get the data from the pointed-to record.
 * Get the data from the pointed-to record.
 */
 */
extern int xfs_inobt_get_rec(struct xfs_btree_cur *cur, xfs_agino_t *ino,
extern int xfs_inobt_get_rec(struct xfs_btree_cur *cur,
			     __int32_t *fcnt, xfs_inofree_t *free, int *stat);
		xfs_inobt_rec_incore_t *rec, int *stat);


#endif	/* __XFS_IALLOC_H__ */
#endif	/* __XFS_IALLOC_H__ */
+44 −40
Original line number Original line Diff line number Diff line
@@ -353,9 +353,6 @@ xfs_bulkstat(
	int			end_of_ag; /* set if we've seen the ag end */
	int			end_of_ag; /* set if we've seen the ag end */
	int			error;	/* error code */
	int			error;	/* error code */
	int                     fmterror;/* bulkstat formatter result */
	int                     fmterror;/* bulkstat formatter result */
	__int32_t		gcnt;	/* current btree rec's count */
	xfs_inofree_t		gfree;	/* current btree rec's free mask */
	xfs_agino_t		gino;	/* current btree rec's start inode */
	int			i;	/* loop index */
	int			i;	/* loop index */
	int			icount;	/* count of inodes good in irbuf */
	int			icount;	/* count of inodes good in irbuf */
	size_t			irbsize; /* size of irec buffer in bytes */
	size_t			irbsize; /* size of irec buffer in bytes */
@@ -442,6 +439,8 @@ xfs_bulkstat(
		 * we need to get the remainder of the chunk we're in.
		 * we need to get the remainder of the chunk we're in.
		 */
		 */
		if (agino > 0) {
		if (agino > 0) {
			xfs_inobt_rec_incore_t r;

			/*
			/*
			 * Lookup the inode chunk that this inode lives in.
			 * Lookup the inode chunk that this inode lives in.
			 */
			 */
@@ -449,33 +448,33 @@ xfs_bulkstat(
			if (!error &&	/* no I/O error */
			if (!error &&	/* no I/O error */
			    tmp &&	/* lookup succeeded */
			    tmp &&	/* lookup succeeded */
					/* got the record, should always work */
					/* got the record, should always work */
			    !(error = xfs_inobt_get_rec(cur, &gino, &gcnt,
			    !(error = xfs_inobt_get_rec(cur, &r, &i)) &&
				    &gfree, &i)) &&
			    i == 1 &&
			    i == 1 &&
					/* this is the right chunk */
					/* this is the right chunk */
			    agino < gino + XFS_INODES_PER_CHUNK &&
			    agino < r.ir_startino + XFS_INODES_PER_CHUNK &&
					/* lastino was not last in chunk */
					/* lastino was not last in chunk */
			    (chunkidx = agino - gino + 1) <
			    (chunkidx = agino - r.ir_startino + 1) <
				    XFS_INODES_PER_CHUNK &&
				    XFS_INODES_PER_CHUNK &&
					/* there are some left allocated */
					/* there are some left allocated */
			    xfs_inobt_maskn(chunkidx,
			    xfs_inobt_maskn(chunkidx,
				    XFS_INODES_PER_CHUNK - chunkidx) & ~gfree) {
				    XFS_INODES_PER_CHUNK - chunkidx) &
				    ~r.ir_free) {
				/*
				/*
				 * Grab the chunk record.  Mark all the
				 * Grab the chunk record.  Mark all the
				 * uninteresting inodes (because they're
				 * uninteresting inodes (because they're
				 * before our start point) free.
				 * before our start point) free.
				 */
				 */
				for (i = 0; i < chunkidx; i++) {
				for (i = 0; i < chunkidx; i++) {
					if (XFS_INOBT_MASK(i) & ~gfree)
					if (XFS_INOBT_MASK(i) & ~r.ir_free)
						gcnt++;
						r.ir_freecount++;
				}
				}
				gfree |= xfs_inobt_maskn(0, chunkidx);
				r.ir_free |= xfs_inobt_maskn(0, chunkidx);
				irbp->ir_startino = gino;
				irbp->ir_startino = r.ir_startino;
				irbp->ir_freecount = gcnt;
				irbp->ir_freecount = r.ir_freecount;
				irbp->ir_free = gfree;
				irbp->ir_free = r.ir_free;
				irbp++;
				irbp++;
				agino = gino + XFS_INODES_PER_CHUNK;
				agino = r.ir_startino + XFS_INODES_PER_CHUNK;
				icount = XFS_INODES_PER_CHUNK - gcnt;
				icount = XFS_INODES_PER_CHUNK - r.ir_freecount;
			} else {
			} else {
				/*
				/*
				 * If any of those tests failed, bump the
				 * If any of those tests failed, bump the
@@ -501,6 +500,8 @@ xfs_bulkstat(
		 * until we run out of inodes or space in the buffer.
		 * until we run out of inodes or space in the buffer.
		 */
		 */
		while (irbp < irbufend && icount < ubcount) {
		while (irbp < irbufend && icount < ubcount) {
			xfs_inobt_rec_incore_t r;

			/*
			/*
			 * Loop as long as we're unable to read the
			 * Loop as long as we're unable to read the
			 * inode btree.
			 * inode btree.
@@ -518,43 +519,47 @@ xfs_bulkstat(
			 * If ran off the end of the ag either with an error,
			 * If ran off the end of the ag either with an error,
			 * or the normal way, set end and stop collecting.
			 * or the normal way, set end and stop collecting.
			 */
			 */
			if (error ||
			if (error) {
			    (error = xfs_inobt_get_rec(cur, &gino, &gcnt,
				end_of_ag = 1;
				    &gfree, &i)) ||
				break;
			    i == 0) {
			}

			error = xfs_inobt_get_rec(cur, &r, &i);
			if (error || i == 0) {
				end_of_ag = 1;
				end_of_ag = 1;
				break;
				break;
			}
			}

			/*
			/*
			 * If this chunk has any allocated inodes, save it.
			 * If this chunk has any allocated inodes, save it.
			 * Also start read-ahead now for this chunk.
			 * Also start read-ahead now for this chunk.
			 */
			 */
			if (gcnt < XFS_INODES_PER_CHUNK) {
			if (r.ir_freecount < XFS_INODES_PER_CHUNK) {
				/*
				/*
				 * Loop over all clusters in the next chunk.
				 * Loop over all clusters in the next chunk.
				 * Do a readahead if there are any allocated
				 * Do a readahead if there are any allocated
				 * inodes in that cluster.
				 * inodes in that cluster.
				 */
				 */
				for (agbno = XFS_AGINO_TO_AGBNO(mp, gino),
				agbno = XFS_AGINO_TO_AGBNO(mp, r.ir_startino);
				     chunkidx = 0;
				for (chunkidx = 0;
				     chunkidx < XFS_INODES_PER_CHUNK;
				     chunkidx < XFS_INODES_PER_CHUNK;
				     chunkidx += nicluster,
				     chunkidx += nicluster,
				     agbno += nbcluster) {
				     agbno += nbcluster) {
					if (xfs_inobt_maskn(chunkidx,
					if (xfs_inobt_maskn(chunkidx, nicluster)
							    nicluster) & ~gfree)
							& ~r.ir_free)
						xfs_btree_reada_bufs(mp, agno,
						xfs_btree_reada_bufs(mp, agno,
							agbno, nbcluster);
							agbno, nbcluster);
				}
				}
				irbp->ir_startino = gino;
				irbp->ir_startino = r.ir_startino;
				irbp->ir_freecount = gcnt;
				irbp->ir_freecount = r.ir_freecount;
				irbp->ir_free = gfree;
				irbp->ir_free = r.ir_free;
				irbp++;
				irbp++;
				icount += XFS_INODES_PER_CHUNK - gcnt;
				icount += XFS_INODES_PER_CHUNK - r.ir_freecount;
			}
			}
			/*
			/*
			 * Set agino to after this chunk and bump the cursor.
			 * Set agino to after this chunk and bump the cursor.
			 */
			 */
			agino = gino + XFS_INODES_PER_CHUNK;
			agino = r.ir_startino + XFS_INODES_PER_CHUNK;
			error = xfs_btree_increment(cur, 0, &tmp);
			error = xfs_btree_increment(cur, 0, &tmp);
			cond_resched();
			cond_resched();
		}
		}
@@ -820,9 +825,7 @@ xfs_inumbers(
	int		bufidx;
	int		bufidx;
	xfs_btree_cur_t	*cur;
	xfs_btree_cur_t	*cur;
	int		error;
	int		error;
	__int32_t	gcnt;
	xfs_inobt_rec_incore_t r;
	xfs_inofree_t	gfree;
	xfs_agino_t	gino;
	int		i;
	int		i;
	xfs_ino_t	ino;
	xfs_ino_t	ino;
	int		left;
	int		left;
@@ -870,9 +873,8 @@ xfs_inumbers(
				continue;
				continue;
			}
			}
		}
		}
		if ((error = xfs_inobt_get_rec(cur, &gino, &gcnt, &gfree,
		error = xfs_inobt_get_rec(cur, &r, &i);
			&i)) ||
		if (error || i == 0) {
		    i == 0) {
			xfs_buf_relse(agbp);
			xfs_buf_relse(agbp);
			agbp = NULL;
			agbp = NULL;
			xfs_btree_del_cursor(cur, XFS_BTREE_NOERROR);
			xfs_btree_del_cursor(cur, XFS_BTREE_NOERROR);
@@ -881,10 +883,12 @@ xfs_inumbers(
			agino = 0;
			agino = 0;
			continue;
			continue;
		}
		}
		agino = gino + XFS_INODES_PER_CHUNK - 1;
		agino = r.ir_startino + XFS_INODES_PER_CHUNK - 1;
		buffer[bufidx].xi_startino = XFS_AGINO_TO_INO(mp, agno, gino);
		buffer[bufidx].xi_startino =
		buffer[bufidx].xi_alloccount = XFS_INODES_PER_CHUNK - gcnt;
			XFS_AGINO_TO_INO(mp, agno, r.ir_startino);
		buffer[bufidx].xi_allocmask = ~gfree;
		buffer[bufidx].xi_alloccount =
			XFS_INODES_PER_CHUNK - r.ir_freecount;
		buffer[bufidx].xi_allocmask = ~r.ir_free;
		bufidx++;
		bufidx++;
		left--;
		left--;
		if (bufidx == bcount) {
		if (bufidx == bcount) {