string: factorize skip_spaces and export it to be generally available
[safe/jmp/linux-2.6] / drivers / mtd / mtd_blkdevs.c
index 502622f..64e2b37 100644 (file)
@@ -32,14 +32,6 @@ struct mtd_blkcore_priv {
        spinlock_t queue_lock;
 };
 
-static int blktrans_discard_request(struct request_queue *q,
-                                   struct request *req)
-{
-       req->cmd_type = REQ_TYPE_LINUX_BLOCK;
-       req->cmd[0] = REQ_LB_OP_DISCARD;
-       return 0;
-}
-
 static int do_blktrans_request(struct mtd_blktrans_ops *tr,
                               struct mtd_blktrans_dev *dev,
                               struct request *req)
@@ -52,10 +44,6 @@ static int do_blktrans_request(struct mtd_blktrans_ops *tr,
 
        buf = req->buffer;
 
-       if (req->cmd_type == REQ_TYPE_LINUX_BLOCK &&
-           req->cmd[0] == REQ_LB_OP_DISCARD)
-               return tr->discard(dev, block, nsect);
-
        if (!blk_fs_request(req))
                return -EIO;
 
@@ -63,17 +51,22 @@ static int do_blktrans_request(struct mtd_blktrans_ops *tr,
            get_capacity(req->rq_disk))
                return -EIO;
 
+       if (blk_discard_rq(req))
+               return tr->discard(dev, block, nsect);
+
        switch(rq_data_dir(req)) {
        case READ:
                for (; nsect > 0; nsect--, block++, buf += tr->blksize)
                        if (tr->readsect(dev, block, buf))
                                return -EIO;
+               rq_flush_dcache_pages(req);
                return 0;
 
        case WRITE:
                if (!tr->writesect)
                        return -EIO;
 
+               rq_flush_dcache_pages(req);
                for (; nsect > 0; nsect--, block++, buf += tr->blksize)
                        if (tr->writesect(dev, block, buf))
                                return -EIO;
@@ -144,7 +137,7 @@ static int blktrans_open(struct block_device *bdev, fmode_t mode)
        struct mtd_blktrans_ops *tr = dev->tr;
        int ret = -ENODEV;
 
-       if (!try_module_get(dev->mtd->owner))
+       if (!get_mtd_device(NULL, dev->mtd->index))
                goto out;
 
        if (!try_module_get(tr->owner))
@@ -158,7 +151,7 @@ static int blktrans_open(struct block_device *bdev, fmode_t mode)
        ret = 0;
        if (tr->open && (ret = tr->open(dev))) {
                dev->mtd->usecount--;
-               module_put(dev->mtd->owner);
+               put_mtd_device(dev->mtd);
        out_tr:
                module_put(tr->owner);
        }
@@ -177,7 +170,7 @@ static int blktrans_release(struct gendisk *disk, fmode_t mode)
 
        if (!ret) {
                dev->mtd->usecount--;
-               module_put(dev->mtd->owner);
+               put_mtd_device(dev->mtd);
                module_put(tr->owner);
        }
 
@@ -210,7 +203,7 @@ static int blktrans_ioctl(struct block_device *bdev, fmode_t mode,
        }
 }
 
-static struct block_device_operations mtd_blktrans_ops = {
+static const struct block_device_operations mtd_blktrans_ops = {
        .owner          = THIS_MODULE,
        .open           = blktrans_open,
        .release        = blktrans_release,
@@ -291,7 +284,7 @@ int add_mtd_blktrans_dev(struct mtd_blktrans_dev *new)
        gd->private_data = new;
        new->blkcore_priv = gd;
        gd->queue = tr->blkcore_priv->rq;
-       gd->driverfs_dev = new->mtd->dev.parent;
+       gd->driverfs_dev = &new->mtd->dev;
 
        if (new->readonly)
                set_disk_ro(gd, 1);
@@ -378,10 +371,10 @@ int register_mtd_blktrans(struct mtd_blktrans_ops *tr)
        }
 
        tr->blkcore_priv->rq->queuedata = tr;
-       blk_queue_hardsect_size(tr->blkcore_priv->rq, tr->blksize);
+       blk_queue_logical_block_size(tr->blkcore_priv->rq, tr->blksize);
        if (tr->discard)
-               blk_queue_set_discard(tr->blkcore_priv->rq,
-                                     blktrans_discard_request);
+               queue_flag_set_unlocked(QUEUE_FLAG_DISCARD,
+                                       tr->blkcore_priv->rq);
 
        tr->blkshift = ffs(tr->blksize) - 1;