diff options
Diffstat (limited to 'fs')
| -rw-r--r-- | fs/buffer.c | 1 | ||||
| -rw-r--r-- | fs/debugfs/inode.c | 2 | ||||
| -rw-r--r-- | fs/jbd/journal.c | 3 | ||||
| -rw-r--r-- | fs/udf/super.c | 3 | ||||
| -rw-r--r-- | fs/xfs/xfs_buf.c | 12 | ||||
| -rw-r--r-- | fs/xfs/xfs_buf.h | 6 | ||||
| -rw-r--r-- | fs/xfs/xfs_buf_item.c | 49 | ||||
| -rw-r--r-- | fs/xfs/xfs_buf_item.h | 2 | ||||
| -rw-r--r-- | fs/xfs/xfs_dir2_block.c | 6 | ||||
| -rw-r--r-- | fs/xfs/xfs_qm_syscalls.c | 4 | ||||
| -rw-r--r-- | fs/xfs/xfs_trans_buf.c | 27 | 
11 files changed, 70 insertions, 45 deletions
diff --git a/fs/buffer.c b/fs/buffer.c index c017a2dfb90..7a75c3e0fd5 100644 --- a/fs/buffer.c +++ b/fs/buffer.c @@ -2935,6 +2935,7 @@ static void guard_bh_eod(int rw, struct bio *bio, struct buffer_head *bh)  		void *kaddr = kmap_atomic(bh->b_page);  		memset(kaddr + bh_offset(bh) + bytes, 0, bh->b_size - bytes);  		kunmap_atomic(kaddr); +		flush_dcache_page(bh->b_page);  	}  } diff --git a/fs/debugfs/inode.c b/fs/debugfs/inode.c index 153bb1e42e6..a5f12b7e228 100644 --- a/fs/debugfs/inode.c +++ b/fs/debugfs/inode.c @@ -176,7 +176,7 @@ static int debugfs_parse_options(char *data, struct debugfs_mount_opts *opts)  			opts->uid = uid;  			break;  		case Opt_gid: -			if (match_octal(&args[0], &option)) +			if (match_int(&args[0], &option))  				return -EINVAL;  			gid = make_kgid(current_user_ns(), option);  			if (!gid_valid(gid)) diff --git a/fs/jbd/journal.c b/fs/jbd/journal.c index a2862339323..81cc7eaff86 100644 --- a/fs/jbd/journal.c +++ b/fs/jbd/journal.c @@ -446,7 +446,8 @@ int __log_start_commit(journal_t *journal, tid_t target)  	 * currently running transaction (if it exists).  Otherwise,  	 * the target tid must be an old one.  	 */ -	if (journal->j_running_transaction && +	if (journal->j_commit_request != target && +	    journal->j_running_transaction &&  	    journal->j_running_transaction->t_tid == target) {  		/*  		 * We want a new commit: OK, mark the request and wakeup the diff --git a/fs/udf/super.c b/fs/udf/super.c index d44fb568abe..e9be396a558 100644 --- a/fs/udf/super.c +++ b/fs/udf/super.c @@ -307,7 +307,8 @@ static void udf_sb_free_partitions(struct super_block *sb)  {  	struct udf_sb_info *sbi = UDF_SB(sb);  	int i; - +	if (sbi->s_partmaps == NULL) +		return;  	for (i = 0; i < sbi->s_partitions; i++)  		udf_free_partition(&sbi->s_partmaps[i]);  	kfree(sbi->s_partmaps); diff --git a/fs/xfs/xfs_buf.c b/fs/xfs/xfs_buf.c index 26673a0b20e..56d1614760c 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); @@ -640,7 +640,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); @@ -1709,7 +1709,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 23f5642480b..433a12ed7b1 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 becf4a97efc..77b09750e92 100644 --- a/fs/xfs/xfs_buf_item.c +++ b/fs/xfs/xfs_buf_item.c @@ -71,7 +71,7 @@ xfs_buf_item_log_debug(  		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]); +		wordp = &(bip->__bli_format.blf_data_map[word_num]);  		bit_set = *wordp & (1 << bit_num);  		ASSERT(bit_set);  		byte++; @@ -237,7 +237,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 +278,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 +287,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 +312,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 +380,8 @@ xfs_buf_item_format_segment(  			nbits++;  		}  	} -	bip->bli_format.blf_size = nvecs; +out: +	blfp->blf_size = nvecs;  	return vecp;  } @@ -405,7 +415,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;  	} @@ -485,7 +495,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); @@ -601,7 +611,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 +641,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; @@ -644,8 +654,15 @@ xfs_buf_item_unlock(  	 * If the buf item isn't tracking any data, free it, otherwise drop the  	 * reference we hold to it.  	 */ -	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  		atomic_dec(&bip->bli_refcount); @@ -716,7 +733,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 +748,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;  	} diff --git a/fs/xfs/xfs_buf_item.h b/fs/xfs/xfs_buf_item.h index 6850f49f4af..16def435944 100644 --- a/fs/xfs/xfs_buf_item.h +++ b/fs/xfs/xfs_buf_item.h @@ -104,7 +104,7 @@ typedef struct xfs_buf_log_item {  #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 *); diff --git a/fs/xfs/xfs_dir2_block.c b/fs/xfs/xfs_dir2_block.c index 7536faaa61e..12afe07a91d 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_qm_syscalls.c b/fs/xfs/xfs_qm_syscalls.c index 5f53e75409b..8a59f854655 100644 --- a/fs/xfs/xfs_qm_syscalls.c +++ b/fs/xfs/xfs_qm_syscalls.c @@ -784,11 +784,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_trans_buf.c b/fs/xfs/xfs_trans_buf.c index 4fc17d479d4..3edf5dbee00 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;  }  |