Whamcloud - gitweb
git://git.whamcloud.com
/
fs
/
lustre-release.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
LU-2241 symlink: fix off-by-one error when reading symlinks
[fs/lustre-release.git]
/
lnet
/
lnet
/
lib-md.c
diff --git
a/lnet/lnet/lib-md.c
b/lnet/lnet/lib-md.c
index
c189fb9
..
6c10ccf
100644
(file)
--- a/
lnet/lnet/lib-md.c
+++ b/
lnet/lnet/lib-md.c
@@
-40,7
+40,7
@@
#include <lnet/lib-lnet.h>
#include <lnet/lib-lnet.h>
-/* must be called with
LNET_LOCK
held */
+/* must be called with
lnet_res_lock
held */
void
lnet_md_unlink(lnet_libmd_t *md)
{
void
lnet_md_unlink(lnet_libmd_t *md)
{
@@
-71,12
+71,14
@@
lnet_md_unlink(lnet_libmd_t *md)
CDEBUG(D_NET, "Unlinking md %p\n", md);
if (md->md_eq != NULL) {
CDEBUG(D_NET, "Unlinking md %p\n", md);
if (md->md_eq != NULL) {
- md->md_eq->eq_refcount--;
- LASSERT (md->md_eq->eq_refcount >= 0);
- }
+ int cpt = lnet_cpt_of_cookie(md->md_lh.lh_cookie);
+
+ LASSERT(*md->md_eq->eq_refs[cpt] > 0);
+ (*md->md_eq->eq_refs[cpt])--;
+ }
-
LASSERT
(!cfs_list_empty(&md->md_list));
-
cfs_list_del_init
(&md->md_list);
+
LASSERT
(!cfs_list_empty(&md->md_list));
+
cfs_list_del_init
(&md->md_list);
lnet_md_free_locked(md);
}
lnet_md_free_locked(md);
}
@@
-163,9
+165,9
@@
lnet_md_build(lnet_libmd_t *lmd, lnet_md_t *umd, int unlink)
/* must be called with resource lock held */
static int
/* must be called with resource lock held */
static int
-lnet_md_link(lnet_libmd_t *md, lnet_handle_eq_t eq_handle)
+lnet_md_link(lnet_libmd_t *md, lnet_handle_eq_t eq_handle
, int cpt
)
{
{
- struct lnet_res_container *container =
&the_lnet.ln_md_container
;
+ struct lnet_res_container *container =
the_lnet.ln_md_containers[cpt]
;
/* NB we are passed an allocated, but inactive md.
* if we return success, caller may lnet_md_unlink() it.
/* NB we are passed an allocated, but inactive md.
* if we return success, caller may lnet_md_unlink() it.
@@
-185,7
+187,7
@@
lnet_md_link(lnet_libmd_t *md, lnet_handle_eq_t eq_handle)
if (md->md_eq == NULL)
return -ENOENT;
if (md->md_eq == NULL)
return -ENOENT;
-
md->md_eq->eq_refcount
++;
+
(*md->md_eq->eq_refs[cpt])
++;
}
lnet_res_lh_initialize(container, &md->md_lh);
}
lnet_res_lh_initialize(container, &md->md_lh);
@@
-196,7
+198,7
@@
lnet_md_link(lnet_libmd_t *md, lnet_handle_eq_t eq_handle)
return 0;
}
return 0;
}
-/* must be called with
LNET_LOCK
held */
+/* must be called with
lnet_res_lock
held */
void
lnet_md_deconstruct(lnet_libmd_t *lmd, lnet_md_t *umd)
{
void
lnet_md_deconstruct(lnet_libmd_t *lmd, lnet_md_t *umd)
{
@@
-261,13
+263,14
@@
lnet_md_validate(lnet_md_t *umd)
*/
int
LNetMDAttach(lnet_handle_me_t meh, lnet_md_t umd,
*/
int
LNetMDAttach(lnet_handle_me_t meh, lnet_md_t umd,
-
lnet_unlink_t unlink, lnet_handle_md_t *handle)
+ lnet_unlink_t unlink, lnet_handle_md_t *handle)
{
{
- CFS_LIST_HEAD (matches);
- CFS_LIST_HEAD (drops);
- lnet_me_t *me;
- lnet_libmd_t *md;
- int rc;
+ CFS_LIST_HEAD (matches);
+ CFS_LIST_HEAD (drops);
+ struct lnet_me *me;
+ struct lnet_libmd *md;
+ int cpt;
+ int rc;
LASSERT (the_lnet.ln_init);
LASSERT (the_lnet.ln_refcount > 0);
LASSERT (the_lnet.ln_init);
LASSERT (the_lnet.ln_refcount > 0);
@@
-285,18
+288,19
@@
LNetMDAttach(lnet_handle_me_t meh, lnet_md_t umd,
return -ENOMEM;
rc = lnet_md_build(md, &umd, unlink);
return -ENOMEM;
rc = lnet_md_build(md, &umd, unlink);
+ cpt = lnet_cpt_of_cookie(meh.cookie);
-
LNET_LOCK(
);
+
lnet_res_lock(cpt
);
if (rc != 0)
goto failed;
if (rc != 0)
goto failed;
-
me = lnet_handle2me(&meh);
+ me = lnet_handle2me(&meh);
if (me == NULL)
rc = -ENOENT;
else if (me->me_md != NULL)
if (me == NULL)
rc = -ENOENT;
else if (me->me_md != NULL)
-
rc = -EBUSY;
+ rc = -EBUSY;
else
else
- rc = lnet_md_link(md, umd.eq_handle);
+ rc = lnet_md_link(md, umd.eq_handle
, cpt
);
if (rc != 0)
goto failed;
if (rc != 0)
goto failed;
@@
-307,7
+311,7
@@
LNetMDAttach(lnet_handle_me_t meh, lnet_md_t umd,
lnet_md2handle(handle, md);
lnet_md2handle(handle, md);
-
LNET_UNLOCK(
);
+
lnet_res_unlock(cpt
);
lnet_drop_delayed_msg_list(&drops, "Bad match");
lnet_recv_delayed_msg_list(&matches);
lnet_drop_delayed_msg_list(&drops, "Bad match");
lnet_recv_delayed_msg_list(&matches);
@@
-317,9
+321,10
@@
LNetMDAttach(lnet_handle_me_t meh, lnet_md_t umd,
failed:
lnet_md_free_locked(md);
failed:
lnet_md_free_locked(md);
-
LNET_UNLOCK(
);
+
lnet_res_unlock(cpt
);
return rc;
}
return rc;
}
+EXPORT_SYMBOL(LNetMDAttach);
/**
* Create a "free floating" memory descriptor - a MD that is not associated
/**
* Create a "free floating" memory descriptor - a MD that is not associated
@@
-340,8
+345,9
@@
LNetMDAttach(lnet_handle_me_t meh, lnet_md_t umd,
int
LNetMDBind(lnet_md_t umd, lnet_unlink_t unlink, lnet_handle_md_t *handle)
{
int
LNetMDBind(lnet_md_t umd, lnet_unlink_t unlink, lnet_handle_md_t *handle)
{
- lnet_libmd_t *md;
- int rc;
+ lnet_libmd_t *md;
+ int cpt;
+ int rc;
LASSERT (the_lnet.ln_init);
LASSERT (the_lnet.ln_refcount > 0);
LASSERT (the_lnet.ln_init);
LASSERT (the_lnet.ln_refcount > 0);
@@
-360,25
+366,26
@@
LNetMDBind(lnet_md_t umd, lnet_unlink_t unlink, lnet_handle_md_t *handle)
rc = lnet_md_build(md, &umd, unlink);
rc = lnet_md_build(md, &umd, unlink);
-
LNET_LOCK
();
+
cpt = lnet_res_lock_current
();
if (rc != 0)
goto failed;
if (rc != 0)
goto failed;
- rc = lnet_md_link(md, umd.eq_handle);
+ rc = lnet_md_link(md, umd.eq_handle
, cpt
);
if (rc != 0)
goto failed;
lnet_md2handle(handle, md);
if (rc != 0)
goto failed;
lnet_md2handle(handle, md);
-
LNET_UNLOCK(
);
+
lnet_res_unlock(cpt
);
return 0;
failed:
lnet_md_free_locked(md);
return 0;
failed:
lnet_md_free_locked(md);
-
LNET_UNLOCK(
);
+
lnet_res_unlock(cpt
);
return rc;
}
return rc;
}
+EXPORT_SYMBOL(LNetMDBind);
/**
* Unlink the memory descriptor from any ME it may be linked to and release
/**
* Unlink the memory descriptor from any ME it may be linked to and release
@@
-412,17
+419,19
@@
LNetMDBind(lnet_md_t umd, lnet_unlink_t unlink, lnet_handle_md_t *handle)
int
LNetMDUnlink (lnet_handle_md_t mdh)
{
int
LNetMDUnlink (lnet_handle_md_t mdh)
{
- lnet_event_t ev;
- lnet_libmd_t *md;
+ lnet_event_t ev;
+ lnet_libmd_t *md;
+ int cpt;
-
LASSERT
(the_lnet.ln_init);
-
LASSERT
(the_lnet.ln_refcount > 0);
+
LASSERT
(the_lnet.ln_init);
+
LASSERT
(the_lnet.ln_refcount > 0);
- LNET_LOCK();
+ cpt = lnet_cpt_of_cookie(mdh.cookie);
+ lnet_res_lock(cpt);
-
md = lnet_handle2md(&mdh);
-
if (md == NULL) {
-
LNET_UNLOCK(
);
+ md = lnet_handle2md(&mdh);
+ if (md == NULL) {
+
lnet_res_unlock(cpt
);
return -ENOENT;
}
return -ENOENT;
}
@@
-438,6
+447,7
@@
LNetMDUnlink (lnet_handle_md_t mdh)
lnet_md_unlink(md);
lnet_md_unlink(md);
-
LNET_UNLOCK(
);
-
return 0;
+
lnet_res_unlock(cpt
);
+ return 0;
}
}
+EXPORT_SYMBOL(LNetMDUnlink);