* [PATCH] dm table: verify each target is H/W sector aligned
@ 2009-04-15 18:46 Mike Snitzer
2009-04-15 18:50 ` Mike Snitzer
0 siblings, 1 reply; 2+ messages in thread
From: Mike Snitzer @ 2009-04-15 18:46 UTC (permalink / raw)
To: dm-devel
Establish device limits prior to verifying a target is H/W sector
aligned.
Signed-off-by: Mike Snitzer <snitzer@redhat.com>
dm_set_device_limits() is now are now established prior to the call check_device_area()
---
drivers/md/dm-table.c | 50 ++++++++++++++++++++++++++++++++++++------------
1 files changed, 37 insertions(+), 13 deletions(-)
diff --git a/drivers/md/dm-table.c b/drivers/md/dm-table.c
index 429b50b..e8f8d11 100644
--- a/drivers/md/dm-table.c
+++ b/drivers/md/dm-table.c
@@ -384,15 +384,39 @@ static void close_dev(struct dm_dev_internal *d, struct mapped_device *md)
/*
* If possible, this checks an area of a destination device is valid.
*/
-static int check_device_area(struct dm_dev_internal *dd, sector_t start,
- sector_t len)
+static int check_device_area(struct dm_target *ti, struct block_device *bdev,
+ sector_t start, sector_t len)
{
- sector_t dev_size = dd->dm_dev.bdev->bd_inode->i_size >> SECTOR_SHIFT;
+ sector_t dev_size = bdev->bd_inode->i_size >> SECTOR_SHIFT;
+ unsigned short hardsect_size_sectors =
+ ti->limits.hardsect_size >> SECTOR_SHIFT;
+ char b[BDEVNAME_SIZE];
if (!dev_size)
return 1;
- return ((start < dev_size) && (len <= (dev_size - start)));
+ if (!((start < dev_size) && (len <= (dev_size - start)))) {
+ DMWARN("%s: %s too small for target",
+ dm_device_name(ti->table->md), bdevname(bdev, b));
+ return 0;
+ }
+
+ if (hardsect_size_sectors <= 1)
+ return 1;
+
+ if (start & (hardsect_size_sectors - 1)) {
+ DMWARN("%s: start=%lu in mapping of %s not H/W sector aligned",
+ dm_device_name(ti->table->md), start, bdevname(bdev, b));
+ return 0;
+ }
+
+ if (len & (hardsect_size_sectors - 1)) {
+ DMWARN("%s: len=%lu in mapping of %s not H/W sector aligned",
+ dm_device_name(ti->table->md), len, bdevname(bdev, b));
+ return 0;
+ }
+
+ return 1;
}
/*
@@ -478,14 +502,7 @@ static int __table_get_device(struct dm_table *t, struct dm_target *ti,
}
atomic_inc(&dd->count);
- if (!check_device_area(dd, start, len)) {
- DMWARN("device %s too small for target", path);
- dm_put_device(ti, &dd->dm_dev);
- return -EINVAL;
- }
-
*result = &dd->dm_dev;
-
return 0;
}
@@ -553,8 +570,15 @@ int dm_get_device(struct dm_target *ti, const char *path, sector_t start,
int r = __table_get_device(ti->table, ti, path,
start, len, mode, result);
- if (!r)
- dm_set_device_limits(ti, (*result)->bdev);
+ if (r)
+ return r;
+
+ dm_set_device_limits(ti, (*result)->bdev);
+
+ if (!check_device_area(ti, (*result)->bdev, start, len)) {
+ dm_put_device(ti, *result);
+ return -EINVAL;
+ }
return r;
}
--
1.6.0.6
^ permalink raw reply related [flat|nested] 2+ messages in thread
* Re: dm table: verify each target is H/W sector aligned
2009-04-15 18:46 [PATCH] dm table: verify each target is H/W sector aligned Mike Snitzer
@ 2009-04-15 18:50 ` Mike Snitzer
0 siblings, 0 replies; 2+ messages in thread
From: Mike Snitzer @ 2009-04-15 18:50 UTC (permalink / raw)
To: dm-devel
On Wed, Apr 15 2009 at 2:46pm -0400,
Mike Snitzer <snitzer@redhat.com> wrote:
> Establish device limits prior to verifying a target is H/W sector
> aligned.
>
> Signed-off-by: Mike Snitzer <snitzer@redhat.com>
> dm_set_device_limits() is now are now established prior to the call check_device_area()
The line after the 'Signed-off-by:' was mistakenly included. Please
drop that line from this patch's commit message.
Mike
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2009-04-15 18:50 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2009-04-15 18:46 [PATCH] dm table: verify each target is H/W sector aligned Mike Snitzer
2009-04-15 18:50 ` Mike Snitzer
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.