diff options
| author | Christoph Hellwig <hch@infradead.org> | 2008-10-30 18:04:13 +1100 | 
|---|---|---|
| committer | Lachlan McIlroy <lachlan@redback.melbourne.sgi.com> | 2008-10-30 18:04:13 +1100 | 
| commit | c679eef0520eb3c2c731fce505e61b8ef9469aac (patch) | |
| tree | 6a3cdcb882282d10dac7bb45e194fc473dd3940d | |
| parent | 455486b9ccdd0a1d7432a03302f549b1c917c181 (diff) | |
| download | olio-linux-3.10-c679eef0520eb3c2c731fce505e61b8ef9469aac.tar.xz olio-linux-3.10-c679eef0520eb3c2c731fce505e61b8ef9469aac.zip  | |
[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>
| -rw-r--r-- | fs/xfs/xfs_inode.c | 13 | ||||
| -rw-r--r-- | fs/xfs/xfs_inode.h | 6 | ||||
| -rw-r--r-- | fs/xfs/xfs_itable.c | 21 | 
3 files changed, 19 insertions, 21 deletions
diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c index c83f6998f95..35e419191ab 100644 --- a/fs/xfs/xfs_inode.c +++ b/fs/xfs/xfs_inode.c @@ -222,25 +222,26 @@ xfs_imap_to_bp(   * Use xfs_imap() to determine the size and location of the   * buffer to read from disk.   */ -STATIC int +int  xfs_inotobp(  	xfs_mount_t	*mp,  	xfs_trans_t	*tp,  	xfs_ino_t	ino,  	xfs_dinode_t	**dipp,  	xfs_buf_t	**bpp, -	int		*offset) +	int		*offset, +	uint		imap_flags)  {  	xfs_imap_t	imap;  	xfs_buf_t	*bp;  	int		error;  	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)  		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)  		return error; @@ -792,7 +793,7 @@ xfs_dic2xflags(  /*   * Allocate and initialise an xfs_inode.   */ -struct xfs_inode * +STATIC struct xfs_inode *  xfs_inode_alloc(  	struct xfs_mount	*mp,  	xfs_ino_t		ino) @@ -2046,7 +2047,7 @@ xfs_iunlink_remove(  			}  			next_ino = XFS_AGINO_TO_INO(mp, agno, next_agino);  			error = xfs_inotobp(mp, tp, next_ino, &last_dip, -					    &last_ibp, &last_offset); +					    &last_ibp, &last_offset, 0);  			if (error) {  				cmn_err(CE_WARN,  			"xfs_iunlink_remove: xfs_inotobp()  returned an error %d on %s.  Returning error.", diff --git a/fs/xfs/xfs_inode.h b/fs/xfs/xfs_inode.h index a5aeb9cfeae..5d12cfeb43c 100644 --- a/fs/xfs/xfs_inode.h +++ b/fs/xfs/xfs_inode.h @@ -158,7 +158,7 @@ typedef struct xfs_icdinode {  #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_BULKSTAT	0x2 @@ -514,7 +514,6 @@ int		xfs_itruncate_finish(struct xfs_trans **, xfs_inode_t *,  				     xfs_fsize_t, int, int);  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_iextract(xfs_inode_t *);  void		xfs_iext_realloc(xfs_inode_t *, int, int); @@ -531,6 +530,9 @@ void		xfs_mark_inode_dirty_sync(xfs_inode_t *);  #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 *,  			  struct xfs_inode *, struct xfs_dinode **,  			  struct xfs_buf **, xfs_daddr_t, uint, uint); diff --git a/fs/xfs/xfs_itable.c b/fs/xfs/xfs_itable.c index 42a214b8df9..35118032a5d 100644 --- a/fs/xfs/xfs_itable.c +++ b/fs/xfs/xfs_itable.c @@ -359,7 +359,6 @@ xfs_bulkstat(  	int			ubused;	/* bytes used by formatter */  	xfs_buf_t		*bp;	/* ptr to on-disk inode cluster buf */  	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. @@ -585,6 +584,8 @@ xfs_bulkstat(  					if (flags & (BULKSTAT_FG_QUICK |  						     BULKSTAT_FG_INLINE)) { +						int offset; +  						ino = XFS_AGINO_TO_INO(mp, agno,  								       agino);  						bno = XFS_AGB_TO_DADDR(mp, agno, @@ -595,19 +596,13 @@ xfs_bulkstat(  						 */  						if (bp)  							xfs_buf_relse(bp); -						ip = xfs_inode_alloc(mp, ino); -						if (!ip) { -							bp = NULL; -							rval = ENOMEM; -							break; -						} -						error = xfs_itobp(mp, NULL, ip, -								&dip, &bp, bno, -								XFS_IMAP_BULKSTAT, -								XFS_BUF_LOCK); + +						error = xfs_inotobp(mp, NULL, ino, &dip, +								    &bp, &offset, +								    XFS_IMAP_BULKSTAT); +  						if (!error) -							clustidx = ip->i_boffset / mp->m_sb.sb_inodesize; -						xfs_idestroy(ip); +							clustidx = offset / mp->m_sb.sb_inodesize;  						if (XFS_TEST_ERROR(error != 0,  								   mp, XFS_ERRTAG_BULKSTAT_READ_CHUNK,  								   XFS_RANDOM_BULKSTAT_READ_CHUNK)) {  |