Commit 25bc5309 authored by John L. Hammond's avatar John L. Hammond Committed by Greg Kroah-Hartman
Browse files

staging/lustre/obdclass: remove idmap.c



The functions defined in lustre/include/lustre_idmap.h are not used so
remove them.

Signed-off-by: default avatarJohn L. Hammond <john.hammond@intel.com>
Signed-off-by: default avatarOleg Drokin <oleg.drokin@intel.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent d6af8748
Loading
Loading
Loading
Loading
+0 −104
Original line number Diff line number Diff line
/*
 * GPL HEADER START
 *
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 only,
 * as published by the Free Software Foundation.
 *
 * This program is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * General Public License version 2 for more details (a copy is included
 * in the LICENSE file that accompanied this code).
 *
 * You should have received a copy of the GNU General Public License
 * version 2 along with this program; If not, see
 * http://www.sun.com/software/products/lustre/docs/GPLv2.pdf
 *
 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
 * CA 95054 USA or visit www.sun.com if you need additional information or
 * have any questions.
 *
 * GPL HEADER END
 */
/*
 * Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved.
 * Use is subject to license terms.
 *
 * Copyright (c) 2012, Intel Corporation.
 */
/*
 * This file is part of Lustre, http://www.lustre.org/
 * Lustre is a trademark of Sun Microsystems, Inc.
 *
 * lustre/lustre/include/lustre_idmap.h
 *
 * MDS data structures.
 * See also lustre_idl.h for wire formats of requests.
 */

#ifndef _LUSTRE_IDMAP_H
#define _LUSTRE_IDMAP_H

/** \defgroup idmap idmap
 *
 * @{
 */

#include "../../include/linux/libcfs/libcfs.h"

#define CFS_NGROUPS_PER_BLOCK   ((int)(PAGE_CACHE_SIZE / sizeof(gid_t)))

#define CFS_GROUP_AT(gi, i) \
	((gi)->blocks[(i) / CFS_NGROUPS_PER_BLOCK][(i) % CFS_NGROUPS_PER_BLOCK])

enum {
	CFS_IC_NOTHING     = 0,    /* convert nothing */
	CFS_IC_ALL	 = 1,    /* convert all items */
	CFS_IC_MAPPED      = 2,    /* convert mapped uid/gid */
	CFS_IC_UNMAPPED    = 3     /* convert unmapped uid/gid */
};

#define  CFS_IDMAP_NOTFOUND     (-1)

#define CFS_IDMAP_HASHSIZE      32

enum lustre_idmap_idx {
	RMT_UIDMAP_IDX,
	LCL_UIDMAP_IDX,
	RMT_GIDMAP_IDX,
	LCL_GIDMAP_IDX,
	CFS_IDMAP_N_HASHES
};

struct lustre_idmap_table {
	spinlock_t	lit_lock;
	struct list_head	lit_idmaps[CFS_IDMAP_N_HASHES][CFS_IDMAP_HASHSIZE];
};

struct lu_ucred;

extern void lustre_groups_from_list(struct group_info *ginfo, gid_t *glist);
extern void lustre_groups_sort(struct group_info *group_info);
extern int lustre_in_group_p(struct lu_ucred *mu, gid_t grp);

extern int lustre_idmap_add(struct lustre_idmap_table *t,
			    uid_t ruid, uid_t luid,
			    gid_t rgid, gid_t lgid);
extern int lustre_idmap_del(struct lustre_idmap_table *t,
			    uid_t ruid, uid_t luid,
			    gid_t rgid, gid_t lgid);
extern int lustre_idmap_lookup_uid(struct lu_ucred *mu,
				   struct lustre_idmap_table *t,
				   int reverse, uid_t uid);
extern int lustre_idmap_lookup_gid(struct lu_ucred *mu,
				   struct lustre_idmap_table *t,
				   int reverse, gid_t gid);
extern struct lustre_idmap_table *lustre_idmap_init(void);
extern void lustre_idmap_fini(struct lustre_idmap_table *t);

/** @} idmap */

