diff --git a/block/blk-core.c b/block/blk-core.c
index 36c7ac3..e6710e4 100644
--- a/block/blk-core.c
+++ b/block/blk-core.c
@@ -2232,7 +2232,8 @@ unsigned int blk_rq_err_bytes(const struct request *rq)
 }
 EXPORT_SYMBOL_GPL(blk_rq_err_bytes);
 
-void blk_account_io_completion(struct request *req, unsigned int bytes)
+void blk_account_io_completion(struct request *req, int io_err,
+			       unsigned int bytes)
 {
 	if (blk_do_io_stat(req)) {
 		const int rw = rq_data_dir(req);
@@ -2242,6 +2243,8 @@ void blk_account_io_completion(struct request *req, unsigned int bytes)
 		cpu = part_stat_lock();
 		part = req->part;
 		part_stat_add(cpu, part, sectors[rw], bytes >> 9);
+		if (io_err)
+			part_stat_inc(cpu, part, io_errors);
 		part_stat_unlock();
 	}
 }
@@ -2539,6 +2542,7 @@ EXPORT_SYMBOL(blk_fetch_request);
 bool blk_update_request(struct request *req, int error, unsigned int nr_bytes)
 {
 	int total_bytes;
+	int io_error = 0;
 
 	trace_block_rq_complete(req->q, req, nr_bytes);
 
@@ -2588,10 +2592,11 @@ bool blk_update_request(struct request *req, int error, unsigned int nr_bytes)
 				   __func__, error_type, req->rq_disk ?
 				   req->rq_disk->disk_name : "?",
 				   (unsigned long long)blk_rq_pos(req));
+		io_error = 1;
 
 	}
 
-	blk_account_io_completion(req, nr_bytes);
+	blk_account_io_completion(req, io_error, nr_bytes);
 
 	total_bytes = 0;
 	while (req->bio) {
diff --git a/block/blk.h b/block/blk.h
index c37492f..b3fd394 100644
--- a/block/blk.h
+++ b/block/blk.h
@@ -107,7 +107,8 @@ bool blk_attempt_plug_merge(struct request_queue *q, struct bio *bio,
 unsigned int blk_plug_queued_count(struct request_queue *q);
 
 void blk_account_io_start(struct request *req, bool new_io);
-void blk_account_io_completion(struct request *req, unsigned int bytes);
+void blk_account_io_completion(struct request *req, int io_err,
+			       unsigned int bytes);
 void blk_account_io_done(struct request *req);
 
 /*
diff --git a/block/partition-generic.c b/block/partition-generic.c
index 71d9ed9..0814ccb 100644
--- a/block/partition-generic.c
+++ b/block/partition-generic.c
@@ -121,7 +121,7 @@ ssize_t part_stat_show(struct device *dev,
 	return sprintf(buf,
 		"%8lu %8lu %8llu %8u "
 		"%8lu %8lu %8llu %8u "
-		"%8u %8u %8u"
+		"%8u %8u %8u %8lu"
 		"\n",
 		part_stat_read(p, ios[READ]),
 		part_stat_read(p, merges[READ]),
@@ -133,7 +133,8 @@ ssize_t part_stat_show(struct device *dev,
 		jiffies_to_msecs(part_stat_read(p, ticks[WRITE])),
 		part_in_flight(p),
 		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)),
+		part_stat_read(p, io_errors));
 }
 
 ssize_t part_inflight_show(struct device *dev,
diff --git a/include/linux/genhd.h b/include/linux/genhd.h
index 1dbf52f..1de7a30 100644
--- a/include/linux/genhd.h
+++ b/include/linux/genhd.h
@@ -87,6 +87,7 @@ struct disk_stats {
 	unsigned long ticks[2];
 	unsigned long io_ticks;
 	unsigned long time_in_queue;
+	unsigned long io_errors;
 };
 
 #define PARTITION_META_INFO_VOLNAMELTH	64
