On Fri, Sep 03, 2010 at 11:35:00AM -0700, Ryan Cooley wrote:
> On Fri, 3 Sep 2010 18:32:03 +0200
> Lars Ellenberg <lars.ellenb...@linbit.com> wrote:
> 
> > Too bad. It was much easier if it was reproducible.
> 
> I reported a similar and consistently reproducable bug:
> 
>   http://bugs.centos.org/view.php?id=4343

That's something different.
Note that your trace shows
     lc_find
     drbd_rs_complete_io
     got_OVResult
     drbd_asender

Whereas Michael and Roland have something in
w_e_end_ov_req from drbd_worker.


As it is easy to reproduce, it was easy to fix.
At least I hope so:

diff --git a/drbd/drbd_receiver.c b/drbd/drbd_receiver.c
index 9717102..77c2523 100644
--- a/drbd/drbd_receiver.c
+++ b/drbd/drbd_receiver.c
@@ -4300,10 +4300,13 @@ STATIC int got_IsInSync(struct drbd_conf *mdev, struct 
p_header80 *h)
 
        update_peer_seq(mdev, be32_to_cpu(p->seq_num));
 
-       drbd_rs_complete_io(mdev, sector);
-       drbd_set_in_sync(mdev, sector, blksize);
-       /* rs_same_csums is supposed to count in units of BM_BLOCK_SIZE */
-       mdev->rs_same_csum += (blksize >> BM_BLOCK_SHIFT);
+       if (get_ldev(mdev)) {
+               drbd_rs_complete_io(mdev, sector);
+               drbd_set_in_sync(mdev, sector, blksize);
+               /* rs_same_csums is supposed to count in units of BM_BLOCK_SIZE 
*/
+               mdev->rs_same_csum += (blksize >> BM_BLOCK_SHIFT);
+               put_ldev(mdev);
+       }
        dec_rs_pending(mdev);
        atomic_add(blksize >> 9, &mdev->rs_sect_in);
 
@@ -4482,6 +4485,9 @@ STATIC int got_OVResult(struct drbd_conf *mdev, struct 
p_header80 *h)
        else
                ov_oos_print(mdev);
 
+       if (!get_ldev(mdev))
+               return TRUE;
+
        drbd_rs_complete_io(mdev, sector);
        dec_rs_pending(mdev);
 
@@ -4496,6 +4502,7 @@ STATIC int got_OVResult(struct drbd_conf *mdev, struct 
p_header80 *h)
                        drbd_resync_finished(mdev);
                }
        }
+       put_ldev(mdev);
        return TRUE;
 }
 
diff --git a/drbd/drbd_worker.c b/drbd/drbd_worker.c
index 6e6ce0e..7acd841 100644
--- a/drbd/drbd_worker.c
+++ b/drbd/drbd_worker.c
@@ -1053,7 +1053,10 @@ int w_e_end_csum_rs_req(struct drbd_conf *mdev, struct 
drbd_work *w, int cancel)
                return 1;
        }
 
-       drbd_rs_complete_io(mdev, e->sector);
+       if (get_ldev(mdev)) {
+               drbd_rs_complete_io(mdev, e->sector);
+               put_ldev(mdev);
+       }
 
        di = e->digest;
 
@@ -1160,7 +1163,10 @@ int w_e_end_ov_reply(struct drbd_conf *mdev, struct 
drbd_work *w, int cancel)
 
        /* after "cancel", because after drbd_disconnect/drbd_rs_cancel_all
         * the resync lru has been cleaned up already */
-       drbd_rs_complete_io(mdev, e->sector);
+       if (get_ldev(mdev)) {
+               drbd_rs_complete_io(mdev, e->sector);
+               put_ldev(mdev);
+       }
 
        di = e->digest;
 
-- 
: Lars Ellenberg
: LINBIT | Your Way to High Availability
: DRBD/HA support and consulting http://www.linbit.com

DRBD® and LINBIT® are registered trademarks of LINBIT, Austria.
__
please don't Cc me, but send to list   --   I'm subscribed
_______________________________________________
drbd-user mailing list
drbd-user@lists.linbit.com
http://lists.linbit.com/mailman/listinfo/drbd-user

Reply via email to