Updated from Linux LTS 3.10.25 to 3.10.26
This commit is contained in:
@@ -313,9 +313,9 @@ static int striped_read(struct inode *inode,
|
||||
{
|
||||
struct ceph_fs_client *fsc = ceph_inode_to_client(inode);
|
||||
struct ceph_inode_info *ci = ceph_inode(inode);
|
||||
u64 pos, this_len;
|
||||
u64 pos, this_len, left;
|
||||
int io_align, page_align;
|
||||
int left, pages_left;
|
||||
int pages_left;
|
||||
int read;
|
||||
struct page **page_pos;
|
||||
int ret;
|
||||
@@ -346,47 +346,40 @@ more:
|
||||
ret = 0;
|
||||
hit_stripe = this_len < left;
|
||||
was_short = ret >= 0 && ret < this_len;
|
||||
dout("striped_read %llu~%u (read %u) got %d%s%s\n", pos, left, read,
|
||||
dout("striped_read %llu~%llu (read %u) got %d%s%s\n", pos, left, read,
|
||||
ret, hit_stripe ? " HITSTRIPE" : "", was_short ? " SHORT" : "");
|
||||
|
||||
if (ret > 0) {
|
||||
int didpages = (page_align + ret) >> PAGE_CACHE_SHIFT;
|
||||
|
||||
if (read < pos - off) {
|
||||
dout(" zero gap %llu to %llu\n", off + read, pos);
|
||||
ceph_zero_page_vector_range(page_align + read,
|
||||
pos - off - read, pages);
|
||||
if (ret >= 0) {
|
||||
int didpages;
|
||||
if (was_short && (pos + ret < inode->i_size)) {
|
||||
u64 tmp = min(this_len - ret,
|
||||
inode->i_size - pos - ret);
|
||||
dout(" zero gap %llu to %llu\n",
|
||||
pos + ret, pos + ret + tmp);
|
||||
ceph_zero_page_vector_range(page_align + read + ret,
|
||||
tmp, pages);
|
||||
ret += tmp;
|
||||
}
|
||||
|
||||
didpages = (page_align + ret) >> PAGE_CACHE_SHIFT;
|
||||
pos += ret;
|
||||
read = pos - off;
|
||||
left -= ret;
|
||||
page_pos += didpages;
|
||||
pages_left -= didpages;
|
||||
|
||||
/* hit stripe? */
|
||||
if (left && hit_stripe)
|
||||
/* hit stripe and need continue*/
|
||||
if (left && hit_stripe && pos < inode->i_size)
|
||||
goto more;
|
||||
}
|
||||
|
||||
if (was_short) {
|
||||
if (read > 0) {
|
||||
ret = read;
|
||||
/* did we bounce off eof? */
|
||||
if (pos + left > inode->i_size)
|
||||
*checkeof = 1;
|
||||
|
||||
/* zero trailing bytes (inside i_size) */
|
||||
if (left > 0 && pos < inode->i_size) {
|
||||
if (pos + left > inode->i_size)
|
||||
left = inode->i_size - pos;
|
||||
|
||||
dout("zero tail %d\n", left);
|
||||
ceph_zero_page_vector_range(page_align + read, left,
|
||||
pages);
|
||||
read += left;
|
||||
}
|
||||
}
|
||||
|
||||
if (ret >= 0)
|
||||
ret = read;
|
||||
dout("striped_read returns %d\n", ret);
|
||||
return ret;
|
||||
}
|
||||
@@ -618,6 +611,8 @@ out:
|
||||
if (check_caps)
|
||||
ceph_check_caps(ceph_inode(inode), CHECK_CAPS_AUTHONLY,
|
||||
NULL);
|
||||
} else if (ret != -EOLDSNAPC && written > 0) {
|
||||
ret = written;
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user