2002-10-29 17:12:57

by Joe Thornber

[permalink] [raw]
Subject: [PATCH] dm update 2/3

. Remove the kdev_t member from struct mapped device, instead
we can make use of the major/first_minor fields of the gendisk.

. New fns dm_set_ro()/dm_get_ro(), simpler than the new set_device_ro,
or set_disk_ro.

--- diff/drivers/md/dm-ioctl.c 2002-10-29 16:18:16.000000000 +0000
+++ source/drivers/md/dm-ioctl.c 2002-10-29 16:22:14.000000000 +0000
@@ -176,10 +176,9 @@
*/
static int register_with_devfs(struct hash_cell *hc)
{
- kdev_t dev = dm_kdev(hc->md);
hc->devfs_entry =
devfs_register(_dev_dir, hc->name, DEVFS_FL_CURRENT_OWNER,
- major(dev), minor(dev),
+ dm_major(hc->md), dm_minor(hc->md),
S_IFBLK | S_IRUSR | S_IWUSR | S_IRGRP,
&dm_blk_dops, NULL);

@@ -453,17 +452,17 @@
if (dm_suspended(md))
param->flags |= DM_SUSPEND_FLAG;

- param->dev = kdev_t_to_nr(dm_kdev(md));
+ param->dev = MKDEV(dm_major(md), dm_minor(md));
bdev = bdget(param->dev);
if (!bdev)
return -ENXIO;

- if (bdev_read_only(bdev))
- param->flags |= DM_READONLY_FLAG;
-
param->open_count = bdev->bd_openers;
bdput(bdev);

+ if (dm_get_ro(md))
+ param->flags |= DM_READONLY_FLAG;
+
table = dm_get_table(md);
param->target_count = dm_table_get_num_targets(table);
dm_table_put(table);
@@ -585,7 +584,7 @@
}
dm_table_put(t); /* md will have grabbed its own reference */

- set_device_ro(dm_kdev(md), (param->flags & DM_READONLY_FLAG));
+ dm_set_ro(md, (param->flags & DM_READONLY_FLAG));
r = dm_hash_insert(param->name, *param->uuid ? param->uuid : NULL, md);
dm_put(md);

@@ -871,7 +870,7 @@
return r;
}

- set_device_ro(dm_kdev(md), (param->flags & DM_READONLY_FLAG));
+ dm_set_ro(md, (param->flags & DM_READONLY_FLAG));
dm_put(md);

r = info(param, user);
--- diff/drivers/md/dm.h 2002-10-29 16:18:16.000000000 +0000
+++ source/drivers/md/dm.h 2002-10-29 16:22:14.000000000 +0000
@@ -77,7 +77,10 @@
/*
* Info functions.
*/
-kdev_t dm_kdev(struct mapped_device *md);
+int dm_major(struct mapped_device *md);
+int dm_minor(struct mapped_device *md);
+int dm_get_ro(struct mapped_device *md);
+void dm_set_ro(struct mapped_device *md, int ro);
int dm_suspended(struct mapped_device *md);

