[XFS] stop using xfs_itobp in xfs_bulkstat
xfs_bulkstat only wants the dinode, offset and buffer from a given inode number. Instead of using xfs_itobp on a fake inode which is complicated and currently leads to leaks of the security data just use xfs_inotobp which is designed to do exactly the kind of lookup xfs_bulkstat wants. The only thing that's missing in xfs_inotobp is a flags paramter that let's us pass down XFS_IMAP_BULKSTAT, but that can easily added. SGI-PV: 987246 SGI-Modid: xfs-linux-melb:xfs-kern:32397a Signed-off-by: Christoph Hellwig <hch@infradead.org> Signed-off-by: Lachlan McIlroy <lachlan@sgi.com> Signed-off-by: David Chinner <david@fromorbit.com>
This commit is contained in:
parent
455486b9cc
commit
c679eef052
3 changed files with 19 additions and 21 deletions
|
@ -222,25 +222,26 @@ xfs_imap_to_bp(
|
||||||
* Use xfs_imap() to determine the size and location of the
|
* Use xfs_imap() to determine the size and location of the
|
||||||
* buffer to read from disk.
|
* buffer to read from disk.
|
||||||
*/
|
*/
|
||||||
STATIC int
|
int
|
||||||
xfs_inotobp(
|
xfs_inotobp(
|
||||||
xfs_mount_t *mp,
|
xfs_mount_t *mp,
|
||||||
xfs_trans_t *tp,
|
xfs_trans_t *tp,
|
||||||
xfs_ino_t ino,
|
xfs_ino_t ino,
|
||||||
xfs_dinode_t **dipp,
|
xfs_dinode_t **dipp,
|
||||||
xfs_buf_t **bpp,
|
xfs_buf_t **bpp,
|
||||||
int *offset)
|
int *offset,
|
||||||
|
uint imap_flags)
|
||||||
{
|
{
|
||||||
xfs_imap_t imap;
|
xfs_imap_t imap;
|
||||||
xfs_buf_t *bp;
|
xfs_buf_t *bp;
|
||||||
int error;
|
int error;
|
||||||
|
|
||||||
imap.im_blkno = 0;
|
imap.im_blkno = 0;
|
||||||
error = xfs_imap(mp, tp, ino, &imap, XFS_IMAP_LOOKUP);
|
error = xfs_imap(mp, tp, ino, &imap, imap_flags | XFS_IMAP_LOOKUP);
|
||||||
if (error)
|
if (error)
|
||||||
return error;
|
return error;
|
||||||
|
|
||||||
error = xfs_imap_to_bp(mp, tp, &imap, &bp, XFS_BUF_LOCK, 0);
|
error = xfs_imap_to_bp(mp, tp, &imap, &bp, XFS_BUF_LOCK, imap_flags);
|
||||||
if (error)
|
if (error)
|
||||||
return error;
|
return error;
|
||||||
|
|
||||||
|
@ -792,7 +793,7 @@ xfs_dic2xflags(
|
||||||
/*
|
/*
|
||||||
* Allocate and initialise an xfs_inode.
|
* Allocate and initialise an xfs_inode.
|
||||||
*/
|
*/
|
||||||
struct xfs_inode *
|
STATIC struct xfs_inode *
|
||||||
xfs_inode_alloc(
|
xfs_inode_alloc(
|
||||||
struct xfs_mount *mp,
|
struct xfs_mount *mp,
|
||||||
xfs_ino_t ino)
|
xfs_ino_t ino)
|
||||||
|
@ -2046,7 +2047,7 @@ xfs_iunlink_remove(
|
||||||
}
|
}
|
||||||
next_ino = XFS_AGINO_TO_INO(mp, agno, next_agino);
|
next_ino = XFS_AGINO_TO_INO(mp, agno, next_agino);
|
||||||
error = xfs_inotobp(mp, tp, next_ino, &last_dip,
|
error = xfs_inotobp(mp, tp, next_ino, &last_dip,
|
||||||
&last_ibp, &last_offset);
|
&last_ibp, &last_offset, 0);
|
||||||
if (error) {
|
if (error) {
|
||||||
cmn_err(CE_WARN,
|
cmn_err(CE_WARN,
|
||||||
"xfs_iunlink_remove: xfs_inotobp() returned an error %d on %s. Returning error.",
|
"xfs_iunlink_remove: xfs_inotobp() returned an error %d on %s. Returning error.",
|
||||||
|
|
|
@ -158,7 +158,7 @@ typedef struct xfs_icdinode {
|
||||||
#define XFS_IFEXTIREC 0x08 /* Indirection array of extent blocks */
|
#define XFS_IFEXTIREC 0x08 /* Indirection array of extent blocks */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Flags for xfs_itobp(), xfs_imap() and xfs_dilocate().
|
* Flags for xfs_inotobp, xfs_itobp(), xfs_imap() and xfs_dilocate().
|
||||||
*/
|
*/
|
||||||
#define XFS_IMAP_LOOKUP 0x1
|
#define XFS_IMAP_LOOKUP 0x1
|
||||||
#define XFS_IMAP_BULKSTAT 0x2
|
#define XFS_IMAP_BULKSTAT 0x2
|
||||||
|
@ -514,7 +514,6 @@ int xfs_itruncate_finish(struct xfs_trans **, xfs_inode_t *,
|
||||||
xfs_fsize_t, int, int);
|
xfs_fsize_t, int, int);
|
||||||
int xfs_iunlink(struct xfs_trans *, xfs_inode_t *);
|
int xfs_iunlink(struct xfs_trans *, xfs_inode_t *);
|
||||||
|
|
||||||
struct xfs_inode * xfs_inode_alloc(struct xfs_mount *, xfs_ino_t);
|
|
||||||
void xfs_idestroy(xfs_inode_t *);
|
void xfs_idestroy(xfs_inode_t *);
|
||||||
void xfs_iextract(xfs_inode_t *);
|
void xfs_iextract(xfs_inode_t *);
|
||||||
void xfs_iext_realloc(xfs_inode_t *, int, int);
|
void xfs_iext_realloc(xfs_inode_t *, int, int);
|
||||||
|
@ -531,6 +530,9 @@ void xfs_mark_inode_dirty_sync(xfs_inode_t *);
|
||||||
|
|
||||||
#endif /* __KERNEL__ */
|
#endif /* __KERNEL__ */
|
||||||
|
|
||||||
|
int xfs_inotobp(struct xfs_mount *, struct xfs_trans *,
|
||||||
|
xfs_ino_t, struct xfs_dinode **,
|
||||||
|
struct xfs_buf **, int *, uint);
|
||||||
int xfs_itobp(struct xfs_mount *, struct xfs_trans *,
|
int xfs_itobp(struct xfs_mount *, struct xfs_trans *,
|
||||||
struct xfs_inode *, struct xfs_dinode **,
|
struct xfs_inode *, struct xfs_dinode **,
|
||||||
struct xfs_buf **, xfs_daddr_t, uint, uint);
|
struct xfs_buf **, xfs_daddr_t, uint, uint);
|
||||||
|
|
|
@ -359,7 +359,6 @@ xfs_bulkstat(
|
||||||
int ubused; /* bytes used by formatter */
|
int ubused; /* bytes used by formatter */
|
||||||
xfs_buf_t *bp; /* ptr to on-disk inode cluster buf */
|
xfs_buf_t *bp; /* ptr to on-disk inode cluster buf */
|
||||||
xfs_dinode_t *dip; /* ptr into bp for specific inode */
|
xfs_dinode_t *dip; /* ptr into bp for specific inode */
|
||||||
xfs_inode_t *ip; /* ptr to in-core inode struct */
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Get the last inode value, see if there's nothing to do.
|
* Get the last inode value, see if there's nothing to do.
|
||||||
|
@ -585,6 +584,8 @@ xfs_bulkstat(
|
||||||
|
|
||||||
if (flags & (BULKSTAT_FG_QUICK |
|
if (flags & (BULKSTAT_FG_QUICK |
|
||||||
BULKSTAT_FG_INLINE)) {
|
BULKSTAT_FG_INLINE)) {
|
||||||
|
int offset;
|
||||||
|
|
||||||
ino = XFS_AGINO_TO_INO(mp, agno,
|
ino = XFS_AGINO_TO_INO(mp, agno,
|
||||||
agino);
|
agino);
|
||||||
bno = XFS_AGB_TO_DADDR(mp, agno,
|
bno = XFS_AGB_TO_DADDR(mp, agno,
|
||||||
|
@ -595,19 +596,13 @@ xfs_bulkstat(
|
||||||
*/
|
*/
|
||||||
if (bp)
|
if (bp)
|
||||||
xfs_buf_relse(bp);
|
xfs_buf_relse(bp);
|
||||||
ip = xfs_inode_alloc(mp, ino);
|
|
||||||
if (!ip) {
|
error = xfs_inotobp(mp, NULL, ino, &dip,
|
||||||
bp = NULL;
|
&bp, &offset,
|
||||||
rval = ENOMEM;
|
XFS_IMAP_BULKSTAT);
|
||||||
break;
|
|
||||||
}
|
|
||||||
error = xfs_itobp(mp, NULL, ip,
|
|
||||||
&dip, &bp, bno,
|
|
||||||
XFS_IMAP_BULKSTAT,
|
|
||||||
XFS_BUF_LOCK);
|
|
||||||
if (!error)
|
if (!error)
|
||||||
clustidx = ip->i_boffset / mp->m_sb.sb_inodesize;
|
clustidx = offset / mp->m_sb.sb_inodesize;
|
||||||
xfs_idestroy(ip);
|
|
||||||
if (XFS_TEST_ERROR(error != 0,
|
if (XFS_TEST_ERROR(error != 0,
|
||||||
mp, XFS_ERRTAG_BULKSTAT_READ_CHUNK,
|
mp, XFS_ERRTAG_BULKSTAT_READ_CHUNK,
|
||||||
XFS_RANDOM_BULKSTAT_READ_CHUNK)) {
|
XFS_RANDOM_BULKSTAT_READ_CHUNK)) {
|
||||||
|
|
Loading…
Reference in a new issue