[linux-lvm] New device-mapper patchset for 2.5.51
joe at fib011235813.fsnet.co.uk
Fri Dec 13 05:50:06 UTC 2002
If anyone was experiencing problems with dm could they please try this
patchset and give me feedback.
Were being declared in device-mapper.h, these are all specific to
the ioctl interface, so they've been moved to dm-ioctl.h. Nobody
in userland should ever include <linux/device-mapper.h> so remove
ifdef __KERNEL guards.
An error value was not being checked correctly in open_dev().
Return -ENOTBLK if lookup_device() finds the inode, but it
is not a block device. [Cristoph Hellwig]
No need to validate the parameters if we are doing a
check_device_area was comparing the bytes with sectors.
minor change for dm-strip.c. Tests for correct chunksize before it allocates
the stripe context. [Heinz Mauelshagen]
There's a bug in the dm-stripe.c constructor failing top check if enough
destinations are handed in. [Heinz Mauelshagen]
Give each device its own io mempool to avoid a potential
deadlock with stacked devices. [HM + EJT]
queue_io() was checking the DMF_SUSPENDED flag rather than the new
DMF_BLOCK_IO flag. This meant suspend could deadlock under load.
dm_suspend(): Stop holding the read lock around the while loop that
waits for pending io to complete.
Add a blk_run_queues() call to encourage pending io to flush
when we're doing a dm_suspend().
dec_pending(): only bother spin locking if io->error is going to be
updated. [Kevin Corry]
md->pending was being incremented for each clone rather than just
once. [Kevin Corry]
Some fields in the duplicated bio weren't being set up properly in
__split_page(). [Kevin Corry]
Remove some paranoia in highmem.c, need to check this with Jens Axboe.
Remove verbose debug message 'Splitting page'.
o If there's an error you still need to call bio_endio with bio->bi_size
as the 'done' param.
o Simplify clone_endio.
The block layer does not honour bio->bi_size when issuing io, instead
it performs io to the complete bvecs. This means we have to change
the bio splitting code slightly.
Given a bio we repeatedly apply one of the following three operations
until there is no more io left in the bio:
1) The remaining io does not cross an io/target boundary, so just
create a clone and issue all of the io.
2) There are some bvecs at the start of the bio that are not split by
a target boundary. Create a clone for these bvecs only.
3) The first bvec needs splitting, use bio_alloc() to create *two*
bios, one for the first half of the bvec, the other for the second
half. A bvec can never contain more than one boundary.
For large bios it was possible to look up the wrong target. Bug
introduced by the recent splitting changes.
The linear target was getting the start sector wrong when doing a
dm_get_device(). [Kevin Corry]
More information about the linux-lvm