diff options
Diffstat (limited to 'fs/xfs/libxfs/xfs_attr_remote.c')
| -rw-r--r-- | fs/xfs/libxfs/xfs_attr_remote.c | 102 | 
1 files changed, 56 insertions, 46 deletions
diff --git a/fs/xfs/libxfs/xfs_attr_remote.c b/fs/xfs/libxfs/xfs_attr_remote.c index ff0412828772..4c44ce1c8a64 100644 --- a/fs/xfs/libxfs/xfs_attr_remote.c +++ b/fs/xfs/libxfs/xfs_attr_remote.c @@ -43,19 +43,32 @@   * the logging system and therefore never have a log item.   */ -/* - * Each contiguous block has a header, so it is not just a simple attribute - * length to FSB conversion. - */ -int +/* How many bytes can be stored in a remote value buffer? */ +inline unsigned int +xfs_attr3_rmt_buf_space( +	struct xfs_mount	*mp) +{ +	unsigned int		blocksize = mp->m_attr_geo->blksize; + +	if (xfs_has_crc(mp)) +		return blocksize - sizeof(struct xfs_attr3_rmt_hdr); + +	return blocksize; +} + +/* Compute number of fsblocks needed to store a remote attr value */ +unsigned int  xfs_attr3_rmt_blocks( -	struct xfs_mount *mp, -	int		attrlen) +	struct xfs_mount	*mp, +	unsigned int		attrlen)  { -	if (xfs_has_crc(mp)) { -		int buflen = XFS_ATTR3_RMT_BUF_SPACE(mp, mp->m_sb.sb_blocksize); -		return (attrlen + buflen - 1) / buflen; -	} +	/* +	 * Each contiguous block has a header, so it is not just a simple +	 * attribute length to FSB conversion. +	 */ +	if (xfs_has_crc(mp)) +		return howmany(attrlen, xfs_attr3_rmt_buf_space(mp)); +  	return XFS_B_TO_FSB(mp, attrlen);  } @@ -92,7 +105,6 @@ xfs_attr3_rmt_verify(  	struct xfs_mount	*mp,  	struct xfs_buf		*bp,  	void			*ptr, -	int			fsbsize,  	xfs_daddr_t		bno)  {  	struct xfs_attr3_rmt_hdr *rmt = ptr; @@ -103,7 +115,7 @@ xfs_attr3_rmt_verify(  		return __this_address;  	if (be64_to_cpu(rmt->rm_blkno) != bno)  		return __this_address; -	if (be32_to_cpu(rmt->rm_bytes) > fsbsize - sizeof(*rmt)) +	if (be32_to_cpu(rmt->rm_bytes) > mp->m_attr_geo->blksize - sizeof(*rmt))  		return __this_address;  	if (be32_to_cpu(rmt->rm_offset) +  				be32_to_cpu(rmt->rm_bytes) > XFS_XATTR_SIZE_MAX) @@ -122,9 +134,9 @@ __xfs_attr3_rmt_read_verify(  {  	struct xfs_mount *mp = bp->b_mount;  	char		*ptr; -	int		len; +	unsigned int	len;  	xfs_daddr_t	bno; -	int		blksize = mp->m_attr_geo->blksize; +	unsigned int	blksize = mp->m_attr_geo->blksize;  	/* no verification of non-crc buffers */  	if (!xfs_has_crc(mp)) @@ -141,7 +153,7 @@ __xfs_attr3_rmt_read_verify(  			*failaddr = __this_address;  			return -EFSBADCRC;  		} -		*failaddr = xfs_attr3_rmt_verify(mp, bp, ptr, blksize, bno); +		*failaddr = xfs_attr3_rmt_verify(mp, bp, ptr, bno);  		if (*failaddr)  			return -EFSCORRUPTED;  		len -= blksize; @@ -186,7 +198,7 @@ xfs_attr3_rmt_write_verify(  {  	struct xfs_mount *mp = bp->b_mount;  	xfs_failaddr_t	fa; -	int		blksize = mp->m_attr_geo->blksize; +	unsigned int	blksize = mp->m_attr_geo->blksize;  	char		*ptr;  	int		len;  	xfs_daddr_t	bno; @@ -203,7 +215,7 @@ xfs_attr3_rmt_write_verify(  	while (len > 0) {  		struct xfs_attr3_rmt_hdr *rmt = (struct xfs_attr3_rmt_hdr *)ptr; -		fa = xfs_attr3_rmt_verify(mp, bp, ptr, blksize, bno); +		fa = xfs_attr3_rmt_verify(mp, bp, ptr, bno);  		if (fa) {  			xfs_verifier_error(bp, -EFSCORRUPTED, fa);  			return; @@ -280,30 +292,30 @@ xfs_attr_rmtval_copyout(  	struct xfs_mount	*mp,  	struct xfs_buf		*bp,  	struct xfs_inode	*dp, -	int			*offset, -	int			*valuelen, +	xfs_ino_t		owner, +	unsigned int		*offset, +	unsigned int		*valuelen,  	uint8_t			**dst)  {  	char			*src = bp->b_addr; -	xfs_ino_t		ino = dp->i_ino;  	xfs_daddr_t		bno = xfs_buf_daddr(bp); -	int			len = BBTOB(bp->b_length); -	int			blksize = mp->m_attr_geo->blksize; +	unsigned int		len = BBTOB(bp->b_length); +	unsigned int		blksize = mp->m_attr_geo->blksize;  	ASSERT(len >= blksize);  	while (len > 0 && *valuelen > 0) { -		int hdr_size = 0; -		int byte_cnt = XFS_ATTR3_RMT_BUF_SPACE(mp, blksize); +		unsigned int hdr_size = 0; +		unsigned int byte_cnt = xfs_attr3_rmt_buf_space(mp);  		byte_cnt = min(*valuelen, byte_cnt);  		if (xfs_has_crc(mp)) { -			if (xfs_attr3_rmt_hdr_ok(src, ino, *offset, +			if (xfs_attr3_rmt_hdr_ok(src, owner, *offset,  						  byte_cnt, bno)) {  				xfs_alert(mp,  "remote attribute header mismatch bno/off/len/owner (0x%llx/0x%x/Ox%x/0x%llx)", -					bno, *offset, byte_cnt, ino); +					bno, *offset, byte_cnt, owner);  				xfs_dirattr_mark_sick(dp, XFS_ATTR_FORK);  				return -EFSCORRUPTED;  			} @@ -330,20 +342,20 @@ xfs_attr_rmtval_copyin(  	struct xfs_mount *mp,  	struct xfs_buf	*bp,  	xfs_ino_t	ino, -	int		*offset, -	int		*valuelen, +	unsigned int	*offset, +	unsigned int	*valuelen,  	uint8_t		**src)  {  	char		*dst = bp->b_addr;  	xfs_daddr_t	bno = xfs_buf_daddr(bp); -	int		len = BBTOB(bp->b_length); -	int		blksize = mp->m_attr_geo->blksize; +	unsigned int	len = BBTOB(bp->b_length); +	unsigned int	blksize = mp->m_attr_geo->blksize;  	ASSERT(len >= blksize);  	while (len > 0 && *valuelen > 0) { -		int hdr_size; -		int byte_cnt = XFS_ATTR3_RMT_BUF_SPACE(mp, blksize); +		unsigned int hdr_size; +		unsigned int byte_cnt = xfs_attr3_rmt_buf_space(mp);  		byte_cnt = min(*valuelen, byte_cnt);  		hdr_size = xfs_attr3_rmt_hdr_set(mp, dst, ino, *offset, @@ -389,12 +401,12 @@ xfs_attr_rmtval_get(  	struct xfs_buf		*bp;  	xfs_dablk_t		lblkno = args->rmtblkno;  	uint8_t			*dst = args->value; -	int			valuelen; +	unsigned int		valuelen;  	int			nmap;  	int			error; -	int			blkcnt = args->rmtblkcnt; +	unsigned int		blkcnt = args->rmtblkcnt;  	int			i; -	int			offset = 0; +	unsigned int		offset = 0;  	trace_xfs_attr_rmtval_get(args); @@ -427,8 +439,7 @@ xfs_attr_rmtval_get(  				return error;  			error = xfs_attr_rmtval_copyout(mp, bp, args->dp, -							&offset, &valuelen, -							&dst); +					args->owner, &offset, &valuelen, &dst);  			xfs_buf_relse(bp);  			if (error)  				return error; @@ -453,7 +464,7 @@ xfs_attr_rmt_find_hole(  	struct xfs_inode	*dp = args->dp;  	struct xfs_mount	*mp = dp->i_mount;  	int			error; -	int			blkcnt; +	unsigned int		blkcnt;  	xfs_fileoff_t		lfileoff = 0;  	/* @@ -482,11 +493,11 @@ xfs_attr_rmtval_set_value(  	struct xfs_bmbt_irec	map;  	xfs_dablk_t		lblkno;  	uint8_t			*src = args->value; -	int			blkcnt; -	int			valuelen; +	unsigned int		blkcnt; +	unsigned int		valuelen;  	int			nmap;  	int			error; -	int			offset = 0; +	unsigned int		offset = 0;  	/*  	 * Roll through the "value", copying the attribute value to the @@ -522,8 +533,8 @@ xfs_attr_rmtval_set_value(  			return error;  		bp->b_ops = &xfs_attr3_rmt_buf_ops; -		xfs_attr_rmtval_copyin(mp, bp, args->dp->i_ino, &offset, -				       &valuelen, &src); +		xfs_attr_rmtval_copyin(mp, bp, args->owner, &offset, &valuelen, +				&src);  		error = xfs_bwrite(bp);	/* GROT: NOTE: synchronous write */  		xfs_buf_relse(bp); @@ -626,7 +637,6 @@ xfs_attr_rmtval_set_blk(  	if (error)  		return error; -	ASSERT(nmap == 1);  	ASSERT((map->br_startblock != DELAYSTARTBLOCK) &&  	       (map->br_startblock != HOLESTARTBLOCK)); @@ -646,7 +656,7 @@ xfs_attr_rmtval_invalidate(  	struct xfs_da_args	*args)  {  	xfs_dablk_t		lblkno; -	int			blkcnt; +	unsigned int		blkcnt;  	int			error;  	/*  |