UPSTREAM: usb: dwc3: gadget: use allocated/queued reqs for LST bit
[firefly-linux-kernel-4.4.55.git] / drivers / mtd / mtd_blkdevs.c
index 5073cbc796d86c3a04c4f22d83b01c2f01b1d114..f4701182b558ecbf6ee714ea0fc24fb5d4730f3e 100644 (file)
@@ -30,7 +30,6 @@
 #include <linux/blkpg.h>
 #include <linux/spinlock.h>
 #include <linux/hdreg.h>
-#include <linux/init.h>
 #include <linux/mutex.h>
 #include <asm/uaccess.h>
 
@@ -83,12 +82,14 @@ static int do_blktrans_request(struct mtd_blktrans_ops *tr,
 
        block = blk_rq_pos(req) << 9 >> tr->blkshift;
        nsect = blk_rq_cur_bytes(req) >> tr->blkshift;
-
-       buf = req->buffer;
+       buf = bio_data(req->bio);
 
        if (req->cmd_type != REQ_TYPE_FS)
                return -EIO;
 
+       if (req->cmd_flags & REQ_FLUSH)
+               return tr->flush(dev);
+
        if (blk_rq_pos(req) + blk_rq_cur_sectors(req) >
            get_capacity(req->rq_disk))
                return -EIO;
@@ -96,14 +97,13 @@ static int do_blktrans_request(struct mtd_blktrans_ops *tr,
        if (req->cmd_flags & REQ_DISCARD)
                return tr->discard(dev, block, nsect);
 
-       switch(rq_data_dir(req)) {
-       case READ:
+       if (rq_data_dir(req) == 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:
+       } else {
                if (!tr->writesect)
                        return -EIO;
 
@@ -112,9 +112,6 @@ static int do_blktrans_request(struct mtd_blktrans_ops *tr,
                        if (tr->writesect(dev, block, buf))
                                return -EIO;
                return 0;
-       default:
-               printk(KERN_NOTICE "Unknown request %u\n", rq_data_dir(req));
-               return -EIO;
        }
 }
 
@@ -170,9 +167,6 @@ static void mtd_blktrans_work(struct work_struct *work)
                background_done = 0;
        }
 
-       if (req)
-               __blk_end_request_all(req, -EIO);
-
        spin_unlock_irq(rq->queue_lock);
 }
 
@@ -198,6 +192,7 @@ static int blktrans_open(struct block_device *bdev, fmode_t mode)
        if (!dev)
                return -ERESTARTSYS; /* FIXME: busy loop! -arnd*/
 
+       mutex_lock(&mtd_table_mutex);
        mutex_lock(&dev->lock);
 
        if (dev->open)
@@ -223,6 +218,7 @@ static int blktrans_open(struct block_device *bdev, fmode_t mode)
 unlock:
        dev->open++;
        mutex_unlock(&dev->lock);
+       mutex_unlock(&mtd_table_mutex);
        blktrans_dev_put(dev);
        return ret;
 
@@ -233,6 +229,7 @@ error_put:
        module_put(dev->tr->owner);
        kref_put(&dev->ref, blktrans_dev_release);
        mutex_unlock(&dev->lock);
+       mutex_unlock(&mtd_table_mutex);
        blktrans_dev_put(dev);
        return ret;
 }
@@ -244,6 +241,7 @@ static void blktrans_release(struct gendisk *disk, fmode_t mode)
        if (!dev)
                return;
 
+       mutex_lock(&mtd_table_mutex);
        mutex_lock(&dev->lock);
 
        if (--dev->open)
@@ -259,6 +257,7 @@ static void blktrans_release(struct gendisk *disk, fmode_t mode)
        }
 unlock:
        mutex_unlock(&dev->lock);
+       mutex_unlock(&mtd_table_mutex);
        blktrans_dev_put(dev);
 }
 
@@ -275,7 +274,7 @@ static int blktrans_getgeo(struct block_device *bdev, struct hd_geometry *geo)
        if (!dev->mtd)
                goto unlock;
 
-       ret = dev->tr->getgeo ? dev->tr->getgeo(dev, geo) : 0;
+       ret = dev->tr->getgeo ? dev->tr->getgeo(dev, geo) : -ENOTTY;
 unlock:
        mutex_unlock(&dev->lock);
        blktrans_dev_put(dev);
@@ -400,7 +399,7 @@ int add_mtd_blktrans_dev(struct mtd_blktrans_dev *new)
                snprintf(gd->disk_name, sizeof(gd->disk_name),
                         "%s%d", tr->name, new->devnum);
 
-       set_capacity(gd, (new->size * tr->blksize) >> 9);
+       set_capacity(gd, ((u64)new->size * tr->blksize) >> 9);
 
        /* Create the request queue */
        spin_lock_init(&new->queue_lock);
@@ -409,14 +408,18 @@ int add_mtd_blktrans_dev(struct mtd_blktrans_dev *new)
        if (!new->rq)
                goto error3;
 
+       if (tr->flush)
+               blk_queue_flush(new->rq, REQ_FLUSH);
+
        new->rq->queuedata = new;
        blk_queue_logical_block_size(new->rq, tr->blksize);
 
        queue_flag_set_unlocked(QUEUE_FLAG_NONROT, new->rq);
+       queue_flag_clear_unlocked(QUEUE_FLAG_ADD_RANDOM, new->rq);
 
        if (tr->discard) {
                queue_flag_set_unlocked(QUEUE_FLAG_DISCARD, new->rq);
-               new->rq->limits.max_discard_sectors = UINT_MAX;
+               blk_queue_max_discard_sectors(new->rq, UINT_MAX);
        }
 
        gd->queue = new->rq;