[snip] >I don't think the later was_short can handle the hole case. For the hole case, >we should try reading next strip object instead of return. how about >below patch. > Hi Yan, i uesed this demo to test hole case. dd if=/dev/urandom bs=4096 count=2 of=file_with_holes dd if=/dev/urandom bs=4096 seek=7 count=2 of=file_with_holes dd if=file_with_holes of=/dev/null bs=16k count=1 iflag=direct Using the dynamic_debug in striped_read, the message are: >[ 8743.663499] ceph: file.c:350 : striped_read 0~16384 (read 0) got 16384 >[ 8743.663502] ceph: file.c:390 : striped_read returns 16384 >From the messages, we can see it can't hit the short-read. For the ceph-file-hole, how does the ceph handle? Or am i missing something? Thanks! Jianpeng Ma >Regards >Yan, Zheng >--- >diff --git a/fs/ceph/file.c b/fs/ceph/file.c >index 271a346..6ca2921 100644 >--- a/fs/ceph/file.c >+++ b/fs/ceph/file.c >@@ -350,16 +350,17 @@ more: > ret, hit_stripe ? " HITSTRIPE" : "", was_short ? " SHORT" : ""); > > if (ret > 0) { >- int didpages = (page_align + ret) >> PAGE_CACHE_SHIFT; >+ int didpages = (page_align + this_len) >> 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 (was_short) { >+ dout(" zero gap %llu to %llu\n", >+ pos + ret, pos + this_len); >+ ceph_zero_page_vector_range(page_align + ret, >+ this_len - ret, page_pos); > } >- pos += ret; >+ pos += this_len; > read = pos - off; >- left -= ret; >+ left -= this_len; > page_pos += didpages; > pages_left -= didpages; > ?韬{.n?????%??檩??w?{.n????u朕?Ф?塄}?财??j:+v??????2??璀??摺?囤??z夸z罐?+?????w棹f