X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Fptlrpc%2Fnodemap_storage.c;h=33e6570869de214481faf30e83fa5040e44468ee;hb=6c13ed6decc680092d3610518dc30aba40c83563;hp=a21764a862ef6c963eaacce10819bc6172461240;hpb=89ce9d5b125762f39339916f14c01242107739ed;p=fs%2Flustre-release.git diff --git a/lustre/ptlrpc/nodemap_storage.c b/lustre/ptlrpc/nodemap_storage.c index a21764a..33e6570 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 @@ -50,8 +50,8 @@ #include #include #include -#include -#include +#include +#include #include #include #include @@ -72,6 +72,9 @@ enum nm_flag_shifts { NM_FL_ALLOW_ROOT_ACCESS = 0x1, NM_FL_TRUST_CLIENT_IDS = 0x2, NM_FL_DENY_UNKNOWN = 0x4, + NM_FL_MAP_UID_ONLY = 0x8, + NM_FL_MAP_GID_ONLY = 0x10, + NM_FL_ENABLE_AUDIT = 0x20, }; static void nodemap_cluster_key_init(struct nodemap_key *nk, unsigned int nm_id) @@ -95,7 +98,13 @@ static void nodemap_cluster_rec_init(union nodemap_rec *nr, (nodemap->nmf_allow_root_access ? NM_FL_ALLOW_ROOT_ACCESS : 0) | (nodemap->nmf_deny_unknown ? - NM_FL_DENY_UNKNOWN : 0)); + NM_FL_DENY_UNKNOWN : 0) | + (nodemap->nmf_map_uid_only ? + NM_FL_MAP_UID_ONLY : 0) | + (nodemap->nmf_map_gid_only ? + NM_FL_MAP_GID_ONLY : 0) | + (nodemap->nmf_enable_audit ? + NM_FL_ENABLE_AUDIT : 0)); } static void nodemap_idmap_key_init(struct nodemap_key *nk, unsigned int nm_id, @@ -162,22 +171,32 @@ static struct dt_object *nodemap_cache_find_create(const struct lu_env *env, struct local_oid_storage *los, enum ncfc_find_create create_new) { - struct lu_fid root_fid; + struct lu_fid tfid; struct dt_object *root_obj; struct dt_object *nm_obj; int rc = 0; - rc = dt_root_get(env, dev, &root_fid); + rc = dt_root_get(env, dev, &tfid); if (rc < 0) GOTO(out, nm_obj = ERR_PTR(rc)); - root_obj = dt_locate(env, dev, &root_fid); + root_obj = dt_locate(env, dev, &tfid); if (unlikely(IS_ERR(root_obj))) GOTO(out, nm_obj = root_obj); + rc = dt_lookup_dir(env, root_obj, LUSTRE_NODEMAP_NAME, &tfid); + if (rc == -ENOENT) { + if (dev->dd_rdonly) + GOTO(out_root, nm_obj = ERR_PTR(-EROFS)); + } else if (rc) { + GOTO(out_root, nm_obj = ERR_PTR(rc)); + } else if (dev->dd_rdonly && create_new == NCFC_CREATE_NEW) { + GOTO(out_root, nm_obj = ERR_PTR(-EROFS)); + } + again: /* if loading index fails the first time, create new index */ - if (create_new == NCFC_CREATE_NEW) { + if (create_new == NCFC_CREATE_NEW && rc != -ENOENT) { CDEBUG(D_INFO, "removing old index, creating new one\n"); rc = local_object_unlink(env, dev, root_obj, LUSTRE_NODEMAP_NAME); @@ -203,7 +222,7 @@ again: * rewrite the config */ if (rc < 0) { - lu_object_put(env, &nm_obj->do_lu); + dt_object_put(env, nm_obj); if (create_new == NCFC_CREATE_NEW) GOTO(out_root, nm_obj = ERR_PTR(rc)); @@ -216,7 +235,7 @@ again: } out_root: - lu_object_put(env, &root_obj->do_lu); + dt_object_put(env, root_obj); out: return nm_obj; } @@ -226,9 +245,9 @@ 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); @@ -254,7 +273,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); @@ -302,7 +321,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); @@ -641,14 +660,14 @@ 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; @@ -694,7 +713,9 @@ 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) { @@ -731,6 +752,23 @@ static int nodemap_process_keyrec(struct nodemap_config *config, flags & NM_FL_TRUST_CLIENT_IDS; nodemap->nmf_deny_unknown = flags & NM_FL_DENY_UNKNOWN; + nodemap->nmf_map_uid_only = + 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; + + /* 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; @@ -741,6 +779,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); @@ -954,7 +993,7 @@ struct dt_object *nodemap_save_config_cache(const struct lu_env *env, /* create a new index file to fill with active config */ o = nodemap_cache_find_create(env, dev, los, NCFC_CREATE_NEW); if (IS_ERR(o)) - GOTO(out, o); + RETURN(o); mutex_lock(&active_config_lock); @@ -1019,11 +1058,10 @@ struct dt_object *nodemap_save_config_cache(const struct lu_env *env, if (rc2 < 0) rc = rc2; -out: mutex_unlock(&active_config_lock); if (rc < 0) { - lu_object_put(env, &o->do_lu); + dt_object_put(env, o); o = ERR_PTR(rc); } @@ -1050,7 +1088,7 @@ static void nodemap_save_all_caches(void) struct dt_object *o; /* put current config file so save conf can rewrite it */ - lu_object_put_nocache(&env, &ncf->ncf_obj->do_lu); + dt_object_put_nocache(&env, ncf->ncf_obj); ncf->ncf_obj = NULL; o = nodemap_save_config_cache(&env, dev, ncf->ncf_los); @@ -1205,7 +1243,7 @@ void nm_config_file_deregister_mgs(const struct lu_env *env, nodemap_mgs_ncf = NULL; if (ncf->ncf_obj) - lu_object_put(env, &ncf->ncf_obj->do_lu); + dt_object_put(env, ncf->ncf_obj); OBD_FREE_PTR(ncf); @@ -1226,7 +1264,7 @@ void nm_config_file_deregister_tgt(const struct lu_env *env, mutex_unlock(&ncf_list_lock); if (ncf->ncf_obj) - lu_object_put(env, &ncf->ncf_obj->do_lu); + dt_object_put(env, ncf->ncf_obj); OBD_FREE_PTR(ncf);