diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2009-03-26 19:03:04 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2009-03-26 19:03:04 -0400 |
commit | 86d9c070175de65890794fa227b68297da6206d8 (patch) | |
tree | 1aa4f1d1ecf397bd0d745a67b9d828420a99a8b4 /drivers/block | |
parent | 413e3376485e6cf81f4cf6a4dbc0de0326535093 (diff) | |
parent | a2a9537ac0b37a5da6fbe7e1e9cb06c524d2a9c4 (diff) |
Merge branch 'for-2.6.30' of git://git.kernel.dk/linux-2.6-block
* 'for-2.6.30' of git://git.kernel.dk/linux-2.6-block:
Get rid of pdflush_operation() in emergency sync and remount
btrfs: get rid of current_is_pdflush() in btrfs_btree_balance_dirty
Move the default_backing_dev_info out of readahead.c and into backing-dev.c
block: Repeated lines in switching-sched.txt
bsg: Remove bogus check against request_queue->max_sectors
block: WARN in __blk_put_request() for potential bio leak
loop: fix circular locking in loop_clr_fd()
loop: support barrier writes
bsg: add support for tail queuing
cpqarray: enable bus mastering
block: genhd.h cleanup patch
block: add private bio_set for bio integrity allocations
block: genhd.h comment needs updating
block: get rid of unused blkdev_free_rq() define
block: remove various blk_queue_*() setting functions in blk_init_queue_node()
cciss: add BUILD_BUG_ON() for catching bad CommandList_struct alignment
block: don't create bio_vec slabs of less than the inline number
block: cleanup bio_alloc_bioset()
Diffstat (limited to 'drivers/block')
-rw-r--r-- | drivers/block/cciss.c | 7 | ||||
-rw-r--r-- | drivers/block/cpqarray.c | 1 | ||||
-rw-r--r-- | drivers/block/loop.c | 48 |
3 files changed, 52 insertions, 4 deletions
diff --git a/drivers/block/cciss.c b/drivers/block/cciss.c index 4f9b6d792017..5d0e135824f9 100644 --- a/drivers/block/cciss.c +++ b/drivers/block/cciss.c | |||
@@ -3898,6 +3898,13 @@ static struct pci_driver cciss_pci_driver = { | |||
3898 | */ | 3898 | */ |
3899 | static int __init cciss_init(void) | 3899 | static int __init cciss_init(void) |
3900 | { | 3900 | { |
3901 | /* | ||
3902 | * The hardware requires that commands are aligned on a 64-bit | ||
3903 | * boundary. Given that we use pci_alloc_consistent() to allocate an | ||
3904 | * array of them, the size must be a multiple of 8 bytes. | ||
3905 | */ | ||
3906 | BUILD_BUG_ON(sizeof(CommandList_struct) % 8); | ||
3907 | |||
3901 | printk(KERN_INFO DRIVER_NAME "\n"); | 3908 | printk(KERN_INFO DRIVER_NAME "\n"); |
3902 | 3909 | ||
3903 | /* Register for our PCI devices */ | 3910 | /* Register for our PCI devices */ |
diff --git a/drivers/block/cpqarray.c b/drivers/block/cpqarray.c index 5d39df14ed90..ca268ca11159 100644 --- a/drivers/block/cpqarray.c +++ b/drivers/block/cpqarray.c | |||
@@ -617,6 +617,7 @@ static int cpqarray_pci_init(ctlr_info_t *c, struct pci_dev *pdev) | |||
617 | int i; | 617 | int i; |
618 | 618 | ||
619 | c->pci_dev = pdev; | 619 | c->pci_dev = pdev; |
620 | pci_set_master(pdev); | ||
620 | if (pci_enable_device(pdev)) { | 621 | if (pci_enable_device(pdev)) { |
621 | printk(KERN_ERR "cpqarray: Unable to Enable PCI device\n"); | 622 | printk(KERN_ERR "cpqarray: Unable to Enable PCI device\n"); |
622 | return -1; | 623 | return -1; |
diff --git a/drivers/block/loop.c b/drivers/block/loop.c index bf0345577672..2621ed2ce6d2 100644 --- a/drivers/block/loop.c +++ b/drivers/block/loop.c | |||
@@ -474,10 +474,35 @@ static int do_bio_filebacked(struct loop_device *lo, struct bio *bio) | |||
474 | int ret; | 474 | int ret; |
475 | 475 | ||
476 | pos = ((loff_t) bio->bi_sector << 9) + lo->lo_offset; | 476 | pos = ((loff_t) bio->bi_sector << 9) + lo->lo_offset; |
477 | if (bio_rw(bio) == WRITE) | 477 | |
478 | if (bio_rw(bio) == WRITE) { | ||
479 | int barrier = bio_barrier(bio); | ||
480 | struct file *file = lo->lo_backing_file; | ||
481 | |||
482 | if (barrier) { | ||
483 | if (unlikely(!file->f_op->fsync)) { | ||
484 | ret = -EOPNOTSUPP; | ||
485 | goto out; | ||
486 | } | ||
487 | |||
488 | ret = vfs_fsync(file, file->f_path.dentry, 0); | ||
489 | if (unlikely(ret)) { | ||
490 | ret = -EIO; | ||
491 | goto out; | ||
492 | } | ||
493 | } | ||
494 | |||
478 | ret = lo_send(lo, bio, pos); | 495 | ret = lo_send(lo, bio, pos); |
479 | else | 496 | |
497 | if (barrier && !ret) { | ||
498 | ret = vfs_fsync(file, file->f_path.dentry, 0); | ||
499 | if (unlikely(ret)) | ||
500 | ret = -EIO; | ||
501 | } | ||
502 | } else | ||
480 | ret = lo_receive(lo, bio, lo->lo_blocksize, pos); | 503 | ret = lo_receive(lo, bio, lo->lo_blocksize, pos); |
504 | |||
505 | out: | ||
481 | return ret; | 506 | return ret; |
482 | } | 507 | } |
483 | 508 | ||
@@ -826,6 +851,9 @@ static int loop_set_fd(struct loop_device *lo, fmode_t mode, | |||
826 | lo->lo_queue->queuedata = lo; | 851 | lo->lo_queue->queuedata = lo; |
827 | lo->lo_queue->unplug_fn = loop_unplug; | 852 | lo->lo_queue->unplug_fn = loop_unplug; |
828 | 853 | ||
854 | if (!(lo_flags & LO_FLAGS_READ_ONLY) && file->f_op->fsync) | ||
855 | blk_queue_ordered(lo->lo_queue, QUEUE_ORDERED_DRAIN, NULL); | ||
856 | |||
829 | set_capacity(lo->lo_disk, size); | 857 | set_capacity(lo->lo_disk, size); |
830 | bd_set_size(bdev, size << 9); | 858 | bd_set_size(bdev, size << 9); |
831 | 859 | ||
@@ -941,11 +969,18 @@ static int loop_clr_fd(struct loop_device *lo, struct block_device *bdev) | |||
941 | bd_set_size(bdev, 0); | 969 | bd_set_size(bdev, 0); |
942 | mapping_set_gfp_mask(filp->f_mapping, gfp); | 970 | mapping_set_gfp_mask(filp->f_mapping, gfp); |
943 | lo->lo_state = Lo_unbound; | 971 | lo->lo_state = Lo_unbound; |
944 | fput(filp); | ||
945 | /* This is safe: open() is still holding a reference. */ | 972 | /* This is safe: open() is still holding a reference. */ |
946 | module_put(THIS_MODULE); | 973 | module_put(THIS_MODULE); |
947 | if (max_part > 0) | 974 | if (max_part > 0) |
948 | ioctl_by_bdev(bdev, BLKRRPART, 0); | 975 | ioctl_by_bdev(bdev, BLKRRPART, 0); |
976 | mutex_unlock(&lo->lo_ctl_mutex); | ||
977 | /* | ||
978 | * Need not hold lo_ctl_mutex to fput backing file. | ||
979 | * Calling fput holding lo_ctl_mutex triggers a circular | ||
980 | * lock dependency possibility warning as fput can take | ||
981 | * bd_mutex which is usually taken before lo_ctl_mutex. | ||
982 | */ | ||
983 | fput(filp); | ||
949 | return 0; | 984 | return 0; |
950 | } | 985 | } |
951 | 986 | ||
@@ -1163,7 +1198,7 @@ static int lo_ioctl(struct block_device *bdev, fmode_t mode, | |||
1163 | struct loop_device *lo = bdev->bd_disk->private_data; | 1198 | struct loop_device *lo = bdev->bd_disk->private_data; |
1164 | int err; | 1199 | int err; |
1165 | 1200 | ||
1166 | mutex_lock(&lo->lo_ctl_mutex); | 1201 | mutex_lock_nested(&lo->lo_ctl_mutex, 1); |
1167 | switch (cmd) { | 1202 | switch (cmd) { |
1168 | case LOOP_SET_FD: | 1203 | case LOOP_SET_FD: |
1169 | err = loop_set_fd(lo, mode, bdev, arg); | 1204 | err = loop_set_fd(lo, mode, bdev, arg); |
@@ -1172,7 +1207,10 @@ static int lo_ioctl(struct block_device *bdev, fmode_t mode, | |||
1172 | err = loop_change_fd(lo, bdev, arg); | 1207 | err = loop_change_fd(lo, bdev, arg); |
1173 | break; | 1208 | break; |
1174 | case LOOP_CLR_FD: | 1209 | case LOOP_CLR_FD: |
1210 | /* loop_clr_fd would have unlocked lo_ctl_mutex on success */ | ||
1175 | err = loop_clr_fd(lo, bdev); | 1211 | err = loop_clr_fd(lo, bdev); |
1212 | if (!err) | ||
1213 | goto out_unlocked; | ||
1176 | break; | 1214 | break; |
1177 | case LOOP_SET_STATUS: | 1215 | case LOOP_SET_STATUS: |
1178 | err = loop_set_status_old(lo, (struct loop_info __user *) arg); | 1216 | err = loop_set_status_old(lo, (struct loop_info __user *) arg); |
@@ -1190,6 +1228,8 @@ static int lo_ioctl(struct block_device *bdev, fmode_t mode, | |||
1190 | err = lo->ioctl ? lo->ioctl(lo, cmd, arg) : -EINVAL; | 1228 | err = lo->ioctl ? lo->ioctl(lo, cmd, arg) : -EINVAL; |
1191 | } | 1229 | } |
1192 | mutex_unlock(&lo->lo_ctl_mutex); | 1230 | mutex_unlock(&lo->lo_ctl_mutex); |
1231 | |||
1232 | out_unlocked: | ||
1193 | return err; | 1233 | return err; |
1194 | } | 1234 | } |
1195 | 1235 | ||