pktcdvd: use set_capacity_and_notify
[linux-2.6-microblaze.git] / drivers / block / pktcdvd.c
index 1034e44..b8bb8ec 100644 (file)
@@ -1082,65 +1082,6 @@ static void pkt_put_packet_data(struct pktcdvd_device *pd, struct packet_data *p
        }
 }
 
-/*
- * recover a failed write, query for relocation if possible
- *
- * returns 1 if recovery is possible, or 0 if not
- *
- */
-static int pkt_start_recovery(struct packet_data *pkt)
-{
-       /*
-        * FIXME. We need help from the file system to implement
-        * recovery handling.
-        */
-       return 0;
-#if 0
-       struct request *rq = pkt->rq;
-       struct pktcdvd_device *pd = rq->rq_disk->private_data;
-       struct block_device *pkt_bdev;
-       struct super_block *sb = NULL;
-       unsigned long old_block, new_block;
-       sector_t new_sector;
-
-       pkt_bdev = bdget(kdev_t_to_nr(pd->pkt_dev));
-       if (pkt_bdev) {
-               sb = get_super(pkt_bdev);
-               bdput(pkt_bdev);
-       }
-
-       if (!sb)
-               return 0;
-
-       if (!sb->s_op->relocate_blocks)
-               goto out;
-
-       old_block = pkt->sector / (CD_FRAMESIZE >> 9);
-       if (sb->s_op->relocate_blocks(sb, old_block, &new_block))
-               goto out;
-
-       new_sector = new_block * (CD_FRAMESIZE >> 9);
-       pkt->sector = new_sector;
-
-       bio_reset(pkt->bio);
-       bio_set_dev(pkt->bio, pd->bdev);
-       bio_set_op_attrs(pkt->bio, REQ_OP_WRITE, 0);
-       pkt->bio->bi_iter.bi_sector = new_sector;
-       pkt->bio->bi_iter.bi_size = pkt->frames * CD_FRAMESIZE;
-       pkt->bio->bi_vcnt = pkt->frames;
-
-       pkt->bio->bi_end_io = pkt_end_io_packet_write;
-       pkt->bio->bi_private = pkt;
-
-       drop_super(sb);
-       return 1;
-
-out:
-       drop_super(sb);
-       return 0;
-#endif
-}
-
 static inline void pkt_set_state(struct packet_data *pkt, enum packet_data_state state)
 {
 #if PACKET_DEBUG > 1
@@ -1357,12 +1298,8 @@ static void pkt_run_state_machine(struct pktcdvd_device *pd, struct packet_data
                        break;
 
                case PACKET_RECOVERY_STATE:
-                       if (pkt_start_recovery(pkt)) {
-                               pkt_start_write(pd, pkt);
-                       } else {
-                               pkt_dbg(2, pd, "No recovery possible\n");
-                               pkt_set_state(pkt, PACKET_FINISHED_STATE);
-                       }
+                       pkt_dbg(2, pd, "No recovery possible\n");
+                       pkt_set_state(pkt, PACKET_FINISHED_STATE);
                        break;
 
                case PACKET_FINISHED_STATE:
@@ -2173,16 +2110,18 @@ static int pkt_open_dev(struct pktcdvd_device *pd, fmode_t write)
        int ret;
        long lba;
        struct request_queue *q;
+       struct block_device *bdev;
 
        /*
         * We need to re-open the cdrom device without O_NONBLOCK to be able
         * to read/write from/to it. It is already opened in O_NONBLOCK mode
-        * so bdget() can't fail.
+        * so open should not fail.
         */
-       bdget(pd->bdev->bd_dev);
-       ret = blkdev_get(pd->bdev, FMODE_READ | FMODE_EXCL, pd);
-       if (ret)
+       bdev = blkdev_get_by_dev(pd->bdev->bd_dev, FMODE_READ | FMODE_EXCL, pd);
+       if (IS_ERR(bdev)) {
+               ret = PTR_ERR(bdev);
                goto out;
+       }
 
        ret = pkt_get_last_written(pd, &lba);
        if (ret) {
@@ -2191,8 +2130,7 @@ static int pkt_open_dev(struct pktcdvd_device *pd, fmode_t write)
        }
 
        set_capacity(pd->disk, lba << 2);
-       set_capacity(pd->bdev->bd_disk, lba << 2);
-       bd_set_size(pd->bdev, (loff_t)lba << 11);
+       set_capacity_and_notify(pd->bdev->bd_disk, lba << 2);
 
        q = bdev_get_queue(pd->bdev);
        if (write) {
@@ -2226,7 +2164,7 @@ static int pkt_open_dev(struct pktcdvd_device *pd, fmode_t write)
        return 0;
 
 out_putdev:
-       blkdev_put(pd->bdev, FMODE_READ | FMODE_EXCL);
+       blkdev_put(bdev, FMODE_READ | FMODE_EXCL);
 out:
        return ret;
 }
@@ -2563,7 +2501,6 @@ static int pkt_seq_show(struct seq_file *m, void *p)
 static int pkt_new_dev(struct pktcdvd_device *pd, dev_t dev)
 {
        int i;
-       int ret = 0;
        char b[BDEVNAME_SIZE];
        struct block_device *bdev;
 
@@ -2586,12 +2523,9 @@ static int pkt_new_dev(struct pktcdvd_device *pd, dev_t dev)
                }
        }
 
-       bdev = bdget(dev);
-       if (!bdev)
-               return -ENOMEM;
-       ret = blkdev_get(bdev, FMODE_READ | FMODE_NDELAY, NULL);
-       if (ret)
-               return ret;
+       bdev = blkdev_get_by_dev(dev, FMODE_READ | FMODE_NDELAY, NULL);
+       if (IS_ERR(bdev))
+               return PTR_ERR(bdev);
        if (!blk_queue_scsi_passthrough(bdev_get_queue(bdev))) {
                blkdev_put(bdev, FMODE_READ | FMODE_NDELAY);
                return -EINVAL;
@@ -2609,7 +2543,6 @@ static int pkt_new_dev(struct pktcdvd_device *pd, dev_t dev)
        pd->cdrw.thread = kthread_run(kcdrwd, pd, "%s", pd->name);
        if (IS_ERR(pd->cdrw.thread)) {
                pkt_err(pd, "can't start kernel thread\n");
-               ret = -ENOMEM;
                goto out_mem;
        }
 
@@ -2621,7 +2554,7 @@ out_mem:
        blkdev_put(bdev, FMODE_READ | FMODE_NDELAY);
        /* This is safe: open() is still holding a reference. */
        module_put(THIS_MODULE);
-       return ret;
+       return -ENOMEM;
 }
 
 static int pkt_ioctl(struct block_device *bdev, fmode_t mode, unsigned int cmd, unsigned long arg)
@@ -2650,9 +2583,11 @@ static int pkt_ioctl(struct block_device *bdev, fmode_t mode, unsigned int cmd,
        case CDROM_LAST_WRITTEN:
        case CDROM_SEND_PACKET:
        case SCSI_IOCTL_SEND_COMMAND:
-               ret = __blkdev_driver_ioctl(pd->bdev, mode, cmd, arg);
+               if (!bdev->bd_disk->fops->ioctl)
+                       ret = -ENOTTY;
+               else
+                       ret = bdev->bd_disk->fops->ioctl(bdev, mode, cmd, arg);
                break;
-
        default:
                pkt_dbg(2, pd, "Unknown ioctl (%x)\n", cmd);
                ret = -ENOTTY;