1db056284SChristoph Hellwig // SPDX-License-Identifier: GPL-2.0 2db056284SChristoph Hellwig 3db056284SChristoph Hellwig #include "blk-cgroup.h" 4db056284SChristoph Hellwig 5db056284SChristoph Hellwig /** 6db056284SChristoph Hellwig * blkcg_set_fc_appid - set the fc_app_id field associted to blkcg 7db056284SChristoph Hellwig * @app_id: application identifier 8db056284SChristoph Hellwig * @cgrp_id: cgroup id 9db056284SChristoph Hellwig * @app_id_len: size of application identifier 10db056284SChristoph Hellwig */ blkcg_set_fc_appid(char * app_id,u64 cgrp_id,size_t app_id_len)11db056284SChristoph Hellwigint blkcg_set_fc_appid(char *app_id, u64 cgrp_id, size_t app_id_len) 12db056284SChristoph Hellwig { 13db056284SChristoph Hellwig struct cgroup *cgrp; 14db056284SChristoph Hellwig struct cgroup_subsys_state *css; 15db056284SChristoph Hellwig struct blkcg *blkcg; 16db056284SChristoph Hellwig int ret = 0; 17db056284SChristoph Hellwig 18db056284SChristoph Hellwig if (app_id_len > FC_APPID_LEN) 19db056284SChristoph Hellwig return -EINVAL; 20db056284SChristoph Hellwig 21db056284SChristoph Hellwig cgrp = cgroup_get_from_id(cgrp_id); 22fa7e439cSMichal Koutný if (IS_ERR(cgrp)) 23fa7e439cSMichal Koutný return PTR_ERR(cgrp); 24db056284SChristoph Hellwig css = cgroup_get_e_css(cgrp, &io_cgrp_subsys); 25db056284SChristoph Hellwig if (!css) { 26db056284SChristoph Hellwig ret = -ENOENT; 27db056284SChristoph Hellwig goto out_cgrp_put; 28db056284SChristoph Hellwig } 29db056284SChristoph Hellwig blkcg = css_to_blkcg(css); 30db056284SChristoph Hellwig /* 31db056284SChristoph Hellwig * There is a slight race condition on setting the appid. 32db056284SChristoph Hellwig * Worst case an I/O may not find the right id. 33db056284SChristoph Hellwig * This is no different from the I/O we let pass while obtaining 34db056284SChristoph Hellwig * the vmid from the fabric. 35db056284SChristoph Hellwig * Adding the overhead of a lock is not necessary. 36db056284SChristoph Hellwig */ 37*20d09975SAzeem Shaikh strscpy(blkcg->fc_app_id, app_id, app_id_len); 38db056284SChristoph Hellwig css_put(css); 39db056284SChristoph Hellwig out_cgrp_put: 40db056284SChristoph Hellwig cgroup_put(cgrp); 41db056284SChristoph Hellwig return ret; 42db056284SChristoph Hellwig } 43db056284SChristoph Hellwig EXPORT_SYMBOL_GPL(blkcg_set_fc_appid); 44db056284SChristoph Hellwig 45db056284SChristoph Hellwig /** 46db056284SChristoph Hellwig * blkcg_get_fc_appid - get the fc app identifier associated with a bio 47db056284SChristoph Hellwig * @bio: target bio 48db056284SChristoph Hellwig * 49db056284SChristoph Hellwig * On success return the fc_app_id, on failure return NULL 50db056284SChristoph Hellwig */ blkcg_get_fc_appid(struct bio * bio)51db056284SChristoph Hellwigchar *blkcg_get_fc_appid(struct bio *bio) 52db056284SChristoph Hellwig { 53db056284SChristoph Hellwig if (!bio->bi_blkg || bio->bi_blkg->blkcg->fc_app_id[0] == '\0') 54db056284SChristoph Hellwig return NULL; 55db056284SChristoph Hellwig return bio->bi_blkg->blkcg->fc_app_id; 56db056284SChristoph Hellwig } 57db056284SChristoph Hellwig EXPORT_SYMBOL_GPL(blkcg_get_fc_appid); 58