diff options
Diffstat (limited to 'fs/xfs')
35 files changed, 615 insertions, 505 deletions
| diff --git a/fs/xfs/Kconfig b/fs/xfs/Kconfig index 5a7ffe54f5d5..cc33aaf219f1 100644 --- a/fs/xfs/Kconfig +++ b/fs/xfs/Kconfig @@ -70,8 +70,8 @@ config XFS_RT  	  If unsure, say N.  config XFS_DEBUG -	bool "XFS Debugging support (EXPERIMENTAL)" -	depends on XFS_FS && EXPERIMENTAL +	bool "XFS Debugging support" +	depends on XFS_FS  	help  	  Say Y here to get an XFS build with many debugging features,  	  including ASSERT checks, function wrappers around macros, diff --git a/fs/xfs/xfs_alloc.c b/fs/xfs/xfs_alloc.c index 393055fe3aef..0ad23253e8b1 100644 --- a/fs/xfs/xfs_alloc.c +++ b/fs/xfs/xfs_alloc.c @@ -1925,8 +1925,6 @@ xfs_alloc_fix_freelist(  	targs.mp = mp;  	targs.agbp = agbp;  	targs.agno = args->agno; -	targs.mod = targs.minleft = targs.wasdel = targs.userdata = -		targs.minalignslop = 0;  	targs.alignment = targs.minlen = targs.prod = targs.isfl = 1;  	targs.type = XFS_ALLOCTYPE_THIS_AG;  	targs.pag = pag; diff --git a/fs/xfs/xfs_aops.c b/fs/xfs/xfs_aops.c index 4111a40ebe1a..5f707e537171 100644 --- a/fs/xfs/xfs_aops.c +++ b/fs/xfs/xfs_aops.c @@ -86,11 +86,11 @@ xfs_destroy_ioend(  	}  	if (ioend->io_iocb) { +		inode_dio_done(ioend->io_inode);  		if (ioend->io_isasync) {  			aio_complete(ioend->io_iocb, ioend->io_error ?  					ioend->io_error : ioend->io_result, 0);  		} -		inode_dio_done(ioend->io_inode);  	}  	mempool_free(ioend, xfs_ioend_pool); diff --git a/fs/xfs/xfs_attr.c b/fs/xfs/xfs_attr.c index aaf472532b3c..888683844d98 100644 --- a/fs/xfs/xfs_attr.c +++ b/fs/xfs/xfs_attr.c @@ -300,9 +300,12 @@ xfs_attr_set_int(  	if (rsvd)  		args.trans->t_flags |= XFS_TRANS_RESERVE; -	if ((error = xfs_trans_reserve(args.trans, args.total, -			XFS_ATTRSET_LOG_RES(mp, args.total), 0, -			XFS_TRANS_PERM_LOG_RES, XFS_ATTRSET_LOG_COUNT))) { +	error = xfs_trans_reserve(args.trans, args.total, +				  XFS_ATTRSETM_LOG_RES(mp) + +				  XFS_ATTRSETRT_LOG_RES(mp) * args.total, +				  0, XFS_TRANS_PERM_LOG_RES, +				  XFS_ATTRSET_LOG_COUNT); +	if (error) {  		xfs_trans_cancel(args.trans, 0);  		return(error);  	} diff --git a/fs/xfs/xfs_bmap.c b/fs/xfs/xfs_bmap.c index 0e92d12765d2..b44af9211bd9 100644 --- a/fs/xfs/xfs_bmap.c +++ b/fs/xfs/xfs_bmap.c @@ -147,7 +147,10 @@ xfs_bmap_local_to_extents(  	xfs_fsblock_t	*firstblock,	/* first block allocated in xaction */  	xfs_extlen_t	total,		/* total blocks needed by transaction */  	int		*logflagsp,	/* inode logging flags */ -	int		whichfork);	/* data or attr fork */ +	int		whichfork,	/* data or attr fork */ +	void		(*init_fn)(struct xfs_buf *bp, +				   struct xfs_inode *ip, +				   struct xfs_ifork *ifp));  /*   * Search the extents list for the inode, for the extent containing bno. @@ -357,7 +360,42 @@ xfs_bmap_add_attrfork_extents(  }  /* - * Called from xfs_bmap_add_attrfork to handle local format files. + * Block initialisation functions for local to extent format conversion. + * As these get more complex, they will be moved to the relevant files, + * but for now they are too simple to worry about. + */ +STATIC void +xfs_bmap_local_to_extents_init_fn( +	struct xfs_buf		*bp, +	struct xfs_inode	*ip, +	struct xfs_ifork	*ifp) +{ +	bp->b_ops = &xfs_bmbt_buf_ops; +	memcpy(bp->b_addr, ifp->if_u1.if_data, ifp->if_bytes); +} + +STATIC void +xfs_symlink_local_to_remote( +	struct xfs_buf		*bp, +	struct xfs_inode	*ip, +	struct xfs_ifork	*ifp) +{ +	/* remote symlink blocks are not verifiable until CRCs come along */ +	bp->b_ops = NULL; +	memcpy(bp->b_addr, ifp->if_u1.if_data, ifp->if_bytes); +} + +/* + * Called from xfs_bmap_add_attrfork to handle local format files. Each + * different data fork content type needs a different callout to do the + * conversion. Some are basic and only require special block initialisation + * callouts for the data formating, others (directories) are so specialised they + * handle everything themselves. + * + * XXX (dgc): investigate whether directory conversion can use the generic + * formatting callout. It should be possible - it's just a very complex + * formatter. it would also require passing the transaction through to the init + * function.   */  STATIC int					/* error */  xfs_bmap_add_attrfork_local( @@ -368,25 +406,29 @@ xfs_bmap_add_attrfork_local(  	int			*flags)		/* inode logging flags */  {  	xfs_da_args_t		dargs;		/* args for dir/attr code */ -	int			error;		/* error return value */ -	xfs_mount_t		*mp;		/* mount structure pointer */  	if (ip->i_df.if_bytes <= XFS_IFORK_DSIZE(ip))  		return 0; +  	if (S_ISDIR(ip->i_d.di_mode)) { -		mp = ip->i_mount;  		memset(&dargs, 0, sizeof(dargs));  		dargs.dp = ip;  		dargs.firstblock = firstblock;  		dargs.flist = flist; -		dargs.total = mp->m_dirblkfsbs; +		dargs.total = ip->i_mount->m_dirblkfsbs;  		dargs.whichfork = XFS_DATA_FORK;  		dargs.trans = tp; -		error = xfs_dir2_sf_to_block(&dargs); -	} else -		error = xfs_bmap_local_to_extents(tp, ip, firstblock, 1, flags, -			XFS_DATA_FORK); -	return error; +		return xfs_dir2_sf_to_block(&dargs); +	} + +	if (S_ISLNK(ip->i_d.di_mode)) +		return xfs_bmap_local_to_extents(tp, ip, firstblock, 1, +						 flags, XFS_DATA_FORK, +						 xfs_symlink_local_to_remote); + +	return xfs_bmap_local_to_extents(tp, ip, firstblock, 1, flags, +					 XFS_DATA_FORK, +					 xfs_bmap_local_to_extents_init_fn);  }  /* @@ -3099,8 +3141,6 @@ xfs_bmap_extents_to_btree(  		args.fsbno = *firstblock;  	}  	args.minlen = args.maxlen = args.prod = 1; -	args.total = args.minleft = args.alignment = args.mod = args.isfl = -		args.minalignslop = 0;  	args.wasdel = wasdel;  	*logflagsp = 0;  	if ((error = xfs_alloc_vextent(&args))) { @@ -3221,7 +3261,10 @@ xfs_bmap_local_to_extents(  	xfs_fsblock_t	*firstblock,	/* first block allocated in xaction */  	xfs_extlen_t	total,		/* total blocks needed by transaction */  	int		*logflagsp,	/* inode logging flags */ -	int		whichfork)	/* data or attr fork */ +	int		whichfork, +	void		(*init_fn)(struct xfs_buf *bp, +				   struct xfs_inode *ip, +				   struct xfs_ifork *ifp))  {  	int		error;		/* error return value */  	int		flags;		/* logging flags returned */ @@ -3241,12 +3284,12 @@ xfs_bmap_local_to_extents(  		xfs_buf_t	*bp;	/* buffer for extent block */  		xfs_bmbt_rec_host_t *ep;/* extent record pointer */ +		ASSERT((ifp->if_flags & +			(XFS_IFINLINE|XFS_IFEXTENTS|XFS_IFEXTIREC)) == XFS_IFINLINE);  		memset(&args, 0, sizeof(args));  		args.tp = tp;  		args.mp = ip->i_mount;  		args.firstblock = *firstblock; -		ASSERT((ifp->if_flags & -			(XFS_IFINLINE|XFS_IFEXTENTS|XFS_IFEXTIREC)) == XFS_IFINLINE);  		/*  		 * Allocate a block.  We know we need only one, since the  		 * file currently fits in an inode. @@ -3259,20 +3302,21 @@ xfs_bmap_local_to_extents(  			args.type = XFS_ALLOCTYPE_NEAR_BNO;  		}  		args.total = total; -		args.mod = args.minleft = args.alignment = args.wasdel = -			args.isfl = args.minalignslop = 0;  		args.minlen = args.maxlen = args.prod = 1; -		if ((error = xfs_alloc_vextent(&args))) +		error = xfs_alloc_vextent(&args); +		if (error)  			goto done; -		/* -		 * Can't fail, the space was reserved. -		 */ + +		/* Can't fail, the space was reserved. */  		ASSERT(args.fsbno != NULLFSBLOCK);  		ASSERT(args.len == 1);  		*firstblock = args.fsbno;  		bp = xfs_btree_get_bufl(args.mp, tp, args.fsbno, 0); -		bp->b_ops = &xfs_bmbt_buf_ops; -		memcpy(bp->b_addr, ifp->if_u1.if_data, ifp->if_bytes); + +		/* initialise the block and copy the data */ +		init_fn(bp, ip, ifp); + +		/* account for the change in fork size and log everything */  		xfs_trans_log_buf(tp, bp, 0, ifp->if_bytes - 1);  		xfs_bmap_forkoff_reset(args.mp, ip, whichfork);  		xfs_idata_realloc(ip, -ifp->if_bytes, whichfork); @@ -4680,9 +4724,6 @@ __xfs_bmapi_allocate(  			return error;  	} -	if (bma->flags & XFS_BMAPI_STACK_SWITCH) -		bma->stack_switch = 1; -  	error = xfs_bmap_alloc(bma);  	if (error)  		return error; @@ -4922,8 +4963,32 @@ xfs_bmapi_write(  	XFS_STATS_INC(xs_blk_mapw);  	if (XFS_IFORK_FORMAT(ip, whichfork) == XFS_DINODE_FMT_LOCAL) { +		/* +		 * XXX (dgc): This assumes we are only called for inodes that +		 * contain content neutral data in local format. Anything that +		 * contains caller-specific data in local format that needs +		 * transformation to move to a block format needs to do the +		 * conversion to extent format itself. +		 * +		 * Directory data forks and attribute forks handle this +		 * themselves, but with the addition of metadata verifiers every +		 * data fork in local format now contains caller specific data +		 * and as such conversion through this function is likely to be +		 * broken. +		 * +		 * The only likely user of this branch is for remote symlinks, +		 * but we cannot overwrite the data fork contents of the symlink +		 * (EEXIST occurs higher up the stack) and so it will never go +		 * from local format to extent format here. Hence I don't think +		 * this branch is ever executed intentionally and we should +		 * consider removing it and asserting that xfs_bmapi_write() +		 * cannot be called directly on local format forks. i.e. callers +		 * are completely responsible for local to extent format +		 * conversion, not xfs_bmapi_write(). +		 */  		error = xfs_bmap_local_to_extents(tp, ip, firstblock, total, -						  &bma.logflags, whichfork); +					&bma.logflags, whichfork, +					xfs_bmap_local_to_extents_init_fn);  		if (error)  			goto error0;  	} @@ -4956,6 +5021,9 @@ xfs_bmapi_write(  	bma.flist = flist;  	bma.firstblock = firstblock; +	if (flags & XFS_BMAPI_STACK_SWITCH) +		bma.stack_switch = 1; +  	while (bno < end && n < *nmap) {  		inhole = eof || bma.got.br_startoff > bno;  		wasdelay = !inhole && isnullstartblock(bma.got.br_startblock); diff --git a/fs/xfs/xfs_buf.c b/fs/xfs/xfs_buf.c index 26673a0b20e7..4e8f0df82d02 100644 --- a/fs/xfs/xfs_buf.c +++ b/fs/xfs/xfs_buf.c @@ -175,7 +175,7 @@ xfs_buf_get_maps(  	bp->b_map_count = map_count;  	if (map_count == 1) { -		bp->b_maps = &bp->b_map; +		bp->b_maps = &bp->__b_map;  		return 0;  	} @@ -193,7 +193,7 @@ static void  xfs_buf_free_maps(  	struct xfs_buf	*bp)  { -	if (bp->b_maps != &bp->b_map) { +	if (bp->b_maps != &bp->__b_map) {  		kmem_free(bp->b_maps);  		bp->b_maps = NULL;  	} @@ -377,8 +377,8 @@ xfs_buf_allocate_memory(  	}  use_alloc_page: -	start = BBTOB(bp->b_map.bm_bn) >> PAGE_SHIFT; -	end = (BBTOB(bp->b_map.bm_bn + bp->b_length) + PAGE_SIZE - 1) +	start = BBTOB(bp->b_maps[0].bm_bn) >> PAGE_SHIFT; +	end = (BBTOB(bp->b_maps[0].bm_bn + bp->b_length) + PAGE_SIZE - 1)  								>> PAGE_SHIFT;  	page_count = end - start;  	error = _xfs_buf_get_pages(bp, page_count, flags); @@ -487,6 +487,7 @@ _xfs_buf_find(  	struct rb_node		*parent;  	xfs_buf_t		*bp;  	xfs_daddr_t		blkno = map[0].bm_bn; +	xfs_daddr_t		eofs;  	int			numblks = 0;  	int			i; @@ -498,6 +499,23 @@ _xfs_buf_find(  	ASSERT(!(numbytes < (1 << btp->bt_sshift)));  	ASSERT(!(BBTOB(blkno) & (xfs_off_t)btp->bt_smask)); +	/* +	 * Corrupted block numbers can get through to here, unfortunately, so we +	 * have to check that the buffer falls within the filesystem bounds. +	 */ +	eofs = XFS_FSB_TO_BB(btp->bt_mount, btp->bt_mount->m_sb.sb_dblocks); +	if (blkno >= eofs) { +		/* +		 * XXX (dgc): we should really be returning EFSCORRUPTED here, +		 * but none of the higher level infrastructure supports +		 * returning a specific error on buffer lookup failures. +		 */ +		xfs_alert(btp->bt_mount, +			  "%s: Block out of range: block 0x%llx, EOFS 0x%llx ", +			  __func__, blkno, eofs); +		return NULL; +	} +  	/* get tree root */  	pag = xfs_perag_get(btp->bt_mount,  				xfs_daddr_to_agno(btp->bt_mount, blkno)); @@ -640,7 +658,7 @@ _xfs_buf_read(  	xfs_buf_flags_t		flags)  {  	ASSERT(!(flags & XBF_WRITE)); -	ASSERT(bp->b_map.bm_bn != XFS_BUF_DADDR_NULL); +	ASSERT(bp->b_maps[0].bm_bn != XFS_BUF_DADDR_NULL);  	bp->b_flags &= ~(XBF_WRITE | XBF_ASYNC | XBF_READ_AHEAD);  	bp->b_flags |= flags & (XBF_READ | XBF_ASYNC | XBF_READ_AHEAD); @@ -933,8 +951,6 @@ xfs_buf_trylock(  	locked = down_trylock(&bp->b_sema) == 0;  	if (locked)  		XB_SET_OWNER(bp); -	else if (atomic_read(&bp->b_pin_count) && (bp->b_flags & XBF_STALE)) -		xfs_log_force(bp->b_target->bt_mount, 0);  	trace_xfs_buf_trylock(bp, _RET_IP_);  	return locked; @@ -1487,6 +1503,8 @@ restart:  	while (!list_empty(&btp->bt_lru)) {  		bp = list_first_entry(&btp->bt_lru, struct xfs_buf, b_lru);  		if (atomic_read(&bp->b_hold) > 1) { +			trace_xfs_buf_wait_buftarg(bp, _RET_IP_); +			list_move_tail(&bp->b_lru, &btp->bt_lru);  			spin_unlock(&btp->bt_lru_lock);  			delay(100);  			goto restart; @@ -1709,7 +1727,7 @@ xfs_buf_cmp(  	struct xfs_buf	*bp = container_of(b, struct xfs_buf, b_list);  	xfs_daddr_t		diff; -	diff = ap->b_map.bm_bn - bp->b_map.bm_bn; +	diff = ap->b_maps[0].bm_bn - bp->b_maps[0].bm_bn;  	if (diff < 0)  		return -1;  	if (diff > 0) diff --git a/fs/xfs/xfs_buf.h b/fs/xfs/xfs_buf.h index 23f5642480bb..433a12ed7b17 100644 --- a/fs/xfs/xfs_buf.h +++ b/fs/xfs/xfs_buf.h @@ -151,7 +151,7 @@ typedef struct xfs_buf {  	struct page		**b_pages;	/* array of page pointers */  	struct page		*b_page_array[XB_PAGES]; /* inline pages */  	struct xfs_buf_map	*b_maps;	/* compound buffer map */ -	struct xfs_buf_map	b_map;		/* inline compound buffer map */ +	struct xfs_buf_map	__b_map;	/* inline compound buffer map */  	int			b_map_count;  	int			b_io_length;	/* IO size in BBs */  	atomic_t		b_pin_count;	/* pin count */ @@ -330,8 +330,8 @@ void xfs_buf_stale(struct xfs_buf *bp);   * In future, uncached buffers will pass the block number directly to the io   * request function and hence these macros will go away at that point.   */ -#define XFS_BUF_ADDR(bp)		((bp)->b_map.bm_bn) -#define XFS_BUF_SET_ADDR(bp, bno)	((bp)->b_map.bm_bn = (xfs_daddr_t)(bno)) +#define XFS_BUF_ADDR(bp)		((bp)->b_maps[0].bm_bn) +#define XFS_BUF_SET_ADDR(bp, bno)	((bp)->b_maps[0].bm_bn = (xfs_daddr_t)(bno))  static inline void xfs_buf_set_ref(struct xfs_buf *bp, int lru_ref)  { diff --git a/fs/xfs/xfs_buf_item.c b/fs/xfs/xfs_buf_item.c index becf4a97efc6..cf263476d6b4 100644 --- a/fs/xfs/xfs_buf_item.c +++ b/fs/xfs/xfs_buf_item.c @@ -37,109 +37,6 @@ static inline struct xfs_buf_log_item *BUF_ITEM(struct xfs_log_item *lip)  	return container_of(lip, struct xfs_buf_log_item, bli_item);  } - -#ifdef XFS_TRANS_DEBUG -/* - * This function uses an alternate strategy for tracking the bytes - * that the user requests to be logged.  This can then be used - * in conjunction with the bli_orig array in the buf log item to - * catch bugs in our callers' code. - * - * We also double check the bits set in xfs_buf_item_log using a - * simple algorithm to check that every byte is accounted for. - */ -STATIC void -xfs_buf_item_log_debug( -	xfs_buf_log_item_t	*bip, -	uint			first, -	uint			last) -{ -	uint	x; -	uint	byte; -	uint	nbytes; -	uint	chunk_num; -	uint	word_num; -	uint	bit_num; -	uint	bit_set; -	uint	*wordp; - -	ASSERT(bip->bli_logged != NULL); -	byte = first; -	nbytes = last - first + 1; -	bfset(bip->bli_logged, first, nbytes); -	for (x = 0; x < nbytes; x++) { -		chunk_num = byte >> XFS_BLF_SHIFT; -		word_num = chunk_num >> BIT_TO_WORD_SHIFT; -		bit_num = chunk_num & (NBWORD - 1); -		wordp = &(bip->bli_format.blf_data_map[word_num]); -		bit_set = *wordp & (1 << bit_num); -		ASSERT(bit_set); -		byte++; -	} -} - -/* - * This function is called when we flush something into a buffer without - * logging it.  This happens for things like inodes which are logged - * separately from the buffer. - */ -void -xfs_buf_item_flush_log_debug( -	xfs_buf_t	*bp, -	uint		first, -	uint		last) -{ -	xfs_buf_log_item_t	*bip = bp->b_fspriv; -	uint			nbytes; - -	if (bip == NULL || (bip->bli_item.li_type != XFS_LI_BUF)) -		return; - -	ASSERT(bip->bli_logged != NULL); -	nbytes = last - first + 1; -	bfset(bip->bli_logged, first, nbytes); -} - -/* - * This function is called to verify that our callers have logged - * all the bytes that they changed. - * - * It does this by comparing the original copy of the buffer stored in - * the buf log item's bli_orig array to the current copy of the buffer - * and ensuring that all bytes which mismatch are set in the bli_logged - * array of the buf log item. - */ -STATIC void -xfs_buf_item_log_check( -	xfs_buf_log_item_t	*bip) -{ -	char		*orig; -	char		*buffer; -	int		x; -	xfs_buf_t	*bp; - -	ASSERT(bip->bli_orig != NULL); -	ASSERT(bip->bli_logged != NULL); - -	bp = bip->bli_buf; -	ASSERT(bp->b_length > 0); -	ASSERT(bp->b_addr != NULL); -	orig = bip->bli_orig; -	buffer = bp->b_addr; -	for (x = 0; x < BBTOB(bp->b_length); x++) { -		if (orig[x] != buffer[x] && !btst(bip->bli_logged, x)) { -			xfs_emerg(bp->b_mount, -				"%s: bip %x buffer %x orig %x index %d", -				__func__, bip, bp, orig, x); -			ASSERT(0); -		} -	} -} -#else -#define		xfs_buf_item_log_debug(x,y,z) -#define		xfs_buf_item_log_check(x) -#endif -  STATIC void	xfs_buf_do_callbacks(struct xfs_buf *bp);  /* @@ -237,7 +134,7 @@ xfs_buf_item_size(  		 * cancel flag in it.  		 */  		trace_xfs_buf_item_size_stale(bip); -		ASSERT(bip->bli_format.blf_flags & XFS_BLF_CANCEL); +		ASSERT(bip->__bli_format.blf_flags & XFS_BLF_CANCEL);  		return bip->bli_format_count;  	} @@ -278,7 +175,7 @@ xfs_buf_item_format_segment(  	uint		buffer_offset;  	/* copy the flags across from the base format item */ -	blfp->blf_flags = bip->bli_format.blf_flags; +	blfp->blf_flags = bip->__bli_format.blf_flags;  	/*  	 * Base size is the actual size of the ondisk structure - it reflects @@ -287,6 +184,17 @@ xfs_buf_item_format_segment(  	 */  	base_size = offsetof(struct xfs_buf_log_format, blf_data_map) +  			(blfp->blf_map_size * sizeof(blfp->blf_data_map[0])); + +	nvecs = 0; +	first_bit = xfs_next_bit(blfp->blf_data_map, blfp->blf_map_size, 0); +	if (!(bip->bli_flags & XFS_BLI_STALE) && first_bit == -1) { +		/* +		 * If the map is not be dirty in the transaction, mark +		 * the size as zero and do not advance the vector pointer. +		 */ +		goto out; +	} +  	vecp->i_addr = blfp;  	vecp->i_len = base_size;  	vecp->i_type = XLOG_REG_TYPE_BFORMAT; @@ -301,15 +209,13 @@ xfs_buf_item_format_segment(  		 */  		trace_xfs_buf_item_format_stale(bip);  		ASSERT(blfp->blf_flags & XFS_BLF_CANCEL); -		blfp->blf_size = nvecs; -		return vecp; +		goto out;  	}  	/*  	 * Fill in an iovec for each set of contiguous chunks.  	 */ -	first_bit = xfs_next_bit(blfp->blf_data_map, blfp->blf_map_size, 0); -	ASSERT(first_bit != -1); +  	last_bit = first_bit;  	nbits = 1;  	for (;;) { @@ -371,7 +277,8 @@ xfs_buf_item_format_segment(  			nbits++;  		}  	} -	bip->bli_format.blf_size = nvecs; +out: +	blfp->blf_size = nvecs;  	return vecp;  } @@ -405,7 +312,7 @@ xfs_buf_item_format(  	if (bip->bli_flags & XFS_BLI_INODE_BUF) {  		if (!((bip->bli_flags & XFS_BLI_INODE_ALLOC_BUF) &&  		      xfs_log_item_in_current_chkpt(lip))) -			bip->bli_format.blf_flags |= XFS_BLF_INODE_BUF; +			bip->__bli_format.blf_flags |= XFS_BLF_INODE_BUF;  		bip->bli_flags &= ~XFS_BLI_INODE_BUF;  	} @@ -419,7 +326,6 @@ xfs_buf_item_format(  	 * Check to make sure everything is consistent.  	 */  	trace_xfs_buf_item_format(bip); -	xfs_buf_item_log_check(bip);  }  /* @@ -485,7 +391,7 @@ xfs_buf_item_unpin(  		ASSERT(bip->bli_flags & XFS_BLI_STALE);  		ASSERT(xfs_buf_islocked(bp));  		ASSERT(XFS_BUF_ISSTALE(bp)); -		ASSERT(bip->bli_format.blf_flags & XFS_BLF_CANCEL); +		ASSERT(bip->__bli_format.blf_flags & XFS_BLF_CANCEL);  		trace_xfs_buf_item_unpin_stale(bip); @@ -563,8 +469,18 @@ xfs_buf_item_push(  	if (xfs_buf_ispinned(bp))  		return XFS_ITEM_PINNED; -	if (!xfs_buf_trylock(bp)) +	if (!xfs_buf_trylock(bp)) { +		/* +		 * If we have just raced with a buffer being pinned and it has +		 * been marked stale, we could end up stalling until someone else +		 * issues a log force to unpin the stale buffer. Check for the +		 * race condition here so xfsaild recognizes the buffer is pinned +		 * and queues a log force to move it along. +		 */ +		if (xfs_buf_ispinned(bp)) +			return XFS_ITEM_PINNED;  		return XFS_ITEM_LOCKED; +	}  	ASSERT(!(bip->bli_flags & XFS_BLI_STALE)); @@ -601,7 +517,7 @@ xfs_buf_item_unlock(  {  	struct xfs_buf_log_item	*bip = BUF_ITEM(lip);  	struct xfs_buf		*bp = bip->bli_buf; -	int			aborted; +	int			aborted, clean, i;  	uint			hold;  	/* Clear the buffer's association with this transaction. */ @@ -631,7 +547,7 @@ xfs_buf_item_unlock(  	 */  	if (bip->bli_flags & XFS_BLI_STALE) {  		trace_xfs_buf_item_unlock_stale(bip); -		ASSERT(bip->bli_format.blf_flags & XFS_BLF_CANCEL); +		ASSERT(bip->__bli_format.blf_flags & XFS_BLF_CANCEL);  		if (!aborted) {  			atomic_dec(&bip->bli_refcount);  			return; @@ -642,12 +558,27 @@ xfs_buf_item_unlock(  	/*  	 * If the buf item isn't tracking any data, free it, otherwise drop the -	 * reference we hold to it. +	 * reference we hold to it. If we are aborting the transaction, this may +	 * be the only reference to the buf item, so we free it anyway +	 * regardless of whether it is dirty or not. A dirty abort implies a +	 * shutdown, anyway.  	 */ -	if (xfs_bitmap_empty(bip->bli_format.blf_data_map, -			     bip->bli_format.blf_map_size)) +	clean = 1; +	for (i = 0; i < bip->bli_format_count; i++) { +		if (!xfs_bitmap_empty(bip->bli_formats[i].blf_data_map, +			     bip->bli_formats[i].blf_map_size)) { +			clean = 0; +			break; +		} +	} +	if (clean)  		xfs_buf_item_relse(bp); -	else +	else if (aborted) { +		if (atomic_dec_and_test(&bip->bli_refcount)) { +			ASSERT(XFS_FORCED_SHUTDOWN(lip->li_mountp)); +			xfs_buf_item_relse(bp); +		} +	} else  		atomic_dec(&bip->bli_refcount);  	if (!hold) @@ -716,7 +647,7 @@ xfs_buf_item_get_format(  	bip->bli_format_count = count;  	if (count == 1) { -		bip->bli_formats = &bip->bli_format; +		bip->bli_formats = &bip->__bli_format;  		return 0;  	} @@ -731,7 +662,7 @@ STATIC void  xfs_buf_item_free_format(  	struct xfs_buf_log_item	*bip)  { -	if (bip->bli_formats != &bip->bli_format) { +	if (bip->bli_formats != &bip->__bli_format) {  		kmem_free(bip->bli_formats);  		bip->bli_formats = NULL;  	} @@ -898,8 +829,6 @@ xfs_buf_item_log_segment(  		mask = (1 << end_bit) - 1;  		*wordp |= mask;  	} - -	xfs_buf_item_log_debug(bip, first, last);  }  /* diff --git a/fs/xfs/xfs_buf_item.h b/fs/xfs/xfs_buf_item.h index 6850f49f4af3..ee36c88ecfde 100644 --- a/fs/xfs/xfs_buf_item.h +++ b/fs/xfs/xfs_buf_item.h @@ -98,13 +98,9 @@ typedef struct xfs_buf_log_item {  	unsigned int		bli_flags;	/* misc flags */  	unsigned int		bli_recur;	/* lock recursion count */  	atomic_t		bli_refcount;	/* cnt of tp refs */ -#ifdef XFS_TRANS_DEBUG -	char			*bli_orig;	/* original buffer copy */ -	char			*bli_logged;	/* bytes logged (bitmap) */ -#endif  	int			bli_format_count;	/* count of headers */  	struct xfs_buf_log_format *bli_formats;	/* array of in-log header ptrs */ -	struct xfs_buf_log_format bli_format;	/* embedded in-log header */ +	struct xfs_buf_log_format __bli_format;	/* embedded in-log header */  } xfs_buf_log_item_t;  void	xfs_buf_item_init(struct xfs_buf *, struct xfs_mount *); @@ -117,16 +113,6 @@ void	xfs_buf_attach_iodone(struct xfs_buf *,  void	xfs_buf_iodone_callbacks(struct xfs_buf *);  void	xfs_buf_iodone(struct xfs_buf *, struct xfs_log_item *); -#ifdef XFS_TRANS_DEBUG -void -xfs_buf_item_flush_log_debug( -	struct xfs_buf *bp, -	uint	first, -	uint	last); -#else -#define	xfs_buf_item_flush_log_debug(bp, first, last) -#endif -  #endif	/* __KERNEL__ */  #endif	/* __XFS_BUF_ITEM_H__ */ diff --git a/fs/xfs/xfs_dfrag.c b/fs/xfs/xfs_dfrag.c index d0e9c74d3d96..a8bd26b82ecb 100644 --- a/fs/xfs/xfs_dfrag.c +++ b/fs/xfs/xfs_dfrag.c @@ -246,10 +246,10 @@ xfs_swap_extents(  		goto out_unlock;  	} -	error = -filemap_write_and_wait(VFS_I(ip)->i_mapping); +	error = -filemap_write_and_wait(VFS_I(tip)->i_mapping);  	if (error)  		goto out_unlock; -	truncate_pagecache_range(VFS_I(ip), 0, -1); +	truncate_pagecache_range(VFS_I(tip), 0, -1);  	/* Verify O_DIRECT for ftmp */  	if (VN_CACHED(VFS_I(tip)) != 0) { diff --git a/fs/xfs/xfs_dir2_block.c b/fs/xfs/xfs_dir2_block.c index 7536faaa61e7..12afe07a91d7 100644 --- a/fs/xfs/xfs_dir2_block.c +++ b/fs/xfs/xfs_dir2_block.c @@ -355,10 +355,12 @@ xfs_dir2_block_addname(  	/*  	 * If need to compact the leaf entries, do it now.  	 */ -	if (compact) +	if (compact) {  		xfs_dir2_block_compact(tp, bp, hdr, btp, blp, &needlog,  				      &lfloghigh, &lfloglow); -	else if (btp->stale) { +		/* recalculate blp post-compaction */ +		blp = xfs_dir2_block_leaf_p(btp); +	} else if (btp->stale) {  		/*  		 * Set leaf logging boundaries to impossible state.  		 * For the no-stale case they're set explicitly. diff --git a/fs/xfs/xfs_dquot.c b/fs/xfs/xfs_dquot.c index 9e1bf5294c91..8025eb23ad72 100644 --- a/fs/xfs/xfs_dquot.c +++ b/fs/xfs/xfs_dquot.c @@ -612,15 +612,9 @@ xfs_qm_dqread(  	if (flags & XFS_QMOPT_DQALLOC) {  		tp = xfs_trans_alloc(mp, XFS_TRANS_QM_DQALLOC);  		error = xfs_trans_reserve(tp, XFS_QM_DQALLOC_SPACE_RES(mp), -				XFS_WRITE_LOG_RES(mp) + -				/* -				 * Round the chunklen up to the next multiple -				 * of 128 (buf log item chunk size)). -				 */ -				BBTOB(mp->m_quotainfo->qi_dqchunklen) - 1 + 128, -				0, -				XFS_TRANS_PERM_LOG_RES, -				XFS_WRITE_LOG_COUNT); +					  XFS_QM_DQALLOC_LOG_RES(mp), 0, +					  XFS_TRANS_PERM_LOG_RES, +					  XFS_WRITE_LOG_COUNT);  		if (error)  			goto error1;  		cancelflags = XFS_TRANS_RELEASE_LOG_RES; diff --git a/fs/xfs/xfs_fsops.c b/fs/xfs/xfs_fsops.c index 94eaeedc5498..2866b8c78b7a 100644 --- a/fs/xfs/xfs_fsops.c +++ b/fs/xfs/xfs_fsops.c @@ -709,8 +709,8 @@ xfs_fs_log_dummy(  	int		error;  	tp = _xfs_trans_alloc(mp, XFS_TRANS_DUMMY1, KM_SLEEP); -	error = xfs_trans_reserve(tp, 0, mp->m_sb.sb_sectsize + 128, 0, 0, -					XFS_DEFAULT_LOG_COUNT); +	error = xfs_trans_reserve(tp, 0, XFS_SB_LOG_RES(mp), 0, 0, +				  XFS_DEFAULT_LOG_COUNT);  	if (error) {  		xfs_trans_cancel(tp, 0);  		return error; diff --git a/fs/xfs/xfs_ialloc.c b/fs/xfs/xfs_ialloc.c index a815412eab80..515bf71ce01c 100644 --- a/fs/xfs/xfs_ialloc.c +++ b/fs/xfs/xfs_ialloc.c @@ -279,8 +279,6 @@ xfs_ialloc_ag_alloc(  		  (args.agbno < be32_to_cpu(agi->agi_length)))) {  		args.fsbno = XFS_AGB_TO_FSB(args.mp, agno, args.agbno);  		args.type = XFS_ALLOCTYPE_THIS_BNO; -		args.mod = args.total = args.wasdel = args.isfl = -			args.userdata = args.minalignslop = 0;  		args.prod = 1;  		/* @@ -333,8 +331,6 @@ xfs_ialloc_ag_alloc(  		 * Allocate a fixed-size extent of inodes.  		 */  		args.type = XFS_ALLOCTYPE_NEAR_BNO; -		args.mod = args.total = args.wasdel = args.isfl = -			args.userdata = args.minalignslop = 0;  		args.prod = 1;  		/*  		 * Allow space for the inode btree to split. diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c index 66282dcb821b..4f201656d2d9 100644 --- a/fs/xfs/xfs_inode.c +++ b/fs/xfs/xfs_inode.c @@ -2379,9 +2379,6 @@ xfs_iflush_fork(  	char			*cp;  	xfs_ifork_t		*ifp;  	xfs_mount_t		*mp; -#ifdef XFS_TRANS_DEBUG -	int			first; -#endif  	static const short	brootflag[2] =  		{ XFS_ILOG_DBROOT, XFS_ILOG_ABROOT };  	static const short	dataflag[2] = @@ -2724,9 +2721,6 @@ xfs_iflush_int(  	xfs_inode_log_item_t	*iip;  	xfs_dinode_t		*dip;  	xfs_mount_t		*mp; -#ifdef XFS_TRANS_DEBUG -	int			first; -#endif  	ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL|XFS_ILOCK_SHARED));  	ASSERT(xfs_isiflocked(ip)); diff --git a/fs/xfs/xfs_inode.h b/fs/xfs/xfs_inode.h index 22baf6ea4fac..237e7f6f2ab3 100644 --- a/fs/xfs/xfs_inode.h +++ b/fs/xfs/xfs_inode.h @@ -419,6 +419,7 @@ static inline void xfs_iflock(struct xfs_inode *ip)  static inline void xfs_ifunlock(struct xfs_inode *ip)  {  	xfs_iflags_clear(ip, XFS_IFLOCK); +	smp_mb();  	wake_up_bit(&ip->i_flags, __XFS_IFLOCK_BIT);  } diff --git a/fs/xfs/xfs_inode_item.c b/fs/xfs/xfs_inode_item.c index d041d47d9d86..f034bd1652f0 100644 --- a/fs/xfs/xfs_inode_item.c +++ b/fs/xfs/xfs_inode_item.c @@ -269,17 +269,6 @@ xfs_inode_item_format(  		} else {  			ASSERT(!(iip->ili_fields &  				 XFS_ILOG_DBROOT)); -#ifdef XFS_TRANS_DEBUG -			if (iip->ili_root_size > 0) { -				ASSERT(iip->ili_root_size == -				       ip->i_df.if_broot_bytes); -				ASSERT(memcmp(iip->ili_orig_root, -					    ip->i_df.if_broot, -					    iip->ili_root_size) == 0); -			} else { -				ASSERT(ip->i_df.if_broot_bytes == 0); -			} -#endif  			iip->ili_fields &= ~XFS_ILOG_DBROOT;  		}  		break; @@ -678,11 +667,6 @@ void  xfs_inode_item_destroy(  	xfs_inode_t	*ip)  { -#ifdef XFS_TRANS_DEBUG -	if (ip->i_itemp->ili_root_size != 0) { -		kmem_free(ip->i_itemp->ili_orig_root); -	} -#endif  	kmem_zone_free(xfs_ili_zone, ip->i_itemp);  } diff --git a/fs/xfs/xfs_inode_item.h b/fs/xfs/xfs_inode_item.h index 376d4d0b2635..779812fb3d80 100644 --- a/fs/xfs/xfs_inode_item.h +++ b/fs/xfs/xfs_inode_item.h @@ -148,10 +148,6 @@ typedef struct xfs_inode_log_item {  						      data exts */  	struct xfs_bmbt_rec	*ili_aextents_buf; /* array of logged  						      attr exts */ -#ifdef XFS_TRANS_DEBUG -	int			ili_root_size; -	char			*ili_orig_root; -#endif  	xfs_inode_log_format_t	ili_format;	   /* logged structure */  } xfs_inode_log_item_t; diff --git a/fs/xfs/xfs_iomap.c b/fs/xfs/xfs_iomap.c index add06b4e9a63..912d83d8860a 100644 --- a/fs/xfs/xfs_iomap.c +++ b/fs/xfs/xfs_iomap.c @@ -311,6 +311,62 @@ xfs_iomap_eof_want_preallocate(  }  /* + * Determine the initial size of the preallocation. We are beyond the current + * EOF here, but we need to take into account whether this is a sparse write or + * an extending write when determining the preallocation size.  Hence we need to + * look up the extent that ends at the current write offset and use the result + * to determine the preallocation size. + * + * If the extent is a hole, then preallocation is essentially disabled. + * Otherwise we take the size of the preceeding data extent as the basis for the + * preallocation size. If the size of the extent is greater than half the + * maximum extent length, then use the current offset as the basis. This ensures + * that for large files the preallocation size always extends to MAXEXTLEN + * rather than falling short due to things like stripe unit/width alignment of + * real extents. + */ +STATIC int +xfs_iomap_eof_prealloc_initial_size( +	struct xfs_mount	*mp, +	struct xfs_inode	*ip, +	xfs_off_t		offset, +	xfs_bmbt_irec_t		*imap, +	int			nimaps) +{ +	xfs_fileoff_t   start_fsb; +	int		imaps = 1; +	int		error; + +	ASSERT(nimaps >= imaps); + +	/* if we are using a specific prealloc size, return now */ +	if (mp->m_flags & XFS_MOUNT_DFLT_IOSIZE) +		return 0; + +	/* +	 * As we write multiple pages, the offset will always align to the +	 * start of a page and hence point to a hole at EOF. i.e. if the size is +	 * 4096 bytes, we only have one block at FSB 0, but XFS_B_TO_FSB(4096) +	 * will return FSB 1. Hence if there are blocks in the file, we want to +	 * point to the block prior to the EOF block and not the hole that maps +	 * directly at @offset. +	 */ +	start_fsb = XFS_B_TO_FSB(mp, offset); +	if (start_fsb) +		start_fsb--; +	error = xfs_bmapi_read(ip, start_fsb, 1, imap, &imaps, XFS_BMAPI_ENTIRE); +	if (error) +		return 0; + +	ASSERT(imaps == 1); +	if (imap[0].br_startblock == HOLESTARTBLOCK) +		return 0; +	if (imap[0].br_blockcount <= (MAXEXTLEN >> 1)) +		return imap[0].br_blockcount; +	return XFS_B_TO_FSB(mp, offset); +} + +/*   * If we don't have a user specified preallocation size, dynamically increase   * the preallocation size as the size of the file grows. Cap the maximum size   * at a single extent or less if the filesystem is near full. The closer the @@ -319,20 +375,19 @@ xfs_iomap_eof_want_preallocate(  STATIC xfs_fsblock_t  xfs_iomap_prealloc_size(  	struct xfs_mount	*mp, -	struct xfs_inode	*ip) +	struct xfs_inode	*ip, +	xfs_off_t		offset, +	struct xfs_bmbt_irec	*imap, +	int			nimaps)  {  	xfs_fsblock_t		alloc_blocks = 0; -	if (!(mp->m_flags & XFS_MOUNT_DFLT_IOSIZE)) { +	alloc_blocks = xfs_iomap_eof_prealloc_initial_size(mp, ip, offset, +							   imap, nimaps); +	if (alloc_blocks > 0) {  		int shift = 0;  		int64_t freesp; -		/* -		 * rounddown_pow_of_two() returns an undefined result -		 * if we pass in alloc_blocks = 0. Hence the "+ 1" to -		 * ensure we always pass in a non-zero value. -		 */ -		alloc_blocks = XFS_B_TO_FSB(mp, XFS_ISIZE(ip)) + 1;  		alloc_blocks = XFS_FILEOFF_MIN(MAXEXTLEN,  					rounddown_pow_of_two(alloc_blocks)); @@ -351,6 +406,15 @@ xfs_iomap_prealloc_size(  		}  		if (shift)  			alloc_blocks >>= shift; + +		/* +		 * If we are still trying to allocate more space than is +		 * available, squash the prealloc hard. This can happen if we +		 * have a large file on a small filesystem and the above +		 * lowspace thresholds are smaller than MAXEXTLEN. +		 */ +		while (alloc_blocks >= freesp) +			alloc_blocks >>= 4;  	}  	if (alloc_blocks < mp->m_writeio_blocks) @@ -390,7 +454,6 @@ xfs_iomap_write_delay(  	extsz = xfs_get_extsz_hint(ip);  	offset_fsb = XFS_B_TO_FSBT(mp, offset); -  	error = xfs_iomap_eof_want_preallocate(mp, ip, offset, count,  				imap, XFS_WRITE_IMAPS, &prealloc);  	if (error) @@ -398,7 +461,10 @@ xfs_iomap_write_delay(  retry:  	if (prealloc) { -		xfs_fsblock_t	alloc_blocks = xfs_iomap_prealloc_size(mp, ip); +		xfs_fsblock_t	alloc_blocks; + +		alloc_blocks = xfs_iomap_prealloc_size(mp, ip, offset, imap, +						       XFS_WRITE_IMAPS);  		aligned_offset = XFS_WRITEIO_ALIGN(mp, (offset + count - 1));  		ioalign = XFS_B_TO_FSBT(mp, aligned_offset); diff --git a/fs/xfs/xfs_log.c b/fs/xfs/xfs_log.c index 46bd9d52ab51..eec226f78a40 100644 --- a/fs/xfs/xfs_log.c +++ b/fs/xfs/xfs_log.c @@ -120,7 +120,7 @@ xlog_verify_iclog(  	struct xlog		*log,  	struct xlog_in_core	*iclog,  	int			count, -	boolean_t		syncing); +	bool                    syncing);  STATIC void  xlog_verify_tail_lsn(  	struct xlog		*log, @@ -1737,7 +1737,7 @@ xlog_sync(  	ASSERT(XFS_BUF_ADDR(bp) <= log->l_logBBsize-1);  	ASSERT(XFS_BUF_ADDR(bp) + BTOBB(count) <= log->l_logBBsize); -	xlog_verify_iclog(log, iclog, count, B_TRUE); +	xlog_verify_iclog(log, iclog, count, true);  	/* account for log which doesn't start at block #0 */  	XFS_BUF_SET_ADDR(bp, XFS_BUF_ADDR(bp) + log->l_logBBstart); @@ -3611,7 +3611,7 @@ xlog_verify_iclog(  	struct xlog		*log,  	struct xlog_in_core	*iclog,  	int			count, -	boolean_t		syncing) +	bool                    syncing)  {  	xlog_op_header_t	*ophead;  	xlog_in_core_t		*icptr; @@ -3659,7 +3659,7 @@ xlog_verify_iclog(  		/* clientid is only 1 byte */  		field_offset = (__psint_t)  			       ((xfs_caddr_t)&(ophead->oh_clientid) - base_ptr); -		if (syncing == B_FALSE || (field_offset & 0x1ff)) { +		if (!syncing || (field_offset & 0x1ff)) {  			clientid = ophead->oh_clientid;  		} else {  			idx = BTOBBT((xfs_caddr_t)&(ophead->oh_clientid) - iclog->ic_datap); @@ -3682,7 +3682,7 @@ xlog_verify_iclog(  		/* check length */  		field_offset = (__psint_t)  			       ((xfs_caddr_t)&(ophead->oh_len) - base_ptr); -		if (syncing == B_FALSE || (field_offset & 0x1ff)) { +		if (!syncing || (field_offset & 0x1ff)) {  			op_len = be32_to_cpu(ophead->oh_len);  		} else {  			idx = BTOBBT((__psint_t)&ophead->oh_len - diff --git a/fs/xfs/xfs_mount.c b/fs/xfs/xfs_mount.c index da508463ff10..3806088a8f77 100644 --- a/fs/xfs/xfs_mount.c +++ b/fs/xfs/xfs_mount.c @@ -658,7 +658,7 @@ xfs_sb_quiet_read_verify(  		return;  	}  	/* quietly fail */ -	xfs_buf_ioerror(bp, EFSCORRUPTED); +	xfs_buf_ioerror(bp, EWRONGFS);  }  static void @@ -1109,8 +1109,8 @@ xfs_mount_reset_sbqflags(  		return 0;  	tp = xfs_trans_alloc(mp, XFS_TRANS_QM_SBCHANGE); -	error = xfs_trans_reserve(tp, 0, mp->m_sb.sb_sectsize + 128, 0, 0, -				      XFS_DEFAULT_LOG_COUNT); +	error = xfs_trans_reserve(tp, 0, XFS_QM_SBCHANGE_LOG_RES(mp), +				  0, 0, XFS_DEFAULT_LOG_COUNT);  	if (error) {  		xfs_trans_cancel(tp, 0);  		xfs_alert(mp, "%s: Superblock update failed!", __func__); @@ -1583,8 +1583,8 @@ xfs_log_sbcount(xfs_mount_t *mp)  		return 0;  	tp = _xfs_trans_alloc(mp, XFS_TRANS_SB_COUNT, KM_SLEEP); -	error = xfs_trans_reserve(tp, 0, mp->m_sb.sb_sectsize + 128, 0, 0, -					XFS_DEFAULT_LOG_COUNT); +	error = xfs_trans_reserve(tp, 0, XFS_SB_LOG_RES(mp), 0, 0, +				  XFS_DEFAULT_LOG_COUNT);  	if (error) {  		xfs_trans_cancel(tp, 0);  		return error; @@ -1945,8 +1945,8 @@ xfs_mount_log_sb(  			 XFS_SB_VERSIONNUM));  	tp = xfs_trans_alloc(mp, XFS_TRANS_SB_UNIT); -	error = xfs_trans_reserve(tp, 0, mp->m_sb.sb_sectsize + 128, 0, 0, -				XFS_DEFAULT_LOG_COUNT); +	error = xfs_trans_reserve(tp, 0, XFS_SB_LOG_RES(mp), 0, 0, +				  XFS_DEFAULT_LOG_COUNT);  	if (error) {  		xfs_trans_cancel(tp, 0);  		return error; diff --git a/fs/xfs/xfs_mount.h b/fs/xfs/xfs_mount.h index bab8314507e4..bc907061d392 100644 --- a/fs/xfs/xfs_mount.h +++ b/fs/xfs/xfs_mount.h @@ -34,12 +34,19 @@ typedef struct xfs_trans_reservations {  	uint	tr_addafork;	/* cvt inode to attributed trans */  	uint	tr_writeid;	/* write setuid/setgid file */  	uint	tr_attrinval;	/* attr fork buffer invalidation */ -	uint	tr_attrset;	/* set/create an attribute */ +	uint	tr_attrsetm;	/* set/create an attribute at mount time */ +	uint	tr_attrsetrt;	/* set/create an attribute at runtime */  	uint	tr_attrrm;	/* remove an attribute */  	uint	tr_clearagi;	/* clear bad agi unlinked ino bucket */  	uint	tr_growrtalloc;	/* grow realtime allocations */  	uint	tr_growrtzero;	/* grow realtime zeroing */  	uint	tr_growrtfree;	/* grow realtime freeing */ +	uint	tr_qm_sbchange;	/* change quota flags */ +	uint	tr_qm_setqlim;	/* adjust quota limits */ +	uint	tr_qm_dqalloc;	/* allocate quota on disk */ +	uint	tr_qm_quotaoff;	/* turn quota off */ +	uint	tr_qm_equotaoff;/* end of turn quota off */ +	uint	tr_sb;		/* modify superblock */  } xfs_trans_reservations_t;  #ifndef __KERNEL__ diff --git a/fs/xfs/xfs_qm.c b/fs/xfs/xfs_qm.c index 60eff4763156..e5b5cf973781 100644 --- a/fs/xfs/xfs_qm.c +++ b/fs/xfs/xfs_qm.c @@ -1584,10 +1584,9 @@ xfs_qm_write_sb_changes(  	int		error;  	tp = xfs_trans_alloc(mp, XFS_TRANS_QM_SBCHANGE); -	if ((error = xfs_trans_reserve(tp, 0, -				      mp->m_sb.sb_sectsize + 128, 0, -				      0, -				      XFS_DEFAULT_LOG_COUNT))) { +	error = xfs_trans_reserve(tp, 0, XFS_QM_SBCHANGE_LOG_RES(mp), +				  0, 0, XFS_DEFAULT_LOG_COUNT); +	if (error) {  		xfs_trans_cancel(tp, 0);  		return error;  	} diff --git a/fs/xfs/xfs_qm_bhv.c b/fs/xfs/xfs_qm_bhv.c index 6b39115bf145..2d02eac1c9a8 100644 --- a/fs/xfs/xfs_qm_bhv.c +++ b/fs/xfs/xfs_qm_bhv.c @@ -146,7 +146,7 @@ xfs_qm_newmount(  			 * inode goes inactive and wants to free blocks,  			 * or via xfs_log_mount_finish.  			 */ -			*needquotamount = B_TRUE; +			*needquotamount = true;  			*quotaflags = mp->m_qflags;  			mp->m_qflags = 0;  		} diff --git a/fs/xfs/xfs_qm_syscalls.c b/fs/xfs/xfs_qm_syscalls.c index 5f53e75409b8..cf9a34051e07 100644 --- a/fs/xfs/xfs_qm_syscalls.c +++ b/fs/xfs/xfs_qm_syscalls.c @@ -408,10 +408,10 @@ xfs_qm_scall_getqstat(  {  	struct xfs_quotainfo	*q = mp->m_quotainfo;  	struct xfs_inode	*uip, *gip; -	boolean_t		tempuqip, tempgqip; +	bool                    tempuqip, tempgqip;  	uip = gip = NULL; -	tempuqip = tempgqip = B_FALSE; +	tempuqip = tempgqip = false;  	memset(out, 0, sizeof(fs_quota_stat_t));  	out->qs_version = FS_QSTAT_VERSION; @@ -434,12 +434,12 @@ xfs_qm_scall_getqstat(  	if (!uip && mp->m_sb.sb_uquotino != NULLFSINO) {  		if (xfs_iget(mp, NULL, mp->m_sb.sb_uquotino,  					0, 0, &uip) == 0) -			tempuqip = B_TRUE; +			tempuqip = true;  	}  	if (!gip && mp->m_sb.sb_gquotino != NULLFSINO) {  		if (xfs_iget(mp, NULL, mp->m_sb.sb_gquotino,  					0, 0, &gip) == 0) -			tempgqip = B_TRUE; +			tempgqip = true;  	}  	if (uip) {  		out->qs_uquota.qfs_nblks = uip->i_d.di_nblocks; @@ -490,8 +490,9 @@ xfs_qm_scall_setqlim(  		return 0;  	tp = xfs_trans_alloc(mp, XFS_TRANS_QM_SETQLIM); -	if ((error = xfs_trans_reserve(tp, 0, sizeof(xfs_disk_dquot_t) + 128, -				      0, 0, XFS_DEFAULT_LOG_COUNT))) { +	error = xfs_trans_reserve(tp, 0, XFS_QM_SETQLIM_LOG_RES(mp), +				  0, 0, XFS_DEFAULT_LOG_COUNT); +	if (error) {  		xfs_trans_cancel(tp, 0);  		return (error);  	} @@ -638,8 +639,9 @@ xfs_qm_log_quotaoff_end(  	tp = xfs_trans_alloc(mp, XFS_TRANS_QM_QUOTAOFF_END); -	if ((error = xfs_trans_reserve(tp, 0, sizeof(xfs_qoff_logitem_t) * 2, -				      0, 0, XFS_DEFAULT_LOG_COUNT))) { +	error = xfs_trans_reserve(tp, 0, XFS_QM_QUOTAOFF_END_LOG_RES(mp), +				  0, 0, XFS_DEFAULT_LOG_COUNT); +	if (error) {  		xfs_trans_cancel(tp, 0);  		return (error);  	} @@ -671,14 +673,10 @@ xfs_qm_log_quotaoff(  	uint			oldsbqflag=0;  	tp = xfs_trans_alloc(mp, XFS_TRANS_QM_QUOTAOFF); -	if ((error = xfs_trans_reserve(tp, 0, -				      sizeof(xfs_qoff_logitem_t) * 2 + -				      mp->m_sb.sb_sectsize + 128, -				      0, -				      0, -				      XFS_DEFAULT_LOG_COUNT))) { +	error = xfs_trans_reserve(tp, 0, XFS_QM_QUOTAOFF_LOG_RES(mp), +				  0, 0, XFS_DEFAULT_LOG_COUNT); +	if (error)  		goto error0; -	}  	qoffi = xfs_trans_get_qoff_item(tp, NULL, flags & XFS_ALL_QUOTA_ACCT);  	xfs_trans_log_quotaoff_item(tp, qoffi); @@ -784,11 +782,11 @@ xfs_qm_scall_getquota(  	     (XFS_IS_OQUOTA_ENFORCED(mp) &&  			(dst->d_flags & (FS_PROJ_QUOTA | FS_GROUP_QUOTA)))) &&  	    dst->d_id != 0) { -		if (((int) dst->d_bcount > (int) dst->d_blk_softlimit) && +		if ((dst->d_bcount > dst->d_blk_softlimit) &&  		    (dst->d_blk_softlimit > 0)) {  			ASSERT(dst->d_btimer != 0);  		} -		if (((int) dst->d_icount > (int) dst->d_ino_softlimit) && +		if ((dst->d_icount > dst->d_ino_softlimit) &&  		    (dst->d_ino_softlimit > 0)) {  			ASSERT(dst->d_itimer != 0);  		} diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c index ab8839b26272..c407121873b4 100644 --- a/fs/xfs/xfs_super.c +++ b/fs/xfs/xfs_super.c @@ -139,9 +139,9 @@ static const match_table_t tokens = {  STATIC unsigned long -suffix_strtoul(char *s, char **endp, unsigned int base) +suffix_kstrtoint(char *s, unsigned int base, int *res)  { -	int	last, shift_left_factor = 0; +	int	last, shift_left_factor = 0, _res;  	char	*value = s;  	last = strlen(value) - 1; @@ -158,7 +158,10 @@ suffix_strtoul(char *s, char **endp, unsigned int base)  		value[last] = '\0';  	} -	return simple_strtoul((const char *)s, endp, base) << shift_left_factor; +	if (kstrtoint(s, base, &_res)) +		return -EINVAL; +	*res = _res << shift_left_factor; +	return 0;  }  /* @@ -174,7 +177,7 @@ xfs_parseargs(  	char			*options)  {  	struct super_block	*sb = mp->m_super; -	char			*this_char, *value, *eov; +	char			*this_char, *value;  	int			dsunit = 0;  	int			dswidth = 0;  	int			iosize = 0; @@ -230,14 +233,16 @@ xfs_parseargs(  					this_char);  				return EINVAL;  			} -			mp->m_logbufs = simple_strtoul(value, &eov, 10); +			if (kstrtoint(value, 10, &mp->m_logbufs)) +				return EINVAL;  		} else if (!strcmp(this_char, MNTOPT_LOGBSIZE)) {  			if (!value || !*value) {  				xfs_warn(mp, "%s option requires an argument",  					this_char);  				return EINVAL;  			} -			mp->m_logbsize = suffix_strtoul(value, &eov, 10); +			if (suffix_kstrtoint(value, 10, &mp->m_logbsize)) +				return EINVAL;  		} else if (!strcmp(this_char, MNTOPT_LOGDEV)) {  			if (!value || !*value) {  				xfs_warn(mp, "%s option requires an argument", @@ -266,7 +271,8 @@ xfs_parseargs(  					this_char);  				return EINVAL;  			} -			iosize = simple_strtoul(value, &eov, 10); +			if (kstrtoint(value, 10, &iosize)) +				return EINVAL;  			iosizelog = ffs(iosize) - 1;  		} else if (!strcmp(this_char, MNTOPT_ALLOCSIZE)) {  			if (!value || !*value) { @@ -274,7 +280,8 @@ xfs_parseargs(  					this_char);  				return EINVAL;  			} -			iosize = suffix_strtoul(value, &eov, 10); +			if (suffix_kstrtoint(value, 10, &iosize)) +				return EINVAL;  			iosizelog = ffs(iosize) - 1;  		} else if (!strcmp(this_char, MNTOPT_GRPID) ||  			   !strcmp(this_char, MNTOPT_BSDGROUPS)) { @@ -296,14 +303,16 @@ xfs_parseargs(  					this_char);  				return EINVAL;  			} -			dsunit = simple_strtoul(value, &eov, 10); +			if (kstrtoint(value, 10, &dsunit)) +				return EINVAL;  		} else if (!strcmp(this_char, MNTOPT_SWIDTH)) {  			if (!value || !*value) {  				xfs_warn(mp, "%s option requires an argument",  					this_char);  				return EINVAL;  			} -			dswidth = simple_strtoul(value, &eov, 10); +			if (kstrtoint(value, 10, &dswidth)) +				return EINVAL;  		} else if (!strcmp(this_char, MNTOPT_32BITINODE)) {  			mp->m_flags |= XFS_MOUNT_SMALL_INUMS;  		} else if (!strcmp(this_char, MNTOPT_64BITINODE)) { diff --git a/fs/xfs/xfs_trace.h b/fs/xfs/xfs_trace.h index 2e137d4a85ae..16a812977eab 100644 --- a/fs/xfs/xfs_trace.h +++ b/fs/xfs/xfs_trace.h @@ -341,6 +341,7 @@ DEFINE_BUF_EVENT(xfs_buf_item_relse);  DEFINE_BUF_EVENT(xfs_buf_item_iodone);  DEFINE_BUF_EVENT(xfs_buf_item_iodone_async);  DEFINE_BUF_EVENT(xfs_buf_error_relse); +DEFINE_BUF_EVENT(xfs_buf_wait_buftarg);  DEFINE_BUF_EVENT(xfs_trans_read_buf_io);  DEFINE_BUF_EVENT(xfs_trans_read_buf_shut); diff --git a/fs/xfs/xfs_trans.c b/fs/xfs/xfs_trans.c index 06ed520a767f..2fd7c1ff1d21 100644 --- a/fs/xfs/xfs_trans.c +++ b/fs/xfs/xfs_trans.c @@ -37,14 +37,45 @@  #include "xfs_extent_busy.h"  #include "xfs_bmap.h"  #include "xfs_quota.h" +#include "xfs_qm.h"  #include "xfs_trans_priv.h"  #include "xfs_trans_space.h"  #include "xfs_inode_item.h" +#include "xfs_log_priv.h" +#include "xfs_buf_item.h"  #include "xfs_trace.h"  kmem_zone_t	*xfs_trans_zone;  kmem_zone_t	*xfs_log_item_desc_zone; +/* + * A buffer has a format structure overhead in the log in addition + * to the data, so we need to take this into account when reserving + * space in a transaction for a buffer.  Round the space required up + * to a multiple of 128 bytes so that we don't change the historical + * reservation that has been used for this overhead. + */ +STATIC uint +xfs_buf_log_overhead(void) +{ +	return round_up(sizeof(struct xlog_op_header) + +			sizeof(struct xfs_buf_log_format), 128); +} + +/* + * Calculate out transaction log reservation per item in bytes. + * + * The nbufs argument is used to indicate the number of items that + * will be changed in a transaction.  size is used to tell how many + * bytes should be reserved per item. + */ +STATIC uint +xfs_calc_buf_res( +	uint		nbufs, +	uint		size) +{ +	return nbufs * (size + xfs_buf_log_overhead()); +}  /*   * Various log reservation values. @@ -85,18 +116,15 @@ xfs_calc_write_reservation(  	struct xfs_mount	*mp)  {  	return XFS_DQUOT_LOGRES(mp) + -		MAX((mp->m_sb.sb_inodesize + -		     XFS_FSB_TO_B(mp, XFS_BM_MAXLEVELS(mp, XFS_DATA_FORK)) + -		     2 * mp->m_sb.sb_sectsize + -		     mp->m_sb.sb_sectsize + -		     XFS_ALLOCFREE_LOG_RES(mp, 2) + -		     128 * (4 + XFS_BM_MAXLEVELS(mp, XFS_DATA_FORK) + -			    XFS_ALLOCFREE_LOG_COUNT(mp, 2))), -		    (2 * mp->m_sb.sb_sectsize + -		     2 * mp->m_sb.sb_sectsize + -		     mp->m_sb.sb_sectsize + -		     XFS_ALLOCFREE_LOG_RES(mp, 2) + -		     128 * (5 + XFS_ALLOCFREE_LOG_COUNT(mp, 2)))); +		MAX((xfs_calc_buf_res(1, mp->m_sb.sb_inodesize) + +		     xfs_calc_buf_res(XFS_BM_MAXLEVELS(mp, XFS_DATA_FORK), +				      XFS_FSB_TO_B(mp, 1)) + +		     xfs_calc_buf_res(3, mp->m_sb.sb_sectsize) + +		     xfs_calc_buf_res(XFS_ALLOCFREE_LOG_COUNT(mp, 2), +				      XFS_FSB_TO_B(mp, 1))), +		    (xfs_calc_buf_res(5, mp->m_sb.sb_sectsize) + +		     xfs_calc_buf_res(XFS_ALLOCFREE_LOG_COUNT(mp, 2), +				      XFS_FSB_TO_B(mp, 1))));  }  /* @@ -117,18 +145,17 @@ xfs_calc_itruncate_reservation(  	struct xfs_mount	*mp)  {  	return XFS_DQUOT_LOGRES(mp) + -		MAX((mp->m_sb.sb_inodesize + -		     XFS_FSB_TO_B(mp, XFS_BM_MAXLEVELS(mp, XFS_DATA_FORK) + 1) + -		     128 * (2 + XFS_BM_MAXLEVELS(mp, XFS_DATA_FORK))), -		    (4 * mp->m_sb.sb_sectsize + -		     4 * mp->m_sb.sb_sectsize + -		     mp->m_sb.sb_sectsize + -		     XFS_ALLOCFREE_LOG_RES(mp, 4) + -		     128 * (9 + XFS_ALLOCFREE_LOG_COUNT(mp, 4)) + -		     128 * 5 + -		     XFS_ALLOCFREE_LOG_RES(mp, 1) + -		     128 * (2 + XFS_IALLOC_BLOCKS(mp) + mp->m_in_maxlevels + -			    XFS_ALLOCFREE_LOG_COUNT(mp, 1)))); +		MAX((xfs_calc_buf_res(1, mp->m_sb.sb_inodesize) + +		     xfs_calc_buf_res(XFS_BM_MAXLEVELS(mp, XFS_DATA_FORK) + 1, +				      XFS_FSB_TO_B(mp, 1))), +		    (xfs_calc_buf_res(9, mp->m_sb.sb_sectsize) + +		     xfs_calc_buf_res(XFS_ALLOCFREE_LOG_COUNT(mp, 4), +				      XFS_FSB_TO_B(mp, 1)) + +		    xfs_calc_buf_res(5, 0) + +		    xfs_calc_buf_res(XFS_ALLOCFREE_LOG_COUNT(mp, 1), +				     XFS_FSB_TO_B(mp, 1)) + +		    xfs_calc_buf_res(2 + XFS_IALLOC_BLOCKS(mp) + +				     mp->m_in_maxlevels, 0)));  }  /* @@ -148,14 +175,12 @@ xfs_calc_rename_reservation(  	struct xfs_mount	*mp)  {  	return XFS_DQUOT_LOGRES(mp) + -		MAX((4 * mp->m_sb.sb_inodesize + -		     2 * XFS_DIROP_LOG_RES(mp) + -		     128 * (4 + 2 * XFS_DIROP_LOG_COUNT(mp))), -		    (3 * mp->m_sb.sb_sectsize + -		     3 * mp->m_sb.sb_sectsize + -		     mp->m_sb.sb_sectsize + -		     XFS_ALLOCFREE_LOG_RES(mp, 3) + -		     128 * (7 + XFS_ALLOCFREE_LOG_COUNT(mp, 3)))); +		MAX((xfs_calc_buf_res(4, mp->m_sb.sb_inodesize) + +		     xfs_calc_buf_res(2 * XFS_DIROP_LOG_COUNT(mp), +				      XFS_FSB_TO_B(mp, 1))), +		    (xfs_calc_buf_res(7, mp->m_sb.sb_sectsize) + +		     xfs_calc_buf_res(XFS_ALLOCFREE_LOG_COUNT(mp, 3), +				      XFS_FSB_TO_B(mp, 1))));  }  /* @@ -175,15 +200,12 @@ xfs_calc_link_reservation(  	struct xfs_mount	*mp)  {  	return XFS_DQUOT_LOGRES(mp) + -		MAX((mp->m_sb.sb_inodesize + -		     mp->m_sb.sb_inodesize + -		     XFS_DIROP_LOG_RES(mp) + -		     128 * (2 + XFS_DIROP_LOG_COUNT(mp))), -		    (mp->m_sb.sb_sectsize + -		     mp->m_sb.sb_sectsize + -		     mp->m_sb.sb_sectsize + -		     XFS_ALLOCFREE_LOG_RES(mp, 1) + -		     128 * (3 + XFS_ALLOCFREE_LOG_COUNT(mp, 1)))); +		MAX((xfs_calc_buf_res(2, mp->m_sb.sb_inodesize) + +		     xfs_calc_buf_res(XFS_DIROP_LOG_COUNT(mp), +				      XFS_FSB_TO_B(mp, 1))), +		    (xfs_calc_buf_res(3, mp->m_sb.sb_sectsize) + +		     xfs_calc_buf_res(XFS_ALLOCFREE_LOG_COUNT(mp, 1), +				      XFS_FSB_TO_B(mp, 1))));  }  /* @@ -203,15 +225,12 @@ xfs_calc_remove_reservation(  	struct xfs_mount	*mp)  {  	return XFS_DQUOT_LOGRES(mp) + -		MAX((mp->m_sb.sb_inodesize + -		     mp->m_sb.sb_inodesize + -		     XFS_DIROP_LOG_RES(mp) + -		     128 * (2 + XFS_DIROP_LOG_COUNT(mp))), -		    (2 * mp->m_sb.sb_sectsize + -		     2 * mp->m_sb.sb_sectsize + -		     mp->m_sb.sb_sectsize + -		     XFS_ALLOCFREE_LOG_RES(mp, 2) + -		     128 * (5 + XFS_ALLOCFREE_LOG_COUNT(mp, 2)))); +		MAX((xfs_calc_buf_res(2, mp->m_sb.sb_inodesize) + +		     xfs_calc_buf_res(XFS_DIROP_LOG_COUNT(mp), +				      XFS_FSB_TO_B(mp, 1))), +		    (xfs_calc_buf_res(5, mp->m_sb.sb_sectsize) + +		     xfs_calc_buf_res(XFS_ALLOCFREE_LOG_COUNT(mp, 2), +				      XFS_FSB_TO_B(mp, 1))));  }  /* @@ -233,18 +252,18 @@ xfs_calc_symlink_reservation(  	struct xfs_mount	*mp)  {  	return XFS_DQUOT_LOGRES(mp) + -		MAX((mp->m_sb.sb_inodesize + -		     mp->m_sb.sb_inodesize + -		     XFS_FSB_TO_B(mp, 1) + -		     XFS_DIROP_LOG_RES(mp) + -		     1024 + -		     128 * (4 + XFS_DIROP_LOG_COUNT(mp))), -		    (2 * mp->m_sb.sb_sectsize + -		     XFS_FSB_TO_B(mp, XFS_IALLOC_BLOCKS(mp)) + -		     XFS_FSB_TO_B(mp, mp->m_in_maxlevels) + -		     XFS_ALLOCFREE_LOG_RES(mp, 1) + -		     128 * (2 + XFS_IALLOC_BLOCKS(mp) + mp->m_in_maxlevels + -			    XFS_ALLOCFREE_LOG_COUNT(mp, 1)))); +		MAX((xfs_calc_buf_res(2, mp->m_sb.sb_inodesize) + +		     xfs_calc_buf_res(1, XFS_FSB_TO_B(mp, 1)) + +		     xfs_calc_buf_res(XFS_DIROP_LOG_COUNT(mp), +				      XFS_FSB_TO_B(mp, 1)) + +		     xfs_calc_buf_res(1, 1024)), +		    (xfs_calc_buf_res(2, mp->m_sb.sb_sectsize) + +		     xfs_calc_buf_res(XFS_IALLOC_BLOCKS(mp), +				      XFS_FSB_TO_B(mp, 1)) + +		     xfs_calc_buf_res(mp->m_in_maxlevels, +				      XFS_FSB_TO_B(mp, 1)) + +		     xfs_calc_buf_res(XFS_ALLOCFREE_LOG_COUNT(mp, 1), +				      XFS_FSB_TO_B(mp, 1))));  }  /* @@ -267,18 +286,19 @@ xfs_calc_create_reservation(  	struct xfs_mount	*mp)  {  	return XFS_DQUOT_LOGRES(mp) + -		MAX((mp->m_sb.sb_inodesize + -		     mp->m_sb.sb_inodesize + +		MAX((xfs_calc_buf_res(2, mp->m_sb.sb_inodesize) + +		     xfs_calc_buf_res(1, mp->m_sb.sb_sectsize) + +		     (uint)XFS_FSB_TO_B(mp, 1) + +		     xfs_calc_buf_res(XFS_DIROP_LOG_COUNT(mp), +				      XFS_FSB_TO_B(mp, 1))), +		    (xfs_calc_buf_res(2, mp->m_sb.sb_sectsize) +  		     mp->m_sb.sb_sectsize + -		     XFS_FSB_TO_B(mp, 1) + -		     XFS_DIROP_LOG_RES(mp) + -		     128 * (3 + XFS_DIROP_LOG_COUNT(mp))), -		    (3 * mp->m_sb.sb_sectsize + -		     XFS_FSB_TO_B(mp, XFS_IALLOC_BLOCKS(mp)) + -		     XFS_FSB_TO_B(mp, mp->m_in_maxlevels) + -		     XFS_ALLOCFREE_LOG_RES(mp, 1) + -		     128 * (2 + XFS_IALLOC_BLOCKS(mp) + mp->m_in_maxlevels + -			    XFS_ALLOCFREE_LOG_COUNT(mp, 1)))); +		     xfs_calc_buf_res(XFS_IALLOC_BLOCKS(mp), +				      XFS_FSB_TO_B(mp, 1)) + +		     xfs_calc_buf_res(mp->m_in_maxlevels, +				      XFS_FSB_TO_B(mp, 1)) + +		     xfs_calc_buf_res(XFS_ALLOCFREE_LOG_COUNT(mp, 1), +				      XFS_FSB_TO_B(mp, 1))));  }  /* @@ -306,16 +326,16 @@ xfs_calc_ifree_reservation(  	struct xfs_mount	*mp)  {  	return XFS_DQUOT_LOGRES(mp) + -		mp->m_sb.sb_inodesize + -		mp->m_sb.sb_sectsize + -		mp->m_sb.sb_sectsize + -		XFS_FSB_TO_B(mp, 1) + +		xfs_calc_buf_res(1, mp->m_sb.sb_inodesize) + +		xfs_calc_buf_res(2, mp->m_sb.sb_sectsize) + +		xfs_calc_buf_res(1, XFS_FSB_TO_B(mp, 1)) +  		MAX((__uint16_t)XFS_FSB_TO_B(mp, 1),  		    XFS_INODE_CLUSTER_SIZE(mp)) + -		128 * 5 + -		XFS_ALLOCFREE_LOG_RES(mp, 1) + -		128 * (2 + XFS_IALLOC_BLOCKS(mp) + mp->m_in_maxlevels + -		       XFS_ALLOCFREE_LOG_COUNT(mp, 1)); +		xfs_calc_buf_res(1, 0) + +		xfs_calc_buf_res(2 + XFS_IALLOC_BLOCKS(mp) + +				 mp->m_in_maxlevels, 0) + +		xfs_calc_buf_res(XFS_ALLOCFREE_LOG_COUNT(mp, 1), +				 XFS_FSB_TO_B(mp, 1));  }  /* @@ -343,9 +363,9 @@ STATIC uint  xfs_calc_growdata_reservation(  	struct xfs_mount	*mp)  { -	return mp->m_sb.sb_sectsize * 3 + -		XFS_ALLOCFREE_LOG_RES(mp, 1) + -		128 * (3 + XFS_ALLOCFREE_LOG_COUNT(mp, 1)); +	return xfs_calc_buf_res(3, mp->m_sb.sb_sectsize) + +		xfs_calc_buf_res(XFS_ALLOCFREE_LOG_COUNT(mp, 1), +				 XFS_FSB_TO_B(mp, 1));  }  /* @@ -362,12 +382,12 @@ STATIC uint  xfs_calc_growrtalloc_reservation(  	struct xfs_mount	*mp)  { -	return 2 * mp->m_sb.sb_sectsize + -		XFS_FSB_TO_B(mp, XFS_BM_MAXLEVELS(mp, XFS_DATA_FORK)) + -		mp->m_sb.sb_inodesize + -		XFS_ALLOCFREE_LOG_RES(mp, 1) + -		128 * (3 + XFS_BM_MAXLEVELS(mp, XFS_DATA_FORK) + -		       XFS_ALLOCFREE_LOG_COUNT(mp, 1)); +	return xfs_calc_buf_res(2, mp->m_sb.sb_sectsize) + +		xfs_calc_buf_res(XFS_BM_MAXLEVELS(mp, XFS_DATA_FORK), +				 XFS_FSB_TO_B(mp, 1)) + +		xfs_calc_buf_res(1, mp->m_sb.sb_inodesize) + +		xfs_calc_buf_res(XFS_ALLOCFREE_LOG_COUNT(mp, 1), +				 XFS_FSB_TO_B(mp, 1));  }  /* @@ -379,7 +399,7 @@ STATIC uint  xfs_calc_growrtzero_reservation(  	struct xfs_mount	*mp)  { -	return mp->m_sb.sb_blocksize + 128; +	return xfs_calc_buf_res(1, mp->m_sb.sb_blocksize);  }  /* @@ -396,11 +416,10 @@ STATIC uint  xfs_calc_growrtfree_reservation(  	struct xfs_mount	*mp)  { -	return mp->m_sb.sb_sectsize + -		2 * mp->m_sb.sb_inodesize + -		mp->m_sb.sb_blocksize + -		mp->m_rsumsize + -		128 * 5; +	return xfs_calc_buf_res(1, mp->m_sb.sb_sectsize) + +		xfs_calc_buf_res(2, mp->m_sb.sb_inodesize) + +		xfs_calc_buf_res(1, mp->m_sb.sb_blocksize) + +		xfs_calc_buf_res(1, mp->m_rsumsize);  }  /* @@ -411,7 +430,7 @@ STATIC uint  xfs_calc_swrite_reservation(  	struct xfs_mount	*mp)  { -	return mp->m_sb.sb_inodesize + 128; +	return xfs_calc_buf_res(1, mp->m_sb.sb_inodesize);  }  /* @@ -421,7 +440,7 @@ xfs_calc_swrite_reservation(  STATIC uint  xfs_calc_writeid_reservation(xfs_mount_t *mp)  { -	return mp->m_sb.sb_inodesize + 128; +	return xfs_calc_buf_res(1, mp->m_sb.sb_inodesize);  }  /* @@ -437,13 +456,13 @@ xfs_calc_addafork_reservation(  	struct xfs_mount	*mp)  {  	return XFS_DQUOT_LOGRES(mp) + -		mp->m_sb.sb_inodesize + -		mp->m_sb.sb_sectsize * 2 + -		mp->m_dirblksize + -		XFS_FSB_TO_B(mp, XFS_DAENTER_BMAP1B(mp, XFS_DATA_FORK) + 1) + -		XFS_ALLOCFREE_LOG_RES(mp, 1) + -		128 * (4 + XFS_DAENTER_BMAP1B(mp, XFS_DATA_FORK) + 1 + -		       XFS_ALLOCFREE_LOG_COUNT(mp, 1)); +		xfs_calc_buf_res(1, mp->m_sb.sb_inodesize) + +		xfs_calc_buf_res(2, mp->m_sb.sb_sectsize) + +		xfs_calc_buf_res(1, mp->m_dirblksize) + +		xfs_calc_buf_res(XFS_DAENTER_BMAP1B(mp, XFS_DATA_FORK) + 1, +				 XFS_FSB_TO_B(mp, 1)) + +		xfs_calc_buf_res(XFS_ALLOCFREE_LOG_COUNT(mp, 1), +				 XFS_FSB_TO_B(mp, 1));  }  /* @@ -461,35 +480,51 @@ STATIC uint  xfs_calc_attrinval_reservation(  	struct xfs_mount	*mp)  { -	return MAX((mp->m_sb.sb_inodesize + -		    XFS_FSB_TO_B(mp, XFS_BM_MAXLEVELS(mp, XFS_ATTR_FORK)) + -		    128 * (1 + XFS_BM_MAXLEVELS(mp, XFS_ATTR_FORK))), -		   (4 * mp->m_sb.sb_sectsize + -		    4 * mp->m_sb.sb_sectsize + -		    mp->m_sb.sb_sectsize + -		    XFS_ALLOCFREE_LOG_RES(mp, 4) + -		    128 * (9 + XFS_ALLOCFREE_LOG_COUNT(mp, 4)))); +	return MAX((xfs_calc_buf_res(1, mp->m_sb.sb_inodesize) + +		    xfs_calc_buf_res(XFS_BM_MAXLEVELS(mp, XFS_ATTR_FORK), +				     XFS_FSB_TO_B(mp, 1))), +		   (xfs_calc_buf_res(9, mp->m_sb.sb_sectsize) + +		    xfs_calc_buf_res(XFS_ALLOCFREE_LOG_COUNT(mp, 4), +				     XFS_FSB_TO_B(mp, 1))));  }  /* - * Setting an attribute. + * Setting an attribute at mount time.   *	the inode getting the attribute   *	the superblock for allocations   *	the agfs extents are allocated from   *	the attribute btree * max depth   *	the inode allocation btree   * Since attribute transaction space is dependent on the size of the attribute, - * the calculation is done partially at mount time and partially at runtime. + * the calculation is done partially at mount time and partially at runtime(see + * below).   */  STATIC uint -xfs_calc_attrset_reservation( +xfs_calc_attrsetm_reservation(  	struct xfs_mount	*mp)  {  	return XFS_DQUOT_LOGRES(mp) + -		mp->m_sb.sb_inodesize + -		mp->m_sb.sb_sectsize + -		XFS_FSB_TO_B(mp, XFS_DA_NODE_MAXDEPTH) + -		128 * (2 + XFS_DA_NODE_MAXDEPTH); +		xfs_calc_buf_res(1, mp->m_sb.sb_inodesize) + +		xfs_calc_buf_res(1, mp->m_sb.sb_sectsize) + +		xfs_calc_buf_res(XFS_DA_NODE_MAXDEPTH, XFS_FSB_TO_B(mp, 1)); +} + +/* + * Setting an attribute at runtime, transaction space unit per block. + * 	the superblock for allocations: sector size + *	the inode bmap btree could join or split: max depth * block size + * Since the runtime attribute transaction space is dependent on the total + * blocks needed for the 1st bmap, here we calculate out the space unit for + * one block so that the caller could figure out the total space according + * to the attibute extent length in blocks by: ext * XFS_ATTRSETRT_LOG_RES(mp). + */ +STATIC uint +xfs_calc_attrsetrt_reservation( +	struct xfs_mount	*mp) +{ +	return xfs_calc_buf_res(1, mp->m_sb.sb_sectsize) + +		xfs_calc_buf_res(XFS_BM_MAXLEVELS(mp, XFS_ATTR_FORK), +				 XFS_FSB_TO_B(mp, 1));  }  /* @@ -508,16 +543,15 @@ xfs_calc_attrrm_reservation(  	struct xfs_mount	*mp)  {  	return XFS_DQUOT_LOGRES(mp) + -		MAX((mp->m_sb.sb_inodesize + -		     XFS_FSB_TO_B(mp, XFS_DA_NODE_MAXDEPTH) + -		     XFS_FSB_TO_B(mp, XFS_BM_MAXLEVELS(mp, XFS_ATTR_FORK)) + -		     128 * (1 + XFS_DA_NODE_MAXDEPTH + -			    XFS_BM_MAXLEVELS(mp, XFS_DATA_FORK))), -		    (2 * mp->m_sb.sb_sectsize + -		     2 * mp->m_sb.sb_sectsize + -		     mp->m_sb.sb_sectsize + -		     XFS_ALLOCFREE_LOG_RES(mp, 2) + -		     128 * (5 + XFS_ALLOCFREE_LOG_COUNT(mp, 2)))); +		MAX((xfs_calc_buf_res(1, mp->m_sb.sb_inodesize) + +		     xfs_calc_buf_res(XFS_DA_NODE_MAXDEPTH, +				      XFS_FSB_TO_B(mp, 1)) + +		     (uint)XFS_FSB_TO_B(mp, +					XFS_BM_MAXLEVELS(mp, XFS_ATTR_FORK)) + +		     xfs_calc_buf_res(XFS_BM_MAXLEVELS(mp, XFS_DATA_FORK), 0)), +		    (xfs_calc_buf_res(5, mp->m_sb.sb_sectsize) + +		     xfs_calc_buf_res(XFS_ALLOCFREE_LOG_COUNT(mp, 2), +				      XFS_FSB_TO_B(mp, 1))));  }  /* @@ -527,7 +561,78 @@ STATIC uint  xfs_calc_clear_agi_bucket_reservation(  	struct xfs_mount	*mp)  { -	return mp->m_sb.sb_sectsize + 128; +	return xfs_calc_buf_res(1, mp->m_sb.sb_sectsize); +} + +/* + * Clearing the quotaflags in the superblock. + *	the super block for changing quota flags: sector size + */ +STATIC uint +xfs_calc_qm_sbchange_reservation( +	struct xfs_mount	*mp) +{ +	return xfs_calc_buf_res(1, mp->m_sb.sb_sectsize); +} + +/* + * Adjusting quota limits. + *    the xfs_disk_dquot_t: sizeof(struct xfs_disk_dquot) + */ +STATIC uint +xfs_calc_qm_setqlim_reservation( +	struct xfs_mount	*mp) +{ +	return xfs_calc_buf_res(1, sizeof(struct xfs_disk_dquot)); +} + +/* + * Allocating quota on disk if needed. + *	the write transaction log space: XFS_WRITE_LOG_RES(mp) + *	the unit of quota allocation: one system block size + */ +STATIC uint +xfs_calc_qm_dqalloc_reservation( +	struct xfs_mount	*mp) +{ +	return XFS_WRITE_LOG_RES(mp) + +		xfs_calc_buf_res(1, +			XFS_FSB_TO_B(mp, XFS_DQUOT_CLUSTER_SIZE_FSB) - 1); +} + +/* + * Turning off quotas. + *    the xfs_qoff_logitem_t: sizeof(struct xfs_qoff_logitem) * 2 + *    the superblock for the quota flags: sector size + */ +STATIC uint +xfs_calc_qm_quotaoff_reservation( +	struct xfs_mount	*mp) +{ +	return sizeof(struct xfs_qoff_logitem) * 2 + +		xfs_calc_buf_res(1, mp->m_sb.sb_sectsize); +} + +/* + * End of turning off quotas. + *    the xfs_qoff_logitem_t: sizeof(struct xfs_qoff_logitem) * 2 + */ +STATIC uint +xfs_calc_qm_quotaoff_end_reservation( +	struct xfs_mount	*mp) +{ +	return sizeof(struct xfs_qoff_logitem) * 2; +} + +/* + * Syncing the incore super block changes to disk. + *     the super block to reflect the changes: sector size + */ +STATIC uint +xfs_calc_sb_reservation( +	struct xfs_mount	*mp) +{ +	return xfs_calc_buf_res(1, mp->m_sb.sb_sectsize);  }  /* @@ -555,12 +660,19 @@ xfs_trans_init(  	resp->tr_writeid = xfs_calc_writeid_reservation(mp);  	resp->tr_addafork = xfs_calc_addafork_reservation(mp);  	resp->tr_attrinval = xfs_calc_attrinval_reservation(mp); -	resp->tr_attrset = xfs_calc_attrset_reservation(mp); +	resp->tr_attrsetm = xfs_calc_attrsetm_reservation(mp); +	resp->tr_attrsetrt = xfs_calc_attrsetrt_reservation(mp);  	resp->tr_attrrm = xfs_calc_attrrm_reservation(mp);  	resp->tr_clearagi = xfs_calc_clear_agi_bucket_reservation(mp);  	resp->tr_growrtalloc = xfs_calc_growrtalloc_reservation(mp);  	resp->tr_growrtzero = xfs_calc_growrtzero_reservation(mp);  	resp->tr_growrtfree = xfs_calc_growrtfree_reservation(mp); +	resp->tr_qm_sbchange = xfs_calc_qm_sbchange_reservation(mp); +	resp->tr_qm_setqlim = xfs_calc_qm_setqlim_reservation(mp); +	resp->tr_qm_dqalloc = xfs_calc_qm_dqalloc_reservation(mp); +	resp->tr_qm_quotaoff = xfs_calc_qm_quotaoff_reservation(mp); +	resp->tr_qm_equotaoff = xfs_calc_qm_quotaoff_end_reservation(mp); +	resp->tr_sb = xfs_calc_sb_reservation(mp);  }  /* diff --git a/fs/xfs/xfs_trans.h b/fs/xfs/xfs_trans.h index c6c0601abd7a..cd29f6171021 100644 --- a/fs/xfs/xfs_trans.h +++ b/fs/xfs/xfs_trans.h @@ -252,17 +252,19 @@ struct xfs_log_item_desc {   * as long as SWRITE logs the entire inode core   */  #define XFS_FSYNC_TS_LOG_RES(mp)        ((mp)->m_reservations.tr_swrite) -#define	XFS_WRITEID_LOG_RES(mp)	((mp)->m_reservations.tr_swrite) +#define	XFS_WRITEID_LOG_RES(mp)		((mp)->m_reservations.tr_swrite)  #define	XFS_ADDAFORK_LOG_RES(mp)	((mp)->m_reservations.tr_addafork)  #define	XFS_ATTRINVAL_LOG_RES(mp)	((mp)->m_reservations.tr_attrinval) -#define	XFS_ATTRSET_LOG_RES(mp, ext)	\ -	((mp)->m_reservations.tr_attrset + \ -	 (ext * (mp)->m_sb.sb_sectsize) + \ -	 (ext * XFS_FSB_TO_B((mp), XFS_BM_MAXLEVELS(mp, XFS_ATTR_FORK))) + \ -	 (128 * (ext + (ext * XFS_BM_MAXLEVELS(mp, XFS_ATTR_FORK))))) -#define	XFS_ATTRRM_LOG_RES(mp)	((mp)->m_reservations.tr_attrrm) +#define	XFS_ATTRSETM_LOG_RES(mp)	((mp)->m_reservations.tr_attrsetm) +#define XFS_ATTRSETRT_LOG_RES(mp)	((mp)->m_reservations.tr_attrsetrt) +#define	XFS_ATTRRM_LOG_RES(mp)		((mp)->m_reservations.tr_attrrm)  #define	XFS_CLEAR_AGI_BUCKET_LOG_RES(mp)  ((mp)->m_reservations.tr_clearagi) - +#define XFS_QM_SBCHANGE_LOG_RES(mp)	((mp)->m_reservations.tr_qm_sbchange) +#define XFS_QM_SETQLIM_LOG_RES(mp)	((mp)->m_reservations.tr_qm_setqlim) +#define XFS_QM_DQALLOC_LOG_RES(mp)	((mp)->m_reservations.tr_qm_dqalloc) +#define XFS_QM_QUOTAOFF_LOG_RES(mp)	((mp)->m_reservations.tr_qm_quotaoff) +#define XFS_QM_QUOTAOFF_END_LOG_RES(mp)	((mp)->m_reservations.tr_qm_equotaoff) +#define XFS_SB_LOG_RES(mp)		((mp)->m_reservations.tr_sb)  /*   * Various log count values. diff --git a/fs/xfs/xfs_trans_ail.c b/fs/xfs/xfs_trans_ail.c index 6011ee661339..0eda7254305f 100644 --- a/fs/xfs/xfs_trans_ail.c +++ b/fs/xfs/xfs_trans_ail.c @@ -55,20 +55,6 @@ xfs_ail_check(  		ASSERT(XFS_LSN_CMP(prev_lip->li_lsn, lip->li_lsn) >= 0); -#ifdef XFS_TRANS_DEBUG -	/* -	 * Walk the list checking lsn ordering, and that every entry has the -	 * XFS_LI_IN_AIL flag set. This is really expensive, so only do it -	 * when specifically debugging the transaction subsystem. -	 */ -	prev_lip = list_entry(&ailp->xa_ail, xfs_log_item_t, li_ail); -	list_for_each_entry(lip, &ailp->xa_ail, li_ail) { -		if (&prev_lip->li_ail != &ailp->xa_ail) -			ASSERT(XFS_LSN_CMP(prev_lip->li_lsn, lip->li_lsn) <= 0); -		ASSERT((lip->li_flags & XFS_LI_IN_AIL) != 0); -		prev_lip = lip; -	} -#endif /* XFS_TRANS_DEBUG */  }  #else /* !DEBUG */  #define	xfs_ail_check(a,l) diff --git a/fs/xfs/xfs_trans_buf.c b/fs/xfs/xfs_trans_buf.c index 4fc17d479d42..3edf5dbee001 100644 --- a/fs/xfs/xfs_trans_buf.c +++ b/fs/xfs/xfs_trans_buf.c @@ -93,7 +93,7 @@ _xfs_trans_bjoin(  	xfs_buf_item_init(bp, tp->t_mountp);  	bip = bp->b_fspriv;  	ASSERT(!(bip->bli_flags & XFS_BLI_STALE)); -	ASSERT(!(bip->bli_format.blf_flags & XFS_BLF_CANCEL)); +	ASSERT(!(bip->__bli_format.blf_flags & XFS_BLF_CANCEL));  	ASSERT(!(bip->bli_flags & XFS_BLI_LOGGED));  	if (reset_recur)  		bip->bli_recur = 0; @@ -432,7 +432,7 @@ xfs_trans_brelse(xfs_trans_t	*tp,  	bip = bp->b_fspriv;  	ASSERT(bip->bli_item.li_type == XFS_LI_BUF);  	ASSERT(!(bip->bli_flags & XFS_BLI_STALE)); -	ASSERT(!(bip->bli_format.blf_flags & XFS_BLF_CANCEL)); +	ASSERT(!(bip->__bli_format.blf_flags & XFS_BLF_CANCEL));  	ASSERT(atomic_read(&bip->bli_refcount) > 0);  	trace_xfs_trans_brelse(bip); @@ -519,7 +519,7 @@ xfs_trans_bhold(xfs_trans_t	*tp,  	ASSERT(bp->b_transp == tp);  	ASSERT(bip != NULL);  	ASSERT(!(bip->bli_flags & XFS_BLI_STALE)); -	ASSERT(!(bip->bli_format.blf_flags & XFS_BLF_CANCEL)); +	ASSERT(!(bip->__bli_format.blf_flags & XFS_BLF_CANCEL));  	ASSERT(atomic_read(&bip->bli_refcount) > 0);  	bip->bli_flags |= XFS_BLI_HOLD; @@ -539,7 +539,7 @@ xfs_trans_bhold_release(xfs_trans_t	*tp,  	ASSERT(bp->b_transp == tp);  	ASSERT(bip != NULL);  	ASSERT(!(bip->bli_flags & XFS_BLI_STALE)); -	ASSERT(!(bip->bli_format.blf_flags & XFS_BLF_CANCEL)); +	ASSERT(!(bip->__bli_format.blf_flags & XFS_BLF_CANCEL));  	ASSERT(atomic_read(&bip->bli_refcount) > 0);  	ASSERT(bip->bli_flags & XFS_BLI_HOLD); @@ -598,7 +598,7 @@ xfs_trans_log_buf(xfs_trans_t	*tp,  		bip->bli_flags &= ~XFS_BLI_STALE;  		ASSERT(XFS_BUF_ISSTALE(bp));  		XFS_BUF_UNSTALE(bp); -		bip->bli_format.blf_flags &= ~XFS_BLF_CANCEL; +		bip->__bli_format.blf_flags &= ~XFS_BLF_CANCEL;  	}  	tp->t_flags |= XFS_TRANS_DIRTY; @@ -643,6 +643,7 @@ xfs_trans_binval(  	xfs_buf_t	*bp)  {  	xfs_buf_log_item_t	*bip = bp->b_fspriv; +	int			i;  	ASSERT(bp->b_transp == tp);  	ASSERT(bip != NULL); @@ -657,8 +658,8 @@ xfs_trans_binval(  		 */  		ASSERT(XFS_BUF_ISSTALE(bp));  		ASSERT(!(bip->bli_flags & (XFS_BLI_LOGGED | XFS_BLI_DIRTY))); -		ASSERT(!(bip->bli_format.blf_flags & XFS_BLF_INODE_BUF)); -		ASSERT(bip->bli_format.blf_flags & XFS_BLF_CANCEL); +		ASSERT(!(bip->__bli_format.blf_flags & XFS_BLF_INODE_BUF)); +		ASSERT(bip->__bli_format.blf_flags & XFS_BLF_CANCEL);  		ASSERT(bip->bli_item.li_desc->lid_flags & XFS_LID_DIRTY);  		ASSERT(tp->t_flags & XFS_TRANS_DIRTY);  		return; @@ -668,10 +669,12 @@ xfs_trans_binval(  	bip->bli_flags |= XFS_BLI_STALE;  	bip->bli_flags &= ~(XFS_BLI_INODE_BUF | XFS_BLI_LOGGED | XFS_BLI_DIRTY); -	bip->bli_format.blf_flags &= ~XFS_BLF_INODE_BUF; -	bip->bli_format.blf_flags |= XFS_BLF_CANCEL; -	memset((char *)(bip->bli_format.blf_data_map), 0, -	      (bip->bli_format.blf_map_size * sizeof(uint))); +	bip->__bli_format.blf_flags &= ~XFS_BLF_INODE_BUF; +	bip->__bli_format.blf_flags |= XFS_BLF_CANCEL; +	for (i = 0; i < bip->bli_format_count; i++) { +		memset(bip->bli_formats[i].blf_data_map, 0, +		       (bip->bli_formats[i].blf_map_size * sizeof(uint))); +	}  	bip->bli_item.li_desc->lid_flags |= XFS_LID_DIRTY;  	tp->t_flags |= XFS_TRANS_DIRTY;  } @@ -775,5 +778,5 @@ xfs_trans_dquot_buf(  	       type == XFS_BLF_GDQUOT_BUF);  	ASSERT(atomic_read(&bip->bli_refcount) > 0); -	bip->bli_format.blf_flags |= type; +	bip->__bli_format.blf_flags |= type;  } diff --git a/fs/xfs/xfs_trans_dquot.c b/fs/xfs/xfs_trans_dquot.c index 0c7fa54f309e..642c2d6e1db1 100644 --- a/fs/xfs/xfs_trans_dquot.c +++ b/fs/xfs/xfs_trans_dquot.c @@ -516,7 +516,7 @@ xfs_trans_unreserve_and_mod_dquots(  	int			i, j;  	xfs_dquot_t		*dqp;  	xfs_dqtrx_t		*qtrx, *qa; -	boolean_t		locked; +	bool                    locked;  	if (!tp->t_dqinfo || !(tp->t_flags & XFS_TRANS_DQ_DIRTY))  		return; @@ -537,17 +537,17 @@ xfs_trans_unreserve_and_mod_dquots(  			 * about the number of blocks used field, or deltas.  			 * Also we don't bother to zero the fields.  			 */ -			locked = B_FALSE; +			locked = false;  			if (qtrx->qt_blk_res) {  				xfs_dqlock(dqp); -				locked = B_TRUE; +				locked = true;  				dqp->q_res_bcount -=  					(xfs_qcnt_t)qtrx->qt_blk_res;  			}  			if (qtrx->qt_ino_res) {  				if (!locked) {  					xfs_dqlock(dqp); -					locked = B_TRUE; +					locked = true;  				}  				dqp->q_res_icount -=  					(xfs_qcnt_t)qtrx->qt_ino_res; @@ -556,7 +556,7 @@ xfs_trans_unreserve_and_mod_dquots(  			if (qtrx->qt_rtblk_res) {  				if (!locked) {  					xfs_dqlock(dqp); -					locked = B_TRUE; +					locked = true;  				}  				dqp->q_res_rtbcount -=  					(xfs_qcnt_t)qtrx->qt_rtblk_res; diff --git a/fs/xfs/xfs_trans_inode.c b/fs/xfs/xfs_trans_inode.c index d2eee20d5f5b..ac6d567704db 100644 --- a/fs/xfs/xfs_trans_inode.c +++ b/fs/xfs/xfs_trans_inode.c @@ -33,14 +33,6 @@  #include "xfs_inode_item.h"  #include "xfs_trace.h" -#ifdef XFS_TRANS_DEBUG -STATIC void -xfs_trans_inode_broot_debug( -	xfs_inode_t	*ip); -#else -#define	xfs_trans_inode_broot_debug(ip) -#endif -  /*   * Add a locked inode to the transaction.   * @@ -67,8 +59,6 @@ xfs_trans_ijoin(  	 * Get a log_item_desc to point at the new item.  	 */  	xfs_trans_add_item(tp, &iip->ili_item); - -	xfs_trans_inode_broot_debug(ip);  }  /* @@ -135,34 +125,3 @@ xfs_trans_log_inode(  	flags |= ip->i_itemp->ili_last_fields;  	ip->i_itemp->ili_fields |= flags;  } - -#ifdef XFS_TRANS_DEBUG -/* - * Keep track of the state of the inode btree root to make sure we - * log it properly. - */ -STATIC void -xfs_trans_inode_broot_debug( -	xfs_inode_t	*ip) -{ -	xfs_inode_log_item_t	*iip; - -	ASSERT(ip->i_itemp != NULL); -	iip = ip->i_itemp; -	if (iip->ili_root_size != 0) { -		ASSERT(iip->ili_orig_root != NULL); -		kmem_free(iip->ili_orig_root); -		iip->ili_root_size = 0; -		iip->ili_orig_root = NULL; -	} -	if (ip->i_d.di_format == XFS_DINODE_FMT_BTREE) { -		ASSERT((ip->i_df.if_broot != NULL) && -		       (ip->i_df.if_broot_bytes > 0)); -		iip->ili_root_size = ip->i_df.if_broot_bytes; -		iip->ili_orig_root = -			(char*)kmem_alloc(iip->ili_root_size, KM_SLEEP); -		memcpy(iip->ili_orig_root, (char*)(ip->i_df.if_broot), -		      iip->ili_root_size); -	} -} -#endif diff --git a/fs/xfs/xfs_types.h b/fs/xfs/xfs_types.h index 7a41874f4c20..61ba1cfa974c 100644 --- a/fs/xfs/xfs_types.h +++ b/fs/xfs/xfs_types.h @@ -32,7 +32,6 @@ typedef unsigned int		__uint32_t;  typedef signed long long int	__int64_t;  typedef unsigned long long int	__uint64_t; -typedef enum { B_FALSE,B_TRUE }	boolean_t;  typedef __uint32_t		prid_t;		/* project ID */  typedef __uint32_t		inst_t;		/* an instruction */ diff --git a/fs/xfs/xfs_vnodeops.c b/fs/xfs/xfs_vnodeops.c index d95f565a390e..77ad74834baa 100644 --- a/fs/xfs/xfs_vnodeops.c +++ b/fs/xfs/xfs_vnodeops.c @@ -725,7 +725,7 @@ xfs_create(  	int			error;  	xfs_bmap_free_t		free_list;  	xfs_fsblock_t		first_block; -	boolean_t		unlock_dp_on_error = B_FALSE; +	bool                    unlock_dp_on_error = false;  	uint			cancel_flags;  	int			committed;  	prid_t			prid; @@ -794,7 +794,7 @@ xfs_create(  	}  	xfs_ilock(dp, XFS_ILOCK_EXCL | XFS_ILOCK_PARENT); -	unlock_dp_on_error = B_TRUE; +	unlock_dp_on_error = true;  	xfs_bmap_init(&free_list, &first_block); @@ -830,7 +830,7 @@ xfs_create(  	 * error path.  	 */  	xfs_trans_ijoin(tp, dp, XFS_ILOCK_EXCL); -	unlock_dp_on_error = B_FALSE; +	unlock_dp_on_error = false;  	error = xfs_dir_createname(tp, dp, name, ip->i_ino,  					&first_block, &free_list, resblks ? @@ -1367,7 +1367,7 @@ xfs_symlink(  	int			pathlen;  	xfs_bmap_free_t		free_list;  	xfs_fsblock_t		first_block; -	boolean_t		unlock_dp_on_error = B_FALSE; +	bool                    unlock_dp_on_error = false;  	uint			cancel_flags;  	int			committed;  	xfs_fileoff_t		first_fsb; @@ -1438,7 +1438,7 @@ xfs_symlink(  	}  	xfs_ilock(dp, XFS_ILOCK_EXCL | XFS_ILOCK_PARENT); -	unlock_dp_on_error = B_TRUE; +	unlock_dp_on_error = true;  	/*  	 * Check whether the directory allows new symlinks or not. @@ -1484,7 +1484,7 @@ xfs_symlink(  	 * error path.  	 */  	xfs_trans_ijoin(tp, dp, XFS_ILOCK_EXCL); -	unlock_dp_on_error = B_FALSE; +	unlock_dp_on_error = false;  	/*  	 * Also attach the dquot(s) to it, if applicable. |