#include <linux/spinlock.h>
#include <libcfs/libcfs.h>
-struct portals_handle_ops {
- /* hop_type is used for some debugging messages */
- char *hop_type;
-};
-
/* These handles are most easily used by having them appear at the very top of
* whatever object that you want to make handles for. ie:
*
struct portals_handle {
struct list_head h_link;
__u64 h_cookie;
- const struct portals_handle_ops *h_ops;
+ const char *h_owner;
refcount_t h_ref;
/* newly added fields to handle the RCU issue. -jxiong */
/* handles.c */
/* Add a handle to the hash table */
-void class_handle_hash(struct portals_handle *,
- const struct portals_handle_ops *ops);
+void class_handle_hash(struct portals_handle *, const char *h_owner);
void class_handle_unhash(struct portals_handle *);
-void *class_handle2object(u64 cookie, const struct portals_handle_ops *ops);
+void *class_handle2object(u64 cookie, const char *h_owner);
int class_handle_init(void);
void class_handle_cleanup(void);
EXIT;
}
-static struct portals_handle_ops lock_handle_ops = {
- .hop_type = "ldlm",
-};
+static const char lock_handle_owner[] = "ldlm";
/**
*
lprocfs_counter_incr(ldlm_res_to_ns(resource)->ns_stats,
LDLM_NSS_LOCKS);
INIT_LIST_HEAD_RCU(&lock->l_handle.h_link);
- class_handle_hash(&lock->l_handle, &lock_handle_ops);
+ class_handle_hash(&lock->l_handle, lock_handle_owner);
lu_ref_init(&lock->l_reference);
lu_ref_add(&lock->l_reference, "hash", lock);
if (!lustre_handle_is_used(handle))
RETURN(NULL);
- lock = class_handle2object(handle->cookie, &lock_handle_ops);
-
+ lock = class_handle2object(handle->cookie, lock_handle_owner);
if (lock == NULL)
RETURN(NULL);
#include "mdt_internal.h"
#include <lustre_nodemap.h>
-static const struct portals_handle_ops mfd_open_handle_ops = {
- .hop_type = "mdt",
-};
+static const char mfd_open_handle_owner[] = "mdt";
/* Create a new mdt_file_data struct, initialize it,
* and insert it to global hash table */
INIT_LIST_HEAD_RCU(&mfd->mfd_open_handle.h_link);
mfd->mfd_owner = med;
INIT_LIST_HEAD(&mfd->mfd_list);
- class_handle_hash(&mfd->mfd_open_handle, &mfd_open_handle_ops);
+ class_handle_hash(&mfd->mfd_open_handle, mfd_open_handle_owner);
}
RETURN(mfd);
ENTRY;
LASSERT(open_handle != NULL);
- mfd = class_handle2object(open_handle->cookie, &mfd_open_handle_ops);
+ mfd = class_handle2object(open_handle->cookie, mfd_open_handle_owner);
if (mfd)
refcount_dec(&mfd->mfd_open_handle.h_ref);
RETURN(rc);
}
-static struct portals_handle_ops export_handle_ops;
+static const char export_handle_owner[] = "export";
/* map connection to client */
struct obd_export *class_conn2export(struct lustre_handle *conn)
}
CDEBUG(D_INFO, "looking for export cookie %#llx\n", conn->cookie);
- export = class_handle2object(conn->cookie, &export_handle_ops);
+ export = class_handle2object(conn->cookie, export_handle_owner);
RETURN(export);
}
EXPORT_SYMBOL(class_conn2export);
EXIT;
}
-static struct portals_handle_ops export_handle_ops = {
- .hop_type = "export",
-};
-
struct obd_export *class_export_get(struct obd_export *exp)
{
refcount_inc(&exp->exp_handle.h_ref);
INIT_LIST_HEAD_RCU(&export->exp_handle.h_link);
INIT_LIST_HEAD(&export->exp_hp_rpcs);
INIT_LIST_HEAD(&export->exp_reg_rpcs);
- class_handle_hash(&export->exp_handle, &export_handle_ops);
+ class_handle_hash(&export->exp_handle, export_handle_owner);
export->exp_last_request_time = ktime_get_real_seconds();
spin_lock_init(&export->exp_lock);
spin_lock_init(&export->exp_rpc_lock);
* Generate a unique 64bit cookie (hash) for a handle and insert it into
* global (per-node) hash-table.
*/
-void class_handle_hash(struct portals_handle *h,
- const struct portals_handle_ops *ops)
+void class_handle_hash(struct portals_handle *h, const char *owner)
{
struct handle_bucket *bucket;
h->h_cookie = handle_base;
spin_unlock(&handle_base_lock);
- h->h_ops = ops;
+ h->h_owner = owner;
spin_lock_init(&h->h_lock);
bucket = &handle_hash[h->h_cookie & HANDLE_HASH_MASK];
}
EXPORT_SYMBOL(class_handle_unhash);
-void *class_handle2object(u64 cookie, const struct portals_handle_ops *ops)
+void *class_handle2object(u64 cookie, const char *owner)
{
struct handle_bucket *bucket;
struct portals_handle *h;
rcu_read_lock();
list_for_each_entry_rcu(h, &bucket->head, h_link) {
- if (h->h_cookie != cookie || h->h_ops != ops)
+ if (h->h_cookie != cookie || h->h_owner != owner)
continue;
spin_lock(&h->h_lock);
if (likely(h->h_in != 0)) {
refcount_inc(&h->h_ref);
CDEBUG(D_INFO, "GET %s %p refcount=%d\n",
- h->h_ops->hop_type, h,
+ h->h_owner, h,
refcount_read(&h->h_ref));
retval = h;
}
spin_lock(&handle_hash[i].lock);
list_for_each_entry_rcu(h, &(handle_hash[i].head), h_link) {
- CERROR("force clean handle %#llx addr %p ops %p\n",
- h->h_cookie, h, h->h_ops);
+ CERROR("force clean handle %#llx addr %p owner %p\n",
+ h->h_cookie, h, h->h_owner);
class_handle_unhash_nolock(h);
rc++;