diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2011-11-04 20:22:14 -0400 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2011-11-04 20:22:14 -0400 |
| commit | 3d0a8d10cfb4cc3d1877c29a866ee7d8a46aa2fa (patch) | |
| tree | 11a85044d1472f5972ae47ce10a2f446ad981e9f | |
| parent | b4fdcb02f1e39c27058a885905bd0277370ba441 (diff) | |
| parent | a0eda62552eba4e1f92d5354bb65c68fb6b45f87 (diff) | |
Merge branch 'for-3.2/drivers' of git://git.kernel.dk/linux-block
* 'for-3.2/drivers' of git://git.kernel.dk/linux-block: (30 commits)
virtio-blk: use ida to allocate disk index
hpsa: add small delay when using PCI Power Management to reset for kump
cciss: add small delay when using PCI Power Management to reset for kump
xen/blkback: Fix two races in the handling of barrier requests.
xen/blkback: Check for proper operation.
xen/blkback: Fix the inhibition to map pages when discarding sector ranges.
xen/blkback: Report VBD_WSECT (wr_sect) properly.
xen/blkback: Support 'feature-barrier' aka old-style BARRIER requests.
xen-blkfront: plug device number leak in xlblk_init() error path
xen-blkfront: If no barrier or flush is supported, use invalid operation.
xen-blkback: use kzalloc() in favor of kmalloc()+memset()
xen-blkback: fixed indentation and comments
xen-blkfront: fix a deadlock while handling discard response
xen-blkfront: Handle discard requests.
xen-blkback: Implement discard requests ('feature-discard')
xen-blkfront: add BLKIF_OP_DISCARD and discard request struct
drivers/block/loop.c: remove unnecessary bdev argument from loop_clr_fd()
drivers/block/loop.c: emit uevent on auto release
drivers/block/cpqarray.c: use pci_dev->revision
loop: always allow userspace partitions and optionally support automatic scanning
...
Fic up trivial header file includsion conflict in drivers/block/loop.c
| -rw-r--r-- | Documentation/ABI/testing/sysfs-bus-pci-devices-cciss | 7 | ||||
| -rw-r--r-- | Documentation/blockdev/cciss.txt | 10 | ||||
| -rw-r--r-- | block/genhd.c | 4 | ||||
| -rw-r--r-- | block/ioctl.c | 2 | ||||
| -rw-r--r-- | drivers/block/cciss.c | 76 | ||||
| -rw-r--r-- | drivers/block/cciss.h | 1 | ||||
| -rw-r--r-- | drivers/block/cpqarray.c | 2 | ||||
| -rw-r--r-- | drivers/block/loop.c | 111 | ||||
| -rw-r--r-- | drivers/block/nbd.c | 69 | ||||
| -rw-r--r-- | drivers/block/xen-blkback/blkback.c | 130 | ||||
| -rw-r--r-- | drivers/block/xen-blkback/common.h | 98 | ||||
| -rw-r--r-- | drivers/block/xen-blkback/xenbus.c | 76 | ||||
| -rw-r--r-- | drivers/block/xen-blkfront.c | 123 | ||||
| -rw-r--r-- | drivers/scsi/hpsa.c | 7 | ||||
| -rw-r--r-- | fs/block_dev.c | 2 | ||||
| -rw-r--r-- | include/linux/genhd.h | 6 | ||||
| -rw-r--r-- | include/linux/loop.h | 1 | ||||
| -rw-r--r-- | include/xen/interface/io/blkif.h | 36 |
18 files changed, 638 insertions, 123 deletions
diff --git a/Documentation/ABI/testing/sysfs-bus-pci-devices-cciss b/Documentation/ABI/testing/sysfs-bus-pci-devices-cciss index f5bb0a3bb8c..53d99edd1d7 100644 --- a/Documentation/ABI/testing/sysfs-bus-pci-devices-cciss +++ b/Documentation/ABI/testing/sysfs-bus-pci-devices-cciss | |||
| @@ -71,3 +71,10 @@ Description: Value of 1 indicates the controller can honor the reset_devices | |||
| 71 | a dump device, as kdump requires resetting the device in order | 71 | a dump device, as kdump requires resetting the device in order |
| 72 | to work reliably. | 72 | to work reliably. |
| 73 | 73 | ||
| 74 | Where: /sys/bus/pci/devices/<dev>/ccissX/transport_mode | ||
| 75 | Date: July 2011 | ||
| 76 | Kernel Version: 3.0 | ||
| 77 | Contact: iss_storagedev@hp.com | ||
| 78 | Description: Value of "simple" indicates that the controller has been placed | ||
| 79 | in "simple mode". Value of "performant" indicates that the | ||
| 80 | controller has been placed in "performant mode". | ||
diff --git a/Documentation/blockdev/cciss.txt b/Documentation/blockdev/cciss.txt index c00c6a5ab21..71464e09ec1 100644 --- a/Documentation/blockdev/cciss.txt +++ b/Documentation/blockdev/cciss.txt | |||
| @@ -78,6 +78,16 @@ The device naming scheme is: | |||
| 78 | /dev/cciss/c1d1p2 Controller 1, disk 1, partition 2 | 78 | /dev/cciss/c1d1p2 Controller 1, disk 1, partition 2 |
| 79 | /dev/cciss/c1d1p3 Controller 1, disk 1, partition 3 | 79 | /dev/cciss/c1d1p3 Controller 1, disk 1, partition 3 |
| 80 | 80 | ||
| 81 | CCISS simple mode support | ||
| 82 | ------------------------- | ||
| 83 | |||
| 84 | The "cciss_simple_mode=1" boot parameter may be used to prevent the driver | ||
| 85 | from putting the controller into "performant" mode. The difference is that | ||
| 86 | with simple mode, each command completion requires an interrupt, while with | ||
| 87 | "performant mode" (the default, and ordinarily better performing) it is | ||
| 88 | possible to have multiple command completions indicated by a single | ||
| 89 | interrupt. | ||
| 90 | |||
| 81 | SCSI tape drive and medium changer support | 91 | SCSI tape drive and medium changer support |
| 82 | ------------------------------------------ | 92 | ------------------------------------------ |
| 83 | 93 | ||
diff --git a/block/genhd.c b/block/genhd.c index 024fc3944fb..9253839714f 100644 --- a/block/genhd.c +++ b/block/genhd.c | |||
| @@ -537,7 +537,7 @@ void register_disk(struct gendisk *disk) | |||
| 537 | disk->slave_dir = kobject_create_and_add("slaves", &ddev->kobj); | 537 | disk->slave_dir = kobject_create_and_add("slaves", &ddev->kobj); |
| 538 | 538 | ||
| 539 | /* No minors to use for partitions */ | 539 | /* No minors to use for partitions */ |
| 540 | if (!disk_partitionable(disk)) | 540 | if (!disk_part_scan_enabled(disk)) |
| 541 | goto exit; | 541 | goto exit; |
| 542 | 542 | ||
| 543 | /* No such device (e.g., media were just removed) */ | 543 | /* No such device (e.g., media were just removed) */ |
| @@ -848,7 +848,7 @@ static int show_partition(struct seq_file *seqf, void *v) | |||
| 848 | char buf[BDEVNAME_SIZE]; | 848 | char buf[BDEVNAME_SIZE]; |
| 849 | 849 | ||
| 850 | /* Don't show non-partitionable removeable devices or empty devices */ | 850 | /* Don't show non-partitionable removeable devices or empty devices */ |
| 851 | if (!get_capacity(sgp) || (!disk_partitionable(sgp) && | 851 | if (!get_capacity(sgp) || (!disk_max_parts(sgp) && |
| 852 | (sgp->flags & GENHD_FL_REMOVABLE))) | 852 | (sgp->flags & GENHD_FL_REMOVABLE))) |
| 853 | return 0; | 853 | return 0; |
| 854 | if (sgp->flags & GENHD_FL_SUPPRESS_PARTITION_INFO) | 854 | if (sgp->flags & GENHD_FL_SUPPRESS_PARTITION_INFO) |
diff --git a/block/ioctl.c b/block/ioctl.c index 1124cd29726..5c74efc0190 100644 --- a/block/ioctl.c +++ b/block/ioctl.c | |||
| @@ -101,7 +101,7 @@ static int blkdev_reread_part(struct block_device *bdev) | |||
| 101 | struct gendisk *disk = bdev->bd_disk; | 101 | struct gendisk *disk = bdev->bd_disk; |
| 102 | int res; | 102 | int res; |
| 103 | 103 | ||
| 104 | if (!disk_partitionable(disk) || bdev != bdev->bd_contains) | 104 | if (!disk_part_scan_enabled(disk) || bdev != bdev->bd_contains) |
| 105 | return -EINVAL; | 105 | return -EINVAL; |
| 106 | if (!capable(CAP_SYS_ADMIN)) | 106 | if (!capable(CAP_SYS_ADMIN)) |
| 107 | return -EACCES; | 107 | return -EACCES; |
diff --git a/drivers/block/cciss.c b/drivers/block/cciss.c index 8f4ef656a1a..486f94ef24d 100644 --- a/drivers/block/cciss.c +++ b/drivers/block/cciss.c | |||
| @@ -68,6 +68,10 @@ static int cciss_tape_cmds = 6; | |||
| 68 | module_param(cciss_tape_cmds, int, 0644); | 68 | module_param(cciss_tape_cmds, int, 0644); |
| 69 | MODULE_PARM_DESC(cciss_tape_cmds, | 69 | MODULE_PARM_DESC(cciss_tape_cmds, |
| 70 | "number of commands to allocate for tape devices (default: 6)"); | 70 | "number of commands to allocate for tape devices (default: 6)"); |
| 71 | static int cciss_simple_mode; | ||
| 72 | module_param(cciss_simple_mode, int, S_IRUGO|S_IWUSR); | ||
| 73 | MODULE_PARM_DESC(cciss_simple_mode, | ||
| 74 | "Use 'simple mode' rather than 'performant mode'"); | ||
| 71 | 75 | ||
| 72 | static DEFINE_MUTEX(cciss_mutex); | 76 | static DEFINE_MUTEX(cciss_mutex); |
| 73 | static struct proc_dir_entry *proc_cciss; | 77 | static struct proc_dir_entry *proc_cciss; |
| @@ -176,6 +180,7 @@ static void cciss_geometry_inquiry(ctlr_info_t *h, int logvol, | |||
| 176 | unsigned int block_size, InquiryData_struct *inq_buff, | 180 | unsigned int block_size, InquiryData_struct *inq_buff, |
| 177 | drive_info_struct *drv); | 181 | drive_info_struct *drv); |
| 178 | static void __devinit cciss_interrupt_mode(ctlr_info_t *); | 182 | static void __devinit cciss_interrupt_mode(ctlr_info_t *); |
| 183 | static int __devinit cciss_enter_simple_mode(struct ctlr_info *h); | ||
| 179 | static void start_io(ctlr_info_t *h); | 184 | static void start_io(ctlr_info_t *h); |
| 180 | static int sendcmd_withirq(ctlr_info_t *h, __u8 cmd, void *buff, size_t size, | 185 | static int sendcmd_withirq(ctlr_info_t *h, __u8 cmd, void *buff, size_t size, |
| 181 | __u8 page_code, unsigned char scsi3addr[], | 186 | __u8 page_code, unsigned char scsi3addr[], |
| @@ -388,7 +393,7 @@ static void cciss_seq_show_header(struct seq_file *seq) | |||
| 388 | h->product_name, | 393 | h->product_name, |
| 389 | (unsigned long)h->board_id, | 394 | (unsigned long)h->board_id, |
| 390 | h->firm_ver[0], h->firm_ver[1], h->firm_ver[2], | 395 | h->firm_ver[0], h->firm_ver[1], h->firm_ver[2], |
| 391 | h->firm_ver[3], (unsigned int)h->intr[PERF_MODE_INT], | 396 | h->firm_ver[3], (unsigned int)h->intr[h->intr_mode], |
| 392 | h->num_luns, | 397 | h->num_luns, |
| 393 | h->Qdepth, h->commands_outstanding, | 398 | h->Qdepth, h->commands_outstanding, |
| 394 | h->maxQsinceinit, h->max_outstanding, h->maxSG); | 399 | h->maxQsinceinit, h->max_outstanding, h->maxSG); |
| @@ -636,6 +641,18 @@ static ssize_t host_store_rescan(struct device *dev, | |||
| 636 | } | 641 | } |
| 637 | static DEVICE_ATTR(rescan, S_IWUSR, NULL, host_store_rescan); | 642 | static DEVICE_ATTR(rescan, S_IWUSR, NULL, host_store_rescan); |
| 638 | 643 | ||
| 644 | static ssize_t host_show_transport_mode(struct device *dev, | ||
| 645 | struct device_attribute *attr, | ||
| 646 | char *buf) | ||
| 647 | { | ||
| 648 | struct ctlr_info *h = to_hba(dev); | ||
| 649 | |||
| 650 | return snprintf(buf, 20, "%s\n", | ||
| 651 | h->transMethod & CFGTBL_Trans_Performant ? | ||
| 652 | "performant" : "simple"); | ||
| 653 | } | ||
| 654 | static DEVICE_ATTR(transport_mode, S_IRUGO, host_show_transport_mode, NULL); | ||
| 655 | |||
| 639 | static ssize_t dev_show_unique_id(struct device *dev, | 656 | static ssize_t dev_show_unique_id(struct device *dev, |
| 640 | struct device_attribute *attr, | 657 | struct device_attribute *attr, |
| 641 | char *buf) | 658 | char *buf) |
| @@ -808,6 +825,7 @@ static DEVICE_ATTR(usage_count, S_IRUGO, cciss_show_usage_count, NULL); | |||
| 808 | static struct attribute *cciss_host_attrs[] = { | 825 | static struct attribute *cciss_host_attrs[] = { |
| 809 | &dev_attr_rescan.attr, | 826 | &dev_attr_rescan.attr, |
| 810 | &dev_attr_resettable.attr, | 827 | &dev_attr_resettable.attr, |
| 828 | &dev_attr_transport_mode.attr, | ||
| 811 | NULL | 829 | NULL |
| 812 | }; | 830 | }; |
| 813 | 831 | ||
| @@ -3984,6 +4002,9 @@ static void __devinit cciss_put_controller_into_performant_mode(ctlr_info_t *h) | |||
| 3984 | { | 4002 | { |
| 3985 | __u32 trans_support; | 4003 | __u32 trans_support; |
| 3986 | 4004 | ||
| 4005 | if (cciss_simple_mode) | ||
| 4006 | return; | ||
| 4007 | |||
| 3987 | dev_dbg(&h->pdev->dev, "Trying to put board into Performant mode\n"); | 4008 | dev_dbg(&h->pdev->dev, "Trying to put board into Performant mode\n"); |
| 3988 | /* Attempt to put controller into performant mode if supported */ | 4009 | /* Attempt to put controller into performant mode if supported */ |
| 3989 | /* Does board support performant mode? */ | 4010 | /* Does board support performant mode? */ |
| @@ -4081,7 +4102,7 @@ static void __devinit cciss_interrupt_mode(ctlr_info_t *h) | |||
| 4081 | default_int_mode: | 4102 | default_int_mode: |
| 4082 | #endif /* CONFIG_PCI_MSI */ | 4103 | #endif /* CONFIG_PCI_MSI */ |
| 4083 | /* if we get here we're going to use the default interrupt mode */ | 4104 | /* if we get here we're going to use the default interrupt mode */ |
| 4084 | h->intr[PERF_MODE_INT] = h->pdev->irq; | 4105 | h->intr[h->intr_mode] = h->pdev->irq; |
| 4085 | return; | 4106 | return; |
| 4086 | } | 4107 | } |
| 4087 | 4108 | ||
| @@ -4341,6 +4362,9 @@ static int __devinit cciss_pci_init(ctlr_info_t *h) | |||
| 4341 | } | 4362 | } |
| 4342 | cciss_enable_scsi_prefetch(h); | 4363 | cciss_enable_scsi_prefetch(h); |
| 4343 | cciss_p600_dma_prefetch_quirk(h); | 4364 | cciss_p600_dma_prefetch_quirk(h); |
| 4365 | err = cciss_enter_simple_mode(h); | ||
| 4366 | if ( | ||
