diff options
Diffstat (limited to 'fs/buffer.c')
| -rw-r--r-- | fs/buffer.c | 24 | 
1 files changed, 14 insertions, 10 deletions
diff --git a/fs/buffer.c b/fs/buffer.c index ad5938ca357..c7062c896d7 100644 --- a/fs/buffer.c +++ b/fs/buffer.c @@ -1036,6 +1036,9 @@ grow_buffers(struct block_device *bdev, sector_t block, int size)  static struct buffer_head *  __getblk_slow(struct block_device *bdev, sector_t block, int size)  { +	int ret; +	struct buffer_head *bh; +  	/* Size must be multiple of hard sectorsize */  	if (unlikely(size & (bdev_logical_block_size(bdev)-1) ||  			(size < 512 || size > PAGE_SIZE))) { @@ -1048,20 +1051,21 @@ __getblk_slow(struct block_device *bdev, sector_t block, int size)  		return NULL;  	} -	for (;;) { -		struct buffer_head * bh; -		int ret; +retry: +	bh = __find_get_block(bdev, block, size); +	if (bh) +		return bh; +	ret = grow_buffers(bdev, block, size); +	if (ret == 0) { +		free_more_memory(); +		goto retry; +	} else if (ret > 0) {  		bh = __find_get_block(bdev, block, size);  		if (bh)  			return bh; - -		ret = grow_buffers(bdev, block, size); -		if (ret < 0) -			return NULL; -		if (ret == 0) -			free_more_memory();  	} +	return NULL;  }  /* @@ -3152,7 +3156,7 @@ SYSCALL_DEFINE2(bdflush, int, func, long, data)  /*   * Buffer-head allocation   */ -static struct kmem_cache *bh_cachep; +static struct kmem_cache *bh_cachep __read_mostly;  /*   * Once the number of bh's in the machine exceeds this level, we start  |