Breaking up a bvec in a bio for reading more than 512
From: Pranay Srivastava <hidden>
Date: 2014-01-07 15:57:59
On Jan 6, 2014 11:34 PM, "neha naik" [off-list ref] wrote:
Hi All,
I figured out the method by some trial and error and looking at the
linux source code.
We can do something like this :
Say we want to read pages of bvec in 512 chunks. Create bio with
a single page and read 512 chunk of data from wherever you want to (it
can be different disks).
dst = kmap_atomic(bvec->bv_page, KM_USER0); ---> bvec is of
original bio
src = kmap_atomic(page, KM_USER0); ---> page we read by
creating new bio
memcpy(dst+offset, src, 512);
kunmap_atomic(src, KM_USER0);
kunmap_atomic(dst, KM_USER0);How this solves the problem of data being on different disks?
My difficulty was not being able to access the high memory page in kernel. I was earlier trying to increment the offset of the bvec and pass the page to the layer below assuming that it would read in the data at correct offset but of course it was resulting in panic. The above solves that. Of course, if there is some other method which involves not creating any bio i would love to know. Regards, Neha On Sat, Jan 4, 2014 at 9:32 AM, Pranay Srivastava [off-list ref]
wrote:
quoted
On 04-Jan-2014 5:18 AM, "neha naik" [off-list ref] wrote:quoted
Hi All, I am getting a request with bvec->bv_len > 512. Now, the information to be read is scattered across the entire disk in 512 chunks. So that, information on disk can be : sector 8, sector 100, sector 9. Now if i get a request to read with the bvec->bv_len > 512 i need to pull in the information from multiple places on disk since the data is not sequentially located. I tried to look at the linux source code because i think raid must be doing it all the time. (eg : on disk 1 we may be storing sector 6 and on disk 2 we may be storing sector 7 and so on).You are right. Perhaps you need to clone the bio and set them properly.
I
quoted
guess you ought to check dm driver's make_request function. It does
clone
quoted
bio. I don't know if you can split that request while handling it. Perhaps reinserting that request could work.quoted
However, i have not really got any useful information from it. Also scouring through articles on google has not helped much. I am hoping somebody points me in the right direction. Thanks in advance, Neha _______________________________________________ Kernelnewbies mailing list Kernelnewbies at kernelnewbies.org http://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies---P.K.S_______________________________________________ Kernelnewbies mailing list Kernelnewbies at kernelnewbies.org http://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies
-------------- next part -------------- An HTML attachment was scrubbed... URL: http://lists.kernelnewbies.org/pipermail/kernelnewbies/attachments/20140107/47849960/attachment.html