Re: question about striped_read

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Thu, 25 Jul 2013, majianpeng wrote:
> Hi all,
> 	I met a problem and ask somebody could help me.
> In func striped_read()
> > 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);
> >                }   
> >                pos += ret;
> >               read = pos - off;
> 
> At first , pos = off and off don't modify.
> Why does it judge 'read < pos -off ' ?
> Because the read = pos -off, so the read must equal pos -off.

This block triggers if we hit a stripe.  off is always the original 
starting offset.  pos is the current position that we just tried to read 
from.  We might:

 - try to read a big extent from off == pos
 - readpages truncates this to the end of the object
 - we get a short read (not a complete object)
 - read is some partial amount
 - pos is off + read + a gap
 - we try to read from the next object and there is data
   => there was a hole and we need to zero the gap

If, on the other hand, there isn't data in the next object, then we don't 
want to zero the hole.. and least not until we decide where EOF is.  
That's why this block is where it is, and never triggers on the first 
iteration.

Does that make sense?
sage
--
To unsubscribe from this list: send the line "unsubscribe ceph-devel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html




[Index of Archives]     [CEPH Users]     [Ceph Large]     [Information on CEPH]     [Linux BTRFS]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]
  Powered by Linux