mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-05 10:31:46 +09:00
staging: lustre: obd: validate open handle cookies
Add a const void *h_owner member to struct portals_handle. Add a const void *owner parameter to class_handle2object() which must be matched by the h_owner member of the handle in addition to the cookie. Signed-off-by: John L. Hammond <john.hammond@intel.com> Intel-bug-id: https://jira.hpdd.intel.com/browse/LU-3233 Reviewed-on: http://review.whamcloud.com/6938 Reviewed-by: Andreas Dilger <andreas.dilger@intel.com> Reviewed-by: Fan Yong <fan.yong@intel.com> Reviewed-by: Mike Pershin <mike.pershin@intel.com> Signed-off-by: James Simmons <jsimmons@infradead.org> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
6a42e615a2
commit
8015e18087
@@ -66,6 +66,7 @@ struct portals_handle_ops {
|
||||
struct portals_handle {
|
||||
struct list_head h_link;
|
||||
__u64 h_cookie;
|
||||
const void *h_owner;
|
||||
struct portals_handle_ops *h_ops;
|
||||
|
||||
/* newly added fields to handle the RCU issue. -jxiong */
|
||||
@@ -83,7 +84,7 @@ struct portals_handle {
|
||||
void class_handle_hash(struct portals_handle *,
|
||||
struct portals_handle_ops *ops);
|
||||
void class_handle_unhash(struct portals_handle *);
|
||||
void *class_handle2object(__u64 cookie);
|
||||
void *class_handle2object(__u64 cookie, const void *owner);
|
||||
void class_handle_free_cb(struct rcu_head *rcu);
|
||||
int class_handle_init(void);
|
||||
void class_handle_cleanup(void);
|
||||
|
||||
@@ -542,7 +542,7 @@ struct ldlm_lock *__ldlm_handle2lock(const struct lustre_handle *handle,
|
||||
|
||||
LASSERT(handle);
|
||||
|
||||
lock = class_handle2object(handle->cookie);
|
||||
lock = class_handle2object(handle->cookie, NULL);
|
||||
if (!lock)
|
||||
return NULL;
|
||||
|
||||
|
||||
@@ -618,7 +618,7 @@ 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 = class_handle2object(conn->cookie, NULL);
|
||||
return export;
|
||||
}
|
||||
EXPORT_SYMBOL(class_conn2export);
|
||||
|
||||
@@ -130,7 +130,7 @@ void class_handle_unhash(struct portals_handle *h)
|
||||
}
|
||||
EXPORT_SYMBOL(class_handle_unhash);
|
||||
|
||||
void *class_handle2object(__u64 cookie)
|
||||
void *class_handle2object(__u64 cookie, const void *owner)
|
||||
{
|
||||
struct handle_bucket *bucket;
|
||||
struct portals_handle *h;
|
||||
@@ -145,7 +145,7 @@ void *class_handle2object(__u64 cookie)
|
||||
|
||||
rcu_read_lock();
|
||||
list_for_each_entry_rcu(h, &bucket->head, h_link) {
|
||||
if (h->h_cookie != cookie)
|
||||
if (h->h_cookie != cookie || h->h_owner != owner)
|
||||
continue;
|
||||
|
||||
spin_lock(&h->h_lock);
|
||||
|
||||
Reference in New Issue
Block a user