|
@@ -1148,7 +1148,6 @@ extern int drbd_bitmap_io_from_worker(struct drbd_conf *mdev,
|
|
char *why, enum bm_flag flags);
|
|
char *why, enum bm_flag flags);
|
|
extern int drbd_bmio_set_n_write(struct drbd_conf *mdev);
|
|
extern int drbd_bmio_set_n_write(struct drbd_conf *mdev);
|
|
extern int drbd_bmio_clear_n_write(struct drbd_conf *mdev);
|
|
extern int drbd_bmio_clear_n_write(struct drbd_conf *mdev);
|
|
-extern void drbd_go_diskless(struct drbd_conf *mdev);
|
|
|
|
extern void drbd_ldev_destroy(struct drbd_conf *mdev);
|
|
extern void drbd_ldev_destroy(struct drbd_conf *mdev);
|
|
|
|
|
|
/* Meta data layout
|
|
/* Meta data layout
|
|
@@ -2053,9 +2052,11 @@ static inline void put_ldev(struct drbd_conf *mdev)
|
|
if (mdev->state.disk == D_DISKLESS)
|
|
if (mdev->state.disk == D_DISKLESS)
|
|
/* even internal references gone, safe to destroy */
|
|
/* even internal references gone, safe to destroy */
|
|
drbd_ldev_destroy(mdev);
|
|
drbd_ldev_destroy(mdev);
|
|
- if (mdev->state.disk == D_FAILED)
|
|
|
|
|
|
+ if (mdev->state.disk == D_FAILED) {
|
|
/* all application IO references gone. */
|
|
/* all application IO references gone. */
|
|
- drbd_go_diskless(mdev);
|
|
|
|
|
|
+ if (!test_and_set_bit(GO_DISKLESS, &mdev->flags))
|
|
|
|
+ drbd_queue_work(&mdev->tconn->sender_work, &mdev->go_diskless);
|
|
|
|
+ }
|
|
wake_up(&mdev->misc_wait);
|
|
wake_up(&mdev->misc_wait);
|
|
}
|
|
}
|
|
}
|
|
}
|