diff options
Diffstat (limited to 'drivers/block/ub.c')
| -rw-r--r-- | drivers/block/ub.c | 35 |
1 files changed, 28 insertions, 7 deletions
diff --git a/drivers/block/ub.c b/drivers/block/ub.c index 0536b5b29adc..c48e14878582 100644 --- a/drivers/block/ub.c +++ b/drivers/block/ub.c | |||
| @@ -28,6 +28,7 @@ | |||
| 28 | #include <linux/timer.h> | 28 | #include <linux/timer.h> |
| 29 | #include <linux/scatterlist.h> | 29 | #include <linux/scatterlist.h> |
| 30 | #include <linux/slab.h> | 30 | #include <linux/slab.h> |
| 31 | #include <linux/smp_lock.h> | ||
| 31 | #include <scsi/scsi.h> | 32 | #include <scsi/scsi.h> |
| 32 | 33 | ||
| 33 | #define DRV_NAME "ub" | 34 | #define DRV_NAME "ub" |
| @@ -648,7 +649,7 @@ static int ub_request_fn_1(struct ub_lun *lun, struct request *rq) | |||
| 648 | return 0; | 649 | return 0; |
| 649 | } | 650 | } |
| 650 | 651 | ||
| 651 | if (lun->changed && !blk_pc_request(rq)) { | 652 | if (lun->changed && rq->cmd_type != REQ_TYPE_BLOCK_PC) { |
| 652 | blk_start_request(rq); | 653 | blk_start_request(rq); |
| 653 | ub_end_rq(rq, SAM_STAT_CHECK_CONDITION); | 654 | ub_end_rq(rq, SAM_STAT_CHECK_CONDITION); |
| 654 | return 0; | 655 | return 0; |
| @@ -684,7 +685,7 @@ static int ub_request_fn_1(struct ub_lun *lun, struct request *rq) | |||
| 684 | } | 685 | } |
| 685 | urq->nsg = n_elem; | 686 | urq->nsg = n_elem; |
| 686 | 687 | ||
| 687 | if (blk_pc_request(rq)) { | 688 | if (rq->cmd_type == REQ_TYPE_BLOCK_PC) { |
| 688 | ub_cmd_build_packet(sc, lun, cmd, urq); | 689 | ub_cmd_build_packet(sc, lun, cmd, urq); |
| 689 | } else { | 690 | } else { |
| 690 | ub_cmd_build_block(sc, lun, cmd, urq); | 691 | ub_cmd_build_block(sc, lun, cmd, urq); |
| @@ -781,7 +782,7 @@ static void ub_rw_cmd_done(struct ub_dev *sc, struct ub_scsi_cmd *cmd) | |||
| 781 | rq = urq->rq; | 782 | rq = urq->rq; |
| 782 | 783 | ||
| 783 | if (cmd->error == 0) { | 784 | if (cmd->error == 0) { |
| 784 | if (blk_pc_request(rq)) { | 785 | if (rq->cmd_type == REQ_TYPE_BLOCK_PC) { |
| 785 | if (cmd->act_len >= rq->resid_len) | 786 | if (cmd->act_len >= rq->resid_len) |
| 786 | rq->resid_len = 0; | 787 | rq->resid_len = 0; |
| 787 | else | 788 | else |
| @@ -795,7 +796,7 @@ static void ub_rw_cmd_done(struct ub_dev *sc, struct ub_scsi_cmd *cmd) | |||
| 795 | } | 796 | } |
| 796 | } | 797 | } |
| 797 | } else { | 798 | } else { |
| 798 | if (blk_pc_request(rq)) { | 799 | if (rq->cmd_type == REQ_TYPE_BLOCK_PC) { |
| 799 | /* UB_SENSE_SIZE is smaller than SCSI_SENSE_BUFFERSIZE */ | 800 | /* UB_SENSE_SIZE is smaller than SCSI_SENSE_BUFFERSIZE */ |
| 800 | memcpy(rq->sense, sc->top_sense, UB_SENSE_SIZE); | 801 | memcpy(rq->sense, sc->top_sense, UB_SENSE_SIZE); |
| 801 | rq->sense_len = UB_SENSE_SIZE; | 802 | rq->sense_len = UB_SENSE_SIZE; |
| @@ -1710,6 +1711,18 @@ err_open: | |||
| 1710 | return rc; | 1711 | return rc; |
| 1711 | } | 1712 | } |
| 1712 | 1713 | ||
| 1714 | static int ub_bd_unlocked_open(struct block_device *bdev, fmode_t mode) | ||
| 1715 | { | ||
| 1716 | int ret; | ||
| 1717 | |||
| 1718 | lock_kernel(); | ||
| 1719 | ret = ub_bd_open(bdev, mode); | ||
| 1720 | unlock_kernel(); | ||
| 1721 | |||
| 1722 | return ret; | ||
| 1723 | } | ||
| 1724 | |||
| 1725 | |||
| 1713 | /* | 1726 | /* |
| 1714 | */ | 1727 | */ |
| 1715 | static int ub_bd_release(struct gendisk *disk, fmode_t mode) | 1728 | static int ub_bd_release(struct gendisk *disk, fmode_t mode) |
| @@ -1717,7 +1730,10 @@ static int ub_bd_release(struct gendisk *disk, fmode_t mode) | |||
| 1717 | struct ub_lun *lun = disk->private_data; | 1730 | struct ub_lun *lun = disk->private_data; |
| 1718 | struct ub_dev *sc = lun->udev; | 1731 | struct ub_dev *sc = lun->udev; |
| 1719 | 1732 | ||
| 1733 | lock_kernel(); | ||
| 1720 | ub_put(sc); | 1734 | ub_put(sc); |
| 1735 | unlock_kernel(); | ||
| 1736 | |||
| 1721 | return 0; | 1737 | return 0; |
| 1722 | } | 1738 | } |
| 1723 | 1739 | ||
| @@ -1729,8 +1745,13 @@ static int ub_bd_ioctl(struct block_device *bdev, fmode_t mode, | |||
| 1729 | { | 1745 | { |
| 1730 | struct gendisk *disk = bdev->bd_disk; | 1746 | struct gendisk *disk = bdev->bd_disk; |
| 1731 | void __user *usermem = (void __user *) arg; | 1747 | void __user *usermem = (void __user *) arg; |
| 1748 | int ret; | ||
| 1749 | |||
| 1750 | lock_kernel(); | ||
| 1751 | ret = scsi_cmd_ioctl(disk->queue, disk, mode, cmd, usermem); | ||
| 1752 | unlock_kernel(); | ||
| 1732 | 1753 | ||
| 1733 | return scsi_cmd_ioctl(disk->queue, disk, mode, cmd, usermem); | 1754 | return ret; |
| 1734 | } | 1755 | } |
| 1735 | 1756 | ||
| 1736 | /* | 1757 | /* |
| @@ -1792,9 +1813,9 @@ static int ub_bd_media_changed(struct gendisk *disk) | |||
| 1792 | 1813 | ||
| 1793 | static const struct block_device_operations ub_bd_fops = { | 1814 | static const struct block_device_operations ub_bd_fops = { |
| 1794 | .owner = THIS_MODULE, | 1815 | .owner = THIS_MODULE, |
| 1795 | .open = ub_bd_open, | 1816 | .open = ub_bd_unlocked_open, |
| 1796 | .release = ub_bd_release, | 1817 | .release = ub_bd_release, |
| 1797 | .locked_ioctl = ub_bd_ioctl, | 1818 | .ioctl = ub_bd_ioctl, |
| 1798 | .media_changed = ub_bd_media_changed, | 1819 | .media_changed = ub_bd_media_changed, |
| 1799 | .revalidate_disk = ub_bd_revalidate, | 1820 | .revalidate_disk = ub_bd_revalidate, |
| 1800 | }; | 1821 | }; |