/*-----------------------------------------------------------------
--- diff/drivers/md/dm.c 2002-10-29 16:18:16.000000000 +0000
+++ source/drivers/md/dm.c 2002-10-29 16:22:36.000000000 +0000
@@ -41,8 +41,6 @@

struct mapped_device {
struct rw_semaphore lock;
-
- kdev_t kdev;
atomic_t holders;

unsigned long flags;
@@ -542,7 +540,6 @@

memset(md, 0, sizeof(*md));
init_rwsem(&md->lock);
- md->kdev = mk_kdev(_major, minor);
atomic_set(&md->holders, 1);

md->queue.queuedata = md;
@@ -749,15 +746,42 @@
return 0;
}

-kdev_t dm_kdev(struct mapped_device *md)
+int dm_major(struct mapped_device *md)
{
- kdev_t dev;
+ int r;
+ down_read(&md->lock);
+ r = md->disk->major;
+ up_read(&md->lock);

+ return r;
+}
+
+int dm_minor(struct mapped_device *md)
+{
+ int r;
down_read(&md->lock);
- dev = md->kdev;
+ r = md->disk->first_minor;
up_read(&md->lock);

- return dev;
+ return r;
+}
+
+int dm_get_ro(struct mapped_device *md)
+{
+ int ro;
+
+ down_read(&md->lock);
+ ro = md->disk->policy;
+ up_read(&md->lock);
+
+ return ro;
+}
+
+void dm_set_ro(struct mapped_device *md, int ro)
+{
+ down_write(&md->lock);
+ set_disk_ro(md->disk, ro);
+ up_write(&md->lock);
}

struct dm_table *dm_get_table(struct mapped_device *md)


2002-10-29 17:33:33

by Alexander Viro

[permalink] [raw]
Subject: Re: [PATCH] dm update 2/3



On Tue, 29 Oct 2002, Joe Thornber wrote:

> - major(dev), minor(dev),
> + dm_major(hc->md), dm_minor(hc->md),

> - param->dev = kdev_t_to_nr(dm_kdev(md));
> + param->dev = MKDEV(dm_major(md), dm_minor(md));

> +int dm_major(struct mapped_device *md);
> +int dm_minor(struct mapped_device *md);

*blam*

Please, don't expose major/minor split. devfs inisisting on separately
passed major/minor is bad enough, no need to compound that crap.

->major and ->first_minor are about to be glued into a single field
anyway and devfs_register() will either switch to dev_t or get wrapper
taking dev_t.

Please, just do dm_disk(dm) and for now use its ->major/->first_minor.

Another thing on cards is the list of block_device over given gendisk -
that kills a bunch of bogus bdget() uses, so the second instance will
disappear completely.

2002-10-30 10:08:33

by Joe Thornber

[permalink] [raw]
Subject: Re: [PATCH] dm update 2/3

On Tue, Oct 29, 2002 at 12:39:51PM -0500, Alexander Viro wrote:
> Please, just do dm_disk(dm) and for now use its ->major/->first_minor.


--- diff/drivers/md/dm-ioctl.c 2002-10-30 09:24:36.000000000 +0000
+++ source/drivers/md/dm-ioctl.c 2002-10-30 09:34:51.000000000 +0000
@@ -176,10 +176,11 @@
*/
static int register_with_devfs(struct hash_cell *hc)
{
- kdev_t dev = dm_kdev(hc->md);
+ struct gendisk *disk = dm_disk(hc->md);
+
hc->devfs_entry =
devfs_register(_dev_dir, hc->name, DEVFS_FL_CURRENT_OWNER,
- major(dev), minor(dev),
+ disk->major, disk->first_minor,
S_IFBLK | S_IRUSR | S_IWUSR | S_IRGRP,
&dm_blk_dops, NULL);

@@ -447,23 +448,24 @@
static int __info(struct mapped_device *md, struct dm_ioctl *param)
{
struct dm_table *table;
+ struct gendisk *disk = dm_disk(md);
struct block_device *bdev;

param->flags = DM_EXISTS_FLAG;
if (dm_suspended(md))
param->flags |= DM_SUSPEND_FLAG;

- param->dev = kdev_t_to_nr(dm_kdev(md));
+ param->dev = MKDEV(disk->major, disk->first_minor);
bdev = bdget(param->dev);
if (!bdev)
return -ENXIO;

- if (bdev_read_only(bdev))
- param->flags |= DM_READONLY_FLAG;
-
param->open_count = bdev->bd_openers;
bdput(bdev);

+ if (disk->policy)
+ param->flags |= DM_READONLY_FLAG;
+
table = dm_get_table(md);
param->target_count = dm_table_get_num_targets(table);
dm_table_put(table);
@@ -558,6 +560,7 @@
{
int r;
struct dm_table *t;
+ struct gendisk *disk;
struct mapped_device *md;
int minor;

@@ -585,7 +588,8 @@
}
dm_table_put(t); /* md will have grabbed its own reference */

- set_device_ro(dm_kdev(md), (param->flags & DM_READONLY_FLAG));
+ disk = dm_disk(md);
+ set_disk_ro(disk, (param->flags & DM_READONLY_FLAG));
r = dm_hash_insert(param->name, *param->uuid ? param->uuid : NULL, md);
dm_put(md);

@@ -845,6 +849,7 @@
static int reload(struct dm_ioctl *param, struct dm_ioctl *user)
{
int r;
+ struct gendisk *disk;
struct mapped_device *md;
struct dm_table *t;

@@ -871,7 +876,8 @@
return r;
}

- set_device_ro(dm_kdev(md), (param->flags & DM_READONLY_FLAG));
+ disk = dm_disk(md);
+ set_disk_ro(disk, (param->flags & DM_READONLY_FLAG));
dm_put(md);

r = info(param, user);
--- diff/drivers/md/dm.h 2002-10-30 09:24:36.000000000 +0000
+++ source/drivers/md/dm.h 2002-10-30 09:31:07.000000000 +0000
@@ -77,7 +77,7 @@
/*
* Info functions.
*/
-kdev_t dm_kdev(struct mapped_device *md);
+struct gendisk *dm_disk(struct mapped_device *md);
int dm_suspended(struct mapped_device *md);

/*-----------------------------------------------------------------
--- diff/drivers/md/dm.c 2002-10-30 09:24:36.000000000 +0000
+++ source/drivers/md/dm.c 2002-10-30 09:38:39.000000000 +0000
@@ -41,8 +41,6 @@

struct mapped_device {
struct rw_semaphore lock;
-
- kdev_t kdev;
atomic_t holders;

unsigned long flags;
@@ -542,7 +540,6 @@

memset(md, 0, sizeof(*md));
init_rwsem(&md->lock);
- md->kdev = mk_kdev(_major, minor);
atomic_set(&md->holders, 1);

md->queue.queuedata = md;
@@ -749,15 +746,13 @@
return 0;
}

-kdev_t dm_kdev(struct mapped_device *md)
+/*
+ * The gendisk is only valid as long as you have a reference
+ * count on 'md'.
+ */
+struct gendisk *dm_disk(struct mapped_device *md)
{
- kdev_t dev;
-
- down_read(&md->lock);
- dev = md->kdev;
- up_read(&md->lock);
-
- return dev;
+ return md->disk;
}

struct dm_table *dm_get_table(struct mapped_device *md)