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