Commit ccae7868 authored by Lars Ellenberg's avatar Lars Ellenberg Committed by Jens Axboe

drbd: log request sector offset and size for IO errors

Signed-off-by: default avatarPhilipp Reisner <philipp.reisner@linbit.com>
Signed-off-by: default avatarLars Ellenberg <lars.ellenberg@linbit.com>
Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
parent a2a3c74f
...@@ -387,6 +387,20 @@ static int _req_conflicts(struct drbd_request *req) ...@@ -387,6 +387,20 @@ static int _req_conflicts(struct drbd_request *req)
return 1; return 1;
} }
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->sector,
req->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
...@@ -455,6 +469,7 @@ int __req_mod(struct drbd_request *req, enum drbd_req_event what, ...@@ -455,6 +469,7 @@ int __req_mod(struct drbd_request *req, enum drbd_req_event what,
req->rq_state |= RQ_LOCAL_COMPLETED; req->rq_state |= RQ_LOCAL_COMPLETED;
req->rq_state &= ~RQ_LOCAL_PENDING; req->rq_state &= ~RQ_LOCAL_PENDING;
drbd_report_io_error(mdev, req);
__drbd_chk_io_error(mdev, DRBD_WRITE_ERROR); __drbd_chk_io_error(mdev, DRBD_WRITE_ERROR);
_req_may_be_done_not_susp(req, m); _req_may_be_done_not_susp(req, m);
break; break;
...@@ -477,6 +492,7 @@ int __req_mod(struct drbd_request *req, enum drbd_req_event what, ...@@ -477,6 +492,7 @@ int __req_mod(struct drbd_request *req, enum drbd_req_event what,
break; break;
} }
drbd_report_io_error(mdev, req);
__drbd_chk_io_error(mdev, DRBD_READ_ERROR); __drbd_chk_io_error(mdev, DRBD_READ_ERROR);
goto_queue_for_net_read: goto_queue_for_net_read:
...@@ -900,7 +916,8 @@ static int drbd_make_request_common(struct drbd_conf *mdev, struct bio *bio, uns ...@@ -900,7 +916,8 @@ static int drbd_make_request_common(struct drbd_conf *mdev, struct bio *bio, uns
if (!(local || remote) && !is_susp(mdev->state)) { if (!(local || remote) && !is_susp(mdev->state)) {
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->sector, req->size >> 9);
goto fail_free_complete; goto fail_free_complete;
} }
......
...@@ -53,7 +53,7 @@ ...@@ -53,7 +53,7 @@
extern const char *drbd_buildtag(void); extern const char *drbd_buildtag(void);
#define REL_VERSION "8.3.13" #define REL_VERSION "8.3.14"
#define API_VERSION 88 #define API_VERSION 88
#define PRO_VERSION_MIN 86 #define PRO_VERSION_MIN 86
#define PRO_VERSION_MAX 97 #define PRO_VERSION_MAX 97
......
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