* GPL HEADER END
*/
/*
- * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
+ * Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved.
* Use is subject to license terms.
*/
/*
cfs_hlist_node_t ce_node;
/**
* Owner for the current cl_env, the key for cfs_hash.
- * Now current thread pointer is stored.
+ * Now current thread pid is stored. Note using thread pointer would
+ * lead to unbalanced hash because of its specific allocation locality
+ * and could be varied for different platforms and OSes, even different
+ * OS versions.
*/
void *ce_owner;
/*
static inline struct cl_env *cl_env_fetch(void)
{
struct cl_env *cle;
- cle = cfs_hash_lookup(cl_env_hash, cfs_current());
+ cle = cfs_hash_lookup(cl_env_hash, (void *) (long) cfs_current()->pid);
LASSERT(ergo(cle, cle->ce_magic == &cl_env_init0));
return cle;
}
if (cle) {
int rc;
LASSERT(cle->ce_owner == NULL);
- cle->ce_owner = cfs_current();
+ cle->ce_owner = (void *) (long) cfs_current()->pid;
rc = cfs_hash_add_unique(cl_env_hash, cle->ce_owner,
- &cle->ce_node);
+ &cle->ce_node);
LASSERT(rc == 0);
}
}
cle = cl_env_fetch();
if (cle && cle->ce_owner) {
void *cookie;
- LASSERT(cle->ce_owner == cfs_current());
+ LASSERT(cle->ce_owner == (void *) (long) cfs_current()->pid);
cookie = cfs_hash_del(cl_env_hash, cle->ce_owner,
- &cle->ce_node);
+ &cle->ce_node);
cle->ce_owner = NULL;
LASSERT(cookie == cle);
}
env = &cle->ce_lu;
*refcheck = ++cle->ce_ref;
}
- CDEBUG(D_OTHER, "%i@%p\n", cle ? cle->ce_ref : 0, cle);
+ CDEBUG(D_OTHER, "%d@%p\n", cle ? cle->ce_ref : 0, cle);
return env;
}
EXPORT_SYMBOL(cl_env_peek);
cle = cl_env_container(env);
cl_env_attach(cle);
*refcheck = cle->ce_ref;
- CDEBUG(D_OTHER, "%i@%p\n", cle->ce_ref, cle);
+ CDEBUG(D_OTHER, "%d@%p\n", cle->ce_ref, cle);
}
}
return env;
cle = cl_env_container(env);
*refcheck = cle->ce_ref;
- CDEBUG(D_OTHER, "%i@%p\n", cle->ce_ref, cle);
+ CDEBUG(D_OTHER, "%d@%p\n", cle->ce_ref, cle);
}
return env;
}
LASSERT(cle->ce_ref > 0);
LASSERT(ergo(refcheck != NULL, cle->ce_ref == *refcheck));
- CDEBUG(D_OTHER, "%i@%p\n", cle->ce_ref, cle);
+ CDEBUG(D_OTHER, "%d@%p\n", cle->ce_ref, cle);
if (--cle->ce_ref == 0) {
CL_ENV_DEC(cs_busy);
cl_env_detach(cle);
cl_env_attach(cle);
cl_env_get(refcheck);
- CDEBUG(D_OTHER, "%i@%p\n", cle->ce_ref, cle);
+ CDEBUG(D_OTHER, "%d@%p\n", cle->ce_ref, cle);
}
EXPORT_SYMBOL(cl_env_implant);
LASSERT(cle->ce_ref > 1);
- CDEBUG(D_OTHER, "%i@%p\n", cle->ce_ref, cle);
+ CDEBUG(D_OTHER, "%d@%p\n", cle->ce_ref, cle);
cl_env_detach(cle);
cl_env_put(env, refcheck);