diff options
Diffstat (limited to 'fs/buffer.c')
| -rw-r--r-- | fs/buffer.c | 22 | 
1 files changed, 13 insertions, 9 deletions
diff --git a/fs/buffer.c b/fs/buffer.c index 838a9cf246b..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;  }  /*  |