X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Fobdclass%2Fidmap.c;h=a7cec601ad6238a9f9a28ca3280e833e3e72e082;hb=6299d78713ef2b6f69f6dd046256aa91a85147a8;hp=afd2f03de6f941a991b01365895a2ec993f3f291;hpb=3e7573cc14a331f01150814495e2345793e22f06;p=fs%2Flustre-release.git diff --git a/lustre/obdclass/idmap.c b/lustre/obdclass/idmap.c index afd2f03..a7cec60 100644 --- a/lustre/obdclass/idmap.c +++ b/lustre/obdclass/idmap.c @@ -27,7 +27,7 @@ * Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved. * Use is subject to license terms. * - * Copyright (c) 2012, Intel Corporation. + * Copyright (c) 2012, 2014, Intel Corporation. */ /* * This file is part of Lustre, http://www.lustre.org/ @@ -42,19 +42,22 @@ #define DEBUG_SUBSYSTEM S_SEC -#include - +#include +#ifdef HAVE_UIDGID_HEADER +# include +#endif #include +#include #include #include -#define lustre_get_group_info(group_info) do { \ - atomic_inc(&(group_info)->usage); \ +#define lustre_get_group_info(group_info) do { \ + atomic_inc(&(group_info)->usage); \ } while (0) -#define lustre_put_group_info(group_info) do { \ - if (atomic_dec_and_test(&(group_info)->usage)) \ - groups_free(group_info); \ +#define lustre_put_group_info(group_info) do { \ + if (atomic_dec_and_test(&(group_info)->usage)) \ + groups_free(group_info); \ } while (0) /* @@ -73,7 +76,8 @@ static int lustre_groups_search(struct group_info *group_info, right = group_info->ngroups; while (left < right) { int mid = (left + right) / 2; - int cmp = grp - CFS_GROUP_AT(group_info, mid); + int cmp = grp - + from_kgid(&init_user_ns, CFS_GROUP_AT(group_info, mid)); if (cmp > 0) left = mid + 1; @@ -113,24 +117,27 @@ void lustre_groups_sort(struct group_info *group_info) ; /* nothing */ stride /= 3; - while (stride) { - max = gidsetsize - stride; - for (base = 0; base < max; base++) { - int left = base; - int right = left + stride; - gid_t tmp = CFS_GROUP_AT(group_info, right); - - while (left >= 0 && - CFS_GROUP_AT(group_info, left) > tmp) { - CFS_GROUP_AT(group_info, right) = - CFS_GROUP_AT(group_info, left); - right = left; - left -= stride; - } - CFS_GROUP_AT(group_info, right) = tmp; - } - stride /= 3; - } + while (stride) { + max = gidsetsize - stride; + for (base = 0; base < max; base++) { + int left = base; + int right = left + stride; + gid_t tmp = from_kgid(&init_user_ns, + CFS_GROUP_AT(group_info, right)); + + while (left >= 0 && + tmp < from_kgid(&init_user_ns, + CFS_GROUP_AT(group_info, left))) { + CFS_GROUP_AT(group_info, right) = + CFS_GROUP_AT(group_info, left); + right = left; + left -= stride; + } + CFS_GROUP_AT(group_info, right) = + make_kgid(&init_user_ns, tmp); + } + stride /= 3; + } } EXPORT_SYMBOL(lustre_groups_sort); @@ -164,10 +171,10 @@ int lustre_in_group_p(struct lu_ucred *mu, gid_t grp) EXPORT_SYMBOL(lustre_in_group_p); struct lustre_idmap_entry { - cfs_list_t lie_rmt_uid_hash; /* hashed as lie_rmt_uid; */ - cfs_list_t lie_lcl_uid_hash; /* hashed as lie_lcl_uid; */ - cfs_list_t lie_rmt_gid_hash; /* hashed as lie_rmt_gid; */ - cfs_list_t lie_lcl_gid_hash; /* hashed as lie_lcl_gid; */ + struct list_head lie_rmt_uid_hash; /* hashed as lie_rmt_uid; */ + struct list_head lie_lcl_uid_hash; /* hashed as lie_lcl_uid; */ + struct list_head lie_rmt_gid_hash; /* hashed as lie_rmt_gid; */ + struct list_head lie_lcl_gid_hash; /* hashed as lie_lcl_gid; */ uid_t lie_rmt_uid; /* remote uid */ uid_t lie_lcl_uid; /* local uid */ gid_t lie_rmt_gid; /* remote gid */ @@ -189,10 +196,10 @@ struct lustre_idmap_entry *idmap_entry_alloc(uid_t rmt_uid, uid_t lcl_uid, if (e == NULL) return NULL; - CFS_INIT_LIST_HEAD(&e->lie_rmt_uid_hash); - CFS_INIT_LIST_HEAD(&e->lie_lcl_uid_hash); - CFS_INIT_LIST_HEAD(&e->lie_rmt_gid_hash); - CFS_INIT_LIST_HEAD(&e->lie_lcl_gid_hash); + INIT_LIST_HEAD(&e->lie_rmt_uid_hash); + INIT_LIST_HEAD(&e->lie_lcl_uid_hash); + INIT_LIST_HEAD(&e->lie_rmt_gid_hash); + INIT_LIST_HEAD(&e->lie_lcl_gid_hash); e->lie_rmt_uid = rmt_uid; e->lie_lcl_uid = lcl_uid; e->lie_rmt_gid = rmt_gid; @@ -203,15 +210,11 @@ struct lustre_idmap_entry *idmap_entry_alloc(uid_t rmt_uid, uid_t lcl_uid, static void idmap_entry_free(struct lustre_idmap_entry *e) { - if (!cfs_list_empty(&e->lie_rmt_uid_hash)) - cfs_list_del(&e->lie_rmt_uid_hash); - if (!cfs_list_empty(&e->lie_lcl_uid_hash)) - cfs_list_del(&e->lie_lcl_uid_hash); - if (!cfs_list_empty(&e->lie_rmt_gid_hash)) - cfs_list_del(&e->lie_rmt_gid_hash); - if (!cfs_list_empty(&e->lie_lcl_gid_hash)) - cfs_list_del(&e->lie_lcl_gid_hash); - OBD_FREE_PTR(e); + list_del(&e->lie_rmt_uid_hash); + list_del(&e->lie_lcl_uid_hash); + list_del(&e->lie_rmt_gid_hash); + list_del(&e->lie_lcl_gid_hash); + OBD_FREE_PTR(e); } /* @@ -225,11 +228,11 @@ struct lustre_idmap_entry *idmap_search_entry(struct lustre_idmap_table *t, uid_t rmt_uid, uid_t lcl_uid, gid_t rmt_gid, gid_t lcl_gid) { - cfs_list_t *head; + struct list_head *head; struct lustre_idmap_entry *e; head = &t->lit_idmaps[RMT_UIDMAP_IDX][lustre_idmap_hashfunc(rmt_uid)]; - cfs_list_for_each_entry(e, head, lie_rmt_uid_hash) + list_for_each_entry(e, head, lie_rmt_uid_hash) if (e->lie_rmt_uid == rmt_uid) { if (e->lie_lcl_uid == lcl_uid) { if (e->lie_rmt_gid == rmt_gid && @@ -246,7 +249,7 @@ struct lustre_idmap_entry *idmap_search_entry(struct lustre_idmap_table *t, } head = &t->lit_idmaps[RMT_GIDMAP_IDX][lustre_idmap_hashfunc(rmt_gid)]; - cfs_list_for_each_entry(e, head, lie_rmt_gid_hash) + list_for_each_entry(e, head, lie_rmt_gid_hash) if (e->lie_rmt_gid == rmt_gid) { if (e->lie_lcl_gid == lcl_gid) { if (unlikely(e->lie_rmt_uid == rmt_uid && @@ -266,36 +269,36 @@ struct lustre_idmap_entry *idmap_search_entry(struct lustre_idmap_table *t, return NULL; } -static __u32 idmap_lookup_uid(cfs_list_t *hash, int reverse, +static __u32 idmap_lookup_uid(struct list_head *hash, int reverse, __u32 uid) { - cfs_list_t *head = &hash[lustre_idmap_hashfunc(uid)]; - struct lustre_idmap_entry *e; + struct list_head *head = &hash[lustre_idmap_hashfunc(uid)]; + struct lustre_idmap_entry *e; - if (!reverse) { - cfs_list_for_each_entry(e, head, lie_rmt_uid_hash) - if (e->lie_rmt_uid == uid) - return e->lie_lcl_uid; - } else { - cfs_list_for_each_entry(e, head, lie_lcl_uid_hash) - if (e->lie_lcl_uid == uid) - return e->lie_rmt_uid; - } + if (!reverse) { + list_for_each_entry(e, head, lie_rmt_uid_hash) + if (e->lie_rmt_uid == uid) + return e->lie_lcl_uid; + } else { + list_for_each_entry(e, head, lie_lcl_uid_hash) + if (e->lie_lcl_uid == uid) + return e->lie_rmt_uid; + } - return CFS_IDMAP_NOTFOUND; + return CFS_IDMAP_NOTFOUND; } -static __u32 idmap_lookup_gid(cfs_list_t *hash, int reverse, __u32 gid) +static __u32 idmap_lookup_gid(struct list_head *hash, int reverse, __u32 gid) { - cfs_list_t *head = &hash[lustre_idmap_hashfunc(gid)]; + struct list_head *head = &hash[lustre_idmap_hashfunc(gid)]; struct lustre_idmap_entry *e; if (!reverse) { - cfs_list_for_each_entry(e, head, lie_rmt_gid_hash) + list_for_each_entry(e, head, lie_rmt_gid_hash) if (e->lie_rmt_gid == gid) return e->lie_lcl_gid; } else { - cfs_list_for_each_entry(e, head, lie_lcl_gid_hash) + list_for_each_entry(e, head, lie_lcl_gid_hash) if (e->lie_lcl_gid == gid) return e->lie_rmt_gid; } @@ -320,32 +323,32 @@ int lustre_idmap_add(struct lustre_idmap_table *t, return -ENOMEM; spin_lock(&t->lit_lock); - e1 = idmap_search_entry(t, ruid, luid, rgid, lgid); - if (e1 == NULL) { - cfs_list_add_tail(&e0->lie_rmt_uid_hash, - &t->lit_idmaps[RMT_UIDMAP_IDX] - [lustre_idmap_hashfunc(ruid)]); - cfs_list_add_tail(&e0->lie_lcl_uid_hash, - &t->lit_idmaps[LCL_UIDMAP_IDX] - [lustre_idmap_hashfunc(luid)]); - cfs_list_add_tail(&e0->lie_rmt_gid_hash, - &t->lit_idmaps[RMT_GIDMAP_IDX] - [lustre_idmap_hashfunc(rgid)]); - cfs_list_add_tail(&e0->lie_lcl_gid_hash, - &t->lit_idmaps[LCL_GIDMAP_IDX] - [lustre_idmap_hashfunc(lgid)]); - } + e1 = idmap_search_entry(t, ruid, luid, rgid, lgid); + if (e1 == NULL) { + list_add_tail(&e0->lie_rmt_uid_hash, + &t->lit_idmaps[RMT_UIDMAP_IDX] + [lustre_idmap_hashfunc(ruid)]); + list_add_tail(&e0->lie_lcl_uid_hash, + &t->lit_idmaps[LCL_UIDMAP_IDX] + [lustre_idmap_hashfunc(luid)]); + list_add_tail(&e0->lie_rmt_gid_hash, + &t->lit_idmaps[RMT_GIDMAP_IDX] + [lustre_idmap_hashfunc(rgid)]); + list_add_tail(&e0->lie_lcl_gid_hash, + &t->lit_idmaps[LCL_GIDMAP_IDX] + [lustre_idmap_hashfunc(lgid)]); + } spin_unlock(&t->lit_lock); - if (e1 != NULL) { - idmap_entry_free(e0); - if (IS_ERR(e1)) - return PTR_ERR(e1); - } - } else if (IS_ERR(e0)) { - return PTR_ERR(e0); - } + if (e1 != NULL) { + idmap_entry_free(e0); + if (IS_ERR(e1)) + return PTR_ERR(e1); + } + } else if (IS_ERR(e0)) { + return PTR_ERR(e0); + } - return 0; + return 0; } EXPORT_SYMBOL(lustre_idmap_add); @@ -374,7 +377,7 @@ int lustre_idmap_lookup_uid(struct lu_ucred *mu, struct lustre_idmap_table *t, int reverse, uid_t uid) { - cfs_list_t *hash; + struct list_head *hash; if (mu && (mu->uc_valid == UCRED_OLD || mu->uc_valid == UCRED_NEW)) { if (!reverse) { @@ -406,7 +409,7 @@ EXPORT_SYMBOL(lustre_idmap_lookup_uid); int lustre_idmap_lookup_gid(struct lu_ucred *mu, struct lustre_idmap_table *t, int reverse, gid_t gid) { - cfs_list_t *hash; + struct list_head *hash; if (mu && (mu->uc_valid == UCRED_OLD || mu->uc_valid == UCRED_NEW)) { if (!reverse) { @@ -447,7 +450,7 @@ struct lustre_idmap_table *lustre_idmap_init(void) spin_lock_init(&t->lit_lock); for (i = 0; i < ARRAY_SIZE(t->lit_idmaps); i++) for (j = 0; j < ARRAY_SIZE(t->lit_idmaps[i]); j++) - CFS_INIT_LIST_HEAD(&t->lit_idmaps[i][j]); + INIT_LIST_HEAD(&t->lit_idmaps[i][j]); return t; } @@ -455,7 +458,7 @@ EXPORT_SYMBOL(lustre_idmap_init); void lustre_idmap_fini(struct lustre_idmap_table *t) { - cfs_list_t *list; + struct list_head *list; struct lustre_idmap_entry *e; int i; LASSERT(t); @@ -463,10 +466,10 @@ void lustre_idmap_fini(struct lustre_idmap_table *t) list = t->lit_idmaps[RMT_UIDMAP_IDX]; spin_lock(&t->lit_lock); for (i = 0; i < CFS_IDMAP_HASHSIZE; i++) - while (!cfs_list_empty(&list[i])) { - e = cfs_list_entry(list[i].next, - struct lustre_idmap_entry, - lie_rmt_uid_hash); + while (!list_empty(&list[i])) { + e = list_entry(list[i].next, + struct lustre_idmap_entry, + lie_rmt_uid_hash); idmap_entry_free(e); } spin_unlock(&t->lit_lock);