diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2008-07-14 16:15:14 -0400 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2008-07-14 16:15:14 -0400 |
| commit | dddec01eb8e2b56267b37a6f9f0997a64b4e0b2a (patch) | |
| tree | b6d8bfbce9abd105384b9d116499afbe306b9c22 /drivers/block | |
| parent | 7daf705f362e349983e92037a198b8821db198af (diff) | |
| parent | 32502b8413a77b54b9e19809404109590c32dfb7 (diff) | |
Merge branch 'for-linus' of git://git.kernel.dk/linux-2.6-block
* 'for-linus' of git://git.kernel.dk/linux-2.6-block: (37 commits)
splice: fix generic_file_splice_read() race with page invalidation
ramfs: enable splice write
drivers/block/pktcdvd.c: avoid useless memset
cdrom: revert commit 22a9189 (cdrom: use kmalloced buffers instead of buffers on stack)
scsi: sr avoids useless buffer allocation
block: blk_rq_map_kern uses the bounce buffers for stack buffers
block: add blk_queue_update_dma_pad
DAC960: push down BKL
pktcdvd: push BKL down into driver
paride: push ioctl down into driver
block: use get_unaligned_* helpers
block: extend queue_flag bitops
block: request_module(): use format string
Add bvec_merge_data to handle stacked devices and ->merge_bvec()
block: integrity flags can't use bit ops on unsigned short
cmdfilter: extend default read filter
sg: fix odd style (extra parenthesis) introduced by cmd filter patch
block: add bounce support to blk_rq_map_user_iov
cfq-iosched: get rid of enable_idle being unused warning
allow userspace to modify scsi command filter on per device basis
...
Diffstat (limited to 'drivers/block')
| -rw-r--r-- | drivers/block/DAC960.c | 157 | ||||
| -rw-r--r-- | drivers/block/aoe/aoecmd.c | 2 | ||||
| -rw-r--r-- | drivers/block/paride/pt.c | 20 | ||||
| -rw-r--r-- | drivers/block/pktcdvd.c | 46 | ||||
| -rw-r--r-- | drivers/block/xen-blkfront.c | 48 |
5 files changed, 187 insertions, 86 deletions
diff --git a/drivers/block/DAC960.c b/drivers/block/DAC960.c index cd03473f3547..a002a381df92 100644 --- a/drivers/block/DAC960.c +++ b/drivers/block/DAC960.c | |||
| @@ -6628,15 +6628,18 @@ static void DAC960_DestroyProcEntries(DAC960_Controller_T *Controller) | |||
| 6628 | * DAC960_gam_ioctl is the ioctl function for performing RAID operations. | 6628 | * DAC960_gam_ioctl is the ioctl function for performing RAID operations. |
| 6629 | */ | 6629 | */ |
| 6630 | 6630 | ||
| 6631 | static int DAC960_gam_ioctl(struct inode *inode, struct file *file, | 6631 | static long DAC960_gam_ioctl(struct file *file, unsigned int Request, |
| 6632 | unsigned int Request, unsigned long Argument) | 6632 | unsigned long Argument) |
| 6633 | { | 6633 | { |
| 6634 | int ErrorCode = 0; | 6634 | long ErrorCode = 0; |
| 6635 | if (!capable(CAP_SYS_ADMIN)) return -EACCES; | 6635 | if (!capable(CAP_SYS_ADMIN)) return -EACCES; |
| 6636 | |||
| 6637 | lock_kernel(); | ||
| 6636 | switch (Request) | 6638 | switch (Request) |
| 6637 | { | 6639 | { |
| 6638 | case DAC960_IOCTL_GET_CONTROLLER_COUNT: | 6640 | case DAC960_IOCTL_GET_CONTROLLER_COUNT: |
| 6639 | return DAC960_ControllerCount; | 6641 | ErrorCode = DAC960_ControllerCount; |
| 6642 | break; | ||
| 6640 | case DAC960_IOCTL_GET_CONTROLLER_INFO: | 6643 | case DAC960_IOCTL_GET_CONTROLLER_INFO: |
| 6641 | { | 6644 | { |
| 6642 | DAC960_ControllerInfo_T __user *UserSpaceControllerInfo = | 6645 | DAC960_ControllerInfo_T __user *UserSpaceControllerInfo = |
| @@ -6644,15 +6647,20 @@ static int DAC960_gam_ioctl(struct inode *inode, struct file *file, | |||
| 6644 | DAC960_ControllerInfo_T ControllerInfo; | 6647 | DAC960_ControllerInfo_T ControllerInfo; |
| 6645 | DAC960_Controller_T *Controller; | 6648 | DAC960_Controller_T *Controller; |
| 6646 | int ControllerNumber; | 6649 | int ControllerNumber; |
| 6647 | if (UserSpaceControllerInfo == NULL) return -EINVAL; | 6650 | if (UserSpaceControllerInfo == NULL) |
| 6648 | ErrorCode = get_user(ControllerNumber, | 6651 | ErrorCode = -EINVAL; |
| 6652 | else ErrorCode = get_user(ControllerNumber, | ||
| 6649 | &UserSpaceControllerInfo->ControllerNumber); | 6653 | &UserSpaceControllerInfo->ControllerNumber); |
| 6650 | if (ErrorCode != 0) return ErrorCode; | 6654 | if (ErrorCode != 0) |
| 6655 | break;; | ||
| 6656 | ErrorCode = -ENXIO; | ||
| 6651 | if (ControllerNumber < 0 || | 6657 | if (ControllerNumber < 0 || |
| 6652 | ControllerNumber > DAC960_ControllerCount - 1) | 6658 | ControllerNumber > DAC960_ControllerCount - 1) { |
| 6653 | return -ENXIO; | 6659 | break; |
| 6660 | } | ||
| 6654 | Controller = DAC960_Controllers[ControllerNumber]; | 6661 | Controller = DAC960_Controllers[ControllerNumber]; |
| 6655 | if (Controller == NULL) return -ENXIO; | 6662 | if (Controller == NULL) |
| 6663 | break;; | ||
| 6656 | memset(&ControllerInfo, 0, sizeof(DAC960_ControllerInfo_T)); | 6664 | memset(&ControllerInfo, 0, sizeof(DAC960_ControllerInfo_T)); |
| 6657 | ControllerInfo.ControllerNumber = ControllerNumber; | 6665 | ControllerInfo.ControllerNumber = ControllerNumber; |
| 6658 | ControllerInfo.FirmwareType = Controller->FirmwareType; | 6666 | ControllerInfo.FirmwareType = Controller->FirmwareType; |
| @@ -6665,8 +6673,9 @@ static int DAC960_gam_ioctl(struct inode *inode, struct file *file, | |||
| 6665 | ControllerInfo.PCI_Address = Controller->PCI_Address; | 6673 | ControllerInfo.PCI_Address = Controller->PCI_Address; |
| 6666 | strcpy(ControllerInfo.ModelName, Controller->ModelName); | 6674 | strcpy(ControllerInfo.ModelName, Controller->ModelName); |
| 6667 | strcpy(ControllerInfo.FirmwareVersion, Controller->FirmwareVersion); | 6675 | strcpy(ControllerInfo.FirmwareVersion, Controller->FirmwareVersion); |
| 6668 | return (copy_to_user(UserSpaceControllerInfo, &ControllerInfo, | 6676 | ErrorCode = (copy_to_user(UserSpaceControllerInfo, &ControllerInfo, |
| 6669 | sizeof(DAC960_ControllerInfo_T)) ? -EFAULT : 0); | 6677 | sizeof(DAC960_ControllerInfo_T)) ? -EFAULT : 0); |
| 6678 | break; | ||
| 6670 | } | 6679 | } |
| 6671 | case DAC960_IOCTL_V1_EXECUTE_COMMAND: | 6680 | case DAC960_IOCTL_V1_EXECUTE_COMMAND: |
| 6672 | { | 6681 | { |
| @@ -6684,30 +6693,39 @@ static int DAC960_gam_ioctl(struct inode *inode, struct file *file, | |||
| 6684 | int ControllerNumber, DataTransferLength; | 6693 | int ControllerNumber, DataTransferLength; |
| 6685 | unsigned char *DataTransferBuffer = NULL; | 6694 | unsigned char *DataTransferBuffer = NULL; |
| 6686 | dma_addr_t DataTransferBufferDMA; | 6695 | dma_addr_t DataTransferBufferDMA; |
| 6687 | if (UserSpaceUserCommand == NULL) return -EINVAL; | 6696 | if (UserSpaceUserCommand == NULL) { |
| 6697 | ErrorCode = -EINVAL; | ||
| 6698 | break; | ||
| 6699 | } | ||
| 6688 | if (copy_from_user(&UserCommand, UserSpaceUserCommand, | 6700 | if (copy_from_user(&UserCommand, UserSpaceUserCommand, |
| 6689 | sizeof(DAC960_V1_UserCommand_T))) { | 6701 | sizeof(DAC960_V1_UserCommand_T))) { |
| 6690 | ErrorCode = -EFAULT; | 6702 | ErrorCode = -EFAULT; |
| 6691 | goto Failure1a; | 6703 | break; |
| 6692 | } | 6704 | } |
| 6693 | ControllerNumber = UserCommand.ControllerNumber; | 6705 | ControllerNumber = UserCommand.ControllerNumber; |
| 6706 | ErrorCode = -ENXIO; | ||
| 6694 | if (ControllerNumber < 0 || | 6707 | if (ControllerNumber < 0 || |
| 6695 | ControllerNumber > DAC960_ControllerCount - 1) | 6708 | ControllerNumber > DAC960_ControllerCount - 1) |
| 6696 | return -ENXIO; | 6709 | break; |
| 6697 | Controller = DAC960_Controllers[ControllerNumber]; | 6710 | Controller = DAC960_Controllers[ControllerNumber]; |
| 6698 | if (Controller == NULL) return -ENXIO; | 6711 | if (Controller == NULL) |
| 6699 | if (Controller->FirmwareType != DAC960_V1_Controller) return -EINVAL; | 6712 | break; |
| 6713 | ErrorCode = -EINVAL; | ||
| 6714 | if (Controller->FirmwareType != DAC960_V1_Controller) | ||
| 6715 | break; | ||
| 6700 | CommandOpcode = UserCommand.CommandMailbox.Common.CommandOpcode; | 6716 | CommandOpcode = UserCommand.CommandMailbox.Common.CommandOpcode; |
| 6701 | DataTransferLength = UserCommand.DataTransferLength; | 6717 | DataTransferLength = UserCommand.DataTransferLength; |
| 6702 | if (CommandOpcode & 0x80) return -EINVAL; | 6718 | if (CommandOpcode & 0x80) |
| 6719 | break; | ||
| 6703 | if (CommandOpcode == DAC960_V1_DCDB) | 6720 | if (CommandOpcode == DAC960_V1_DCDB) |
| 6704 | { | 6721 | { |
| 6705 | if (copy_from_user(&DCDB, UserCommand.DCDB, | 6722 | if (copy_from_user(&DCDB, UserCommand.DCDB, |
| 6706 | sizeof(DAC960_V1_DCDB_T))) { | 6723 | sizeof(DAC960_V1_DCDB_T))) { |
| 6707 | ErrorCode = -EFAULT; | 6724 | ErrorCode = -EFAULT; |
| 6708 | goto Failure1a; | 6725 | break; |
| 6709 | } | 6726 | } |
| 6710 | if (DCDB.Channel >= DAC960_V1_MaxChannels) return -EINVAL; | 6727 | if (DCDB.Channel >= DAC960_V1_MaxChannels) |
| 6728 | break; | ||
| 6711 | if (!((DataTransferLength == 0 && | 6729 | if (!((DataTransferLength == 0 && |
| 6712 | DCDB.Direction | 6730 | DCDB.Direction |
| 6713 | == DAC960_V1_DCDB_NoDataTransfer) || | 6731 | == DAC960_V1_DCDB_NoDataTransfer) || |
| @@ -6717,38 +6735,37 @@ static int DAC960_gam_ioctl(struct inode *inode, struct file *file, | |||
| 6717 | (DataTransferLength < 0 && | 6735 | (DataTransferLength < 0 && |
| 6718 | DCDB.Direction | 6736 | DCDB.Direction |
| 6719 | == DAC960_V1_DCDB_DataTransferSystemToDevice))) | 6737 | == DAC960_V1_DCDB_DataTransferSystemToDevice))) |
| 6720 | return -EINVAL; | 6738 | break; |
| 6721 | if (((DCDB.TransferLengthHigh4 << 16) | DCDB.TransferLength) | 6739 | if (((DCDB.TransferLengthHigh4 << 16) | DCDB.TransferLength) |
| 6722 | != abs(DataTransferLength)) | 6740 | != abs(DataTransferLength)) |
| 6723 | return -EINVAL; | 6741 | break; |
| 6724 | DCDB_IOBUF = pci_alloc_consistent(Controller->PCIDevice, | 6742 | DCDB_IOBUF = pci_alloc_consistent(Controller->PCIDevice, |
| 6725 | sizeof(DAC960_V1_DCDB_T), &DCDB_IOBUFDMA); | 6743 | sizeof(DAC960_V1_DCDB_T), &DCDB_IOBUFDMA); |
| 6726 | if (DCDB_IOBUF == NULL) | 6744 | if (DCDB_IOBUF == NULL) { |
| 6727 | return -ENOMEM; | 6745 | ErrorCode = -ENOMEM; |
| 6746 | break; | ||
| 6747 | } | ||
| 6728 | } | 6748 | } |
| 6749 | ErrorCode = -ENOMEM; | ||
| 6729 | if (DataTransferLength > 0) | 6750 | if (DataTransferLength > 0) |
| 6730 | { | 6751 | { |
| 6731 | DataTransferBuffer = pci_alloc_consistent(Controller->PCIDevice, | 6752 | DataTransferBuffer = pci_alloc_consistent(Controller->PCIDevice, |
| 6732 | DataTransferLength, &DataTransferBufferDMA); | 6753 | DataTransferLength, &DataTransferBufferDMA); |
| 6733 | if (DataTransferBuffer == NULL) { | 6754 | if (DataTransferBuffer == NULL) |
| 6734 | ErrorCode = -ENOMEM; | 6755 | break; |
| 6735 | goto Failure1; | ||
| 6736 | } | ||
| 6737 | memset(DataTransferBuffer, 0, DataTransferLength); | 6756 | memset(DataTransferBuffer, 0, DataTransferLength); |
| 6738 | } | 6757 | } |
| 6739 | else if (DataTransferLength < 0) | 6758 | else if (DataTransferLength < 0) |
| 6740 | { | 6759 | { |
| 6741 | DataTransferBuffer = pci_alloc_consistent(Controller->PCIDevice, | 6760 | DataTransferBuffer = pci_alloc_consistent(Controller->PCIDevice, |
| 6742 | -DataTransferLength, &DataTransferBufferDMA); | 6761 | -DataTransferLength, &DataTransferBufferDMA); |
| 6743 | if (DataTransferBuffer == NULL) { | 6762 | if (DataTransferBuffer == NULL) |
| 6744 | ErrorCode = -ENOMEM; | 6763 | break; |
| 6745 | goto Failure1; | ||
| 6746 | } | ||
| 6747 | if (copy_from_user(DataTransferBuffer, | 6764 | if (copy_from_user(DataTransferBuffer, |
| 6748 | UserCommand.DataTransferBuffer, | 6765 | UserCommand.DataTransferBuffer, |
| 6749 | -DataTransferLength)) { | 6766 | -DataTransferLength)) { |
| 6750 | ErrorCode = -EFAULT; | 6767 | ErrorCode = -EFAULT; |
| 6751 | goto Failure1; | 6768 | break; |
| 6752 | } | 6769 | } |
| 6753 | } | 6770 | } |
| 6754 | if (CommandOpcode == DAC960_V1_DCDB) | 6771 | if (CommandOpcode == DAC960_V1_DCDB) |
| @@ -6825,8 +6842,7 @@ static int DAC960_gam_ioctl(struct inode *inode, struct file *file, | |||
| 6825 | if (DCDB_IOBUF != NULL) | 6842 | if (DCDB_IOBUF != NULL) |
| 6826 | pci_free_consistent(Controller->PCIDevice, sizeof(DAC960_V1_DCDB_T), | 6843 | pci_free_consistent(Controller->PCIDevice, sizeof(DAC960_V1_DCDB_T), |
| 6827 | DCDB_IOBUF, DCDB_IOBUFDMA); | 6844 | DCDB_IOBUF, DCDB_IOBUFDMA); |
| 6828 | Failure1a: | 6845 | break; |
| 6829 | return ErrorCode; | ||
| 6830 | } | 6846 | } |
| 6831 | case DAC960_IOCTL_V2_EXECUTE_COMMAND: | 6847 | case DAC960_IOCTL_V2_EXECUTE_COMMAND: |
| 6832 | { | 6848 | { |
| @@ -6844,32 +6860,43 @@ static int DAC960_gam_ioctl(struct inode *inode, struct file *file, | |||
| 6844 | dma_addr_t DataTransferBufferDMA; | 6860 | dma_addr_t DataTransferBufferDMA; |
| 6845 | unsigned char *RequestSenseBuffer = NULL; | 6861 | unsigned char *RequestSenseBuffer = NULL; |
| 6846 | dma_addr_t RequestSenseBufferDMA; | 6862 | dma_addr_t RequestSenseBufferDMA; |
| 6847 | if (UserSpaceUserCommand == NULL) return -EINVAL; | 6863 | |
| 6864 | ErrorCode = -EINVAL; | ||
| 6865 | if (UserSpaceUserCommand == NULL) | ||
| 6866 | break; | ||
| 6848 | if (copy_from_user(&UserCommand, UserSpaceUserCommand, | 6867 | if (copy_from_user(&UserCommand, UserSpaceUserCommand, |
| 6849 | sizeof(DAC960_V2_UserCommand_T))) { | 6868 | sizeof(DAC960_V2_UserCommand_T))) { |
| 6850 | ErrorCode = -EFAULT; | 6869 | ErrorCode = -EFAULT; |
| 6851 | goto Failure2a; | 6870 | break; |
| 6852 | } | 6871 | } |
| 6872 | ErrorCode = -ENXIO; | ||
| 6853 | ControllerNumber = UserCommand.ControllerNumber; | 6873 | ControllerNumber = UserCommand.ControllerNumber; |
| 6854 | if (ControllerNumber < 0 || | 6874 | if (ControllerNumber < 0 || |
| 6855 | ControllerNumber > DAC960_ControllerCount - 1) | 6875 | ControllerNumber > DAC960_ControllerCount - 1) |
| 6856 | return -ENXIO; | 6876 | break; |
| 6857 | Controller = DAC960_Controllers[ControllerNumber]; | 6877 | Controller = DAC960_Controllers[ControllerNumber]; |
| 6858 | if (Controller == NULL) return -ENXIO; | 6878 | if (Controller == NULL) |
| 6859 | if (Controller->FirmwareType != DAC960_V2_Controller) return -EINVAL; | 6879 | break; |
| 6880 | if (Controller->FirmwareType != DAC960_V2_Controller){ | ||
| 6881 | ErrorCode = -EINVAL; | ||
| 6882 | break; | ||
| 6883 | } | ||
| 6860 | DataTransferLength = UserCommand.DataTransferLength; | 6884 | DataTransferLength = UserCommand.DataTransferLength; |
| 6885 | ErrorCode = -ENOMEM; | ||
| 6861 | if (DataTransferLength > 0) | 6886 | if (DataTransferLength > 0) |
| 6862 | { | 6887 | { |
| 6863 | DataTransferBuffer = pci_alloc_consistent(Controller->PCIDevice, | 6888 | DataTransferBuffer = pci_alloc_consistent(Controller->PCIDevice, |
| 6864 | DataTransferLength, &DataTransferBufferDMA); | 6889 | DataTransferLength, &DataTransferBufferDMA); |
| 6865 | if (DataTransferBuffer == NULL) return -ENOMEM; | 6890 | if (DataTransferBuffer == NULL) |
| 6891 | break; | ||
| 6866 | memset(DataTransferBuffer, 0, DataTransferLength); | 6892 | memset(DataTransferBuffer, 0, DataTransferLength); |
| 6867 | } | 6893 | } |
| 6868 | else if (DataTransferLength < 0) | 6894 | else if (DataTransferLength < 0) |
| 6869 | { | 6895 | { |
| 6870 | DataTransferBuffer = pci_alloc_consistent(Controller->PCIDevice, | 6896 | DataTransferBuffer = pci_alloc_consistent(Controller->PCIDevice, |
| 6871 | -DataTransferLength, &DataTransferBufferDMA); | 6897 | -DataTransferLength, &DataTransferBufferDMA); |
| 6872 | if (DataTransferBuffer == NULL) return -ENOMEM; | 6898 | if (DataTransferBuffer == NULL) |
| 6899 | break; | ||
| 6873 | if (copy_from_user(DataTransferBuffer, | 6900 | if (copy_from_user(DataTransferBuffer, |
| 6874 | UserCommand.DataTransferBuffer, | 6901 | UserCommand.DataTransferBuffer, |
| 6875 | -DataTransferLength)) { | 6902 | -DataTransferLength)) { |
| @@ -6979,8 +7006,7 @@ static int DAC960_gam_ioctl(struct inode *inode, struct file *file, | |||
| 6979 | if (RequestSenseBuffer != NULL) | 7006 | if (RequestSenseBuffer != NULL) |
| 6980 | pci_free_consistent(Controller->PCIDevice, RequestSenseLength, | 7007 | pci_free_consistent(Controller->PCIDevice, RequestSenseLength, |
| 6981 | RequestSenseBuffer, RequestSenseBufferDMA); | 7008 | RequestSenseBuffer, RequestSenseBufferDMA); |
| 6982 | Failure2a: | 7009 | break; |
| 6983 | return ErrorCode; | ||
| 6984 | } | 7010 | } |
| 6985 | case DAC960_IOCTL_V2_GET_HEALTH_STATUS: | 7011 | case DAC960_IOCTL_V2_GET_HEALTH_STATUS: |
| 6986 | { | 7012 | { |
| @@ -6990,21 +7016,33 @@ static int DAC960_gam_ioctl(struct inode *inode, struct file *file, | |||
| 6990 | DAC960_V2_HealthStatusBuffer_T HealthStatusBuffer; | 7016 | DAC960_V2_HealthStatusBuffer_T HealthStatusBuffer; |
| 6991 | DAC960_Controller_T *Controller; | 7017 | DAC960_Controller_T *Controller; |
| 6992 | int ControllerNumber; | 7018 | int ControllerNumber; |
| 6993 | if (UserSpaceGetHealthStatus == NULL) return -EINVAL; | 7019 | if (UserSpaceGetHealthStatus == NULL) { |
| 7020 | ErrorCode = -EINVAL; | ||
| 7021 | break; | ||
| 7022 | } | ||
| 6994 | if (copy_from_user(&GetHealthStatus, UserSpaceGetHealthStatus, | 7023 | if (copy_from_user(&GetHealthStatus, UserSpaceGetHealthStatus, |
| 6995 | sizeof(DAC960_V2_GetHealthStatus_T))) | 7024 | sizeof(DAC960_V2_GetHealthStatus_T))) { |
| 6996 | return -EFAULT; | 7025 | ErrorCode = -EFAULT; |
| 7026 | break; | ||
| 7027 | } | ||
| 7028 | ErrorCode = -ENXIO; | ||
| 6997 | ControllerNumber = GetHealthStatus.ControllerNumber; | 7029 | ControllerNumber = GetHealthStatus.ControllerNumber; |
| 6998 | if (ControllerNumber < 0 || | 7030 | if (ControllerNumber < 0 || |
| 6999 | ControllerNumber > DAC960_ControllerCount - 1) | 7031 | ControllerNumber > DAC960_ControllerCount - 1) |
| 7000 | return -ENXIO; | 7032 | break; |
| 7001 | Controller = DAC960_Controllers[ControllerNumber]; | 7033 | Controller = DAC960_Controllers[ControllerNumber]; |
| 7002 | if (Controller == NULL) return -ENXIO; | 7034 | if (Controller == NULL) |
| 7003 | if (Controller->FirmwareType != DAC960_V2_Controller) return -EINVAL; | 7035 | break; |
| 7036 | if (Controller->FirmwareType != DAC960_V2_Controller) { | ||
| 7037 | ErrorCode = -EINVAL; | ||
| 7038 | break; | ||
| 7039 | } | ||
| 7004 | if (copy_from_user(&HealthStatusBuffer, | 7040 | if (copy_from_user(&HealthStatusBuffer, |
| 7005 | GetHealthStatus.HealthStatusBuffer, | 7041 | GetHealthStatus.HealthStatusBuffer, |
| 7006 | sizeof(DAC960_V2_HealthStatusBuffer_T))) | 7042 | sizeof(DAC960_V2_HealthStatusBuffer_T))) { |
| 7007 | return -EFAULT; | 7043 | ErrorCode = -EFAULT; |
| 7044 | break; | ||
| 7045 | } | ||
| 7008 | while (Controller->V2.HealthStatusBuffer->StatusChangeCounter | 7046 | while (Controller->V2.HealthStatusBuffer->StatusChangeCounter |
| 7009 | == HealthStatusBuffer.StatusChangeCounter && | 7047 | == HealthStatusBuffer.StatusChangeCounter && |
| 7010 | Controller->V2.HealthStatusBuffer->NextEventSequenceNumber | 7048 | Controller->V2.HealthStatusBuffer->NextEventSequenceNumber |
| @@ -7012,21 +7050,28 @@ static int DAC960_gam_ioctl(struct inode *inode, struct file *file, | |||
| 7012 | { | 7050 | { |
| 7013 | interruptible_sleep_on_timeout(&Controller->HealthStatusWaitQueue, | 7051 | interruptible_sleep_on_timeout(&Controller->HealthStatusWaitQueue, |
| 7014 | DAC960_MonitoringTimerInterval); | 7052 | DAC960_MonitoringTimerInterval); |
| 7015 | if (signal_pending(current)) return -EINTR; | 7053 | if (signal_pending(current)) { |
| 7054 | ErrorCode = -EINTR; | ||
| 7055 | break; | ||
| 7056 | } | ||
| 7016 | } | 7057 | } |
| 7017 | if (copy_to_user(GetHealthStatus.HealthStatusBuffer, | 7058 | if (copy_to_user(GetHealthStatus.HealthStatusBuffer, |
| 7018 | Controller->V2.HealthStatusBuffer, | 7059 | Controller->V2.HealthStatusBuffer, |
| 7019 | sizeof(DAC960_V2_HealthStatusBuffer_T))) | 7060 | sizeof(DAC960_V2_HealthStatusBuffer_T))) |
| 7020 | return -EFAULT; | 7061 | ErrorCode = -EFAULT; |
| 7021 | return 0; | 7062 | else |
| 7063 | ErrorCode = 0; | ||
| 7022 | } | 7064 | } |
| 7065 | default: | ||
| 7066 | ErrorCode = -ENOTTY; | ||
| 7023 | } | 7067 | } |
| 7024 | return -EINVAL; | 7068 | unlock_kernel(); |
| 7069 | return ErrorCode; | ||
| 7025 | } | 7070 | } |
| 7026 | 7071 | ||
| 7027 | static const struct file_operations DAC960_gam_fops = { | 7072 | static const struct file_operations DAC960_gam_fops = { |
| 7028 | .owner = THIS_MODULE, | 7073 | .owner = THIS_MODULE, |
| 7029 | .ioctl = DAC960_gam_ioctl | 7074 | .unlocked_ioctl = DAC960_gam_ioctl |
| 7030 | }; | 7075 | }; |
| 7031 | 7076 | ||
| 7032 | static struct miscdevice DAC960_gam_dev = { | 7077 | static struct miscdevice DAC960_gam_dev = { |
diff --git a/drivers/block/aoe/aoecmd.c b/drivers/block/aoe/aoecmd.c index 41f818be2f7e..2f1746295d06 100644 --- a/drivers/block/aoe/aoecmd.c +++ b/drivers/block/aoe/aoecmd.c | |||
| @@ -1003,7 +1003,7 @@ aoecmd_cfg_rsp(struct sk_buff *skb) | |||
| 1003 | * Enough people have their dip switches set backwards to | 1003 | * Enough people have their dip switches set backwards to |
| 1004 | * warrant a loud message for this special case. | 1004 | * warrant a loud message for this special case. |
| 1005 | */ | 1005 | */ |
| 1006 | aoemajor = be16_to_cpu(get_unaligned(&h->major)); | 1006 | aoemajor = get_unaligned_be16(&h->major); |
| 1007 | if (aoemajor == 0xfff) { | 1007 | if (aoemajor == 0xfff) { |
| 1008 | printk(KERN_ERR "aoe: Warning: shelf address is all ones. " | 1008 | printk(KERN_ERR "aoe: Warning: shelf address is all ones. " |
| 1009 | "Check shelf dip switches.\n"); | 1009 | "Check shelf dip switches.\n"); |
diff --git a/drivers/block/paride/pt.c b/drivers/block/paride/pt.c index 8b9549ab4a4e..27455ee1e9da 100644 --- a/drivers/block/paride/pt.c +++ b/drivers/block/paride/pt.c | |||
| @@ -146,6 +146,7 @@ static int (*drives[4])[6] = {&drive0, &drive1, &drive2, &drive3}; | |||
| 146 | #include <linux/mtio.h> | 146 | #include <linux/mtio.h> |
| 147 | #include <linux/device.h> | 147 | #include <linux/device.h> |
| 148 | #include <linux/sched.h> /* current, TASK_*, schedule_timeout() */ | 148 | #include <linux/sched.h> /* current, TASK_*, schedule_timeout() */ |
| 149 | #include <linux/smp_lock.h> | ||
| 149 | 150 | ||
| 150 | #include <asm/uaccess.h> | 151 | #include <asm/uaccess.h> |
| 151 | 152 | ||
| @@ -189,8 +190,7 @@ module_param_array(drive3, int, NULL, 0); | |||
| 189 | #define ATAPI_LOG_SENSE 0x4d | 190 | #define ATAPI_LOG_SENSE 0x4d |
| 190 | 191 | ||
| 191 | static int pt_open(struct inode *inode, struct file *file); | 192 | static int pt_open(struct inode *inode, struct file *file); |
| 192 | static int pt_ioctl(struct inode *inode, struct file *file, | 193 | static long pt_ioctl(struct file *file, unsigned int cmd, unsigned long arg); |
| 193 | unsigned int cmd, unsigned long arg); | ||
| 194 | static int pt_release(struct inode *inode, struct file *file); | 194 | static int pt_release(struct inode *inode, struct file *file); |
| 195 | static ssize_t pt_read(struct file *filp, char __user *buf, | 195 | static ssize_t pt_read(struct file *filp, char __user *buf, |
| 196 | size_t count, loff_t * ppos); | 196 | size_t count, loff_t * ppos); |
| @@ -236,7 +236,7 @@ static const struct file_operations pt_fops = { | |||
| 236 | .owner = THIS_MODULE, | 236 | .owner = THIS_MODULE, |
| 237 | .read = pt_read, | 237 | .read = pt_read, |
| 238 | .write = pt_write, | 238 | .write = pt_write, |
| 239 | .ioctl = pt_ioctl, | 239 | .unlocked_ioctl = pt_ioctl, |
| 240 | .open = pt_open, | 240 | .open = pt_open, |
| 241 | .release = pt_release, | 241 | .release = pt_release, |
| 242 | }; | 242 | }; |
| @@ -685,8 +685,7 @@ out: | |||
| 685 | return err; | 685 | return err; |
| 686 | } | 686 | } |
| 687 | 687 | ||
| 688 | static int pt_ioctl(struct inode *inode, struct file *file, | 688 | static long pt_ioctl(struct file *file, unsigned int cmd, unsigned long arg) |
| 689 | unsigned int cmd, unsigned long arg) | ||
| 690 | { | 689 | { |
| 691 | struct pt_unit *tape = file->private_data; | 690 | struct pt_unit *tape = file->private_data; |
| 692 | struct mtop __user *p = (void __user *)arg; | 691 | struct mtop __user *p = (void __user *)arg; |
| @@ -700,23 +699,26 @@ static int pt_ioctl(struct inode *inode, struct file *file, | |||
| 700 | switch (mtop.mt_op) { | 699 | switch (mtop.mt_op) { |
| 701 | 700 | ||
| 702 | case MTREW: | 701 | case MTREW: |
| 702 | lock_kernel(); | ||
| 703 | pt_rewind(tape); | 703 | pt_rewind(tape); |
| 704 | unlock_kernel(); | ||
| 704 | return 0; | 705 | return 0; |
| 705 | 706 | ||
| 706 | case MTWEOF: | 707 | case MTWEOF: |
| 708 | lock_kernel(); | ||
| 707 | pt_write_fm(tape); | 709 | pt_write_fm(tape); |
| 710 | unlock_kernel(); | ||
| 708 | return 0; | 711 | return 0; |
| 709 | 712 | ||
| 710 | default: | 713 | default: |
| 711 | printk("%s: Unimplemented mt_op %d\n", tape->name, | 714 | /* FIXME: rate limit ?? */ |
| 715 | printk(KERN_DEBUG "%s: Unimplemented mt_op %d\n", tape->name, | ||
| 712 | mtop.mt_op); | 716 | mtop.mt_op); |
| 713 | return -EINVAL; | 717 | return -EINVAL; |
| 714 | } | 718 | } |
| 715 | 719 | ||
| 716 | default: | 720 | default: |
| 717 | printk("%s: Unimplemented ioctl 0x%x\n", tape->name, cmd); | 721 | return -ENOTTY; |
| 718 | return -EINVAL; | ||
| 719 | |||
| 720 | } | 722 | } |
| 721 | } | 723 | } |
| 722 | 724 | ||
diff --git a/drivers/block/pktcdvd.c b/drivers/block/pktcdvd.c index 3ba1df93e9e3..45bee918c46a 100644 --- a/drivers/block/pktcdvd.c +++ b/drivers/block/pktcdvd.c | |||
| @@ -49,6 +49,7 @@ | |||
| 49 | #include <linux/types.h> | 49 | #include <linux/types.h> |
| 50 | #include <linux/kernel.h> | 50 | #include <linux/kernel.h> |
| 51 | #include <linux/kthread.h> | 51 | #include <linux/kthread.h> |
| 52 | #include <linux/smp_lock.h> | ||
| 52 | #include <linux/errno.h> | 53 | #include <linux/errno.h> |
| 53 | #include <linux/spinlock.h> | 54 | #include <linux/spinlock.h> |
| 54 | #include <linux/file.h> | 55 | #include <linux/file.h> |
| @@ -2079,7 +2080,6 @@ static noinline_for_stack int pkt_write_caching(struct pktcdvd_device *pd, | |||
| 2079 | unsigned char buf[64]; | 2080 | unsigned char buf[64]; |
| 2080 | int ret; | 2081 | int ret; |
| 2081 | 2082 | ||
| 2082 | memset(buf, 0, sizeof(buf)); | ||
| 2083 | init_cdrom_command(&cgc, buf, sizeof(buf), CGC_DATA_READ); | 2083 | init_cdrom_command(&cgc, buf, sizeof(buf), CGC_DATA_READ); |
| 2084 | cgc.sense = &sense; | 2084 | cgc.sense = &sense; |
| 2085 | cgc.buflen = pd->mode_offset + 12; | 2085 | cgc.buflen = pd->mode_offset + 12; |
| @@ -2126,7 +2126,6 @@ static noinline_for_stack int pkt_get_max_speed(struct pktcdvd_device *pd, | |||
| 2126 | unsigned char *cap_buf; | 2126 | unsigned char *cap_buf; |
| 2127 | int ret, offset; | 2127 | int ret, offset; |
| 2128 | 2128 | ||
| 2129 | memset(buf, 0, sizeof(buf)); | ||
| 2130 | cap_buf = &buf[sizeof(struct mode_page_header) + pd->mode_offset]; | 2129 | cap_buf = &buf[sizeof(struct mode_page_header) + pd->mode_offset]; |
| 2131 | init_cdrom_command(&cgc, buf, sizeof(buf), CGC_DATA_UNKNOWN); | 2130 | init_cdrom_command(&cgc, buf, sizeof(buf), CGC_DATA_UNKNOWN); |
| 2132 | cgc.sense = &sense; | 2131 | cgc.sense = &sense; |
| @@ -2633,11 +2632,12 @@ end_io: | |||
| 2633 | 2632 | ||
| 2634 | 2633 | ||
| 2635 | 2634 | ||
| 2636 | static int pkt_merge_bvec(struct request_queue *q, struct bio *bio, struct bio_vec *bvec) | 2635 | static int pkt_merge_bvec(struct request_queue *q, struct bvec_merge_data *bmd, |
| 2636 | struct bio_vec *bvec) | ||
| 2637 | { | 2637 | { |
| 2638 | struct pktcdvd_device *pd = q->queuedata; | 2638 | struct pktcdvd_device *pd = q->queuedata; |
| 2639 | sector_t zone = ZONE(bio->bi_sector, pd); | 2639 | sector_t zone = ZONE(bmd->bi_sector, pd); |
| 2640 | int used = ((bio->bi_sector - zone) << 9) + bio->bi_size; | 2640 | int used = ((bmd->bi_sector - zone) << 9) + bmd->bi_size; |
| 2641 | int remaining = (pd->settings.size << 9) - used; | 2641 | int remaining = (pd->settings.size << 9) - used; |
| 2642 | int remaining2; | 2642 | int remaining2; |
| 2643 | 2643 | ||
| @@ -2645,7 +2645,7 @@ static int pkt_merge_bvec(struct request_queue *q, struct bio *bio, struct bio_v | |||
| 2645 | * A bio <= PAGE_SIZE must be allowed. If it crosses a packet | 2645 | * A bio <= PAGE_SIZE must be allowed. If it crosses a packet |
| 2646 | * boundary, pkt_make_request() will split the bio. | 2646 | * boundary, pkt_make_request() will split the bio. |
| 2647 | */ | 2647 | */ |
| 2648 | remaining2 = PAGE_SIZE - bio->bi_size; | 2648 | remaining2 = PAGE_SIZE - bmd->bi_size; |
| 2649 | remaining = max(remaining, remaining2); | 2649 | remaining = max(remaining, remaining2); |
| 2650 | 2650 | ||
| 2651 | BUG_ON(remaining < 0); | 2651 | BUG_ON(remaining < 0); |
| @@ -2796,9 +2796,14 @@ out_mem: | |||
| 2796 | return ret; | 2796 | return ret; |
| 2797 | } | 2797 | } |
| 2798 | 2798 | ||
| 2799 | static int pkt_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg) | 2799 | static long pkt_ioctl(struct file *file, unsigned int cmd, unsigned long arg) |
| 2800 | { | 2800 | { |
| 2801 | struct pktcdvd_device *pd = inode->i_bdev->bd_disk->private_data; | 2801 | struct inode *inode = file->f_path.dentry->d_inode; |
| 2802 | struct pktcdvd_device *pd; | ||
| 2803 | long ret; | ||
| 2804 | |||
| 2805 | lock_kernel(); | ||
| 2806 | pd = inode->i_bdev->bd_disk->private_data; | ||
| 2802 | 2807 | ||
| 2803 | VPRINTK("pkt_ioctl: cmd %x, dev %d:%d\n", cmd, imajor(inode), iminor(inode)); | 2808 | VPRINTK("pkt_ioctl: cmd %x, dev %d:%d\n", cmd, imajor(inode), iminor(inode)); |
| 2804 | 2809 | ||
| @@ -2811,7 +2816,8 @@ static int pkt_ioctl(struct inode *inode, struct file *file, unsigned int cmd, u | |||
| 2811 | case CDROM_LAST_WRITTEN: | 2816 | case CDROM_LAST_WRITTEN: |
| 2812 | case CDROM_SEND_PACKET: | 2817 | case CDROM_SEND_PACKET: |
| 2813 | case SCSI_IOCTL_SEND_COMMAND: | 2818 | case SCSI_IOCTL_SEND_COMMAND: |
| 2814 | return blkdev_ioctl(pd->bdev->bd_inode, file, cmd, arg); | 2819 | ret = blkdev_ioctl(pd->bdev->bd_inode, file, cmd, arg); |
| 2820 | break; | ||
| 2815 | 2821 | ||
| 2816 | case CDROMEJECT: | 2822 | case CDROMEJECT: |
| 2817 | /* | 2823 | /* |
| @@ -2820,14 +2826,15 @@ static int pkt_ioctl(struct inode *inode, struct file *file, unsigned int cmd, u | |||
| 2820 | */ | 2826 | */ |
| 2821 | if (pd->refcnt == 1) | 2827 | if (pd->refcnt == 1) |
| 2822 | pkt_lock_door(pd, 0); | 2828 | pkt_lock_door(pd, 0); |
| 2823 | return blkdev_ioctl(pd->bdev->bd_inode, file, cmd, arg); | 2829 | ret = blkdev_ioctl(pd->bdev->bd_inode, file, cmd, arg); |
| 2830 | break; | ||
| 2824 | 2831 | ||
| 2825 | default: | 2832 | default: |
| 2826 | VPRINTK(DRIVER_NAME": Unknown ioctl for %s (%x)\n", pd->name, cmd); | 2833 | VPRINTK(DRIVER_NAME": Unknown ioctl for %s (%x)\n", pd->name, cmd); |
| 2827 | return -ENOTTY; | 2834 | ret = -ENOTTY; |
| 2828 | } | 2835 | } |
| 2829 | 2836 | unlock_kernel(); | |
| 2830 | return 0; | 2837 | return ret; |
| 2831 | } | 2838 | } |
| 2832 | 2839 | ||
| 2833 | static int pkt_media_changed(struct gendisk *disk) | 2840 | static int pkt_media_changed(struct gendisk *disk) |
| @@ -2849,7 +2856,7 @@ static struct block_device_operations pktcdvd_ops = { | |||
| 2849 | .owner = THIS_MODULE, | 2856 | .owner = THIS_MODULE, |
| 2850 | .open = pkt_open, | 2857 | .open = pkt_open, |
| 2851 | .release = pkt_close, | 2858 | .release = pkt_close, |
| 2852 | .ioctl = pkt_ioctl, | 2859 | .unlocked_ioctl = pkt_ioctl, |
| 2853 | .media_changed = pkt_media_changed, | 2860 | .media_changed = pkt_media_changed, |
| 2854 | }; | 2861 | }; |
| 2855 | 2862 | ||
| @@ -3014,7 +3021,8 @@ static void pkt_get_status(struct pkt_ctrl_command *ctrl_cmd) | |||
| 3014 | mutex_unlock(&ctl_mutex); | 3021 | mutex_unlock(&ctl_mutex); |
| 3015 | } | 3022 | } |
| 3016 | 3023 | ||
| 3017 | static int pkt_ctl_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg) | 3024 | static long pkt_ctl_ioctl(struct file *file, unsigned int cmd, |
| 3025 | unsigned long arg) | ||
| 3018 | { | 3026 | { |
| 3019 | void __user *argp = (void __user *)arg; | 3027 | void __user *argp = (void __user *)arg; |
| 3020 | struct pkt_ctrl_command ctrl_cmd; | 3028 | struct pkt_ctrl_command ctrl_cmd; |
| @@ -3031,16 +3039,22 @@ static int pkt_ctl_ioctl(struct inode *inode, struct file *file, unsigned int cm | |||
| 3031 | case PKT_CTRL_CMD_SETUP: | 3039 | case PKT_CTRL_CMD_SETUP: |
| 3032 | if (!capable(CAP_SYS_ADMIN)) | 3040 | if (!capable(CAP_SYS_ADMIN)) |
| 3033 | return -EPERM; | 3041 | return -EPERM; |
| 3042 | lock_kernel(); | ||
| 3034 | ret = pkt_setup_dev(new_decode_dev(ctrl_cmd.dev), &pkt_dev); | 3043 | ret = pkt_setup_dev(new_decode_dev(ctrl_cmd.dev), &pkt_dev); |
| 3035 | ctrl_cmd.pkt_dev = new_encode_dev(pkt_dev); | 3044 | ctrl_cmd.pkt_dev = new_encode_dev(pkt_dev); |
| 3045 | unlock_kernel(); | ||
| 3036 | break; | 3046 | break; |
| 3037 | case PKT_CTRL_CMD_TEARDOWN: | 3047 | case PKT_CTRL_CMD_TEARDOWN: |
| 3038 | if (!capable(CAP_SYS_ADMIN)) | 3048 | if (!capable(CAP_SYS_ADMIN)) |
| 3039 | return -EPERM; | 3049 | return -EPERM; |
| 3050 | lock_kernel(); | ||
| 3040 | ret = pkt_remove_dev(new_decode_dev(ctrl_cmd.pkt_dev)); | 3051 | ret = pkt_remove_dev(new_decode_dev(ctrl_cmd.pkt_dev)); |
| 3052 | unlock_kernel(); | ||
| 3041 | break; | 3053 | break; |
| 3042 | case PKT_CTRL_CMD_STATUS: | 3054 | case PKT_CTRL_CMD_STATUS: |
| 3055 | lock_kernel(); | ||
| 3043 | pkt_get_status(&ctrl_cmd); | 3056 | pkt_get_status(&ctrl_cmd); |
| 3057 | unlock_kernel(); | ||
| 3044 | break; | 3058 | break; |
| 3045 | default: | 3059 | default: |
| 3046 | return -ENOTTY; | 3060 | return -ENOTTY; |
| @@ -3053,7 +3067,7 @@ static int pkt_ctl_ioctl(struct inode *inode, struct file *file, unsigned int cm | |||
| 3053 | 3067 | ||
| 3054 | 3068 | ||
| 3055 | static const struct file_operations pkt_ctl_fops = { | 3069 | static const struct file_operations pkt_ctl_fops = { |
| 3056 | .ioctl = pkt_ctl_ioctl, | 3070 | .unlocked_ioctl = pkt_ctl_ioctl, |
| 3057 | .owner = THIS_MODULE, | 3071 | .owner = THIS_MODULE, |
| 3058 | }; | 3072 | }; |
| 3059 | 3073 | ||
diff --git a/drivers/block/xen-blkfront.c b/drivers/block/xen-blkfront.c index f2fff5799ddf..9ae05c584234 100644 --- a/drivers/block/xen-blkfront.c +++ b/drivers/block/xen-blkfront.c | |||
| @@ -38,6 +38,7 @@ | |||
| 38 | #include <linux/interrupt.h> | 38 | #include <linux/interrupt.h> |
| 39 | #include <linux/blkdev.h> | 39 | #include <linux/blkdev.h> |
| 40 | #include <linux/hdreg.h> | 40 | #include <linux/hdreg.h> |
| 41 | #include <linux/cdrom.h> | ||
| 41 | #include <linux/module.h> | 42 | #include <linux/module.h> |
| 42 | 43 | ||
| 43 | #include <xen/xenbus.h> | 44 | #include <xen/xenbus.h> |
| @@ -153,6 +154,40 @@ static int blkif_getgeo(struct block_device *bd, struct hd_geometry *hg) | |||
| 153 | return 0; | 154 | return 0; |
| 154 | } | 155 | } |
| 155 | 156 | ||
| 157 | int blkif_ioctl(struct inode *inode, struct file *filep, | ||
| 158 | unsigned command, unsigned long argument) | ||
| 159 | { | ||
| 160 | struct blkfront_info *info = | ||
| 161 | inode->i_bdev->bd_disk->private_data; | ||
| 162 | int i; | ||
| 163 | |||
| 164 | dev_dbg(&info->xbdev->dev, "command: 0x%x, argument: 0x%lx\n", | ||
| 165 | command, (long)argument); | ||
| 166 | |||
| 167 | switch (command) { | ||
| 168 | case CDROMMULTISESSION: | ||
| 169 | dev_dbg(&info->xbdev->dev, "FIXME: support multisession CDs later\n"); | ||
| 170 | for (i = 0; i < sizeof(struct cdrom_multisession); i++) | ||
| 171 | if (put_user(0, (char __user *)(argument + i))) | ||
| 172 | return -EFAULT; | ||
| 173 | return 0; | ||
| 174 | |||
| 175 | case CDROM_GET_CAPABILITY: { | ||
| 176 | struct gendisk *gd = info->gd; | ||
| 177 | if (gd->flags & GENHD_FL_CD) | ||
| 178 | return 0; | ||
| 179 | return -EINVAL; | ||
| 180 | } | ||
| 181 | |||
| 182 | default: | ||
| 183 | /*printk(KERN_ALERT "ioctl %08x not supported by Xen blkdev\n", | ||
| 184 | command);*/ | ||
| 185 | return -EINVAL; /* same return as native Linux */ | ||
| 186 | } | ||
| 187 | |||
| 188 | return 0; | ||
| 189 | } | ||
| 190 | |||
| 156 | /* | 191 | /* |
| 157 | * blkif_queue_request | 192 | * blkif_queue_request |
| 158 | * | 193 | * |
| @@ -324,6 +359,9 @@ static int xlvbd_init_blk_queue(struct gendisk *gd, u16 sector_size) | |||
| 324 | /* Make sure buffer addresses are sector-aligned. */ | 359 | /* Make sure buffer addresses are sector-aligned. */ |
| 325 | blk_queue_dma_alignment(rq, 511); | 360 | blk_queue_dma_alignment(rq, 511); |
| 326 | 361 | ||
| 362 | /* Make sure we don't use bounce buffers. */ | ||
| 363 | blk_queue_bounce_limit(rq, BLK_BOUNCE_ANY); | ||
| 364 | |||
| 327 | gd->queue = rq; | 365 | gd->queue = rq; |
| 328 | 366 | ||
| 329 | return 0; | 367 | return 0; |
| @@ -546,7 +584,7 @@ static int setup_blkring(struct xenbus_device *dev, | |||
| 546 | 584 | ||
| 547 | info->ring_ref = GRANT_INVALID_REF; | 585 | info->ring_ref = GRANT_INVALID_REF; |
| 548 | 586 | ||
| 549 | sring = (struct blkif_sring *)__get_free_page(GFP_KERNEL); | 587 | sring = (struct blkif_sring *)__get_free_page(GFP_NOIO | __GFP_HIGH); |
| 550 | if (!sring) { | 588 | if (!sring) { |
| 551 | xenbus_dev_fatal(dev, -ENOMEM, "allocating shared ring"); | 589 | xenbus_dev_fatal(dev, -ENOMEM, "allocating shared ring"); |
| 552 | return -ENOMEM; | 590 | return -ENOMEM; |
| @@ -703,7 +741,8 @@ static int blkif_recover(struct blkfront_info *info) | |||
| 703 | int j; | 741 | int j; |
| 704 | 742 | ||
| 705 | /* Stage 1: Make a safe copy of the shadow state. */ | 743 | /* Stage 1: Make a safe copy of the shadow state. */ |
| 706 | copy = kmalloc(sizeof(info->shadow), GFP_KERNEL); | 744 | copy = kmalloc(sizeof(info->shadow), |
| 745 | GFP_NOIO | __GFP_REPEAT | __GFP_HIGH); | ||
| 707 | if (!copy) | 746 | if (!copy) |
| 708 | return -ENOMEM; | 747 | return -ENOMEM; |
| 709 | memcpy(copy, info->shadow, sizeof(info->shadow)); | 748 | memcpy(copy, info->shadow, sizeof(info->shadow)); |
| @@ -959,7 +998,7 @@ static int blkif_release(struct inode *inode, struct file *filep) | |||
| 959 | struct xenbus_device *dev = info->xbdev; | 998 | struct xenbus_device *dev = info->xbdev; |
| 960 | enum xenbus_state state = xenbus_read_driver_state(dev->otherend); | 999 | enum xenbus_state state = xenbus_read_driver_state(dev->otherend); |
| 961 | 1000 | ||
| 962 | if (state == XenbusStateClosing) | 1001 | if (state == XenbusStateClosing && info->is_ready) |
| 963 | blkfront_closing(dev); | 1002 | blkfront_closing(dev); |
| 964 | } | 1003 | } |
| 965 | return 0; | 1004 | return 0; |
| @@ -971,6 +1010,7 @@ static struct block_device_operations xlvbd_block_fops = | |||
| 971 | .open = blkif_open, | 1010 | .open = blkif_open, |
| 972 | .release = blkif_release, | 1011 | .release = blkif_release, |
| 973 | .getgeo = blkif_getgeo, | 1012 | .getgeo = blkif_getgeo, |
| 1013 | .ioctl = blkif_ioctl, | ||
| 974 | }; | 1014 | }; |
| 975 | 1015 | ||
| 976 | 1016 | ||
| @@ -1006,7 +1046,7 @@ static int __init xlblk_init(void) | |||
| 1006 | module_init(xlblk_init); | 1046 | module_init(xlblk_init); |
| 1007 | 1047 | ||
| 1008 | 1048 | ||
| 1009 | static void xlblk_exit(void) | 1049 | static void __exit xlblk_exit(void) |
| 1010 | { | 1050 | { |
| 1011 | return xenbus_unregister_driver(&blkfront); | 1051 | return xenbus_unregister_driver(&blkfront); |
| 1012 | } | 1052 | } |
