static inline void spin_lock_irqsave(spinlock_t *a, unsigned long b) {}
static inline void spin_unlock_irqrestore(spinlock_t *a, unsigned long b) {}
+typedef spinlock_t rwlock_t;
+#define RW_LOCK_UNLOCKED SPIN_LOCK_UNLOCKED
+#define read_lock(l) spin_lock(l)
+#define read_unlock(l) spin_unlock(l)
+#define write_lock(l) spin_lock(l)
+#define write_unlock(l) spin_unlock(l)
+
+
#define min(x,y) ((x)<(y) ? (x) : (y))
#define max(x,y) ((x)>(y) ? (x) : (y))
* policy registers *
***********************************************/
-static spinlock_t policy_lock = SPIN_LOCK_UNLOCKED;
+static rwlock_t policy_lock = RW_LOCK_UNLOCKED;
static struct ptlrpc_sec_policy *policies[SPTLRPC_POLICY_MAX] = {
NULL,
};
if (number >= SPTLRPC_POLICY_MAX)
return -EINVAL;
- spin_lock(&policy_lock);
- if (policies[number]) {
- spin_unlock(&policy_lock);
+ write_lock(&policy_lock);
+ if (unlikely(policies[number])) {
+ write_unlock(&policy_lock);
return -EALREADY;
}
policies[number] = policy;
- spin_unlock(&policy_lock);
+ write_unlock(&policy_lock);
CDEBUG(D_SEC, "%s: registered\n", policy->sp_name);
return 0;
LASSERT(number < SPTLRPC_POLICY_MAX);
- spin_lock(&policy_lock);
- if (!policies[number]) {
- spin_unlock(&policy_lock);
+ write_lock(&policy_lock);
+ if (unlikely(policies[number] == NULL)) {
+ write_unlock(&policy_lock);
CERROR("%s: already unregistered\n", policy->sp_name);
return -EINVAL;
}
LASSERT(policies[number] == policy);
policies[number] = NULL;
- spin_unlock(&policy_lock);
+ write_unlock(&policy_lock);
CDEBUG(D_SEC, "%s: unregistered\n", policy->sp_name);
return 0;
static
struct ptlrpc_sec_policy * sptlrpc_flavor2policy(ptlrpc_sec_flavor_t flavor)
{
- static int load_module = 0;
- struct ptlrpc_sec_policy *policy;
- __u32 number = SEC_FLAVOR_POLICY(flavor);
+ static DECLARE_MUTEX(load_mutex);
+ static atomic_t loaded = ATOMIC_INIT(0);
+ struct ptlrpc_sec_policy *policy;
+ __u32 number = SEC_FLAVOR_POLICY(flavor), flag = 0;
if (number >= SPTLRPC_POLICY_MAX)
return NULL;
again:
- spin_lock(&policy_lock);
+ read_lock(&policy_lock);
policy = policies[number];
if (policy && !try_module_get(policy->sp_owner))
policy = NULL;
- spin_unlock(&policy_lock);
+ if (policy == NULL)
+ flag = atomic_read(&loaded);
+ read_unlock(&policy_lock);
#ifdef CONFIG_KMOD
/* if failure, try to load gss module, once */
- if (policy == NULL && load_module == 0 &&
- number == SPTLRPC_POLICY_GSS) {
- load_module = 1;
- if (request_module("ptlrpc_gss") == 0)
- goto again;
+ if (unlikely(policy == NULL) &&
+ number == SPTLRPC_POLICY_GSS && flag == 0) {
+ mutex_down(&load_mutex);
+ if (atomic_read(&loaded) == 0) {
+ if (request_module("ptlrpc_gss") != 0)
+ CERROR("Unable to load module ptlrpc_gss\n");
+ else
+ CDEBUG(D_INFO, "module ptlrpc_gss loaded\n");
+
+ atomic_set(&loaded, 1);
+ }
+ mutex_up(&load_mutex);
+
+ goto again;
}
#endif
+ return -1;
+ }
+ memcpy(sname, name.value, name.length);
-+ printerr(1, "authenticate user %s\n", sname);
++ printerr(1, "authenticated %s from %016llx\n", sname, nid);
+ gss_release_buffer(&min_stat, &name);
+
+ lookup_mapping(sname, nid, &cred->cr_mapped_uid);
+ return 0;
+ }
+ }
-+ printerr(1, "no mapping for %s/%#Lx\n", princ, nid);
++ printerr(2, "no mapping for %s/%#Lx\n", princ, nid);
+ *uid = -1;
+ return -1;
+}