drbd: detach must not try to abort non-local requests
authorLars Ellenberg <lars.ellenberg@linbit.com>
Fri, 15 Jul 2011 21:52:44 +0000 (23:52 +0200)
committerPhilipp Reisner <philipp.reisner@linbit.com>
Thu, 8 Nov 2012 15:58:00 +0000 (16:58 +0100)
Signed-off-by: Philipp Reisner <philipp.reisner@linbit.com>
Signed-off-by: Lars Ellenberg <lars.ellenberg@linbit.com>
drivers/block/drbd/drbd_main.c
drivers/block/drbd/drbd_req.c

index 2090b78..edd0227 100644 (file)
@@ -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);
        }
index d0f73b3..60fc186 100644 (file)
@@ -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