diff options
| author | Ingo Molnar <mingo@elte.hu> | 2008-08-14 06:19:59 -0400 |
|---|---|---|
| committer | Ingo Molnar <mingo@elte.hu> | 2008-08-14 06:19:59 -0400 |
| commit | 8d7ccaa545490cdffdfaff0842436a8dd85cf47b (patch) | |
| tree | 8129b5907161bc6ae26deb3645ce1e280c5e1f51 /fs/romfs/inode.c | |
| parent | b2139aa0eec330c711c5a279db361e5ef1178e78 (diff) | |
| parent | 30a2f3c60a84092c8084dfe788b710f8d0768cd4 (diff) | |
Merge commit 'v2.6.27-rc3' into x86/prototypes
Conflicts:
include/asm-x86/dma-mapping.h
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Diffstat (limited to 'fs/romfs/inode.c')
| -rw-r--r-- | fs/romfs/inode.c | 39 |
1 files changed, 24 insertions, 15 deletions
diff --git a/fs/romfs/inode.c b/fs/romfs/inode.c index 3f13d491c7c7..60d2f822e87b 100644 --- a/fs/romfs/inode.c +++ b/fs/romfs/inode.c | |||
| @@ -418,7 +418,8 @@ static int | |||
| 418 | romfs_readpage(struct file *file, struct page * page) | 418 | romfs_readpage(struct file *file, struct page * page) |
| 419 | { | 419 | { |
| 420 | struct inode *inode = page->mapping->host; | 420 | struct inode *inode = page->mapping->host; |
| 421 | loff_t offset, avail, readlen; | 421 | loff_t offset, size; |
| 422 | unsigned long filled; | ||
| 422 | void *buf; | 423 | void *buf; |
| 423 | int result = -EIO; | 424 | int result = -EIO; |
| 424 | 425 | ||
| @@ -430,21 +431,29 @@ romfs_readpage(struct file *file, struct page * page) | |||
| 430 | 431 | ||
| 431 | /* 32 bit warning -- but not for us :) */ | 432 | /* 32 bit warning -- but not for us :) */ |
| 432 | offset = page_offset(page); | 433 | offset = page_offset(page); |
| 433 | if (offset < i_size_read(inode)) { | 434 | size = i_size_read(inode); |
| 434 | avail = inode->i_size-offset; | 435 | filled = 0; |
| 435 | readlen = min_t(unsigned long, avail, PAGE_SIZE); | 436 | result = 0; |
| 436 | if (romfs_copyfrom(inode, buf, ROMFS_I(inode)->i_dataoffset+offset, readlen) == readlen) { | 437 | if (offset < size) { |
| 437 | if (readlen < PAGE_SIZE) { | 438 | unsigned long readlen; |
| 438 | memset(buf + readlen,0,PAGE_SIZE-readlen); | 439 | |
| 439 | } | 440 | size -= offset; |
| 440 | SetPageUptodate(page); | 441 | readlen = size > PAGE_SIZE ? PAGE_SIZE : size; |
| 441 | result = 0; | 442 | |
| 443 | filled = romfs_copyfrom(inode, buf, ROMFS_I(inode)->i_dataoffset+offset, readlen); | ||
| 444 | |||
| 445 | if (filled != readlen) { | ||
| 446 | SetPageError(page); | ||
| 447 | filled = 0; | ||
| 448 | result = -EIO; | ||
| 442 | } | 449 | } |
| 443 | } | 450 | } |
| 444 | if (result) { | 451 | |
| 445 | memset(buf, 0, PAGE_SIZE); | 452 | if (filled < PAGE_SIZE) |
| 446 | SetPageError(page); | 453 | memset(buf + filled, 0, PAGE_SIZE-filled); |
| 447 | } | 454 | |
| 455 | if (!result) | ||
| 456 | SetPageUptodate(page); | ||
| 448 | flush_dcache_page(page); | 457 | flush_dcache_page(page); |
| 449 | 458 | ||
| 450 | unlock_page(page); | 459 | unlock_page(page); |
| @@ -577,7 +586,7 @@ static void romfs_destroy_inode(struct inode *inode) | |||
| 577 | kmem_cache_free(romfs_inode_cachep, ROMFS_I(inode)); | 586 | kmem_cache_free(romfs_inode_cachep, ROMFS_I(inode)); |
| 578 | } | 587 | } |
| 579 | 588 | ||
| 580 | static void init_once(struct kmem_cache *cachep, void *foo) | 589 | static void init_once(void *foo) |
| 581 | { | 590 | { |
| 582 | struct romfs_inode_info *ei = foo; | 591 | struct romfs_inode_info *ei = foo; |
| 583 | 592 | ||