#endif
+1 −1
Original line number Diff line number Diff line
@@ -6,5 +6,5 @@ obdclass-y := linux/linux-module.o linux/linux-obdo.o linux/linux-sysctl.o \
	      lustre_handles.o lustre_peer.o llog_osd.o \
	      local_storage.o statfs_pack.o obdo.o obd_config.o obd_mount.o\
	      mea.o lu_object.o dt_object.o capa.o cl_object.o   \
	      cl_page.o cl_lock.o cl_io.o lu_ref.o acl.o idmap.o	   \
	      cl_page.o cl_lock.o cl_io.o lu_ref.o acl.o \
	      lu_ucred.o
+0 −477
Original line number Diff line number Diff line
/*
 * GPL HEADER START
 *
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 only,
 * as published by the Free Software Foundation.
 *
 * This program is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * General Public License version 2 for more details (a copy is included
 * in the LICENSE file that accompanied this code).
 *
 * You should have received a copy of the GNU General Public License
 * version 2 along with this program; If not, see
 * http://www.sun.com/software/products/lustre/docs/GPLv2.pdf
 *
 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
 * CA 95054 USA or visit www.sun.com if you need additional information or
 * have any questions.
 *
 * GPL HEADER END
 */
/*
 * Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved.
 * Use is subject to license terms.
 *
 * Copyright (c) 2012, Intel Corporation.
 */
/*
 * This file is part of Lustre, http://www.lustre.org/
 * Lustre is a trademark of Sun Microsystems, Inc.
 *
 * lustre/obdclass/idmap.c
 *
 * Lustre user identity mapping.
 *
 * Author: Fan Yong <fanyong@clusterfs.com>
 */

#define DEBUG_SUBSYSTEM S_SEC

#include "../include/lustre_idmap.h"
#include "../include/md_object.h"
#include "../include/obd_support.h"

#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);	       \
} while (0)

/*
 * groups_search() is copied from linux kernel!
 * A simple bsearch.
 */
static int lustre_groups_search(const struct group_info *group_info, gid_t grp)
{
	int left, right;

	if (!group_info)
		return 0;

	left = 0;
	right = group_info->ngroups;
	while (left < right) {
		int mid = (left + right) / 2;
		int cmp = grp -
			from_kgid(&init_user_ns, CFS_GROUP_AT(group_info, mid));

		if (cmp > 0)
			left = mid + 1;
		else if (cmp < 0)
			right = mid;
		else
			return 1;
	}
	return 0;
}

void lustre_groups_from_list(struct group_info *ginfo, gid_t *glist)
{
	int i;
	int count = ginfo->ngroups;

	/* fill group_info from gid array */
	for (i = 0; i < ginfo->nblocks && count > 0; i++) {
		int cp_count = min(CFS_NGROUPS_PER_BLOCK, count);
		int off = i * CFS_NGROUPS_PER_BLOCK;
		int len = cp_count * sizeof(*glist);

		memcpy(ginfo->blocks[i], glist + off, len);
		count -= cp_count;
	}
}
EXPORT_SYMBOL(lustre_groups_from_list);

/* groups_sort() is copied from linux kernel! */
/* a simple shell-metzner sort */
void lustre_groups_sort(struct group_info *group_info)
{
	int base, max, stride;
	int gidsetsize = group_info->ngroups;

	for (stride = 1; stride < gidsetsize; stride = 3 * stride + 1)
		; /* nothing */
	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);

int lustre_in_group_p(struct lu_ucred *mu, gid_t grp)
{
	int rc = 1;

	if (grp != mu->uc_fsgid) {
		struct group_info *group_info = NULL;

		if (mu->uc_ginfo || !mu->uc_identity ||
		    mu->uc_valid == UCRED_OLD)
			if (grp == mu->uc_suppgids[0] ||
			    grp == mu->uc_suppgids[1])
				return 1;

		if (mu->uc_ginfo)
			group_info = mu->uc_ginfo;
		else if (mu->uc_identity)
			group_info = mu->uc_identity->mi_ginfo;

		if (!group_info)
			return 0;

		lustre_get_group_info(group_info);
		rc = lustre_groups_search(group_info, grp);
		lustre_put_group_info(group_info);
	}
	return rc;
}
EXPORT_SYMBOL(lustre_in_group_p);

