diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2008-08-14 02:17:49 +0400 | 
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2008-08-14 02:17:49 +0400 | 
| commit | 9ea319b61613085f501a79cf8d405cb221d084f3 (patch) | |
| tree | 5bf7e1b9f104a0df029d355927fa9eb398db37bb /fs/xfs/linux-2.6/xfs_buf.c | |
| parent | 3e11acd4306d558249c31cf6cac09f218f2de52e (diff) | |
| parent | c6a7b0f8a49aa71792dd108efc535435f462bf79 (diff) | |
| download | linux-9ea319b61613085f501a79cf8d405cb221d084f3.tar.xz | |
Merge git://oss.sgi.com:8090/xfs/linux-2.6
* git://oss.sgi.com:8090/xfs/linux-2.6: (45 commits)
  [XFS] Fix use after free in xfs_log_done().
  [XFS] Make xfs_bmap_*_count_leaves void.
  [XFS] Use KM_NOFS for debug trace buffers
  [XFS] use KM_MAYFAIL in xfs_mountfs
  [XFS] refactor xfs_mount_free
  [XFS] don't call xfs_freesb from xfs_unmountfs
  [XFS] xfs_unmountfs should return void
  [XFS] cleanup xfs_mountfs
  [XFS] move root inode IRELE into xfs_unmountfs
  [XFS] stop using file_update_time
  [XFS] optimize xfs_ichgtime
  [XFS] update timestamp in xfs_ialloc manually
  [XFS] remove the sema_t from XFS.
  [XFS] replace dquot flush semaphore with a completion
  [XFS] replace inode flush semaphore with a completion
  [XFS] extend completions to provide XFS object flush requirements
  [XFS] replace the XFS buf iodone semaphore with a completion
  [XFS] clean up stale references to semaphores
  [XFS] use get_unaligned_* helpers
  [XFS] Fix compile failure in xfs_buf_trace()
  ...
Diffstat (limited to 'fs/xfs/linux-2.6/xfs_buf.c')
| -rw-r--r-- | fs/xfs/linux-2.6/xfs_buf.c | 16 | 
1 files changed, 6 insertions, 10 deletions
| diff --git a/fs/xfs/linux-2.6/xfs_buf.c b/fs/xfs/linux-2.6/xfs_buf.c index 9cc8f0213095..986061ae1b9b 100644 --- a/fs/xfs/linux-2.6/xfs_buf.c +++ b/fs/xfs/linux-2.6/xfs_buf.c @@ -58,7 +58,7 @@ xfs_buf_trace(  		bp, id,  		(void *)(unsigned long)bp->b_flags,  		(void *)(unsigned long)bp->b_hold.counter, -		(void *)(unsigned long)bp->b_sema.count.counter, +		(void *)(unsigned long)bp->b_sema.count,  		(void *)current,  		data, ra,  		(void *)(unsigned long)((bp->b_file_offset>>32) & 0xffffffff), @@ -253,7 +253,7 @@ _xfs_buf_initialize(  	memset(bp, 0, sizeof(xfs_buf_t));  	atomic_set(&bp->b_hold, 1); -	init_MUTEX_LOCKED(&bp->b_iodonesema); +	init_completion(&bp->b_iowait);  	INIT_LIST_HEAD(&bp->b_list);  	INIT_LIST_HEAD(&bp->b_hash_list);  	init_MUTEX_LOCKED(&bp->b_sema); /* held, no waiters */ @@ -838,6 +838,7 @@ xfs_buf_rele(  		return;  	} +	ASSERT(atomic_read(&bp->b_hold) > 0);  	if (atomic_dec_and_lock(&bp->b_hold, &hash->bh_lock)) {  		if (bp->b_relse) {  			atomic_inc(&bp->b_hold); @@ -851,11 +852,6 @@ xfs_buf_rele(  			spin_unlock(&hash->bh_lock);  			xfs_buf_free(bp);  		} -	} else { -		/* -		 * Catch reference count leaks -		 */ -		ASSERT(atomic_read(&bp->b_hold) >= 0);  	}  } @@ -1037,7 +1033,7 @@ xfs_buf_ioend(  			xfs_buf_iodone_work(&bp->b_iodone_work);  		}  	} else { -		up(&bp->b_iodonesema); +		complete(&bp->b_iowait);  	}  } @@ -1275,7 +1271,7 @@ xfs_buf_iowait(  	XB_TRACE(bp, "iowait", 0);  	if (atomic_read(&bp->b_io_remaining))  		blk_run_address_space(bp->b_target->bt_mapping); -	down(&bp->b_iodonesema); +	wait_for_completion(&bp->b_iowait);  	XB_TRACE(bp, "iowaited", (long)bp->b_error);  	return bp->b_error;  } @@ -1799,7 +1795,7 @@ int __init  xfs_buf_init(void)  {  #ifdef XFS_BUF_TRACE -	xfs_buf_trace_buf = ktrace_alloc(XFS_BUF_TRACE_SIZE, KM_SLEEP); +	xfs_buf_trace_buf = ktrace_alloc(XFS_BUF_TRACE_SIZE, KM_NOFS);  #endif  	xfs_buf_zone = kmem_zone_init_flags(sizeof(xfs_buf_t), "xfs_buf", | 
