>On Tue, Jul 30, 2013 at 7:01 PM, majianpeng <[email protected]> wrote:
>>>On Mon, Jul 29, 2013 at 11:00 AM, majianpeng <[email protected]> wrote:
>>>>
>>>> [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?
>>>
>>>the default strip size is 4M, all data are written to the first object
>>>in your test case.
>>>could you try something like below.
>>>
>>
>>>dd if=/dev/urandom bs=1M count=2 of=file_with_holes
>>>dd if=/dev/urandom bs=1M count=2 seek=4 of=file_with_holes conv=notrunc
>>>dd if=file_with_holes bs=8M >/dev/null
>>>
>> diff --git a/fs/ceph/file.c b/fs/ceph/file.c
>> index 2ddf061..22a98e5 100644
>> --- a/fs/ceph/file.c
>> +++ b/fs/ceph/file.c
>> @@ -349,17 +349,17 @@ more:
>>         dout("striped_read %llu~%u (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 (ret >= 0) {
>> +               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, pages);
>>                 }
>> -               pos += ret;
>> +               pos += this_len;
>>                 read = pos - off;
>> -               left -= ret;
>> +               left -= this_len;
>>                 page_pos += didpages;
>>                 pages_left -= didpages;
>>
>> This patch can do those case. It only add ret== 0 in judgement 'ret > 0".
>
>maybe we should add a  i_size check. stop reading next strip object
>when 'pos > i_size'
>
I think those code can do.
>               /* hit stripe? */
>        if (left && hit_stripe)
 >               goto more;
>> But i think i will add a parameter about hit_hole. It will make the code 
>> easy to understand.
>>
>
> i think 'was_short' is equal to 'hit_hole'
FYI, for the EOF, they are the same meaing.

Thanks!
Jianpeng Ma
>
>Regards
>Yan, Zheng
>
>>
>>
>>>Regards
>>>Yan, Zheng
>>>
>>>
>>>>
>>>>
>>>> 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;
>>>> >
>> Thanks!
>> Jianpeng Ma
>>>On Mon, Jul 29, 2013 at 11:00 AM, majianpeng <[email protected]> wrote:
>>>>
>>>> [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?
>>>
>>>the default strip size is 4M, all data are written to the first object
>>>in your test case.
>>>could you try something like below.
>>>
>>>dd if=/dev/urandom bs=1M count=2 of=file_with_holes
>>>dd if=/dev/urandom bs=1M count=2 seek=4 of=file_with_holes conv=notrunc
>>>dd if=file_with_holes bs=8M >/dev/null
>>>
>>>Regards
>>>Yan, Zheng
>>>
>>>
>>>>
>>>>
>>>> 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;
>>>> >
Thanks!
Jianpeng Ma
>On Tue, Jul 30, 2013 at 7:01 PM, majianpeng <[email protected]> wrote:
>>>On Mon, Jul 29, 2013 at 11:00 AM, majianpeng <[email protected]> wrote:
>>>>
>>>> [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?
>>>
>>>the default strip size is 4M, all data are written to the first object
>>>in your test case.
>>>could you try something like below.
>>>
>>
>>>dd if=/dev/urandom bs=1M count=2 of=file_with_holes
>>>dd if=/dev/urandom bs=1M count=2 seek=4 of=file_with_holes conv=notrunc
>>>dd if=file_with_holes bs=8M >/dev/null
>>>
>> diff --git a/fs/ceph/file.c b/fs/ceph/file.c
>> index 2ddf061..22a98e5 100644
>> --- a/fs/ceph/file.c
>> +++ b/fs/ceph/file.c
>> @@ -349,17 +349,17 @@ more:
>>         dout("striped_read %llu~%u (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 (ret >= 0) {
>> +               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, pages);
>>                 }
>> -               pos += ret;
>> +               pos += this_len;
>>                 read = pos - off;
>> -               left -= ret;
>> +               left -= this_len;
>>                 page_pos += didpages;
>>                 pages_left -= didpages;
>>
>> This patch can do those case. It only add ret== 0 in judgement 'ret > 0".
>
>maybe we should add a  i_size check. stop reading next strip object
>when 'pos > i_size'
>
>> But i think i will add a parameter about hit_hole. It will make the code 
>> easy to understand.
>>
>
> i think 'was_short' is equal to 'hit_hole'
>
>Regards
>Yan, Zheng
>
>>
>>
>>>Regards
>>>Yan, Zheng
>>>
>>>
>>>>
>>>>
>>>> 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;
>>>> >
>> Thanks!
>> Jianpeng Ma
>>>On Mon, Jul 29, 2013 at 11:00 AM, majianpeng <[email protected]> wrote:
>>>>
>>>> [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?
>>>
>>>the default strip size is 4M, all data are written to the first object
>>>in your test case.
>>>could you try something like below.
>>>
>>>dd if=/dev/urandom bs=1M count=2 of=file_with_holes
>>>dd if=/dev/urandom bs=1M count=2 seek=4 of=file_with_holes conv=notrunc
>>>dd if=file_with_holes bs=8M >/dev/null
>>>
>>>Regards
>>>Yan, Zheng
>>>
>>>
>>>>
>>>>
>>>> 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�Р骒r��y����b�X�肚�v�^�)藓{.n�+���z�]z鳐�{ay������,j��f"�h���z��wア�
>>>> >⒎�j:+v���w�j�m������赙zZ+�����茛j"��!�i

Reply via email to