|
Line
Link Here
|
| 0 |
-- |
0 |
++ b/fs/buffer.c |
| 1 |
-- a/fs/buffer.c |
|
|
|
Lines 1042-1049
grow_buffers(struct block_device *bdev,
Link Here
|
| 1042 |
} while ((size << sizebits) < PAGE_SIZE); |
1042 |
} while ((size << sizebits) < PAGE_SIZE); |
| 1043 |
|
1043 |
|
| 1044 |
index = block >> sizebits; |
1044 |
index = block >> sizebits; |
| 1045 |
block = index << sizebits; |
|
|
| 1046 |
|
1045 |
|
|
|
1046 |
/* |
| 1047 |
* Check for a block which wants to lie outside our maximum possible |
| 1048 |
* pagecache index. (this comparison is done using sector_t types). |
| 1049 |
*/ |
| 1050 |
if (unlikely(index != block >> sizebits)) { |
| 1051 |
char b[BDEVNAME_SIZE]; |
| 1052 |
|
| 1053 |
printk(KERN_ERR "%s: requested out-of-range block %llu for " |
| 1054 |
"device %s\n", |
| 1055 |
__FUNCTION__, (unsigned long long)block, |
| 1056 |
bdevname(bdev, b)); |
| 1057 |
return -EIO; |
| 1058 |
} |
| 1059 |
block = index << sizebits; |
| 1047 |
/* Create a page with the proper size buffers.. */ |
1060 |
/* Create a page with the proper size buffers.. */ |
| 1048 |
page = grow_dev_page(bdev, block, index, size); |
1061 |
page = grow_dev_page(bdev, block, index, size); |
| 1049 |
if (!page) |
1062 |
if (!page) |
|
Lines 1070-1081
__getblk_slow(struct block_device *bdev,
Link Here
|
| 1070 |
|
1083 |
|
| 1071 |
for (;;) { |
1084 |
for (;;) { |
| 1072 |
struct buffer_head * bh; |
1085 |
struct buffer_head * bh; |
|
|
1086 |
int ret; |
| 1073 |
|
1087 |
|
| 1074 |
bh = __find_get_block(bdev, block, size); |
1088 |
bh = __find_get_block(bdev, block, size); |
| 1075 |
if (bh) |
1089 |
if (bh) |
| 1076 |
return bh; |
1090 |
return bh; |
| 1077 |
|
1091 |
|
| 1078 |
if (!grow_buffers(bdev, block, size)) |
1092 |
ret = grow_buffers(bdev, block, size); |
|
|
1093 |
if (ret < 0) |
| 1094 |
return NULL; |
| 1095 |
if (ret == 0) |
| 1079 |
free_more_memory(); |
1096 |
free_more_memory(); |
| 1080 |
} |
1097 |
} |
| 1081 |
} |
1098 |
} |