drbd: New minors have to intherit the connection state form their connection
authorPhilipp Reisner <philipp.reisner@linbit.com>
Tue, 15 Mar 2011 15:56:18 +0000 (16:56 +0100)
committerPhilipp Reisner <philipp.reisner@linbit.com>
Sat, 3 Nov 2012 23:16:25 +0000 (00:16 +0100)
Signed-off-by: Philipp Reisner <philipp.reisner@linbit.com>
Signed-off-by: Lars Ellenberg <lars.ellenberg@linbit.com>
drivers/block/drbd/drbd_int.h
drivers/block/drbd/drbd_main.c
drivers/block/drbd/drbd_receiver.c
drivers/block/drbd/drbd_state.c

index 5fa7ba0..278e7ac 100644 (file)
@@ -1595,6 +1595,7 @@ extern void _drbd_wait_ee_list_empty(struct drbd_conf *mdev,
 extern void drbd_set_recv_tcq(struct drbd_conf *mdev, int tcq_enabled);
 extern void _drbd_clear_done_ee(struct drbd_conf *mdev, struct list_head *to_be_freed);
 extern void conn_flush_workqueue(struct drbd_tconn *tconn);
+extern int drbd_connected(int vnr, void *p, void *data);
 static inline void drbd_flush_workqueue(struct drbd_conf *mdev)
 {
        conn_flush_workqueue(mdev->tconn);
index 40b7b93..79a0e04 100644 (file)
@@ -2410,6 +2410,11 @@ enum drbd_ret_code conn_new_minor(struct drbd_tconn *tconn, unsigned int minor,
        }
        add_disk(disk);
 
+       /* inherit the connection state */
+       mdev->state.conn = tconn->cstate;
+       if (mdev->state.conn == C_WF_REPORT_PARAMS)
+               drbd_connected(vnr, mdev, tconn);
+
        return NO_ERROR;
 
 out_idr_remove_vol:
index 3c739ab..54f45fc 100644 (file)
@@ -744,8 +744,9 @@ static int drbd_socket_okay(struct socket **sock)
                return false;
        }
 }
-
-static int drbd_connected(int vnr, void *p, void *data)
+/* Gets called if a connection is established, or if a new minor gets created
+   in a connection */
+int drbd_connected(int vnr, void *p, void *data)
 {
        struct drbd_conf *mdev = (struct drbd_conf *)p;
        int ok = 1;
index 0db6c43..886b996 100644 (file)
@@ -432,8 +432,8 @@ is_valid_soft_transition(union drbd_state os, union drbd_state ns)
        if (ns.conn == C_DISCONNECTING && os.conn == C_UNCONNECTED)
                rv = SS_IN_TRANSIENT_STATE;
 
-       if (ns.conn == os.conn && ns.conn == C_WF_REPORT_PARAMS)
-               rv = SS_IN_TRANSIENT_STATE;
+       /* if (ns.conn == os.conn && ns.conn == C_WF_REPORT_PARAMS)
+          rv = SS_IN_TRANSIENT_STATE; */
 
        if ((ns.conn == C_VERIFY_S || ns.conn == C_VERIFY_T) && os.conn < C_CONNECTED)
                rv = SS_NEED_CONNECTION;