[dm-devel] Newbie device mapper questions
Vivek Goyal
vgoyal at redhat.com
Mon Jun 15 22:20:18 UTC 2015
On Mon, Jun 15, 2015 at 12:52:57PM -0700, Doug Dumitru wrote:
[..]
> >
> > In map() I actually do the switching operation. I've looked at how
> > dm-linear implements this and copied a lot of information. Currently I
> > do static switching (fixed block size, ingoring the meta device). Here
> > are my questions:
> >
> > - How can I read within the kernel from the block device lc->meta->bdev?
> > If I call "read_dev_sector" from "map" this results in a deadlock, I'm
> > guessing this is now how it's supposed to work. The bcache module must
> > perform something similar (because it also reads and writes metadata,
> > only much more complex), but I'll be damned but couldn't find out where
> > the actual reading/writing is performed in the code. What are things
> > that I should look at?
> >
>
> You have to allocate a bio, populate it, allocate pages for buffer,
> populate the bvec, and call make_request (or generic make request). You
> will get the completion from the bio on the bottom half of the interrupt
> handler, so how much work you can do there is debatable. You cannot start
> an new IO from there, which you need to. You will probably want to start a
> helper thread and have the completion routine schedule itself onto your
> thread. Once you are back on your thread, you can do just about anything.
>
> Because you need to do IO, you will not be able to do a simple bio "bounce
> redirect". You will need to do the IO youself (ie, call another make
> request), but you can use the callers bvec for this, so there is no data
> copy required. Once the request completes, you can then fin the caller.
>
Above sounds right.
[..]
> >
> > - Is i_size_read(lc->src1dev->bdev->bd_inode) the correct way of
> > determining the size of the underlying block device? If not, which
> > function is?
> >
I believe that's correct. Look at block/blk-core.c
handle_bad_sector(struct bio *bio)
{
}
>
> ... I am happy to leave out answers that I don't know ...
>
>
> >
> > - Can I safely assume the logical sector size is fixed to be 512 bytes
> > in all cases?
> >
>
> Probably not, but maybe. You are in control of the hardware.
You mean block size or sector size? I think sector sizes can vary and
targets can allow user space to specify one. Typically metadata is per
block can lead to smaller metadata foot print.
>
>
> >
> > - In the dm-linear example, bio_sectors(bio) is checked. This gives, if
> > I understand it correctly, the size in sectors of the BIO (usually this
> > is 8). What I don't understand is in which cases this can become zero
> > (dm-linear has a if that checks for bio_sectors(bio) != 0).
> >
>
> .. just a sanity check. If you get a call of zero size, it means
> something else is broken.
>
>
> >
> > - Can I determine the size the bio in map() will have already in ctr()
> > somehow? Can I assume it will never change if it was once determined?
> > The reason is that for my example I need to make sure the chunk size is
> > a integer multiple of the bio size and I would only like to check this
> > once (in ctr) and not every time (in map).
> >
I think size of bio can change and it depends on the submitter. Targets
can specify maximum size of bio and upper layers will adhere to it. So
I don't think you can fix the size of bio in constructor. I guess you will
have to check incoming bio in map().
Thanks
Vivek
More information about the dm-devel
mailing list