struct lustre_idmap_entry {
	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 */
	gid_t	    lie_lcl_gid;      /* local gid */
};

static inline __u32 lustre_idmap_hashfunc(__u32 id)
{
	return id & (CFS_IDMAP_HASHSIZE - 1);
}

static
struct lustre_idmap_entry *idmap_entry_alloc(uid_t rmt_uid, uid_t lcl_uid,
					     gid_t rmt_gid, gid_t lcl_gid)
{
	struct lustre_idmap_entry *e;

	OBD_ALLOC_PTR(e);
	if (e == NULL)
		return NULL;

	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;
	e->lie_lcl_gid = lcl_gid;

	return e;
}

static void idmap_entry_free(struct lustre_idmap_entry *e)
{
	if (!list_empty(&e->lie_rmt_uid_hash))
		list_del(&e->lie_rmt_uid_hash);
	if (!list_empty(&e->lie_lcl_uid_hash))
		list_del(&e->lie_lcl_uid_hash);
	if (!list_empty(&e->lie_rmt_gid_hash))
		list_del(&e->lie_rmt_gid_hash);
	if (!list_empty(&e->lie_lcl_gid_hash))
		list_del(&e->lie_lcl_gid_hash);
	OBD_FREE_PTR(e);
}

/*
 * return value
 * NULL: not found entry
 * ERR_PTR(-EACCES): found 1(remote):N(local) mapped entry
 * others: found normal entry
 */
static
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)
{
	struct list_head *head;
	struct lustre_idmap_entry *e;

	head = &t->lit_idmaps[RMT_UIDMAP_IDX][lustre_idmap_hashfunc(rmt_uid)];
	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 &&
				    e->lie_lcl_gid == lcl_gid)
					/* must be quaternion match */
					return e;
			} else {
				/* 1:N uid mapping */
				CERROR("rmt uid %u already be mapped to %u"
				       " (new %u)\n", e->lie_rmt_uid,
				       e->lie_lcl_uid, lcl_uid);
				return ERR_PTR(-EACCES);
			}
		}

	head = &t->lit_idmaps[RMT_GIDMAP_IDX][lustre_idmap_hashfunc(rmt_gid)];
	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 &&
				    e->lie_lcl_uid == lcl_uid))
					/* after uid mapping search above,
					 * we should never come here */
					LBUG();
			} else {
				/* 1:N gid mapping */
				CERROR("rmt gid %u already be mapped to %u"
				       " (new %u)\n", e->lie_rmt_gid,
				       e->lie_lcl_gid, lcl_gid);
				return ERR_PTR(-EACCES);
			}
		}

	return NULL;
}

static __u32 idmap_lookup_uid(struct list_head *hash, int reverse,
			      __u32 uid)
{
	struct list_head *head = &hash[lustre_idmap_hashfunc(uid)];
	struct lustre_idmap_entry *e;

	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;
}

static __u32 idmap_lookup_gid(struct list_head *hash, int reverse, __u32 gid)
{
	struct list_head *head = &hash[lustre_idmap_hashfunc(gid)];
	struct lustre_idmap_entry *e;

	if (!reverse) {
		list_for_each_entry(e, head, lie_rmt_gid_hash)
			if (e->lie_rmt_gid == gid)
				return e->lie_lcl_gid;
	} else {
		list_for_each_entry(e, head, lie_lcl_gid_hash)
			if (e->lie_lcl_gid == gid)
				return e->lie_rmt_gid;
	}

	return CFS_IDMAP_NOTFOUND;
}

