drbd: Fix postponed requests
authorPhilipp Reisner <philipp.reisner@linbit.com>
Wed, 29 Aug 2012 13:23:14 +0000 (15:23 +0200)
committerPhilipp Reisner <philipp.reisner@linbit.com>
Fri, 9 Nov 2012 13:11:37 +0000 (14:11 +0100)
A postponed request might has RQ_IN_ACT_LOG already set, but
is POSTPONED before it gets something in the RQ_LOCAL_MASK
set. Up to now this caused a left-over active extent.

Fix that by only testing for the RQ_IN_ACT_LOG bit in drbd_req_destroy()

Signed-off-by: Philipp Reisner <philipp.reisner@linbit.com>
Signed-off-by: Lars Ellenberg <lars.ellenberg@linbit.com>
drivers/block/drbd/drbd_req.c

index 57cbef2..d1d17fc 100644 (file)
@@ -141,10 +141,9 @@ void drbd_req_destroy(struct kref *kref)
                 * but after the extent has been dropped from the al,
                 * we would forget to resync the corresponding extent.
                 */
-               if (s & RQ_LOCAL_MASK) {
+               if (s & RQ_IN_ACT_LOG) {
                        if (get_ldev_if_state(mdev, D_FAILED)) {
-                               if (s & RQ_IN_ACT_LOG)
-                                       drbd_al_complete_io(mdev, &req->i);
+                               drbd_al_complete_io(mdev, &req->i);
                                put_ldev(mdev);
                        } else if (__ratelimit(&drbd_ratelimit_state)) {
                                dev_warn(DEV, "Should have called drbd_al_complete_io(, %llu, %u), "