Commit c30f3343 authored by Jens Axboe's avatar Jens Axboe

Merge branch 'for-linus' into for-2.6.33

parents 132cc538 2ec24ff1
...@@ -70,7 +70,7 @@ static void drive_stat_acct(struct request *rq, int new_io) ...@@ -70,7 +70,7 @@ static void drive_stat_acct(struct request *rq, int new_io)
part_stat_inc(cpu, part, merges[rw]); part_stat_inc(cpu, part, merges[rw]);
else { else {
part_round_stats(cpu, part); part_round_stats(cpu, part);
part_inc_in_flight(part); part_inc_in_flight(part, rw);
} }
part_stat_unlock(); part_stat_unlock();
...@@ -1030,9 +1030,9 @@ static void part_round_stats_single(int cpu, struct hd_struct *part, ...@@ -1030,9 +1030,9 @@ static void part_round_stats_single(int cpu, struct hd_struct *part,
if (now == part->stamp) if (now == part->stamp)
return; return;
if (part->in_flight) { if (part_in_flight(part)) {
__part_stat_add(cpu, part, time_in_queue, __part_stat_add(cpu, part, time_in_queue,
part->in_flight * (now - part->stamp)); part_in_flight(part) * (now - part->stamp));
__part_stat_add(cpu, part, io_ticks, (now - part->stamp)); __part_stat_add(cpu, part, io_ticks, (now - part->stamp));
} }
part->stamp = now; part->stamp = now;
...@@ -1739,7 +1739,7 @@ static void blk_account_io_done(struct request *req) ...@@ -1739,7 +1739,7 @@ static void blk_account_io_done(struct request *req)
part_stat_inc(cpu, part, ios[rw]); part_stat_inc(cpu, part, ios[rw]);
part_stat_add(cpu, part, ticks[rw], duration); part_stat_add(cpu, part, ticks[rw], duration);
part_round_stats(cpu, part); part_round_stats(cpu, part);
part_dec_in_flight(part); part_dec_in_flight(part, rw);
part_stat_unlock(); part_stat_unlock();
} }
...@@ -2492,14 +2492,6 @@ int kblockd_schedule_work(struct request_queue *q, struct work_struct *work) ...@@ -2492,14 +2492,6 @@ int kblockd_schedule_work(struct request_queue *q, struct work_struct *work)
} }
EXPORT_SYMBOL(kblockd_schedule_work); EXPORT_SYMBOL(kblockd_schedule_work);
int kblockd_schedule_delayed_work(struct request_queue *q,
struct delayed_work *work,
unsigned long delay)
{
return queue_delayed_work(kblockd_workqueue, work, delay);
}
EXPORT_SYMBOL(kblockd_schedule_delayed_work);
int __init blk_dev_init(void) int __init blk_dev_init(void)
{ {
BUILD_BUG_ON(__REQ_NR_BITS > 8 * BUILD_BUG_ON(__REQ_NR_BITS > 8 *
......
...@@ -351,7 +351,7 @@ static void blk_account_io_merge(struct request *req) ...@@ -351,7 +351,7 @@ static void blk_account_io_merge(struct request *req)
part = disk_map_sector_rcu(req->rq_disk, blk_rq_pos(req)); part = disk_map_sector_rcu(req->rq_disk, blk_rq_pos(req));
part_round_stats(cpu, part); part_round_stats(cpu, part);
part_dec_in_flight(part); part_dec_in_flight(part, rq_data_dir(req));
part_stat_unlock(); part_stat_unlock();
} }
......
...@@ -242,7 +242,7 @@ EXPORT_SYMBOL(blk_queue_max_hw_sectors); ...@@ -242,7 +242,7 @@ EXPORT_SYMBOL(blk_queue_max_hw_sectors);
/** /**
* blk_queue_max_discard_sectors - set max sectors for a single discard * blk_queue_max_discard_sectors - set max sectors for a single discard
* @q: the request queue for the device * @q: the request queue for the device
* @max_discard: maximum number of sectors to discard * @max_discard_sectors: maximum number of sectors to discard
**/ **/
void blk_queue_max_discard_sectors(struct request_queue *q, void blk_queue_max_discard_sectors(struct request_queue *q,
unsigned int max_discard_sectors) unsigned int max_discard_sectors)
......
...@@ -359,7 +359,7 @@ int blk_queue_start_tag(struct request_queue *q, struct request *rq) ...@@ -359,7 +359,7 @@ int blk_queue_start_tag(struct request_queue *q, struct request *rq)
max_depth -= 2; max_depth -= 2;
if (!max_depth) if (!max_depth)
max_depth = 1; max_depth = 1;
if (q->in_flight[0] > max_depth) if (q->in_flight[BLK_RW_ASYNC] > max_depth)
return 1; return 1;
} }
......
This diff is collapsed.
...@@ -1053,9 +1053,7 @@ ssize_t elv_iosched_store(struct request_queue *q, const char *name, ...@@ -1053,9 +1053,7 @@ ssize_t elv_iosched_store(struct request_queue *q, const char *name,
return count; return count;
strlcpy(elevator_name, name, sizeof(elevator_name)); strlcpy(elevator_name, name, sizeof(elevator_name));
strstrip(elevator_name); e = elevator_get(strstrip(elevator_name));
e = elevator_get(elevator_name);
if (!e) { if (!e) {
printk(KERN_ERR "elevator: type %s not found\n", elevator_name); printk(KERN_ERR "elevator: type %s not found\n", elevator_name);
return -EINVAL; return -EINVAL;
......
...@@ -869,6 +869,7 @@ static DEVICE_ATTR(size, S_IRUGO, part_size_show, NULL); ...@@ -869,6 +869,7 @@ static DEVICE_ATTR(size, S_IRUGO, part_size_show, NULL);
static DEVICE_ATTR(alignment_offset, S_IRUGO, disk_alignment_offset_show, NULL); static DEVICE_ATTR(alignment_offset, S_IRUGO, disk_alignment_offset_show, NULL);
static DEVICE_ATTR(capability, S_IRUGO, disk_capability_show, NULL); static DEVICE_ATTR(capability, S_IRUGO, disk_capability_show, NULL);
static DEVICE_ATTR(stat, S_IRUGO, part_stat_show, NULL); static DEVICE_ATTR(stat, S_IRUGO, part_stat_show, NULL);
static DEVICE_ATTR(inflight, S_IRUGO, part_inflight_show, NULL);
#ifdef CONFIG_FAIL_MAKE_REQUEST #ifdef CONFIG_FAIL_MAKE_REQUEST
static struct device_attribute dev_attr_fail = static struct device_attribute dev_attr_fail =
__ATTR(make-it-fail, S_IRUGO|S_IWUSR, part_fail_show, part_fail_store); __ATTR(make-it-fail, S_IRUGO|S_IWUSR, part_fail_show, part_fail_store);
...@@ -888,6 +889,7 @@ static struct attribute *disk_attrs[] = { ...@@ -888,6 +889,7 @@ static struct attribute *disk_attrs[] = {
&dev_attr_alignment_offset.attr, &dev_attr_alignment_offset.attr,
&dev_attr_capability.attr, &dev_attr_capability.attr,
&dev_attr_stat.attr, &dev_attr_stat.attr,
&dev_attr_inflight.attr,
#ifdef CONFIG_FAIL_MAKE_REQUEST #ifdef CONFIG_FAIL_MAKE_REQUEST
&dev_attr_fail.attr, &dev_attr_fail.attr,
#endif #endif
...@@ -1053,7 +1055,7 @@ static int diskstats_show(struct seq_file *seqf, void *v) ...@@ -1053,7 +1055,7 @@ static int diskstats_show(struct seq_file *seqf, void *v)
part_stat_read(hd, merges[1]), part_stat_read(hd, merges[1]),
(unsigned long long)part_stat_read(hd, sectors[1]), (unsigned long long)part_stat_read(hd, sectors[1]),
jiffies_to_msecs(part_stat_read(hd, ticks[1])), jiffies_to_msecs(part_stat_read(hd, ticks[1])),
hd->in_flight, part_in_flight(hd),
jiffies_to_msecs(part_stat_read(hd, io_ticks)), jiffies_to_msecs(part_stat_read(hd, io_ticks)),
jiffies_to_msecs(part_stat_read(hd, time_in_queue)) jiffies_to_msecs(part_stat_read(hd, time_in_queue))
); );
......
...@@ -68,6 +68,12 @@ MODULE_SUPPORTED_DEVICE("HP SA5i SA5i+ SA532 SA5300 SA5312 SA641 SA642 SA6400" ...@@ -68,6 +68,12 @@ MODULE_SUPPORTED_DEVICE("HP SA5i SA5i+ SA532 SA5300 SA5312 SA641 SA642 SA6400"
MODULE_VERSION("3.6.20"); MODULE_VERSION("3.6.20");
MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL");
static int cciss_allow_hpsa;
module_param(cciss_allow_hpsa, int, S_IRUGO|S_IWUSR);
MODULE_PARM_DESC(cciss_allow_hpsa,
"Prevent cciss driver from accessing hardware known to be "
" supported by the hpsa driver");
#include "cciss_cmd.h" #include "cciss_cmd.h"
#include "cciss.h" #include "cciss.h"
#include <linux/cciss_ioctl.h> #include <linux/cciss_ioctl.h>
...@@ -101,8 +107,6 @@ static const struct pci_device_id cciss_pci_device_id[] = { ...@@ -101,8 +107,6 @@ static const struct pci_device_id cciss_pci_device_id[] = {
{PCI_VENDOR_ID_HP, PCI_DEVICE_ID_HP_CISSE, 0x103C, 0x3249}, {PCI_VENDOR_ID_HP, PCI_DEVICE_ID_HP_CISSE, 0x103C, 0x3249},
{PCI_VENDOR_ID_HP, PCI_DEVICE_ID_HP_CISSE, 0x103C, 0x324A}, {PCI_VENDOR_ID_HP, PCI_DEVICE_ID_HP_CISSE, 0x103C, 0x324A},
{PCI_VENDOR_ID_HP, PCI_DEVICE_ID_HP_CISSE, 0x103C, 0x324B}, {PCI_VENDOR_ID_HP, PCI_DEVICE_ID_HP_CISSE, 0x103C, 0x324B},
{PCI_VENDOR_ID_HP, PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID,
PCI_CLASS_STORAGE_RAID << 8, 0xffff << 8, 0},
{0,} {0,}
}; };
...@@ -123,8 +127,6 @@ static struct board_type products[] = { ...@@ -123,8 +127,6 @@ static struct board_type products[] = {
{0x409D0E11, "Smart Array 6400 EM", &SA5_access}, {0x409D0E11, "Smart Array 6400 EM", &SA5_access},
{0x40910E11, "Smart Array 6i", &SA5_access}, {0x40910E11, "Smart Array 6i", &SA5_access},
{0x3225103C, "Smart Array P600", &SA5_access}, {0x3225103C, "Smart Array P600", &SA5_access},
{0x3223103C, "Smart Array P800", &SA5_access},
{0x3234103C, "Smart Array P400", &SA5_access},
{0x3235103C, "Smart Array P400i", &SA5_access}, {0x3235103C, "Smart Array P400i", &SA5_access},
{0x3211103C, "Smart Array E200i", &SA5_access}, {0x3211103C, "Smart Array E200i", &SA5_access},
{0x3212103C, "Smart Array E200", &SA5_access}, {0x3212103C, "Smart Array E200", &SA5_access},
...@@ -132,6 +134,10 @@ static struct board_type products[] = { ...@@ -132,6 +134,10 @@ static struct board_type products[] = {
{0x3214103C, "Smart Array E200i", &SA5_access}, {0x3214103C, "Smart Array E200i", &SA5_access},
{0x3215103C, "Smart Array E200i", &SA5_access}, {0x3215103C, "Smart Array E200i", &SA5_access},
{0x3237103C, "Smart Array E500", &SA5_access}, {0x3237103C, "Smart Array E500", &SA5_access},
/* controllers below this line are also supported by the hpsa driver. */
#define HPSA_BOUNDARY 0x3223103C
{0x3223103C, "Smart Array P800", &SA5_access},
{0x3234103C, "Smart Array P400", &SA5_access},
{0x323D103C, "Smart Array P700m", &SA5_access}, {0x323D103C, "Smart Array P700m", &SA5_access},
{0x3241103C, "Smart Array P212", &SA5_access}, {0x3241103C, "Smart Array P212", &SA5_access},
{0x3243103C, "Smart Array P410", &SA5_access}, {0x3243103C, "Smart Array P410", &SA5_access},
...@@ -140,7 +146,6 @@ static struct board_type products[] = { ...@@ -140,7 +146,6 @@ static struct board_type products[] = {
{0x3249103C, "Smart Array P812", &SA5_access}, {0x3249103C, "Smart Array P812", &SA5_access},
{0x324A103C, "Smart Array P712m", &SA5_access}, {0x324A103C, "Smart Array P712m", &SA5_access},
{0x324B103C, "Smart Array P711m", &SA5_access}, {0x324B103C, "Smart Array P711m", &SA5_access},
{0xFFFF103C, "Unknown Smart Array", &SA5_access},
}; };
/* How long to wait (in milliseconds) for board to go into simple mode */ /* How long to wait (in milliseconds) for board to go into simple mode */
...@@ -3754,7 +3759,27 @@ static int __devinit cciss_pci_init(ctlr_info_t *c, struct pci_dev *pdev) ...@@ -3754,7 +3759,27 @@ static int __devinit cciss_pci_init(ctlr_info_t *c, struct pci_dev *pdev)
__u64 cfg_offset; __u64 cfg_offset;
__u32 cfg_base_addr; __u32 cfg_base_addr;
__u64 cfg_base_addr_index; __u64 cfg_base_addr_index;
int i, err; int i, prod_index, err;
subsystem_vendor_id = pdev->subsystem_vendor;
subsystem_device_id = pdev->subsystem_device;
board_id = (((__u32) (subsystem_device_id << 16) & 0xffff0000) |
subsystem_vendor_id);
for (i = 0; i < ARRAY_SIZE(products); i++) {
/* Stand aside for hpsa driver on request */
if (cciss_allow_hpsa && products[i].board_id == HPSA_BOUNDARY)
return -ENODEV;
if (board_id == products[i].board_id)
break;
}
prod_index = i;
if (prod_index == ARRAY_SIZE(products)) {
dev_warn(&pdev->dev,
"unrecognized board ID: 0x%08lx, ignoring.\n",
(unsigned long) board_id);
return -ENODEV;
}
/* check to see if controller has been disabled */ /* check to see if controller has been disabled */
/* BEFORE trying to enable it */ /* BEFORE trying to enable it */
...@@ -3778,11 +3803,6 @@ static int __devinit cciss_pci_init(ctlr_info_t *c, struct pci_dev *pdev) ...@@ -3778,11 +3803,6 @@ static int __devinit cciss_pci_init(ctlr_info_t *c, struct pci_dev *pdev)
return err; return err;
} }
subsystem_vendor_id = pdev->subsystem_vendor;
subsystem_device_id = pdev->subsystem_device;
board_id = (((__u32) (subsystem_device_id << 16) & 0xffff0000) |
subsystem_vendor_id);
#ifdef CCISS_DEBUG #ifdef CCISS_DEBUG
printk("command = %x\n", command); printk("command = %x\n", command);
printk("irq = %x\n", pdev->irq); printk("irq = %x\n", pdev->irq);
...@@ -3868,14 +3888,9 @@ static int __devinit cciss_pci_init(ctlr_info_t *c, struct pci_dev *pdev) ...@@ -3868,14 +3888,9 @@ static int __devinit cciss_pci_init(ctlr_info_t *c, struct pci_dev *pdev)
* leave a little room for ioctl calls. * leave a little room for ioctl calls.
*/ */
c->max_commands = readl(&(c->cfgtable->CmdsOutMax)); c->max_commands = readl(&(c->cfgtable->CmdsOutMax));
for (i = 0; i < ARRAY_SIZE(products); i++) { c->product_name = products[prod_index].product_name;
if (board_id == products[i].board_id) { c->access = *(products[prod_index].access);
c->product_name = products[i].product_name;
c->access = *(products[i].access);
c->nr_cmds = c->max_commands - 4; c->nr_cmds = c->max_commands - 4;
break;
}
}
if ((readb(&c->cfgtable->Signature[0]) != 'C') || if ((readb(&c->cfgtable->Signature[0]) != 'C') ||
(readb(&c->cfgtable->Signature[1]) != 'I') || (readb(&c->cfgtable->Signature[1]) != 'I') ||
(readb(&c->cfgtable->Signature[2]) != 'S') || (readb(&c->cfgtable->Signature[2]) != 'S') ||
...@@ -3884,27 +3899,6 @@ static int __devinit cciss_pci_init(ctlr_info_t *c, struct pci_dev *pdev) ...@@ -3884,27 +3899,6 @@ static int __devinit cciss_pci_init(ctlr_info_t *c, struct pci_dev *pdev)
err = -ENODEV; err = -ENODEV;
goto err_out_free_res; goto err_out_free_res;
} }
/* We didn't find the controller in our list. We know the
* signature is valid. If it's an HP device let's try to
* bind to the device and fire it up. Otherwise we bail.
*/
if (i == ARRAY_SIZE(products)) {
if (subsystem_vendor_id == PCI_VENDOR_ID_HP) {
c->product_name = products[i-1].product_name;
c->access = *(products[i-1].access);
c->nr_cmds = c->max_commands - 4;
printk(KERN_WARNING "cciss: This is an unknown "
"Smart Array controller.\n"
"cciss: Please update to the latest driver "
"available from www.hp.com.\n");
} else {
printk(KERN_WARNING "cciss: Sorry, I don't know how"
" to access the Smart Array controller %08lx\n"
, (unsigned long)board_id);
err = -ENODEV;
goto err_out_free_res;
}
}
#ifdef CONFIG_X86 #ifdef CONFIG_X86
{ {
/* Need to enable prefetch in the SCSI core for 6400 in x86 */ /* Need to enable prefetch in the SCSI core for 6400 in x86 */
...@@ -4254,7 +4248,7 @@ static int __devinit cciss_init_one(struct pci_dev *pdev, ...@@ -4254,7 +4248,7 @@ static int __devinit cciss_init_one(struct pci_dev *pdev,
mutex_init(&hba[i]->busy_shutting_down); mutex_init(&hba[i]->busy_shutting_down);
if (cciss_pci_init(hba[i], pdev) != 0) if (cciss_pci_init(hba[i], pdev) != 0)
goto clean0; goto clean_no_release_regions;
sprintf(hba[i]->devname, "cciss%d", i); sprintf(hba[i]->devname, "cciss%d", i);
hba[i]->ctlr = i; hba[i]->ctlr = i;
...@@ -4391,13 +4385,14 @@ static int __devinit cciss_init_one(struct pci_dev *pdev, ...@@ -4391,13 +4385,14 @@ static int __devinit cciss_init_one(struct pci_dev *pdev,
clean1: clean1:
cciss_destroy_hba_sysfs_entry(hba[i]); cciss_destroy_hba_sysfs_entry(hba[i]);
clean0: clean0:
pci_release_regions(pdev);
clean_no_release_regions:
hba[i]->busy_initializing = 0; hba[i]->busy_initializing = 0;
/* /*
* Deliberately omit pci_disable_device(): it does something nasty to * Deliberately omit pci_disable_device(): it does something nasty to
* Smart Array controllers that pci_enable_device does not undo * Smart Array controllers that pci_enable_device does not undo
*/ */
pci_release_regions(pdev);
pci_set_drvdata(pdev, NULL); pci_set_drvdata(pdev, NULL);
free_hba(i); free_hba(i);
return -1; return -1;
......
...@@ -130,7 +130,7 @@ struct mapped_device { ...@@ -130,7 +130,7 @@ struct mapped_device {
/* /*
* A list of ios that arrived while we were suspended. * A list of ios that arrived while we were suspended.
*/ */
atomic_t pending; atomic_t pending[2];
wait_queue_head_t wait; wait_queue_head_t wait;
struct work_struct work; struct work_struct work;
struct bio_list deferred; struct bio_list deferred;
...@@ -453,13 +453,14 @@ static void start_io_acct(struct dm_io *io) ...@@ -453,13 +453,14 @@ static void start_io_acct(struct dm_io *io)
{ {
struct mapped_device *md = io->md; struct mapped_device *md = io->md;
int cpu; int cpu;
int rw = bio_data_dir(io->bio);
io->start_time = jiffies; io->start_time = jiffies;
cpu = part_stat_lock(); cpu = part_stat_lock();
part_round_stats(cpu, &dm_disk(md)->part0); part_round_stats(cpu, &dm_disk(md)->part0);
part_stat_unlock(); part_stat_unlock();
dm_disk(md)->part0.in_flight = atomic_inc_return(&md->pending); dm_disk(md)->part0.in_flight[rw] = atomic_inc_return(&md->pending[rw]);
} }
static void end_io_acct(struct dm_io *io) static void end_io_acct(struct dm_io *io)
...@@ -479,8 +480,9 @@ static void end_io_acct(struct dm_io *io) ...@@ -479,8 +480,9 @@ static void end_io_acct(struct dm_io *io)
* After this is decremented the bio must not be touched if it is * After this is decremented the bio must not be touched if it is
* a barrier. * a barrier.
*/ */
dm_disk(md)->part0.in_flight = pending = dm_disk(md)->part0.in_flight[rw] = pending =
atomic_dec_return(&md->pending); atomic_dec_return(&md->pending[rw]);
pending += atomic_read(&md->pending[rw^0x1]);
/* nudge anyone waiting on suspend queue */ /* nudge anyone waiting on suspend queue */
if (!pending) if (!pending)
...@@ -1785,7 +1787,8 @@ static struct mapped_device *alloc_dev(int minor) ...@@ -1785,7 +1787,8 @@ static struct mapped_device *alloc_dev(int minor)
if (!md->disk) if (!md->disk)
goto bad_disk; goto bad_disk;
atomic_set(&md->pending, 0); atomic_set(&md->pending[0], 0);
atomic_set(&md->pending[1], 0);
init_waitqueue_head(&md->wait); init_waitqueue_head(&md->wait);
INIT_WORK(&md->work, dm_wq_work); INIT_WORK(&md->work, dm_wq_work);
init_waitqueue_head(&md->eventq); init_waitqueue_head(&md->eventq);
...@@ -2088,7 +2091,8 @@ static int dm_wait_for_completion(struct mapped_device *md, int interruptible) ...@@ -2088,7 +2091,8 @@ static int dm_wait_for_completion(struct mapped_device *md, int interruptible)
break; break;
} }
spin_unlock_irqrestore(q->queue_lock, flags); spin_unlock_irqrestore(q->queue_lock, flags);
} else if (!atomic_read(&md->pending)) } else if (!atomic_read(&md->pending[0]) &&
!atomic_read(&md->pending[1]))
break; break;
if (interruptible == TASK_INTERRUPTIBLE && if (interruptible == TASK_INTERRUPTIBLE &&
......
...@@ -248,11 +248,19 @@ ssize_t part_stat_show(struct device *dev, ...@@ -248,11 +248,19 @@ ssize_t part_stat_show(struct device *dev,
part_stat_read(p, merges[WRITE]), part_stat_read(p, merges[WRITE]),
(unsigned long long)part_stat_read(p, sectors[WRITE]), (unsigned long long)part_stat_read(p, sectors[WRITE]),
jiffies_to_msecs(part_stat_read(p, ticks[WRITE])), jiffies_to_msecs(part_stat_read(p, ticks[WRITE])),
p->in_flight, part_in_flight(p),
jiffies_to_msecs(part_stat_read(p, io_ticks)), jiffies_to_msecs(part_stat_read(p, io_ticks)),
jiffies_to_msecs(part_stat_read(p, time_in_queue))); jiffies_to_msecs(part_stat_read(p, time_in_queue)));
} }
ssize_t part_inflight_show(struct device *dev,
struct device_attribute *attr, char *buf)
{
struct hd_struct *p = dev_to_part(dev);
return sprintf(buf, "%8u %8u\n", p->in_flight[0], p->in_flight[1]);
}
#ifdef CONFIG_FAIL_MAKE_REQUEST #ifdef CONFIG_FAIL_MAKE_REQUEST
ssize_t part_fail_show(struct device *dev, ssize_t part_fail_show(struct device *dev,
struct device_attribute *attr, char *buf) struct device_attribute *attr, char *buf)
...@@ -281,6 +289,7 @@ static DEVICE_ATTR(start, S_IRUGO, part_start_show, NULL); ...@@ -281,6 +289,7 @@ static DEVICE_ATTR(start, S_IRUGO, part_start_show, NULL);
static DEVICE_ATTR(size, S_IRUGO, part_size_show, NULL); static DEVICE_ATTR(size, S_IRUGO, part_size_show, NULL);
static DEVICE_ATTR(alignment_offset, S_IRUGO, part_alignment_offset_show, NULL); static DEVICE_ATTR(alignment_offset, S_IRUGO, part_alignment_offset_show, NULL);
static DEVICE_ATTR(stat, S_IRUGO, part_stat_show, NULL); static DEVICE_ATTR(stat, S_IRUGO, part_stat_show, NULL);
static DEVICE_ATTR(inflight, S_IRUGO, part_inflight_show, NULL);
#ifdef CONFIG_FAIL_MAKE_REQUEST #ifdef CONFIG_FAIL_MAKE_REQUEST
static struct device_attribute dev_attr_fail = static struct device_attribute dev_attr_fail =
__ATTR(make-it-fail, S_IRUGO|S_IWUSR, part_fail_show, part_fail_store); __ATTR(make-it-fail, S_IRUGO|S_IWUSR, part_fail_show, part_fail_store);
...@@ -292,6 +301,7 @@ static struct attribute *part_attrs[] = { ...@@ -292,6 +301,7 @@ static struct attribute *part_attrs[] = {
&dev_attr_size.attr, &dev_attr_size.attr,
&dev_attr_alignment_offset.attr, &dev_attr_alignment_offset.attr,
&dev_attr_stat.attr, &dev_attr_stat.attr,
&dev_attr_inflight.attr,
#ifdef CONFIG_FAIL_MAKE_REQUEST #ifdef CONFIG_FAIL_MAKE_REQUEST
&dev_attr_fail.attr, &dev_attr_fail.attr,
#endif #endif
......
...@@ -1172,11 +1172,7 @@ static inline void put_dev_sector(Sector p) ...@@ -1172,11 +1172,7 @@ static inline void put_dev_sector(Sector p)
} }
struct work_struct; struct work_struct;
struct delayed_work;
int kblockd_schedule_work(struct request_queue *q, struct work_struct *work); int kblockd_schedule_work(struct request_queue *q, struct work_struct *work);
int kblockd_schedule_delayed_work(struct request_queue *q,
struct delayed_work *work,
unsigned long delay);
#define MODULE_ALIAS_BLOCKDEV(major,minor) \ #define MODULE_ALIAS_BLOCKDEV(major,minor) \
MODULE_ALIAS("block-major-" __stringify(major) "-" __stringify(minor)) MODULE_ALIAS("block-major-" __stringify(major) "-" __stringify(minor))
......
...@@ -98,7 +98,7 @@ struct hd_struct { ...@@ -98,7 +98,7 @@ struct hd_struct {
int make_it_fail; int make_it_fail;
#endif #endif
unsigned long stamp; unsigned long stamp;
int in_flight; int in_flight[2];
#ifdef CONFIG_SMP #ifdef CONFIG_SMP
struct disk_stats *dkstats; struct disk_stats *dkstats;
#else #else
...@@ -322,18 +322,23 @@ static inline void free_part_stats(struct hd_struct *part) ...@@ -322,18 +322,23 @@ static inline void free_part_stats(struct hd_struct *part)
#define part_stat_sub(cpu, gendiskp, field, subnd) \ #define part_stat_sub(cpu, gendiskp, field, subnd) \
part_stat_add(cpu, gendiskp, field, -subnd) part_stat_add(cpu, gendiskp, field, -subnd)
static inline void part_inc_in_flight(struct hd_struct *part) static inline void part_inc_in_flight(struct hd_struct *part, int rw)
{ {
part->in_flight++; part->in_flight[rw]++;
if (part->partno) if (part->partno)
part_to_disk(part)->part0.in_flight++; part_to_disk(part)->part0.in_flight[rw]++;
} }
static inline void part_dec_in_flight(struct hd_struct *part) static inline void part_dec_in_flight(struct hd_struct *part, int rw)
{ {
part->in_flight--; part->in_flight[rw]--;
if (part->partno) if (part->partno)
part_to_disk(part)->part0.in_flight--; part_to_disk(part)->part0.in_flight[rw]--;
}
static inline int part_in_flight(struct hd_struct *part)
{
return part->in_flight[0] + part->in_flight[1];
} }
/* block/blk-core.c */ /* block/blk-core.c */
...@@ -546,6 +551,8 @@ extern ssize_t part_size_show(struct device *dev, ...@@ -546,6 +551,8 @@ extern ssize_t part_size_show(struct device *dev,
struct device_attribute *attr, char *buf); struct device_attribute *attr, char *buf);
extern ssize_t part_stat_show(struct device *dev, extern ssize_t part_stat_show(struct device *dev,
struct device_attribute *attr, char *buf); struct device_attribute *attr, char *buf);
extern ssize_t part_inflight_show(struct device *dev,
struct device_attribute *attr, char *buf);
#ifdef CONFIG_FAIL_MAKE_REQUEST #ifdef CONFIG_FAIL_MAKE_REQUEST
extern ssize_t part_fail_show(struct device *dev, extern ssize_t part_fail_show(struct device *dev,
struct device_attribute *attr, char *buf); struct device_attribute *attr, char *buf);
......
...@@ -6720,9 +6720,6 @@ EXPORT_SYMBOL(yield); ...@@ -6720,9 +6720,6 @@ EXPORT_SYMBOL(yield);
/* /*
* This task is about to go to sleep on IO. Increment rq->nr_iowait so * This task is about to go to sleep on IO. Increment rq->nr_iowait so
* that process accounting knows that this is a task in IO wait state. * that process accounting knows that this is a task in IO wait state.
*
* But don't do that if it is a deliberate, throttling IO wait (this task
* has set its backing_dev_info: the queue against which it should throttle)
*/ */
void __sched io_schedule(void) void __sched io_schedule(void)
{ {
......
...@@ -92,7 +92,7 @@ static int bdi_debug_stats_show(struct seq_file *m, void *v) ...@@ -92,7 +92,7 @@ static int bdi_debug_stats_show(struct seq_file *m, void *v)
"BdiDirtyThresh: %8lu kB\n" "BdiDirtyThresh: %8lu kB\n"
"DirtyThresh: %8lu kB\n" "DirtyThresh: %8lu kB\n"
"BackgroundThresh: %8lu kB\n" "BackgroundThresh: %8lu kB\n"
"WriteBack threads:%8lu\n" "WritebackThreads: %8lu\n"
"b_dirty: %8lu\n" "b_dirty: %8lu\n"
"b_io: %8lu\n" "b_io: %8lu\n"
"b_more_io: %8lu\n" "b_more_io: %8lu\n"
......
...@@ -566,7 +566,8 @@ static void balance_dirty_pages(struct address_space *mapping, ...@@ -566,7 +566,8 @@ static void balance_dirty_pages(struct address_space *mapping,
if (pages_written >= write_chunk) if (pages_written >= write_chunk)
break; /* We've done our duty */ break; /* We've done our duty */
schedule_timeout_interruptible(pause); __set_current_state(TASK_INTERRUPTIBLE);
io_schedule_timeout(pause);
/* /*
* Increase the delay for each loop, up to our previous * Increase the delay for each loop, up to our previous
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment