|
@@ -4614,7 +4614,7 @@ static int nla_put_notification_header(struct sk_buff *msg,
|
|
|
return drbd_notification_header_to_skb(msg, &nh, true);
|
|
|
}
|
|
|
|
|
|
-void notify_resource_state(struct sk_buff *skb,
|
|
|
+int notify_resource_state(struct sk_buff *skb,
|
|
|
unsigned int seq,
|
|
|
struct drbd_resource *resource,
|
|
|
struct resource_info *resource_info,
|
|
@@ -4656,16 +4656,17 @@ void notify_resource_state(struct sk_buff *skb,
|
|
|
if (err && err != -ESRCH)
|
|
|
goto failed;
|
|
|
}
|
|
|
- return;
|
|
|
+ return 0;
|
|
|
|
|
|
nla_put_failure:
|
|
|
nlmsg_free(skb);
|
|
|
failed:
|
|
|
drbd_err(resource, "Error %d while broadcasting event. Event seq:%u\n",
|
|
|
err, seq);
|
|
|
+ return err;
|
|
|
}
|
|
|
|
|
|
-void notify_device_state(struct sk_buff *skb,
|
|
|
+int notify_device_state(struct sk_buff *skb,
|
|
|
unsigned int seq,
|
|
|
struct drbd_device *device,
|
|
|
struct device_info *device_info,
|
|
@@ -4705,16 +4706,17 @@ void notify_device_state(struct sk_buff *skb,
|
|
|
if (err && err != -ESRCH)
|
|
|
goto failed;
|
|
|
}
|
|
|
- return;
|
|
|
+ return 0;
|
|
|
|
|
|
nla_put_failure:
|
|
|
nlmsg_free(skb);
|
|
|
failed:
|
|
|
drbd_err(device, "Error %d while broadcasting event. Event seq:%u\n",
|
|
|
err, seq);
|
|
|
+ return err;
|
|
|
}
|
|
|
|
|
|
-void notify_connection_state(struct sk_buff *skb,
|
|
|
+int notify_connection_state(struct sk_buff *skb,
|
|
|
unsigned int seq,
|
|
|
struct drbd_connection *connection,
|
|
|
struct connection_info *connection_info,
|
|
@@ -4754,16 +4756,17 @@ void notify_connection_state(struct sk_buff *skb,
|
|
|
if (err && err != -ESRCH)
|
|
|
goto failed;
|
|
|
}
|
|
|
- return;
|
|
|
+ return 0;
|
|
|
|
|
|
nla_put_failure:
|
|
|
nlmsg_free(skb);
|
|
|
failed:
|
|
|
drbd_err(connection, "Error %d while broadcasting event. Event seq:%u\n",
|
|
|
err, seq);
|
|
|
+ return err;
|
|
|
}
|
|
|
|
|
|
-void notify_peer_device_state(struct sk_buff *skb,
|
|
|
+int notify_peer_device_state(struct sk_buff *skb,
|
|
|
unsigned int seq,
|
|
|
struct drbd_peer_device *peer_device,
|
|
|
struct peer_device_info *peer_device_info,
|
|
@@ -4804,13 +4807,14 @@ void notify_peer_device_state(struct sk_buff *skb,
|
|
|
if (err && err != -ESRCH)
|
|
|
goto failed;
|
|
|
}
|
|
|
- return;
|
|
|
+ return 0;
|
|
|
|
|
|
nla_put_failure:
|
|
|
nlmsg_free(skb);
|
|
|
failed:
|
|
|
drbd_err(peer_device, "Error %d while broadcasting event. Event seq:%u\n",
|
|
|
err, seq);
|
|
|
+ return err;
|
|
|
}
|
|
|
|
|
|
void notify_helper(enum drbd_notification_type type,
|
|
@@ -4861,7 +4865,7 @@ fail:
|
|
|
err, seq);
|
|
|
}
|
|
|
|
|
|
-static void notify_initial_state_done(struct sk_buff *skb, unsigned int seq)
|
|
|
+static int notify_initial_state_done(struct sk_buff *skb, unsigned int seq)
|
|
|
{
|
|
|
struct drbd_genlmsghdr *dh;
|
|
|
int err;
|
|
@@ -4875,11 +4879,12 @@ static void notify_initial_state_done(struct sk_buff *skb, unsigned int seq)
|
|
|
if (nla_put_notification_header(skb, NOTIFY_EXISTS))
|
|
|
goto nla_put_failure;
|
|
|
genlmsg_end(skb, dh);
|
|
|
- return;
|
|
|
+ return 0;
|
|
|
|
|
|
nla_put_failure:
|
|
|
nlmsg_free(skb);
|
|
|
pr_err("Error %d sending event. Event seq:%u\n", err, seq);
|
|
|
+ return err;
|
|
|
}
|
|
|
|
|
|
static void free_state_changes(struct list_head *list)
|
|
@@ -4906,6 +4911,7 @@ static int get_initial_state(struct sk_buff *skb, struct netlink_callback *cb)
|
|
|
unsigned int seq = cb->args[2];
|
|
|
unsigned int n;
|
|
|
enum drbd_notification_type flags = 0;
|
|
|
+ int err = 0;
|
|
|
|
|
|
/* There is no need for taking notification_mutex here: it doesn't
|
|
|
matter if the initial state events mix with later state chage
|
|
@@ -4914,32 +4920,32 @@ static int get_initial_state(struct sk_buff *skb, struct netlink_callback *cb)
|
|
|
|
|
|
cb->args[5]--;
|
|
|
if (cb->args[5] == 1) {
|
|
|
- notify_initial_state_done(skb, seq);
|
|
|
+ err = notify_initial_state_done(skb, seq);
|
|
|
goto out;
|
|
|
}
|
|
|
n = cb->args[4]++;
|
|
|
if (cb->args[4] < cb->args[3])
|
|
|
flags |= NOTIFY_CONTINUES;
|
|
|
if (n < 1) {
|
|
|
- notify_resource_state_change(skb, seq, state_change->resource,
|
|
|
+ err = notify_resource_state_change(skb, seq, state_change->resource,
|
|
|
NOTIFY_EXISTS | flags);
|
|
|
goto next;
|
|
|
}
|
|
|
n--;
|
|
|
if (n < state_change->n_connections) {
|
|
|
- notify_connection_state_change(skb, seq, &state_change->connections[n],
|
|
|
+ err = notify_connection_state_change(skb, seq, &state_change->connections[n],
|
|
|
NOTIFY_EXISTS | flags);
|
|
|
goto next;
|
|
|
}
|
|
|
n -= state_change->n_connections;
|
|
|
if (n < state_change->n_devices) {
|
|
|
- notify_device_state_change(skb, seq, &state_change->devices[n],
|
|
|
+ err = notify_device_state_change(skb, seq, &state_change->devices[n],
|
|
|
NOTIFY_EXISTS | flags);
|
|
|
goto next;
|
|
|
}
|
|
|
n -= state_change->n_devices;
|
|
|
if (n < state_change->n_devices * state_change->n_connections) {
|
|
|
- notify_peer_device_state_change(skb, seq, &state_change->peer_devices[n],
|
|
|
+ err = notify_peer_device_state_change(skb, seq, &state_change->peer_devices[n],
|
|
|
NOTIFY_EXISTS | flags);
|
|
|
goto next;
|
|
|
}
|
|
@@ -4954,7 +4960,10 @@ next:
|
|
|
cb->args[4] = 0;
|
|
|
}
|
|
|
out:
|
|
|
- return skb->len;
|
|
|
+ if (err)
|
|
|
+ return err;
|
|
|
+ else
|
|
|
+ return skb->len;
|
|
|
}
|
|
|
|
|
|
int drbd_adm_get_initial_state(struct sk_buff *skb, struct netlink_callback *cb)
|