|
@@ -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;
|
|
|
}
|
|
|
|
|
|
/*
|