diff options
author | Joern Engel <joern@logfs.org> | 2010-03-17 08:47:45 -0400 |
---|---|---|
committer | Joern Engel <joern@logfs.org> | 2010-03-27 06:19:14 -0400 |
commit | 59fe27c0a8173a74b105debc803b97582028c90b (patch) | |
tree | 6011317b8da26f879989a4b654aedf6549181968 /fs/logfs/dev_bdev.c | |
parent | 49137f2efb5cf68724bccaba531ab3d59acd71f9 (diff) |
Limit max_pages for insane devices
Intel SSDs have a limit of 0xffff as queue_max_hw_sectors(q). Such a
limit may make sense from a hardware pov, but it causes bio_alloc() to
return NULL.
Signed-off-by: Joern Engel <joern@logfs.org>
Diffstat (limited to 'fs/logfs/dev_bdev.c')
-rw-r--r-- | fs/logfs/dev_bdev.c | 8 |
1 files changed, 6 insertions, 2 deletions
diff --git a/fs/logfs/dev_bdev.c b/fs/logfs/dev_bdev.c index 9718c22f186d..f99f5dcce546 100644 --- a/fs/logfs/dev_bdev.c +++ b/fs/logfs/dev_bdev.c | |||
@@ -97,8 +97,10 @@ static int __bdev_writeseg(struct super_block *sb, u64 ofs, pgoff_t index, | |||
97 | unsigned int max_pages = queue_max_hw_sectors(q) >> (PAGE_SHIFT - 9); | 97 | unsigned int max_pages = queue_max_hw_sectors(q) >> (PAGE_SHIFT - 9); |
98 | int i; | 98 | int i; |
99 | 99 | ||
100 | if (max_pages > BIO_MAX_PAGES) | ||
101 | max_pages = BIO_MAX_PAGES; | ||
100 | bio = bio_alloc(GFP_NOFS, max_pages); | 102 | bio = bio_alloc(GFP_NOFS, max_pages); |
101 | BUG_ON(!bio); /* FIXME: handle this */ | 103 | BUG_ON(!bio); |
102 | 104 | ||
103 | for (i = 0; i < nr_pages; i++) { | 105 | for (i = 0; i < nr_pages; i++) { |
104 | if (i >= max_pages) { | 106 | if (i >= max_pages) { |
@@ -191,8 +193,10 @@ static int do_erase(struct super_block *sb, u64 ofs, pgoff_t index, | |||
191 | unsigned int max_pages = queue_max_hw_sectors(q) >> (PAGE_SHIFT - 9); | 193 | unsigned int max_pages = queue_max_hw_sectors(q) >> (PAGE_SHIFT - 9); |
192 | int i; | 194 | int i; |
193 | 195 | ||
196 | if (max_pages > BIO_MAX_PAGES) | ||
197 | max_pages = BIO_MAX_PAGES; | ||
194 | bio = bio_alloc(GFP_NOFS, max_pages); | 198 | bio = bio_alloc(GFP_NOFS, max_pages); |
195 | BUG_ON(!bio); /* FIXME: handle this */ | 199 | BUG_ON(!bio); |
196 | 200 | ||
197 | for (i = 0; i < nr_pages; i++) { | 201 | for (i = 0; i < nr_pages; i++) { |
198 | if (i >= max_pages) { | 202 | if (i >= max_pages) { |