drbd: log request sector offset and size for IO errors
Signed-off-by: Philipp Reisner <philipp.reisner@linbit.com> Signed-off-by: Lars Ellenberg <lars.ellenberg@linbit.com>
This commit is contained in:
parent
edc9f5eb7a
commit
42839f6536
@ -425,6 +425,20 @@ static void mod_rq_state(struct drbd_request *req, struct bio_and_error *m,
|
|||||||
kref_sub(&req->kref, k_put, drbd_req_destroy);
|
kref_sub(&req->kref, k_put, drbd_req_destroy);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void drbd_report_io_error(struct drbd_conf *mdev, struct drbd_request *req)
|
||||||
|
{
|
||||||
|
char b[BDEVNAME_SIZE];
|
||||||
|
|
||||||
|
if (!__ratelimit(&drbd_ratelimit_state))
|
||||||
|
return;
|
||||||
|
|
||||||
|
dev_warn(DEV, "local %s IO error sector %llu+%u on %s\n",
|
||||||
|
(req->rq_state & RQ_WRITE) ? "WRITE" : "READ",
|
||||||
|
(unsigned long long)req->i.sector,
|
||||||
|
req->i.size >> 9,
|
||||||
|
bdevname(mdev->ldev->backing_bdev, b));
|
||||||
|
}
|
||||||
|
|
||||||
/* obviously this could be coded as many single functions
|
/* obviously this could be coded as many single functions
|
||||||
* instead of one huge switch,
|
* instead of one huge switch,
|
||||||
* or by putting the code directly in the respective locations
|
* or by putting the code directly in the respective locations
|
||||||
@ -493,12 +507,14 @@ int __req_mod(struct drbd_request *req, enum drbd_req_event what,
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case WRITE_COMPLETED_WITH_ERROR:
|
case WRITE_COMPLETED_WITH_ERROR:
|
||||||
|
drbd_report_io_error(mdev, req);
|
||||||
__drbd_chk_io_error(mdev, DRBD_WRITE_ERROR);
|
__drbd_chk_io_error(mdev, DRBD_WRITE_ERROR);
|
||||||
mod_rq_state(req, m, RQ_LOCAL_PENDING, RQ_LOCAL_COMPLETED);
|
mod_rq_state(req, m, RQ_LOCAL_PENDING, RQ_LOCAL_COMPLETED);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case READ_COMPLETED_WITH_ERROR:
|
case READ_COMPLETED_WITH_ERROR:
|
||||||
drbd_set_out_of_sync(mdev, req->i.sector, req->i.size);
|
drbd_set_out_of_sync(mdev, req->i.sector, req->i.size);
|
||||||
|
drbd_report_io_error(mdev, req);
|
||||||
__drbd_chk_io_error(mdev, DRBD_READ_ERROR);
|
__drbd_chk_io_error(mdev, DRBD_READ_ERROR);
|
||||||
/* fall through. */
|
/* fall through. */
|
||||||
case READ_AHEAD_COMPLETED_WITH_ERROR:
|
case READ_AHEAD_COMPLETED_WITH_ERROR:
|
||||||
@ -1108,7 +1124,8 @@ void __drbd_make_request(struct drbd_conf *mdev, struct bio *bio, unsigned long
|
|||||||
} else if (no_remote) {
|
} else if (no_remote) {
|
||||||
nodata:
|
nodata:
|
||||||
if (__ratelimit(&drbd_ratelimit_state))
|
if (__ratelimit(&drbd_ratelimit_state))
|
||||||
dev_err(DEV, "IO ERROR: neither local nor remote disk\n");
|
dev_err(DEV, "IO ERROR: neither local nor remote data, sector %llu+%u\n",
|
||||||
|
(unsigned long long)req->i.sector, req->i.size >> 9);
|
||||||
/* A write may have been queued for send_oos, however.
|
/* A write may have been queued for send_oos, however.
|
||||||
* So we can not simply free it, we must go through drbd_req_put_completion_ref() */
|
* So we can not simply free it, we must go through drbd_req_put_completion_ref() */
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user