drbd: Consider that bio->bi_bdev might be modified below DRBD
authorPhilipp Reisner <philipp.reisner@linbit.com>
Wed, 7 Mar 2012 12:41:52 +0000 (13:41 +0100)
committerPhilipp Reisner <philipp.reisner@linbit.com>
Thu, 8 Nov 2012 15:58:17 +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_req.c

index bfd14bc9693d4bfce94b6b60552d8a54c9f8ecdc..3e4dc070d3ff5070c7d8962d8810bf8795752f02 100644 (file)
@@ -1154,7 +1154,6 @@ void request_timer_fn(unsigned long data)
        struct drbd_conf *mdev = (struct drbd_conf *) data;
        struct drbd_tconn *tconn = mdev->tconn;
        struct drbd_request *req; /* oldest request */
-       struct block_device *bdev;
        struct list_head *le;
        struct net_conf *nc;
        unsigned long ent = 0, dt = 0, et, nt; /* effective timeout = ko_count * timeout */
@@ -1165,7 +1164,6 @@ void request_timer_fn(unsigned long data)
 
        if (get_ldev(mdev)) {
                dt = rcu_dereference(mdev->ldev->disk_conf)->disk_timeout * HZ / 10;
-               bdev = mdev->ldev->backing_bdev;
                put_ldev(mdev);
        }
        rcu_read_unlock();
@@ -1191,7 +1189,7 @@ void request_timer_fn(unsigned long data)
                        _drbd_set_state(_NS(mdev, conn, C_TIMEOUT), CS_VERBOSE | CS_HARD, NULL);
                }
        }
-       if (dt && req->rq_state & RQ_LOCAL_PENDING && req->private_bio->bi_bdev == bdev) {
+       if (dt && req->rq_state & RQ_LOCAL_PENDING && req->w.mdev == mdev) {
                if (time_is_before_eq_jiffies(req->start_time + dt)) {
                        dev_warn(DEV, "Local backing device failed to meet the disk-timeout\n");
                        __drbd_chk_io_error(mdev, 1);