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 838a9cf246bd..c7062c896d7c 100644 --- a/fs/buffer.c +++ b/fs/buffer.c | |||
| @@ -1036,6 +1036,9 @@ grow_buffers(struct block_device *bdev, sector_t block, int size) | |||
| 1036 | static struct buffer_head * | 1036 | static struct buffer_head * |
| 1037 | __getblk_slow(struct block_device *bdev, sector_t block, int size) | 1037 | __getblk_slow(struct block_device *bdev, sector_t block, int size) |
| 1038 | { | 1038 | { |
| 1039 | int ret; | ||
| 1040 | struct buffer_head *bh; | ||
| 1041 | |||
| 1039 | /* Size must be multiple of hard sectorsize */ | 1042 | /* Size must be multiple of hard sectorsize */ |
| 1040 | if (unlikely(size & (bdev_logical_block_size(bdev)-1) || | 1043 | if (unlikely(size & (bdev_logical_block_size(bdev)-1) || |
| 1041 | (size < 512 || size > PAGE_SIZE))) { | 1044 | (size < 512 || size > PAGE_SIZE))) { |
| @@ -1048,20 +1051,21 @@ __getblk_slow(struct block_device *bdev, sector_t block, int size) | |||
| 1048 | return NULL; | 1051 | return NULL; |
| 1049 | } | 1052 | } |
| 1050 | 1053 | ||
| 1051 | for (;;) { | 1054 | retry: |
| 1052 | struct buffer_head * bh; | 1055 | bh = __find_get_block(bdev, block, size); |
| 1053 | int ret; | 1056 | if (bh) |
| 1057 | return bh; | ||
| 1054 | 1058 | ||
| 1059 | ret = grow_buffers(bdev, block, size); | ||
| 1060 | if (ret == 0) { | ||
| 1061 | free_more_memory(); | ||
| 1062 | goto retry; | ||
| 1063 | } else if (ret > 0) { | ||
| 1055 | bh = __find_get_block(bdev, block, size); | 1064 | bh = __find_get_block(bdev, block, size); |
| 1056 | if (bh) | 1065 | if (bh) |
| 1057 | return bh; | 1066 | return bh; |
| 1058 | |||
| 1059 | ret = grow_buffers(bdev, block, size); | ||
| 1060 | if (ret < 0) | ||
| 1061 | return NULL; | ||
| 1062 | if (ret == 0) | ||
| 1063 | free_more_memory(); | ||
| 1064 | } | 1067 | } |
| 1068 | return NULL; | ||
| 1065 | } | 1069 | } |
| 1066 | 1070 | ||
| 1067 | /* | 1071 | /* |
