Commit a21f9edb authored by Benjamin Marzinski's avatar Benjamin Marzinski Committed by Mikulas Patocka

dm: factor out helper function from dm_get_device

Factor out a helper function, dm_devt_from_path(), from dm_get_device()
for use in dm targets.
Signed-off-by: default avatarBenjamin Marzinski <bmarzins@redhat.com>
Signed-off-by: default avatarMikulas Patocka <mpatocka@redhat.com>
parent 3708c726
...@@ -331,23 +331,15 @@ static int upgrade_mode(struct dm_dev_internal *dd, blk_mode_t new_mode, ...@@ -331,23 +331,15 @@ static int upgrade_mode(struct dm_dev_internal *dd, blk_mode_t new_mode,
} }
/* /*
* Add a device to the list, or just increment the usage count if
* it's already present.
*
* Note: the __ref annotation is because this function can call the __init * Note: the __ref annotation is because this function can call the __init
* marked early_lookup_bdev when called during early boot code from dm-init.c. * marked early_lookup_bdev when called during early boot code from dm-init.c.
*/ */
int __ref dm_get_device(struct dm_target *ti, const char *path, blk_mode_t mode, int __ref dm_devt_from_path(const char *path, dev_t *dev_p)
struct dm_dev **result)
{ {
int r; int r;
dev_t dev; dev_t dev;
unsigned int major, minor; unsigned int major, minor;
char dummy; char dummy;
struct dm_dev_internal *dd;
struct dm_table *t = ti->table;
BUG_ON(!t);
if (sscanf(path, "%u:%u%c", &major, &minor, &dummy) == 2) { if (sscanf(path, "%u:%u%c", &major, &minor, &dummy) == 2) {
/* Extract the major/minor numbers */ /* Extract the major/minor numbers */
...@@ -363,6 +355,29 @@ int __ref dm_get_device(struct dm_target *ti, const char *path, blk_mode_t mode, ...@@ -363,6 +355,29 @@ int __ref dm_get_device(struct dm_target *ti, const char *path, blk_mode_t mode,
if (r) if (r)
return r; return r;
} }
*dev_p = dev;
return 0;
}
EXPORT_SYMBOL(dm_devt_from_path);
/*
* Add a device to the list, or just increment the usage count if
* it's already present.
*/
int dm_get_device(struct dm_target *ti, const char *path, blk_mode_t mode,
struct dm_dev **result)
{
int r;
dev_t dev;
struct dm_dev_internal *dd;
struct dm_table *t = ti->table;
BUG_ON(!t);
r = dm_devt_from_path(path, &dev);
if (r)
return r;
if (dev == disk_devt(t->md->disk)) if (dev == disk_devt(t->md->disk))
return -EINVAL; return -EINVAL;
......
...@@ -179,6 +179,11 @@ int dm_get_device(struct dm_target *ti, const char *path, blk_mode_t mode, ...@@ -179,6 +179,11 @@ int dm_get_device(struct dm_target *ti, const char *path, blk_mode_t mode,
struct dm_dev **result); struct dm_dev **result);
void dm_put_device(struct dm_target *ti, struct dm_dev *d); void dm_put_device(struct dm_target *ti, struct dm_dev *d);
/*
* Helper function for getting devices
*/
int dm_devt_from_path(const char *path, dev_t *dev_p);
/* /*
* Information about a target type * Information about a target type
*/ */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment