Переглянути джерело

drbd: detach must not try to abort non-local requests

Signed-off-by: Philipp Reisner <philipp.reisner@linbit.com>
Signed-off-by: Lars Ellenberg <lars.ellenberg@linbit.com>
Lars Ellenberg 14 роки тому
батько
коміт
97ddb68790
2 змінених файлів з 6 додано та 0 видалено
  1. 4 0
      drivers/block/drbd/drbd_main.c
  2. 2 0
      drivers/block/drbd/drbd_req.c

+ 4 - 0
drivers/block/drbd/drbd_main.c

@@ -501,6 +501,8 @@ void tl_abort_disk_io(struct drbd_conf *mdev)
 	while (b) {
 		list_for_each_safe(le, tle, &b->requests) {
 			req = list_entry(le, struct drbd_request, tl_requests);
+			if (!(req->rq_state & RQ_LOCAL_PENDING))
+				continue;
 			if (req->w.mdev == mdev)
 				_req_mod(req, ABORT_DISK_IO);
 		}
@@ -509,6 +511,8 @@ void tl_abort_disk_io(struct drbd_conf *mdev)
 
 	list_for_each_safe(le, tle, &tconn->barrier_acked_requests) {
 		req = list_entry(le, struct drbd_request, tl_requests);
+		if (!(req->rq_state & RQ_LOCAL_PENDING))
+			continue;
 		if (req->w.mdev == mdev)
 			_req_mod(req, ABORT_DISK_IO);
 	}

+ 2 - 0
drivers/block/drbd/drbd_req.c

@@ -436,6 +436,7 @@ int __req_mod(struct drbd_request *req, enum drbd_req_event what,
 
 		/* so we can verify the handle in the answer packet
 		 * corresponding hlist_del is in _req_may_be_done() */
+		D_ASSERT(drbd_interval_empty(&req->i));
 		drbd_insert_interval(&mdev->read_requests, &req->i);
 
 		set_bit(UNPLUG_REMOTE, &mdev->flags);
@@ -453,6 +454,7 @@ int __req_mod(struct drbd_request *req, enum drbd_req_event what,
 		/* from __drbd_make_request only */
 
 		/* corresponding hlist_del is in _req_may_be_done() */
+		D_ASSERT(drbd_interval_empty(&req->i));
 		drbd_insert_interval(&mdev->write_requests, &req->i);
 
 		/* NOTE