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;
774 retcode = drbd_adm_prepare(&adm_ctx, skb, info, DRBD_ADM_NEED_MINOR);
775 if (!adm_ctx.reply_skb)
785 drbd_msg_put_info(adm_ctx.reply_skb, from_attrs_err_to_txt(err));
790 mutex_lock(&adm_ctx.resource->adm_mutex);
793 retcode = (enum drbd_ret_code)drbd_set_role(adm_ctx.device,
796 retcode = (enum drbd_ret_code)drbd_set_role(adm_ctx.device,
799 mutex_unlock(&adm_ctx.resource->adm_mutex);
802 drbd_adm_finish(&adm_ctx, info, retcode);
1567 struct drbd_config_context adm_ctx;
1575 retcode = drbd_adm_prepare(&adm_ctx, skb, info, DRBD_ADM_NEED_MINOR);
1576 if (!adm_ctx.reply_skb)
1581 device = adm_ctx.device;
1582 mutex_lock(&adm_ctx.resource->adm_mutex);
1606 drbd_msg_put_info(adm_ctx.reply_skb, from_attrs_err_to_txt(err));
1632 drbd_msg_put_info(adm_ctx.reply_skb,
1696 mutex_unlock(&adm_ctx.resource->adm_mutex);
1698 drbd_adm_finish(&adm_ctx, info, retcode);
1786 struct drbd_config_context adm_ctx;
1803 retcode = drbd_adm_prepare(&adm_ctx, skb, info, DRBD_ADM_NEED_MINOR);
1804 if (!adm_ctx.reply_skb)
1809 device = adm_ctx.device;
1810 mutex_lock(&adm_ctx.resource->adm_mutex);
1855 drbd_msg_put_info(adm_ctx.reply_skb, from_attrs_err_to_txt(err));
2006 drbd_msg_sprintf_info(adm_ctx.reply_skb,
2180 mutex_unlock(&adm_ctx.resource->adm_mutex);
2181 drbd_adm_finish(&adm_ctx, info, retcode);
2199 mutex_unlock(&adm_ctx.resource->adm_mutex);
2201 drbd_adm_finish(&adm_ctx, info, retcode);
2223 struct drbd_config_context adm_ctx;
2228 retcode = drbd_adm_prepare(&adm_ctx, skb, info, DRBD_ADM_NEED_MINOR);
2229 if (!adm_ctx.reply_skb)
2238 drbd_msg_put_info(adm_ctx.reply_skb, from_attrs_err_to_txt(err));
2243 mutex_lock(&adm_ctx.resource->adm_mutex);
2244 retcode = adm_detach(adm_ctx.device, parms.force_detach);
2245 mutex_unlock(&adm_ctx.resource->adm_mutex);
2247 drbd_adm_finish(&adm_ctx, info, retcode);
2421 struct drbd_config_context adm_ctx;
2430 retcode = drbd_adm_prepare(&adm_ctx, skb, info, DRBD_ADM_NEED_CONNECTION);
2431 if (!adm_ctx.reply_skb)
2436 connection = adm_ctx.connection;
2437 mutex_lock(&adm_ctx.resource->adm_mutex);
2452 drbd_msg_put_info(adm_ctx.reply_skb, "net conf missing, try connect");
2464 drbd_msg_put_info(adm_ctx.reply_skb, from_attrs_err_to_txt(err));
2535 mutex_unlock(&adm_ctx.resource->adm_mutex);
2537 drbd_adm_finish(&adm_ctx, info, retcode);
2566 struct drbd_config_context adm_ctx;
2576 retcode = drbd_adm_prepare(&adm_ctx, skb, info, DRBD_ADM_NEED_RESOURCE);
2578 if (!adm_ctx.reply_skb)
2582 if (!(adm_ctx.my_addr && adm_ctx.peer_addr)) {
2583 drbd_msg_put_info(adm_ctx.reply_skb, "connection endpoint(s) missing");
2593 if (nla_len(adm_ctx.my_addr) == connection->my_addr_len &&
2594 !memcmp(nla_data(adm_ctx.my_addr), &connection->my_addr,
2600 if (nla_len(adm_ctx.peer_addr) == connection->peer_addr_len &&
2601 !memcmp(nla_data(adm_ctx.peer_addr), &connection->peer_addr,
2609 mutex_lock(&adm_ctx.resource->adm_mutex);
2610 connection = first_connection(adm_ctx.resource);
2630 drbd_msg_put_info(adm_ctx.reply_skb, from_attrs_err_to_txt(err));
2646 mutex_lock(&adm_ctx.resource->conf_update);
2650 mutex_unlock(&adm_ctx.resource->conf_update);
2661 connection->my_addr_len = nla_len(adm_ctx.my_addr);
2662 memcpy(&connection->my_addr, nla_data(adm_ctx.my_addr), connection->my_addr_len);
2663 connection->peer_addr_len = nla_len(adm_ctx.peer_addr);
2664 memcpy(&connection->peer_addr, nla_data(adm_ctx.peer_addr), connection->peer_addr_len);
2682 mutex_unlock(&adm_ctx.resource->conf_update);
2696 mutex_unlock(&adm_ctx.resource->adm_mutex);
2697 drbd_adm_finish(&adm_ctx, info, retcode);
2705 mutex_unlock(&adm_ctx.resource->adm_mutex);
2707 drbd_adm_finish(&adm_ctx, info, retcode);
2779 struct drbd_config_context adm_ctx;
2786 retcode = drbd_adm_prepare(&adm_ctx, skb, info, DRBD_ADM_NEED_CONNECTION);
2787 if (!adm_ctx.reply_skb)
2792 connection = adm_ctx.connection;
2798 drbd_msg_put_info(adm_ctx.reply_skb, from_attrs_err_to_txt(err));
2803 mutex_lock(&adm_ctx.resource->adm_mutex);
2809 mutex_unlock(&adm_ctx.resource->adm_mutex);
2811 drbd_adm_finish(&adm_ctx, info, retcode);
2833 struct drbd_config_context adm_ctx;
2844 retcode = drbd_adm_prepare(&adm_ctx, skb, info, DRBD_ADM_NEED_MINOR);
2845 if (!adm_ctx.reply_skb)
2850 mutex_lock(&adm_ctx.resource->adm_mutex);
2851 device = adm_ctx.device;
2864 drbd_msg_put_info(adm_ctx.reply_skb, from_attrs_err_to_txt(err));
2957 mutex_unlock(&adm_ctx.resource->adm_mutex);
2959 drbd_adm_finish(&adm_ctx, info, retcode);
2970 struct drbd_config_context adm_ctx;
2975 retcode = drbd_adm_prepare(&adm_ctx, skb, info, DRBD_ADM_NEED_RESOURCE);
2976 if (!adm_ctx.reply_skb)
2981 res_opts = adm_ctx.resource->res_opts;
2988 drbd_msg_put_info(adm_ctx.reply_skb, from_attrs_err_to_txt(err));
2992 mutex_lock(&adm_ctx.resource->adm_mutex);
2993 err = set_resource_options(adm_ctx.resource, &res_opts);
2999 mutex_unlock(&adm_ctx.resource->adm_mutex);
3002 drbd_adm_finish(&adm_ctx, info, retcode);
3008 struct drbd_config_context adm_ctx;
3012 retcode = drbd_adm_prepare(&adm_ctx, skb, info, DRBD_ADM_NEED_MINOR);
3013 if (!adm_ctx.reply_skb)
3018 device = adm_ctx.device;
3024 mutex_lock(&adm_ctx.resource->adm_mutex);
3047 mutex_unlock(&adm_ctx.resource->adm_mutex);
3050 drbd_adm_finish(&adm_ctx, info, retcode);
3057 struct drbd_config_context adm_ctx;
3060 retcode = drbd_adm_prepare(&adm_ctx, skb, info, DRBD_ADM_NEED_MINOR);
3061 if (!adm_ctx.reply_skb)
3066 mutex_lock(&adm_ctx.resource->adm_mutex);
3067 retcode = drbd_request_state(adm_ctx.device, mask, val);
3068 mutex_unlock(&adm_ctx.resource->adm_mutex);
3070 drbd_adm_finish(&adm_ctx, info, retcode);
3085 struct drbd_config_context adm_ctx;
3089 retcode = drbd_adm_prepare(&adm_ctx, skb, info, DRBD_ADM_NEED_MINOR);
3090 if (!adm_ctx.reply_skb)
3095 device = adm_ctx.device;
3101 mutex_lock(&adm_ctx.resource->adm_mutex);
3127 mutex_unlock(&adm_ctx.resource->adm_mutex);
3130 drbd_adm_finish(&adm_ctx, info, retcode);
3136 struct drbd_config_context adm_ctx;
3139 retcode = drbd_adm_prepare(&adm_ctx, skb, info, DRBD_ADM_NEED_MINOR);
3140 if (!adm_ctx.reply_skb)
3145 mutex_lock(&adm_ctx.resource->adm_mutex);
3146 if (drbd_request_state(adm_ctx.device, NS(user_isp, 1)) == SS_NOTHING_TO_DO)
3148 mutex_unlock(&adm_ctx.resource->adm_mutex);
3150 drbd_adm_finish(&adm_ctx, info, retcode);
3156 struct drbd_config_context adm_ctx;
3160 retcode = drbd_adm_prepare(&adm_ctx, skb, info, DRBD_ADM_NEED_MINOR);
3161 if (!adm_ctx.reply_skb)
3166 mutex_lock(&adm_ctx.resource->adm_mutex);
3167 if (drbd_request_state(adm_ctx.device, NS(user_isp, 0)) == SS_NOTHING_TO_DO) {
3168 s = adm_ctx.device->state;
3176 mutex_unlock(&adm_ctx.resource->adm_mutex);
3178 drbd_adm_finish(&adm_ctx, info, retcode);
3189 struct drbd_config_context adm_ctx;
3193 retcode = drbd_adm_prepare(&adm_ctx, skb, info, DRBD_ADM_NEED_MINOR);
3194 if (!adm_ctx.reply_skb)
3199 mutex_lock(&adm_ctx.resource->adm_mutex);
3200 device = adm_ctx.device;
3237 mutex_unlock(&adm_ctx.resource->adm_mutex);
3239 drbd_adm_finish(&adm_ctx, info, retcode);
3892 struct drbd_config_context adm_ctx;
3896 retcode = drbd_adm_prepare(&adm_ctx, skb, info, DRBD_ADM_NEED_MINOR);
3897 if (!adm_ctx.reply_skb)
3902 err = nla_put_status_info(adm_ctx.reply_skb, adm_ctx.device, NULL);
3904 nlmsg_free(adm_ctx.reply_skb);
3908 drbd_adm_finish(&adm_ctx, info, retcode);
4095 struct drbd_config_context adm_ctx;
4100 retcode = drbd_adm_prepare(&adm_ctx, skb, info, DRBD_ADM_NEED_MINOR);
4101 if (!adm_ctx.reply_skb)
4107 adm_ctx.device->state.pdsk == D_OUTDATED ? UT_PEER_OUTDATED :
4108 test_bit(USE_DEGR_WFC_T, &adm_ctx.device->flags) ? UT_DEGRADED :
4111 err = timeout_parms_to_priv_skb(adm_ctx.reply_skb, &tp);
4113 nlmsg_free(adm_ctx.reply_skb);
4117 drbd_adm_finish(&adm_ctx, info, retcode);
4123 struct drbd_config_context adm_ctx;
4128 retcode = drbd_adm_prepare(&adm_ctx, skb, info, DRBD_ADM_NEED_MINOR);
4129 if (!adm_ctx.reply_skb)
4134 device = adm_ctx.device;
4143 drbd_msg_put_info(adm_ctx.reply_skb, from_attrs_err_to_txt(err));
4147 mutex_lock(&adm_ctx.resource->adm_mutex);
4160 mutex_unlock(&adm_ctx.resource->adm_mutex);
4162 drbd_adm_finish(&adm_ctx, info, retcode);
4169 struct drbd_config_context adm_ctx;
4176 retcode = drbd_adm_prepare(&adm_ctx, skb, info, DRBD_ADM_NEED_MINOR);
4177 if (!adm_ctx.reply_skb)
4182 device = adm_ctx.device;
4188 drbd_msg_put_info(adm_ctx.reply_skb, from_attrs_err_to_txt(err));
4193 mutex_lock(&adm_ctx.resource->adm_mutex);
4238 mutex_unlock(&adm_ctx.resource->adm_mutex);
4240 drbd_adm_finish(&adm_ctx, info, retcode);
4245 drbd_check_resource_name(struct drbd_config_context *adm_ctx)
4247 const char *name = adm_ctx->resource_name;
4249 drbd_msg_put_info(adm_ctx->reply_skb, "resource name missing");
4255 drbd_msg_put_info(adm_ctx->reply_skb, "invalid resource name");
4273 struct drbd_config_context adm_ctx;
4278 retcode = drbd_adm_prepare(&adm_ctx, skb, info, 0);
4279 if (!adm_ctx.reply_skb)
4288 drbd_msg_put_info(adm_ctx.reply_skb, from_attrs_err_to_txt(err));
4292 retcode = drbd_check_resource_name(&adm_ctx);
4296 if (adm_ctx.resource) {
4299 drbd_msg_put_info(adm_ctx.reply_skb, "resource exists");
4307 connection = conn_create(adm_ctx.resource_name, &res_opts);
4322 drbd_adm_finish(&adm_ctx, info, retcode);
4335 struct drbd_config_context adm_ctx;
4339 retcode = drbd_adm_prepare(&adm_ctx, skb, info, DRBD_ADM_NEED_RESOURCE);
4340 if (!adm_ctx.reply_skb)
4346 drbd_msg_put_info(adm_ctx.reply_skb, "requested minor out of range");
4350 if (adm_ctx.volume > DRBD_VOLUME_MAX) {
4351 drbd_msg_put_info(adm_ctx.reply_skb, "requested volume id out of range");
4358 if (adm_ctx.device) {
4365 mutex_lock(&adm_ctx.resource->adm_mutex);
4366 retcode = drbd_create_device(&adm_ctx, dh->minor);
4397 mutex_unlock(&adm_ctx.resource->adm_mutex);
4399 drbd_adm_finish(&adm_ctx, info, retcode);
4442 struct drbd_config_context adm_ctx;
4445 retcode = drbd_adm_prepare(&adm_ctx, skb, info, DRBD_ADM_NEED_MINOR);
4446 if (!adm_ctx.reply_skb)
4451 mutex_lock(&adm_ctx.resource->adm_mutex);
4452 retcode = adm_del_minor(adm_ctx.device);
4453 mutex_unlock(&adm_ctx.resource->adm_mutex);
4455 drbd_adm_finish(&adm_ctx, info, retcode);
4491 struct drbd_config_context adm_ctx;
4498 retcode = drbd_adm_prepare(&adm_ctx, skb, info, DRBD_ADM_NEED_RESOURCE);
4499 if (!adm_ctx.reply_skb)
4504 resource = adm_ctx.resource;
4513 drbd_msg_put_info(adm_ctx.reply_skb, "failed to demote");
4520 drbd_msg_put_info(adm_ctx.reply_skb, "failed to disconnect");
4529 drbd_msg_put_info(adm_ctx.reply_skb, "failed to detach");
4539 drbd_msg_put_info(adm_ctx.reply_skb, "failed to delete volume");
4548 drbd_adm_finish(&adm_ctx, info, retcode);
4554 struct drbd_config_context adm_ctx;
4558 retcode = drbd_adm_prepare(&adm_ctx, skb, info, DRBD_ADM_NEED_RESOURCE);
4559 if (!adm_ctx.reply_skb)
4563 resource = adm_ctx.resource;
4569 drbd_adm_finish(&adm_ctx, info, retcode);