diff options
Diffstat (limited to 'drivers/ide')
-rw-r--r-- | drivers/ide/ide-cd.c | 10 | ||||
-rw-r--r-- | drivers/ide/ide-disk.c | 12 | ||||
-rw-r--r-- | drivers/ide/ide-floppy.c | 12 | ||||
-rw-r--r-- | drivers/ide/ide-io.c | 42 | ||||
-rw-r--r-- | drivers/ide/ide-probe.c | 2 | ||||
-rw-r--r-- | drivers/ide/ide.c | 13 | ||||
-rw-r--r-- | drivers/ide/legacy/hd.c | 24 | ||||
-rw-r--r-- | drivers/ide/pci/serverworks.c | 2 |
8 files changed, 70 insertions, 47 deletions
diff --git a/drivers/ide/ide-cd.c b/drivers/ide/ide-cd.c index d31117eb95aa..e4d55ad32d2f 100644 --- a/drivers/ide/ide-cd.c +++ b/drivers/ide/ide-cd.c | |||
@@ -1332,8 +1332,6 @@ static ide_startstop_t cdrom_start_read (ide_drive_t *drive, unsigned int block) | |||
1332 | if (cdrom_read_from_buffer(drive)) | 1332 | if (cdrom_read_from_buffer(drive)) |
1333 | return ide_stopped; | 1333 | return ide_stopped; |
1334 | 1334 | ||
1335 | blk_attempt_remerge(drive->queue, rq); | ||
1336 | |||
1337 | /* Clear the local sector buffer. */ | 1335 | /* Clear the local sector buffer. */ |
1338 | info->nsectors_buffered = 0; | 1336 | info->nsectors_buffered = 0; |
1339 | 1337 | ||
@@ -1874,14 +1872,6 @@ static ide_startstop_t cdrom_start_write(ide_drive_t *drive, struct request *rq) | |||
1874 | return ide_stopped; | 1872 | return ide_stopped; |
1875 | } | 1873 | } |
1876 | 1874 | ||
1877 | /* | ||
1878 | * for dvd-ram and such media, it's a really big deal to get | ||
1879 | * big writes all the time. so scour the queue and attempt to | ||
1880 | * remerge requests, often the plugging will not have had time | ||
1881 | * to do this properly | ||
1882 | */ | ||
1883 | blk_attempt_remerge(drive->queue, rq); | ||
1884 | |||
1885 | info->nsectors_buffered = 0; | 1875 | info->nsectors_buffered = 0; |
1886 | 1876 | ||
1887 | /* use dma, if possible. we don't need to check more, since we | 1877 | /* use dma, if possible. we don't need to check more, since we |
diff --git a/drivers/ide/ide-disk.c b/drivers/ide/ide-disk.c index 4b441720b6ba..cab362ea0336 100644 --- a/drivers/ide/ide-disk.c +++ b/drivers/ide/ide-disk.c | |||
@@ -1130,6 +1130,17 @@ static int idedisk_release(struct inode *inode, struct file *filp) | |||
1130 | return 0; | 1130 | return 0; |
1131 | } | 1131 | } |
1132 | 1132 | ||
1133 | static int idedisk_getgeo(struct block_device *bdev, struct hd_geometry *geo) | ||
1134 | { | ||
1135 | struct ide_disk_obj *idkp = ide_disk_g(bdev->bd_disk); | ||
1136 | ide_drive_t *drive = idkp->drive; | ||
1137 | |||
1138 | geo->heads = drive->bios_head; | ||
1139 | geo->sectors = drive->bios_sect; | ||
1140 | geo->cylinders = (u16)drive->bios_cyl; /* truncate */ | ||
1141 | return 0; | ||
1142 | } | ||
1143 | |||
1133 | static int idedisk_ioctl(struct inode *inode, struct file *file, | 1144 | static int idedisk_ioctl(struct inode *inode, struct file *file, |
1134 | unsigned int cmd, unsigned long arg) | 1145 | unsigned int cmd, unsigned long arg) |
1135 | { | 1146 | { |
@@ -1164,6 +1175,7 @@ static struct block_device_operations idedisk_ops = { | |||
1164 | .open = idedisk_open, | 1175 | .open = idedisk_open, |
1165 | .release = idedisk_release, | 1176 | .release = idedisk_release, |
1166 | .ioctl = idedisk_ioctl, | 1177 | .ioctl = idedisk_ioctl, |
1178 | .getgeo = idedisk_getgeo, | ||
1167 | .media_changed = idedisk_media_changed, | 1179 | .media_changed = idedisk_media_changed, |
1168 | .revalidate_disk= idedisk_revalidate_disk | 1180 | .revalidate_disk= idedisk_revalidate_disk |
1169 | }; | 1181 | }; |
diff --git a/drivers/ide/ide-floppy.c b/drivers/ide/ide-floppy.c index fba3fffc2d66..5945f551aaaa 100644 --- a/drivers/ide/ide-floppy.c +++ b/drivers/ide/ide-floppy.c | |||
@@ -2031,6 +2031,17 @@ static int idefloppy_release(struct inode *inode, struct file *filp) | |||
2031 | return 0; | 2031 | return 0; |
2032 | } | 2032 | } |
2033 | 2033 | ||
2034 | static int idefloppy_getgeo(struct block_device *bdev, struct hd_geometry *geo) | ||
2035 | { | ||
2036 | struct ide_floppy_obj *floppy = ide_floppy_g(bdev->bd_disk); | ||
2037 | ide_drive_t *drive = floppy->drive; | ||
2038 | |||
2039 | geo->heads = drive->bios_head; | ||
2040 | geo->sectors = drive->bios_sect; | ||
2041 | geo->cylinders = (u16)drive->bios_cyl; /* truncate */ | ||
2042 | return 0; | ||
2043 | } | ||
2044 | |||
2034 | static int idefloppy_ioctl(struct inode *inode, struct file *file, | 2045 | static int idefloppy_ioctl(struct inode *inode, struct file *file, |
2035 | unsigned int cmd, unsigned long arg) | 2046 | unsigned int cmd, unsigned long arg) |
2036 | { | 2047 | { |
@@ -2120,6 +2131,7 @@ static struct block_device_operations idefloppy_ops = { | |||
2120 | .open = idefloppy_open, | 2131 | .open = idefloppy_open, |
2121 | .release = idefloppy_release, | 2132 | .release = idefloppy_release, |
2122 | .ioctl = idefloppy_ioctl, | 2133 | .ioctl = idefloppy_ioctl, |
2134 | .getgeo = idefloppy_getgeo, | ||
2123 | .media_changed = idefloppy_media_changed, | 2135 | .media_changed = idefloppy_media_changed, |
2124 | .revalidate_disk= idefloppy_revalidate_disk | 2136 | .revalidate_disk= idefloppy_revalidate_disk |
2125 | }; | 2137 | }; |
diff --git a/drivers/ide/ide-io.c b/drivers/ide/ide-io.c index b5dc6df8e67d..dea2d4dcc698 100644 --- a/drivers/ide/ide-io.c +++ b/drivers/ide/ide-io.c | |||
@@ -55,9 +55,22 @@ | |||
55 | #include <asm/io.h> | 55 | #include <asm/io.h> |
56 | #include <asm/bitops.h> | 56 | #include <asm/bitops.h> |
57 | 57 | ||
58 | void ide_softirq_done(struct request *rq) | ||
59 | { | ||
60 | request_queue_t *q = rq->q; | ||
61 | |||
62 | add_disk_randomness(rq->rq_disk); | ||
63 | end_that_request_chunk(rq, rq->errors, rq->data_len); | ||
64 | |||
65 | spin_lock_irq(q->queue_lock); | ||
66 | end_that_request_last(rq, rq->errors); | ||
67 | spin_unlock_irq(q->queue_lock); | ||
68 | } | ||
69 | |||
58 | int __ide_end_request(ide_drive_t *drive, struct request *rq, int uptodate, | 70 | int __ide_end_request(ide_drive_t *drive, struct request *rq, int uptodate, |
59 | int nr_sectors) | 71 | int nr_sectors) |
60 | { | 72 | { |
73 | unsigned int nbytes; | ||
61 | int ret = 1; | 74 | int ret = 1; |
62 | 75 | ||
63 | BUG_ON(!(rq->flags & REQ_STARTED)); | 76 | BUG_ON(!(rq->flags & REQ_STARTED)); |
@@ -81,17 +94,28 @@ int __ide_end_request(ide_drive_t *drive, struct request *rq, int uptodate, | |||
81 | HWGROUP(drive)->hwif->ide_dma_on(drive); | 94 | HWGROUP(drive)->hwif->ide_dma_on(drive); |
82 | } | 95 | } |
83 | 96 | ||
84 | if (!end_that_request_first(rq, uptodate, nr_sectors)) { | 97 | /* |
85 | add_disk_randomness(rq->rq_disk); | 98 | * For partial completions (or non fs/pc requests), use the regular |
86 | 99 | * direct completion path. | |
87 | if (blk_rq_tagged(rq)) | 100 | */ |
88 | blk_queue_end_tag(drive->queue, rq); | 101 | nbytes = nr_sectors << 9; |
89 | 102 | if (rq_all_done(rq, nbytes)) { | |
103 | rq->errors = uptodate; | ||
104 | rq->data_len = nbytes; | ||
90 | blkdev_dequeue_request(rq); | 105 | blkdev_dequeue_request(rq); |
91 | HWGROUP(drive)->rq = NULL; | 106 | HWGROUP(drive)->rq = NULL; |
92 | end_that_request_last(rq, uptodate); | 107 | blk_complete_request(rq); |
93 | ret = 0; | 108 | ret = 0; |
109 | } else { | ||
110 | if (!end_that_request_first(rq, uptodate, nr_sectors)) { | ||
111 | add_disk_randomness(rq->rq_disk); | ||
112 | blkdev_dequeue_request(rq); | ||
113 | HWGROUP(drive)->rq = NULL; | ||
114 | end_that_request_last(rq, uptodate); | ||
115 | ret = 0; | ||
116 | } | ||
94 | } | 117 | } |
118 | |||
95 | return ret; | 119 | return ret; |
96 | } | 120 | } |
97 | EXPORT_SYMBOL(__ide_end_request); | 121 | EXPORT_SYMBOL(__ide_end_request); |
@@ -113,6 +137,10 @@ int ide_end_request (ide_drive_t *drive, int uptodate, int nr_sectors) | |||
113 | unsigned long flags; | 137 | unsigned long flags; |
114 | int ret = 1; | 138 | int ret = 1; |
115 | 139 | ||
140 | /* | ||
141 | * room for locking improvements here, the calls below don't | ||
142 | * need the queue lock held at all | ||
143 | */ | ||
116 | spin_lock_irqsave(&ide_lock, flags); | 144 | spin_lock_irqsave(&ide_lock, flags); |
117 | rq = HWGROUP(drive)->rq; | 145 | rq = HWGROUP(drive)->rq; |
118 | 146 | ||
diff --git a/drivers/ide/ide-probe.c b/drivers/ide/ide-probe.c index 02167a5b751d..1ddaa71a8f45 100644 --- a/drivers/ide/ide-probe.c +++ b/drivers/ide/ide-probe.c | |||
@@ -1011,6 +1011,8 @@ static int ide_init_queue(ide_drive_t *drive) | |||
1011 | blk_queue_max_hw_segments(q, max_sg_entries); | 1011 | blk_queue_max_hw_segments(q, max_sg_entries); |
1012 | blk_queue_max_phys_segments(q, max_sg_entries); | 1012 | blk_queue_max_phys_segments(q, max_sg_entries); |
1013 | 1013 | ||
1014 | blk_queue_softirq_done(q, ide_softirq_done); | ||
1015 | |||
1014 | /* assign drive queue */ | 1016 | /* assign drive queue */ |
1015 | drive->queue = q; | 1017 | drive->queue = q; |
1016 | 1018 | ||
diff --git a/drivers/ide/ide.c b/drivers/ide/ide.c index 4b524f6b3ecd..b069b13b75a7 100644 --- a/drivers/ide/ide.c +++ b/drivers/ide/ide.c | |||
@@ -1278,19 +1278,6 @@ int generic_ide_ioctl(ide_drive_t *drive, struct file *file, struct block_device | |||
1278 | up(&ide_setting_sem); | 1278 | up(&ide_setting_sem); |
1279 | 1279 | ||
1280 | switch (cmd) { | 1280 | switch (cmd) { |
1281 | case HDIO_GETGEO: | ||
1282 | { | ||
1283 | struct hd_geometry geom; | ||
1284 | if (!p || (drive->media != ide_disk && drive->media != ide_floppy)) return -EINVAL; | ||
1285 | geom.heads = drive->bios_head; | ||
1286 | geom.sectors = drive->bios_sect; | ||
1287 | geom.cylinders = (u16)drive->bios_cyl; /* truncate */ | ||
1288 | geom.start = get_start_sect(bdev); | ||
1289 | if (copy_to_user(p, &geom, sizeof(struct hd_geometry))) | ||
1290 | return -EFAULT; | ||
1291 | return 0; | ||
1292 | } | ||
1293 | |||
1294 | case HDIO_OBSOLETE_IDENTITY: | 1281 | case HDIO_OBSOLETE_IDENTITY: |
1295 | case HDIO_GET_IDENTITY: | 1282 | case HDIO_GET_IDENTITY: |
1296 | if (bdev != bdev->bd_contains) | 1283 | if (bdev != bdev->bd_contains) |
diff --git a/drivers/ide/legacy/hd.c b/drivers/ide/legacy/hd.c index 242029c9c0ca..6439dec66881 100644 --- a/drivers/ide/legacy/hd.c +++ b/drivers/ide/legacy/hd.c | |||
@@ -658,22 +658,14 @@ static void do_hd_request (request_queue_t * q) | |||
658 | enable_irq(HD_IRQ); | 658 | enable_irq(HD_IRQ); |
659 | } | 659 | } |
660 | 660 | ||
661 | static int hd_ioctl(struct inode * inode, struct file * file, | 661 | static int hd_getgeo(struct block_device *bdev, struct hd_geometry *geo) |
662 | unsigned int cmd, unsigned long arg) | ||
663 | { | 662 | { |
664 | struct hd_i_struct *disk = inode->i_bdev->bd_disk->private_data; | 663 | struct hd_i_struct *disk = bdev->bd_disk->private_data; |
665 | struct hd_geometry __user *loc = (struct hd_geometry __user *) arg; | 664 | |
666 | struct hd_geometry g; | 665 | geo->heads = disk->head; |
667 | 666 | geo->sectors = disk->sect; | |
668 | if (cmd != HDIO_GETGEO) | 667 | geo->cylinders = disk->cyl; |
669 | return -EINVAL; | 668 | return 0; |
670 | if (!loc) | ||
671 | return -EINVAL; | ||
672 | g.heads = disk->head; | ||
673 | g.sectors = disk->sect; | ||
674 | g.cylinders = disk->cyl; | ||
675 | g.start = get_start_sect(inode->i_bdev); | ||
676 | return copy_to_user(loc, &g, sizeof g) ? -EFAULT : 0; | ||
677 | } | 669 | } |
678 | 670 | ||
679 | /* | 671 | /* |
@@ -695,7 +687,7 @@ static irqreturn_t hd_interrupt(int irq, void *dev_id, struct pt_regs *regs) | |||
695 | } | 687 | } |
696 | 688 | ||
697 | static struct block_device_operations hd_fops = { | 689 | static struct block_device_operations hd_fops = { |
698 | .ioctl = hd_ioctl, | 690 | .getgeo = hd_getgeo, |
699 | }; | 691 | }; |
700 | 692 | ||
701 | /* | 693 | /* |
diff --git a/drivers/ide/pci/serverworks.c b/drivers/ide/pci/serverworks.c index ff2e217a8c84..0d3073f4eab4 100644 --- a/drivers/ide/pci/serverworks.c +++ b/drivers/ide/pci/serverworks.c | |||
@@ -69,7 +69,7 @@ static int check_in_drive_lists (ide_drive_t *drive, const char **list) | |||
69 | static u8 svwks_ratemask (ide_drive_t *drive) | 69 | static u8 svwks_ratemask (ide_drive_t *drive) |
70 | { | 70 | { |
71 | struct pci_dev *dev = HWIF(drive)->pci_dev; | 71 | struct pci_dev *dev = HWIF(drive)->pci_dev; |
72 | u8 mode; | 72 | u8 mode = 0; |
73 | 73 | ||
74 | if (!svwks_revision) | 74 | if (!svwks_revision) |
75 | pci_read_config_byte(dev, PCI_REVISION_ID, &svwks_revision); | 75 | pci_read_config_byte(dev, PCI_REVISION_ID, &svwks_revision); |