int lustre_idmap_add(struct lustre_idmap_table *t,
		     uid_t ruid, uid_t luid,
		     gid_t rgid, gid_t lgid)
{
	struct lustre_idmap_entry *e0, *e1;

	LASSERT(t);

	spin_lock(&t->lit_lock);
	e0 = idmap_search_entry(t, ruid, luid, rgid, lgid);
	spin_unlock(&t->lit_lock);
	if (!e0) {
		e0 = idmap_entry_alloc(ruid, luid, rgid, lgid);
		if (!e0)
			return -ENOMEM;

		spin_lock(&t->lit_lock);
		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);
	}

	return 0;
}
EXPORT_SYMBOL(lustre_idmap_add);

int lustre_idmap_del(struct lustre_idmap_table *t,
		    uid_t ruid, uid_t luid,
		    gid_t rgid, gid_t lgid)
{
	struct lustre_idmap_entry *e;
	int rc = 0;

	LASSERT(t);

	spin_lock(&t->lit_lock);
	e = idmap_search_entry(t, ruid, luid, rgid, lgid);
	if (IS_ERR(e))
		rc = PTR_ERR(e);
	else if (e)
		idmap_entry_free(e);
	spin_unlock(&t->lit_lock);

	return rc;
}
EXPORT_SYMBOL(lustre_idmap_del);

int lustre_idmap_lookup_uid(struct lu_ucred *mu,
			    struct lustre_idmap_table *t,
			    int reverse, uid_t uid)
{
	struct list_head *hash;

	if (mu && (mu->uc_valid == UCRED_OLD || mu->uc_valid == UCRED_NEW)) {
		if (!reverse) {
			if (uid == mu->uc_o_uid)
				return mu->uc_uid;
			else if (uid == mu->uc_o_fsuid)
				return mu->uc_fsuid;
		} else {
			if (uid == mu->uc_uid)
				return mu->uc_o_uid;
			else if (uid == mu->uc_fsuid)
				return mu->uc_o_fsuid;
		}
	}

	if (t == NULL)
		return CFS_IDMAP_NOTFOUND;

	hash = t->lit_idmaps[reverse ? LCL_UIDMAP_IDX : RMT_UIDMAP_IDX];

	spin_lock(&t->lit_lock);
	uid = idmap_lookup_uid(hash, reverse, uid);
	spin_unlock(&t->lit_lock);

	return uid;
}
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)
{
	struct list_head *hash;

	if (mu && (mu->uc_valid == UCRED_OLD || mu->uc_valid == UCRED_NEW)) {
		if (!reverse) {
			if (gid == mu->uc_o_gid)
				return mu->uc_gid;
			else if (gid == mu->uc_o_fsgid)
				return mu->uc_fsgid;
		} else {
			if (gid == mu->uc_gid)
				return mu->uc_o_gid;
			else if (gid == mu->uc_fsgid)
				return mu->uc_o_fsgid;
		}
	}

	if (t == NULL)
		return CFS_IDMAP_NOTFOUND;

	hash = t->lit_idmaps[reverse ? LCL_GIDMAP_IDX : RMT_GIDMAP_IDX];

	spin_lock(&t->lit_lock);
	gid = idmap_lookup_gid(hash, reverse, gid);
	spin_unlock(&t->lit_lock);

	return gid;
}
EXPORT_SYMBOL(lustre_idmap_lookup_gid);

struct lustre_idmap_table *lustre_idmap_init(void)
{
	struct lustre_idmap_table *t;
	int i, j;

	OBD_ALLOC_PTR(t);
	if (unlikely(t == NULL))
		return ERR_PTR(-ENOMEM);

	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++)
			INIT_LIST_HEAD(&t->lit_idmaps[i][j]);

	return t;
}
EXPORT_SYMBOL(lustre_idmap_init);

void lustre_idmap_fini(struct lustre_idmap_table *t)
{
	struct list_head *list;
	struct lustre_idmap_entry *e;
	int i;
	LASSERT(t);

	list = t->lit_idmaps[RMT_UIDMAP_IDX];
	spin_lock(&t->lit_lock);
	for (i = 0; i < CFS_IDMAP_HASHSIZE; i++)
		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);

	OBD_FREE_PTR(t);
}
EXPORT_SYMBOL(lustre_idmap_fini);