ceph: fix reading inline data when i_size > PAGE_SIZE
when inode has inline data but its size > PAGE_SIZE (it was truncated to larger size), previous direct read code return -EIO. This patch adds code to return zeros for data whose offset > PAGE_SIZE. Signed-off-by: Yan, Zheng <zyan@redhat.com>
This commit is contained in:
@@ -196,17 +196,22 @@ static int readpage_nounlock(struct file *filp, struct page *page)
|
||||
u64 len = PAGE_CACHE_SIZE;
|
||||
|
||||
if (off >= i_size_read(inode)) {
|
||||
zero_user_segment(page, err, PAGE_CACHE_SIZE);
|
||||
zero_user_segment(page, 0, PAGE_CACHE_SIZE);
|
||||
SetPageUptodate(page);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Uptodate inline data should have been added into page cache
|
||||
* while getting Fcr caps.
|
||||
*/
|
||||
if (ci->i_inline_version != CEPH_INLINE_NONE)
|
||||
return -EINVAL;
|
||||
if (ci->i_inline_version != CEPH_INLINE_NONE) {
|
||||
/*
|
||||
* Uptodate inline data should have been added
|
||||
* into page cache while getting Fcr caps.
|
||||
*/
|
||||
if (off == 0)
|
||||
return -EINVAL;
|
||||
zero_user_segment(page, 0, PAGE_CACHE_SIZE);
|
||||
SetPageUptodate(page);
|
||||
return 0;
|
||||
}
|
||||
|
||||
err = ceph_readpage_from_fscache(inode, page);
|
||||
if (err == 0)
|
||||
|
Reference in New Issue
Block a user