|
@@ -350,44 +350,37 @@ more:
|
|
|
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 (ret >= 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 %llu\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;
|
|
|
}
|