summaryrefslogtreecommitdiff
path: root/drivers
diff options
context:
space:
mode:
authorNeil Brown <neilb@cse.unsw.edu.au>2002-06-18 04:17:12 -0700
committerLinus Torvalds <torvalds@home.transmeta.com>2002-06-18 04:17:12 -0700
commitdfdf2be0e56dec7aba04c4b05f83547b340b4ee2 (patch)
tree69ed856cbba2dcb3cf02e7f2d5d73201d0828601 /drivers
parent2cf76fbf072dfc7c6d86183ae285610fce027d29 (diff)
[PATCH] md 15 of 22 - Get rid of kdev_to_mddev
Only two users of kdev_to_mddev remain, md_release and md_queue_proc. For md_release we can store the mddev in the md_inode at md_open time so we can find it easily. For md_queue_proc, we use mddev_find because we only have the device number to work with. Hopefully the ->queue function will get more arguements one day...
Diffstat (limited to 'drivers')
-rw-r--r--drivers/md/md.c28
1 files changed, 13 insertions, 15 deletions
diff --git a/drivers/md/md.c b/drivers/md/md.c
index 6e8b7524ad77..234e47ab1fb3 100644
--- a/drivers/md/md.c
+++ b/drivers/md/md.c
@@ -132,13 +132,6 @@ static LIST_HEAD(all_mddevs);
static mddev_t *mddev_map[MAX_MD_DEVS];
-static inline mddev_t * kdev_to_mddev (kdev_t dev)
-{
- if (major(dev) != MD_MAJOR)
- BUG();
- return mddev_map[minor(dev)];
-}
-
static int md_fail_request (request_queue_t *q, struct bio *bio)
{
bio_io_error(bio);
@@ -2703,15 +2696,17 @@ static int md_open(struct inode *inode, struct file *file)
*/
mddev_t *mddev = mddev_find(minor(inode->i_rdev));
- if (mddev)
+ if (mddev) {
+ inode->i_bdev->bd_inode->u.generic_ip = mddev;
return 0; /* and we "own" a reference */
- else
+ } else
return -ENOMEM;
}
static int md_release(struct inode *inode, struct file * file)
{
- mddev_t *mddev = kdev_to_mddev(inode->i_rdev);
+ mddev_t *mddev = inode->i_bdev->bd_inode->u.generic_ip;
+
if (!mddev)
BUG();
mddev_put(mddev);
@@ -3439,11 +3434,14 @@ static void md_geninit(void)
request_queue_t * md_queue_proc(kdev_t dev)
{
- mddev_t *mddev = kdev_to_mddev(dev);
- if (mddev == NULL)
- return BLK_DEFAULT_QUEUE(MAJOR_NR);
- else
- return &mddev->queue;
+ mddev_t *mddev = mddev_find(minor(dev));
+ request_queue_t *q = BLK_DEFAULT_QUEUE(MAJOR_NR);
+ if (!mddev || atomic_read(&mddev->active)<2)
+ BUG();
+ if (mddev->pers)
+ q = &mddev->queue;
+ mddev_put(mddev); /* the caller must hold a reference... */
+ return q;
}
int __init md_init(void)