X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Fptlrpc%2Fnodemap_storage.c;h=ef559ca2550f8ff22b7190d70e70aa4965c0670f;hb=5c89fa57cb2dfff667ddd75eaeb13f942f5b155d;hp=78944595687d21c7f86412d7eb605507316a1403;hpb=d92bd22523aa9bb1cdb91ded3d46fb180f68a93c;p=fs%2Flustre-release.git diff --git a/lustre/ptlrpc/nodemap_storage.c b/lustre/ptlrpc/nodemap_storage.c index 7894459..ef559ca 100644 --- a/lustre/ptlrpc/nodemap_storage.c +++ b/lustre/ptlrpc/nodemap_storage.c @@ -22,7 +22,7 @@ /* * Copyright (C) 2015, Trustees of Indiana University * - * Copyright (c) 2014, Intel Corporation. + * Copyright (c) 2017, Intel Corporation. * * Author: Joshua Walgenbach * Author: Kit Westneat @@ -51,7 +51,7 @@ #include #include #include -#include +#include #include #include #include @@ -74,6 +74,8 @@ enum nm_flag_shifts { NM_FL_DENY_UNKNOWN = 0x4, NM_FL_MAP_UID_ONLY = 0x8, NM_FL_MAP_GID_ONLY = 0x10, + NM_FL_ENABLE_AUDIT = 0x20, + NM_FL_FORBID_ENCRYPT = 0x40, }; static void nodemap_cluster_key_init(struct nodemap_key *nk, unsigned int nm_id) @@ -86,9 +88,9 @@ static void nodemap_cluster_key_init(struct nodemap_key *nk, unsigned int nm_id) static void nodemap_cluster_rec_init(union nodemap_rec *nr, const struct lu_nodemap *nodemap) { - CLASSERT(sizeof(nr->ncr.ncr_name) == sizeof(nodemap->nm_name)); + BUILD_BUG_ON(sizeof(nr->ncr.ncr_name) != sizeof(nodemap->nm_name)); - strncpy(nr->ncr.ncr_name, nodemap->nm_name, sizeof(nodemap->nm_name)); + strncpy(nr->ncr.ncr_name, nodemap->nm_name, sizeof(nr->ncr.ncr_name)); nr->ncr.ncr_squash_uid = cpu_to_le32(nodemap->nm_squash_uid); nr->ncr.ncr_squash_gid = cpu_to_le32(nodemap->nm_squash_gid); nr->ncr.ncr_flags = cpu_to_le32( @@ -101,7 +103,11 @@ static void nodemap_cluster_rec_init(union nodemap_rec *nr, (nodemap->nmf_map_uid_only ? NM_FL_MAP_UID_ONLY : 0) | (nodemap->nmf_map_gid_only ? - NM_FL_MAP_GID_ONLY : 0)); + NM_FL_MAP_GID_ONLY : 0) | + (nodemap->nmf_enable_audit ? + NM_FL_ENABLE_AUDIT : 0) | + (nodemap->nmf_forbid_encryption ? + NM_FL_FORBID_ENCRYPT : 0)); } static void nodemap_idmap_key_init(struct nodemap_key *nk, unsigned int nm_id, @@ -242,11 +248,11 @@ static int nodemap_idx_insert(const struct lu_env *env, const struct nodemap_key *nk, const union nodemap_rec *nr) { - struct thandle *th; - struct dt_device *dev = lu2dt_dev(idx->do_lu.lo_dev); - int rc; + struct thandle *th; + struct dt_device *dev = lu2dt_dev(idx->do_lu.lo_dev); + int rc; - CLASSERT(sizeof(union nodemap_rec) == 32); + BUILD_BUG_ON(sizeof(union nodemap_rec) != 32); th = dt_trans_create(env, dev); @@ -270,7 +276,7 @@ static int nodemap_idx_insert(const struct lu_env *env, dt_write_lock(env, idx, 0); rc = dt_insert(env, idx, (const struct dt_rec *)nr, - (const struct dt_key *)nk, th, 1); + (const struct dt_key *)nk, th); nodemap_inc_version(env, idx, th); dt_write_unlock(env, idx); @@ -318,7 +324,7 @@ static int nodemap_idx_update(const struct lu_env *env, GOTO(out_lock, rc); rc = dt_insert(env, idx, (const struct dt_rec *)nr, - (const struct dt_key *)nk, th, 1); + (const struct dt_key *)nk, th); if (rc != 0) GOTO(out_lock, rc); @@ -657,18 +663,18 @@ static int nodemap_process_keyrec(struct nodemap_config *config, const union nodemap_rec *rec, struct lu_nodemap **recent_nodemap) { - struct lu_nodemap *nodemap = NULL; - enum nodemap_idx_type type; - enum nodemap_id_type id_type; - u8 flags; - u32 nodemap_id; - lnet_nid_t nid[2]; - u32 map[2]; - int rc; + struct lu_nodemap *nodemap = NULL; + enum nodemap_idx_type type; + enum nodemap_id_type id_type; + u8 flags; + u32 nodemap_id; + lnet_nid_t nid[2]; + u32 map[2]; + int rc; ENTRY; - CLASSERT(sizeof(union nodemap_rec) == 32); + BUILD_BUG_ON(sizeof(union nodemap_rec) != 32); nodemap_id = le32_to_cpu(key->nk_nodemap_id); type = nodemap_get_key_type(key); @@ -710,14 +716,15 @@ static int nodemap_process_keyrec(struct nodemap_config *config, " nodemap_id=%d. nodemap config file corrupt?\n", nodemap_id); break; - case NODEMAP_CLUSTER_IDX: + case NODEMAP_CLUSTER_IDX: { + struct lu_nodemap *old_nm = NULL; + nodemap = cfs_hash_lookup(config->nmc_nodemap_hash, rec->ncr.ncr_name); if (nodemap == NULL) { if (nodemap_id == LUSTRE_NODEMAP_DEFAULT_ID) { nodemap = nodemap_create(rec->ncr.ncr_name, config, 1); - config->nmc_default_nodemap = nodemap; } else { nodemap = nodemap_create(rec->ncr.ncr_name, config, 0); @@ -751,6 +758,21 @@ static int nodemap_process_keyrec(struct nodemap_config *config, flags & NM_FL_MAP_UID_ONLY; nodemap->nmf_map_gid_only = flags & NM_FL_MAP_GID_ONLY; + nodemap->nmf_enable_audit = + flags & NM_FL_ENABLE_AUDIT; + nodemap->nmf_forbid_encryption = + flags & NM_FL_FORBID_ENCRYPT; + + /* The fileset should be saved otherwise it will be empty + * every time in case of "NODEMAP_CLUSTER_IDX". */ + mutex_lock(&active_config_lock); + old_nm = nodemap_lookup(rec->ncr.ncr_name); + if (!IS_ERR(old_nm) && old_nm->nm_fileset[0] != '\0') + strlcpy(nodemap->nm_fileset, old_nm->nm_fileset, + sizeof(nodemap->nm_fileset)); + mutex_unlock(&active_config_lock); + if (!IS_ERR(old_nm)) + nodemap_putref(old_nm); if (*recent_nodemap == NULL) { *recent_nodemap = nodemap; @@ -761,6 +783,7 @@ static int nodemap_process_keyrec(struct nodemap_config *config, } nodemap_putref(nodemap); break; + } case NODEMAP_RANGE_IDX: nid[0] = le64_to_cpu(rec->nrr.nrr_start_nid); nid[1] = le64_to_cpu(rec->nrr.nrr_end_nid); @@ -918,10 +941,10 @@ out: if (new_config->nmc_default_nodemap == NULL) { /* new MGS won't have a default nm on disk, so create it here */ - new_config->nmc_default_nodemap = + struct lu_nodemap *nodemap = nodemap_create(DEFAULT_NODEMAP, new_config, 1); - if (IS_ERR(new_config->nmc_default_nodemap)) { - rc = PTR_ERR(new_config->nmc_default_nodemap); + if (IS_ERR(nodemap)) { + rc = PTR_ERR(nodemap); } else { rc = nodemap_idx_nodemap_add_update( new_config->nmc_default_nodemap, @@ -996,8 +1019,8 @@ struct dt_object *nodemap_save_config_cache(const struct lu_env *env, list_for_each_entry_safe(range, range_temp, &nodemap->nm_ranges, rn_list) { lnet_nid_t nid[2] = { - range->rn_node.in_extent.start, - range->rn_node.in_extent.end + range->rn_start, + range->rn_end }; nodemap_range_key_init(&nk, nodemap->nm_id, range->rn_id); @@ -1441,12 +1464,12 @@ EXPORT_SYMBOL(nodemap_index_read); int nodemap_get_config_req(struct obd_device *mgs_obd, struct ptlrpc_request *req) { + const struct ptlrpc_bulk_frag_ops *frag_ops = &ptlrpc_bulk_kiov_pin_ops; struct mgs_config_body *body; struct mgs_config_res *res; struct lu_rdpg rdpg; struct idx_info nodemap_ii; struct ptlrpc_bulk_desc *desc; - struct l_wait_info lwi; struct tg_export_data *rqexp_ted = &req->rq_export->exp_target_data; int i; int page_count; @@ -1470,7 +1493,7 @@ int nodemap_get_config_req(struct obd_device *mgs_obd, body->mcb_name, rdpg.rp_count); /* allocate pages to store the containers */ - OBD_ALLOC(rdpg.rp_pages, sizeof(*rdpg.rp_pages) * rdpg.rp_npages); + OBD_ALLOC_PTR_ARRAY(rdpg.rp_pages, rdpg.rp_npages); if (rdpg.rp_pages == NULL) RETURN(-ENOMEM); for (i = 0; i < rdpg.rp_npages; i++) { @@ -1502,20 +1525,18 @@ int nodemap_get_config_req(struct obd_device *mgs_obd, page_count = (bytes + PAGE_SIZE - 1) >> PAGE_SHIFT; LASSERT(page_count <= rdpg.rp_count); desc = ptlrpc_prep_bulk_exp(req, page_count, 1, - PTLRPC_BULK_PUT_SOURCE | - PTLRPC_BULK_BUF_KIOV, - MGS_BULK_PORTAL, - &ptlrpc_bulk_kiov_pin_ops); + PTLRPC_BULK_PUT_SOURCE, + MGS_BULK_PORTAL, frag_ops); if (desc == NULL) GOTO(out, rc = -ENOMEM); for (i = 0; i < page_count && bytes > 0; i++) { - ptlrpc_prep_bulk_page_pin(desc, rdpg.rp_pages[i], 0, - min_t(int, bytes, PAGE_SIZE)); + frag_ops->add_kiov_frag(desc, rdpg.rp_pages[i], 0, + min_t(int, bytes, PAGE_SIZE)); bytes -= PAGE_SIZE; } - rc = target_bulk_io(req->rq_export, desc, &lwi); + rc = target_bulk_io(req->rq_export, desc); ptlrpc_free_bulk(desc); out: @@ -1523,8 +1544,7 @@ out: for (i = 0; i < rdpg.rp_npages; i++) if (rdpg.rp_pages[i] != NULL) __free_page(rdpg.rp_pages[i]); - OBD_FREE(rdpg.rp_pages, - rdpg.rp_npages * sizeof(rdpg.rp_pages[0])); + OBD_FREE_PTR_ARRAY(rdpg.rp_pages, rdpg.rp_npages); } return rc; }