Lines Matching defs:adm_ctx
150 * If it returns successfully, adm_ctx members are valid.
159 static int drbd_adm_prepare(struct drbd_config_context *adm_ctx,
166 memset(adm_ctx, 0, sizeof(*adm_ctx));
172 adm_ctx->reply_skb = genlmsg_new(NLMSG_GOODSIZE, GFP_KERNEL);
173 if (!adm_ctx->reply_skb) {
178 adm_ctx->reply_dh = genlmsg_put_reply(adm_ctx->reply_skb,
182 if (!adm_ctx->reply_dh) {
187 adm_ctx->reply_dh->minor = d_in->minor;
188 adm_ctx->reply_dh->ret_code = NO_ERROR;
190 adm_ctx->volume = VOLUME_UNSPECIFIED;
200 err = nla_put_nohdr(adm_ctx->reply_skb,
206 /* and assign stuff to the adm_ctx */
209 adm_ctx->volume = nla_get_u32(nla);
212 adm_ctx->resource_name = nla_data(nla);
213 adm_ctx->my_addr = nested_attr_tb[__nla_type(T_ctx_my_addr)];
214 adm_ctx->peer_addr = nested_attr_tb[__nla_type(T_ctx_peer_addr)];
215 if ((adm_ctx->my_addr &&
216 nla_len(adm_ctx->my_addr) > sizeof(adm_ctx->connection->my_addr)) ||
217 (adm_ctx->peer_addr &&
218 nla_len(adm_ctx->peer_addr) > sizeof(adm_ctx->connection->peer_addr))) {
224 adm_ctx->minor = d_in->minor;
225 adm_ctx->device = minor_to_device(d_in->minor);
230 if (adm_ctx->device)
231 kref_get(&adm_ctx->device->kref);
233 if (adm_ctx->resource_name) {
234 adm_ctx->resource = drbd_find_resource(adm_ctx->resource_name);
237 if (!adm_ctx->device && (flags & DRBD_ADM_NEED_MINOR)) {
238 drbd_msg_put_info(adm_ctx->reply_skb, "unknown minor");
241 if (!adm_ctx->resource && (flags & DRBD_ADM_NEED_RESOURCE)) {
242 drbd_msg_put_info(adm_ctx->reply_skb, "unknown resource");
243 if (adm_ctx->resource_name)
249 if (adm_ctx->resource) {
250 drbd_msg_put_info(adm_ctx->reply_skb, "no resource name expected");
253 if (adm_ctx->device) {
254 drbd_msg_put_info(adm_ctx->reply_skb, "no minor number expected");
257 if (adm_ctx->my_addr && adm_ctx->peer_addr)
258 adm_ctx->connection = conn_get_by_addrs(nla_data(adm_ctx->my_addr),
259 nla_len(adm_ctx->my_addr),
260 nla_data(adm_ctx->peer_addr),
261 nla_len(adm_ctx->peer_addr));
262 if (!adm_ctx->connection) {
263 drbd_msg_put_info(adm_ctx->reply_skb, "unknown connection");
269 if (adm_ctx->device && adm_ctx->resource &&
270 adm_ctx->device->resource != adm_ctx->resource) {
272 adm_ctx->minor, adm_ctx->resource->name,
273 adm_ctx->device->resource->name);
274 drbd_msg_put_info(adm_ctx->reply_skb, "minor exists in different resource");
277 if (adm_ctx->device &&
278 adm_ctx->volume != VOLUME_UNSPECIFIED &&
279 adm_ctx->volume != adm_ctx->device->vnr) {
281 adm_ctx->minor, adm_ctx->volume,
282 adm_ctx->device->vnr, adm_ctx->device->resource->name);
283 drbd_msg_put_info(adm_ctx->reply_skb, "minor exists as different volume");
287 /* still, provide adm_ctx->resource always, if possible. */
288 if (!adm_ctx->resource) {
289 adm_ctx->resource = adm_ctx->device ? adm_ctx->device->resource
290 : adm_ctx->connection ? adm_ctx->connection->resource : NULL;
291 if (adm_ctx->resource)
292 kref_get(&adm_ctx->resource->kref);
298 nlmsg_free(adm_ctx->reply_skb);
299 adm_ctx->reply_skb = NULL;
303 static int drbd_adm_finish(struct drbd_config_context *adm_ctx,
306 if (adm_ctx->device) {
307 kref_put(&adm_ctx->device->kref, drbd_destroy_device);
308 adm_ctx->device = NULL;
310 if (adm_ctx->connection) {
311 kref_put(&adm_ctx->connection->kref, &drbd_destroy_connection);
312 adm_ctx->connection = NULL;
314 if (adm_ctx->resource) {
315 kref_put(&adm_ctx->resource->kref, drbd_destroy_resource);
316 adm_ctx->resource = NULL;
319 if (!adm_ctx->reply_skb)
322 adm_ctx->reply_dh->ret_code = retcode;
323 drbd_adm_send_reply(adm_ctx->reply_skb, info);
769 struct drbd_config_context adm_ctx;
775 retcode = drbd_adm_prepare(&adm_ctx, skb, info, DRBD_ADM_NEED_MINOR);
776 if (!adm_ctx.reply_skb)
786 drbd_msg_put_info(adm_ctx.reply_skb, from_attrs_err_to_txt(err));
791 mutex_lock(&adm_ctx.resource->adm_mutex);
794 rv = drbd_set_role(adm_ctx.device, R_PRIMARY, parms.assume_uptodate);
796 rv = drbd_set_role(adm_ctx.device, R_SECONDARY, 0);
798 mutex_unlock(&adm_ctx.resource->adm_mutex);
800 drbd_adm_finish(&adm_ctx, info, rv);
803 drbd_adm_finish(&adm_ctx, info, retcode);
1504 struct drbd_config_context adm_ctx;
1512 retcode = drbd_adm_prepare(&adm_ctx, skb, info, DRBD_ADM_NEED_MINOR);
1513 if (!adm_ctx.reply_skb)
1518 device = adm_ctx.device;
1519 mutex_lock(&adm_ctx.resource->adm_mutex);
1543 drbd_msg_put_info(adm_ctx.reply_skb, from_attrs_err_to_txt(err));
1569 drbd_msg_put_info(adm_ctx.reply_skb,
1632 mutex_unlock(&adm_ctx.resource->adm_mutex);
1634 drbd_adm_finish(&adm_ctx, info, retcode);
1725 struct drbd_config_context adm_ctx;
1742 retcode = drbd_adm_prepare(&adm_ctx, skb, info, DRBD_ADM_NEED_MINOR);
1743 if (!adm_ctx.reply_skb)
1748 device = adm_ctx.device;
1749 mutex_lock(&adm_ctx.resource->adm_mutex);
1794 drbd_msg_put_info(adm_ctx.reply_skb, from_attrs_err_to_txt(err));
1945 drbd_msg_sprintf_info(adm_ctx.reply_skb,
2121 mutex_unlock(&adm_ctx.resource->adm_mutex);
2122 drbd_adm_finish(&adm_ctx, info, retcode);
2143 mutex_unlock(&adm_ctx.resource->adm_mutex);
2145 drbd_adm_finish(&adm_ctx, info, retcode);
2167 struct drbd_config_context adm_ctx;
2172 retcode = drbd_adm_prepare(&adm_ctx, skb, info, DRBD_ADM_NEED_MINOR);
2173 if (!adm_ctx.reply_skb)
2182 drbd_msg_put_info(adm_ctx.reply_skb, from_attrs_err_to_txt(err));
2187 mutex_lock(&adm_ctx.resource->adm_mutex);
2188 retcode = adm_detach(adm_ctx.device, parms.force_detach);
2189 mutex_unlock(&adm_ctx.resource->adm_mutex);
2191 drbd_adm_finish(&adm_ctx, info, retcode);
2365 struct drbd_config_context adm_ctx;
2374 retcode = drbd_adm_prepare(&adm_ctx, skb, info, DRBD_ADM_NEED_CONNECTION);
2375 if (!adm_ctx.reply_skb)
2380 connection = adm_ctx.connection;
2381 mutex_lock(&adm_ctx.resource->adm_mutex);
2396 drbd_msg_put_info(adm_ctx.reply_skb, "net conf missing, try connect");
2408 drbd_msg_put_info(adm_ctx.reply_skb, from_attrs_err_to_txt(err));
2478 mutex_unlock(&adm_ctx.resource->adm_mutex);
2480 drbd_adm_finish(&adm_ctx, info, retcode);
2509 struct drbd_config_context adm_ctx;
2520 retcode = drbd_adm_prepare(&adm_ctx, skb, info, DRBD_ADM_NEED_RESOURCE);
2522 if (!adm_ctx.reply_skb)
2526 if (!(adm_ctx.my_addr && adm_ctx.peer_addr)) {
2527 drbd_msg_put_info(adm_ctx.reply_skb, "connection endpoint(s) missing");
2537 if (nla_len(adm_ctx.my_addr) == connection->my_addr_len &&
2538 !memcmp(nla_data(adm_ctx.my_addr), &connection->my_addr,
2544 if (nla_len(adm_ctx.peer_addr) == connection->peer_addr_len &&
2545 !memcmp(nla_data(adm_ctx.peer_addr), &connection->peer_addr,
2553 mutex_lock(&adm_ctx.resource->adm_mutex);
2554 connection = first_connection(adm_ctx.resource);
2574 drbd_msg_put_info(adm_ctx.reply_skb, from_attrs_err_to_txt(err));
2590 mutex_lock(&adm_ctx.resource->conf_update);
2594 mutex_unlock(&adm_ctx.resource->conf_update);
2605 connection->my_addr_len = nla_len(adm_ctx.my_addr);
2606 memcpy(&connection->my_addr, nla_data(adm_ctx.my_addr), connection->my_addr_len);
2607 connection->peer_addr_len = nla_len(adm_ctx.peer_addr);
2608 memcpy(&connection->peer_addr, nla_data(adm_ctx.peer_addr), connection->peer_addr_len);
2626 mutex_unlock(&adm_ctx.resource->conf_update);
2639 mutex_unlock(&adm_ctx.resource->adm_mutex);
2640 drbd_adm_finish(&adm_ctx, info, rv);
2648 mutex_unlock(&adm_ctx.resource->adm_mutex);
2650 drbd_adm_finish(&adm_ctx, info, retcode);
2722 struct drbd_config_context adm_ctx;
2729 retcode = drbd_adm_prepare(&adm_ctx, skb, info, DRBD_ADM_NEED_CONNECTION);
2730 if (!adm_ctx.reply_skb)
2735 connection = adm_ctx.connection;
2741 drbd_msg_put_info(adm_ctx.reply_skb, from_attrs_err_to_txt(err));
2746 mutex_lock(&adm_ctx.resource->adm_mutex);
2748 mutex_unlock(&adm_ctx.resource->adm_mutex);
2750 drbd_adm_finish(&adm_ctx, info, rv);
2755 drbd_adm_finish(&adm_ctx, info, retcode);
2777 struct drbd_config_context adm_ctx;
2788 retcode = drbd_adm_prepare(&adm_ctx, skb, info, DRBD_ADM_NEED_MINOR);
2789 if (!adm_ctx.reply_skb)
2794 mutex_lock(&adm_ctx.resource->adm_mutex);
2795 device = adm_ctx.device;
2808 drbd_msg_put_info(adm_ctx.reply_skb, from_attrs_err_to_txt(err));
2900 mutex_unlock(&adm_ctx.resource->adm_mutex);
2902 drbd_adm_finish(&adm_ctx, info, retcode);
2913 struct drbd_config_context adm_ctx;
2918 retcode = drbd_adm_prepare(&adm_ctx, skb, info, DRBD_ADM_NEED_RESOURCE);
2919 if (!adm_ctx.reply_skb)
2924 res_opts = adm_ctx.resource->res_opts;
2931 drbd_msg_put_info(adm_ctx.reply_skb, from_attrs_err_to_txt(err));
2935 mutex_lock(&adm_ctx.resource->adm_mutex);
2936 err = set_resource_options(adm_ctx.resource, &res_opts);
2942 mutex_unlock(&adm_ctx.resource->adm_mutex);
2945 drbd_adm_finish(&adm_ctx, info, retcode);
2951 struct drbd_config_context adm_ctx;
2955 retcode = drbd_adm_prepare(&adm_ctx, skb, info, DRBD_ADM_NEED_MINOR);
2956 if (!adm_ctx.reply_skb)
2961 device = adm_ctx.device;
2967 mutex_lock(&adm_ctx.resource->adm_mutex);
2990 mutex_unlock(&adm_ctx.resource->adm_mutex);
2993 drbd_adm_finish(&adm_ctx, info, retcode);
3000 struct drbd_config_context adm_ctx;
3003 retcode = drbd_adm_prepare(&adm_ctx, skb, info, DRBD_ADM_NEED_MINOR);
3004 if (!adm_ctx.reply_skb)
3009 mutex_lock(&adm_ctx.resource->adm_mutex);
3010 retcode = drbd_request_state(adm_ctx.device, mask, val);
3011 mutex_unlock(&adm_ctx.resource->adm_mutex);
3013 drbd_adm_finish(&adm_ctx, info, retcode);
3029 struct drbd_config_context adm_ctx;
3033 retcode = drbd_adm_prepare(&adm_ctx, skb, info, DRBD_ADM_NEED_MINOR);
3034 if (!adm_ctx.reply_skb)
3039 device = adm_ctx.device;
3045 mutex_lock(&adm_ctx.resource->adm_mutex);
3071 mutex_unlock(&adm_ctx.resource->adm_mutex);
3074 drbd_adm_finish(&adm_ctx, info, retcode);
3080 struct drbd_config_context adm_ctx;
3083 retcode = drbd_adm_prepare(&adm_ctx, skb, info, DRBD_ADM_NEED_MINOR);
3084 if (!adm_ctx.reply_skb)
3089 mutex_lock(&adm_ctx.resource->adm_mutex);
3090 if (drbd_request_state(adm_ctx.device, NS(user_isp, 1)) == SS_NOTHING_TO_DO)
3092 mutex_unlock(&adm_ctx.resource->adm_mutex);
3094 drbd_adm_finish(&adm_ctx, info, retcode);
3100 struct drbd_config_context adm_ctx;
3104 retcode = drbd_adm_prepare(&adm_ctx, skb, info, DRBD_ADM_NEED_MINOR);
3105 if (!adm_ctx.reply_skb)
3110 mutex_lock(&adm_ctx.resource->adm_mutex);
3111 if (drbd_request_state(adm_ctx.device, NS(user_isp, 0)) == SS_NOTHING_TO_DO) {
3112 s = adm_ctx.device->state;
3120 mutex_unlock(&adm_ctx.resource->adm_mutex);
3122 drbd_adm_finish(&adm_ctx, info, retcode);
3133 struct drbd_config_context adm_ctx;
3137 retcode = drbd_adm_prepare(&adm_ctx, skb, info, DRBD_ADM_NEED_MINOR);
3138 if (!adm_ctx.reply_skb)
3143 mutex_lock(&adm_ctx.resource->adm_mutex);
3144 device = adm_ctx.device;
3181 mutex_unlock(&adm_ctx.resource->adm_mutex);
3183 drbd_adm_finish(&adm_ctx, info, retcode);
3836 struct drbd_config_context adm_ctx;
3840 retcode = drbd_adm_prepare(&adm_ctx, skb, info, DRBD_ADM_NEED_MINOR);
3841 if (!adm_ctx.reply_skb)
3846 err = nla_put_status_info(adm_ctx.reply_skb, adm_ctx.device, NULL);
3848 nlmsg_free(adm_ctx.reply_skb);
3852 drbd_adm_finish(&adm_ctx, info, retcode);
4039 struct drbd_config_context adm_ctx;
4044 retcode = drbd_adm_prepare(&adm_ctx, skb, info, DRBD_ADM_NEED_MINOR);
4045 if (!adm_ctx.reply_skb)
4051 adm_ctx.device->state.pdsk == D_OUTDATED ? UT_PEER_OUTDATED :
4052 test_bit(USE_DEGR_WFC_T, &adm_ctx.device->flags) ? UT_DEGRADED :
4055 err = timeout_parms_to_priv_skb(adm_ctx.reply_skb, &tp);
4057 nlmsg_free(adm_ctx.reply_skb);
4061 drbd_adm_finish(&adm_ctx, info, retcode);
4067 struct drbd_config_context adm_ctx;
4072 retcode = drbd_adm_prepare(&adm_ctx, skb, info, DRBD_ADM_NEED_MINOR);
4073 if (!adm_ctx.reply_skb)
4078 device = adm_ctx.device;
4087 drbd_msg_put_info(adm_ctx.reply_skb, from_attrs_err_to_txt(err));
4091 mutex_lock(&adm_ctx.resource->adm_mutex);
4104 mutex_unlock(&adm_ctx.resource->adm_mutex);
4106 drbd_adm_finish(&adm_ctx, info, retcode);
4113 struct drbd_config_context adm_ctx;
4120 retcode = drbd_adm_prepare(&adm_ctx, skb, info, DRBD_ADM_NEED_MINOR);
4121 if (!adm_ctx.reply_skb)
4126 device = adm_ctx.device;
4132 drbd_msg_put_info(adm_ctx.reply_skb, from_attrs_err_to_txt(err));
4137 mutex_lock(&adm_ctx.resource->adm_mutex);
4182 mutex_unlock(&adm_ctx.resource->adm_mutex);
4184 drbd_adm_finish(&adm_ctx, info, retcode);
4189 drbd_check_resource_name(struct drbd_config_context *adm_ctx)
4191 const char *name = adm_ctx->resource_name;
4193 drbd_msg_put_info(adm_ctx->reply_skb, "resource name missing");
4199 drbd_msg_put_info(adm_ctx->reply_skb, "invalid resource name");
4217 struct drbd_config_context adm_ctx;
4222 retcode = drbd_adm_prepare(&adm_ctx, skb, info, 0);
4223 if (!adm_ctx.reply_skb)
4232 drbd_msg_put_info(adm_ctx.reply_skb, from_attrs_err_to_txt(err));
4236 retcode = drbd_check_resource_name(&adm_ctx);
4240 if (adm_ctx.resource) {
4243 drbd_msg_put_info(adm_ctx.reply_skb, "resource exists");
4251 connection = conn_create(adm_ctx.resource_name, &res_opts);
4266 drbd_adm_finish(&adm_ctx, info, retcode);
4279 struct drbd_config_context adm_ctx;
4283 retcode = drbd_adm_prepare(&adm_ctx, skb, info, DRBD_ADM_NEED_RESOURCE);
4284 if (!adm_ctx.reply_skb)
4290 drbd_msg_put_info(adm_ctx.reply_skb, "requested minor out of range");
4294 if (adm_ctx.volume > DRBD_VOLUME_MAX) {
4295 drbd_msg_put_info(adm_ctx.reply_skb, "requested volume id out of range");
4302 if (adm_ctx.device) {
4309 mutex_lock(&adm_ctx.resource->adm_mutex);
4310 retcode = drbd_create_device(&adm_ctx, dh->minor);
4341 mutex_unlock(&adm_ctx.resource->adm_mutex);
4343 drbd_adm_finish(&adm_ctx, info, retcode);
4386 struct drbd_config_context adm_ctx;
4389 retcode = drbd_adm_prepare(&adm_ctx, skb, info, DRBD_ADM_NEED_MINOR);
4390 if (!adm_ctx.reply_skb)
4395 mutex_lock(&adm_ctx.resource->adm_mutex);
4396 retcode = adm_del_minor(adm_ctx.device);
4397 mutex_unlock(&adm_ctx.resource->adm_mutex);
4399 drbd_adm_finish(&adm_ctx, info, retcode);
4435 struct drbd_config_context adm_ctx;
4442 retcode = drbd_adm_prepare(&adm_ctx, skb, info, DRBD_ADM_NEED_RESOURCE);
4443 if (!adm_ctx.reply_skb)
4448 resource = adm_ctx.resource;
4457 drbd_msg_put_info(adm_ctx.reply_skb, "failed to demote");
4464 drbd_msg_put_info(adm_ctx.reply_skb, "failed to disconnect");
4473 drbd_msg_put_info(adm_ctx.reply_skb, "failed to detach");
4483 drbd_msg_put_info(adm_ctx.reply_skb, "failed to delete volume");
4492 drbd_adm_finish(&adm_ctx, info, retcode);
4498 struct drbd_config_context adm_ctx;
4502 retcode = drbd_adm_prepare(&adm_ctx, skb, info, DRBD_ADM_NEED_RESOURCE);
4503 if (!adm_ctx.reply_skb)
4507 resource = adm_ctx.resource;
4513 drbd_adm_finish(&adm_ctx, info, retcode);