diff options
| -rw-r--r-- | fs/dlm/dir.c | 7 | ||||
| -rw-r--r-- | fs/dlm/lockspace.c | 17 | ||||
| -rw-r--r-- | fs/dlm/lowcomms.c | 22 | ||||
| -rw-r--r-- | fs/dlm/lowcomms.h | 3 | ||||
| -rw-r--r-- | fs/dlm/member.c | 19 | ||||
| -rw-r--r-- | fs/dlm/requestqueue.c | 2 | ||||
| -rw-r--r-- | include/linux/dlm.h | 4 |
7 files changed, 48 insertions, 26 deletions
diff --git a/fs/dlm/dir.c b/fs/dlm/dir.c index 858fba14aaa6..c4dfa1dcc86f 100644 --- a/fs/dlm/dir.c +++ b/fs/dlm/dir.c | |||
| @@ -49,7 +49,8 @@ static struct dlm_direntry *get_free_de(struct dlm_ls *ls, int len) | |||
| 49 | spin_unlock(&ls->ls_recover_list_lock); | 49 | spin_unlock(&ls->ls_recover_list_lock); |
| 50 | 50 | ||
| 51 | if (!found) | 51 | if (!found) |
| 52 | de = kzalloc(sizeof(struct dlm_direntry) + len, GFP_KERNEL); | 52 | de = kzalloc(sizeof(struct dlm_direntry) + len, |
| 53 | ls->ls_allocation); | ||
| 53 | return de; | 54 | return de; |
| 54 | } | 55 | } |
| 55 | 56 | ||
| @@ -211,7 +212,7 @@ int dlm_recover_directory(struct dlm_ls *ls) | |||
| 211 | 212 | ||
| 212 | dlm_dir_clear(ls); | 213 | dlm_dir_clear(ls); |
| 213 | 214 | ||
| 214 | last_name = kmalloc(DLM_RESNAME_MAXLEN, GFP_KERNEL); | 215 | last_name = kmalloc(DLM_RESNAME_MAXLEN, ls->ls_allocation); |
| 215 | if (!last_name) | 216 | if (!last_name) |
| 216 | goto out; | 217 | goto out; |
| 217 | 218 | ||
| @@ -322,7 +323,7 @@ static int get_entry(struct dlm_ls *ls, int nodeid, char *name, | |||
| 322 | if (namelen > DLM_RESNAME_MAXLEN) | 323 | if (namelen > DLM_RESNAME_MAXLEN) |
| 323 | return -EINVAL; | 324 | return -EINVAL; |
| 324 | 325 | ||
| 325 | de = kzalloc(sizeof(struct dlm_direntry) + namelen, GFP_KERNEL); | 326 | de = kzalloc(sizeof(struct dlm_direntry) + namelen, ls->ls_allocation); |
| 326 | if (!de) | 327 | if (!de) |
| 327 | return -ENOMEM; | 328 | return -ENOMEM; |
| 328 | 329 | ||
diff --git a/fs/dlm/lockspace.c b/fs/dlm/lockspace.c index cd8e2df3c295..d489fcc86713 100644 --- a/fs/dlm/lockspace.c +++ b/fs/dlm/lockspace.c | |||
| @@ -384,7 +384,7 @@ static void threads_stop(void) | |||
| 384 | dlm_astd_stop(); | 384 | dlm_astd_stop(); |
| 385 | } | 385 | } |
| 386 | 386 | ||
| 387 | static int new_lockspace(char *name, int namelen, void **lockspace, | 387 | static int new_lockspace(const char *name, int namelen, void **lockspace, |
| 388 | uint32_t flags, int lvblen) | 388 | uint32_t flags, int lvblen) |
| 389 | { | 389 | { |
| 390 | struct dlm_ls *ls; | 390 | struct dlm_ls *ls; |
| @@ -419,16 +419,14 @@ static int new_lockspace(char *name, int namelen, void **lockspace, | |||
| 419 | break; | 419 | break; |
| 420 | } | 420 | } |
| 421 | ls->ls_create_count++; | 421 | ls->ls_create_count++; |
| 422 | module_put(THIS_MODULE); | 422 | *lockspace = ls; |
| 423 | error = 1; /* not an error, return 0 */ | 423 | error = 1; |
| 424 | break; | 424 | break; |
| 425 | } | 425 | } |
| 426 | spin_unlock(&lslist_lock); | 426 | spin_unlock(&lslist_lock); |
| 427 | 427 | ||
| 428 | if (error < 0) | ||
| 429 | goto out; | ||
| 430 | if (error) | 428 | if (error) |
| 431 | goto ret_zero; | 429 | goto out; |
| 432 | 430 | ||
| 433 | error = -ENOMEM; | 431 | error = -ENOMEM; |
| 434 | 432 | ||
| @@ -583,7 +581,6 @@ static int new_lockspace(char *name, int namelen, void **lockspace, | |||
| 583 | dlm_create_debug_file(ls); | 581 | dlm_create_debug_file(ls); |
| 584 | 582 | ||
| 585 | log_debug(ls, "join complete"); | 583 | log_debug(ls, "join complete"); |
| 586 | ret_zero: | ||
| 587 | *lockspace = ls; | 584 | *lockspace = ls; |
| 588 | return 0; | 585 | return 0; |
| 589 | 586 | ||
| @@ -614,7 +611,7 @@ static int new_lockspace(char *name, int namelen, void **lockspace, | |||
| 614 | return error; | 611 | return error; |
| 615 | } | 612 | } |
| 616 | 613 | ||
| 617 | int dlm_new_lockspace(char *name, int namelen, void **lockspace, | 614 | int dlm_new_lockspace(const char *name, int namelen, void **lockspace, |
| 618 | uint32_t flags, int lvblen) | 615 | uint32_t flags, int lvblen) |
| 619 | { | 616 | { |
| 620 | int error = 0; | 617 | int error = 0; |
| @@ -628,7 +625,9 @@ int dlm_new_lockspace(char *name, int namelen, void **lockspace, | |||
| 628 | error = new_lockspace(name, namelen, lockspace, flags, lvblen); | 625 | error = new_lockspace(name, namelen, lockspace, flags, lvblen); |
| 629 | if (!error) | 626 | if (!error) |
| 630 | ls_count++; | 627 | ls_count++; |
| 631 | else if (!ls_count) | 628 | if (error > 0) |
| 629 | error = 0; | ||
| 630 | if (!ls_count) | ||
| 632 | threads_stop(); | 631 | threads_stop(); |
| 633 | out: | 632 | out: |
| 634 | mutex_unlock(&ls_lock); | 633 | mutex_unlock(&ls_lock); |
diff --git a/fs/dlm/lowcomms.c b/fs/dlm/lowcomms.c index 609108a83267..cdb580a9c7a2 100644 --- a/fs/dlm/lowcomms.c +++ b/fs/dlm/lowcomms.c | |||
| @@ -309,6 +309,20 @@ static void lowcomms_state_change(struct sock *sk) | |||
| 309 | lowcomms_write_space(sk); | 309 | lowcomms_write_space(sk); |
| 310 | } | 310 | } |
| 311 | 311 | ||
| 312 | int dlm_lowcomms_connect_node(int nodeid) | ||
| 313 | { | ||
| 314 | struct connection *con; | ||
| 315 | |||
| 316 | if (nodeid == dlm_our_nodeid()) | ||
| 317 | return 0; | ||
| 318 | |||
| 319 | con = nodeid2con(nodeid, GFP_NOFS); | ||
| 320 | if (!con) | ||
| 321 | return -ENOMEM; | ||
| 322 | lowcomms_connect_sock(con); | ||
| 323 | return 0; | ||
| 324 | } | ||
| 325 | |||
| 312 | /* Make a socket active */ | 326 | /* Make a socket active */ |
| 313 | static int add_sock(struct socket *sock, struct connection *con) | 327 | static int add_sock(struct socket *sock, struct connection *con) |
| 314 | { | 328 | { |
| @@ -486,7 +500,7 @@ static void process_sctp_notification(struct connection *con, | |||
| 486 | return; | 500 | return; |
| 487 | } | 501 | } |
| 488 | 502 | ||
| 489 | new_con = nodeid2con(nodeid, GFP_KERNEL); | 503 | new_con = nodeid2con(nodeid, GFP_NOFS); |
| 490 | if (!new_con) | 504 | if (!new_con) |
| 491 | return; | 505 | return; |
| 492 | 506 | ||
| @@ -722,7 +736,7 @@ static int tcp_accept_from_sock(struct connection *con) | |||
| 722 | * the same time and the connections cross on the wire. | 736 | * the same time and the connections cross on the wire. |
| 723 | * In this case we store the incoming one in "othercon" | 737 | * In this case we store the incoming one in "othercon" |
| 724 | */ | 738 | */ |
| 725 | newcon = nodeid2con(nodeid, GFP_KERNEL); | 739 | newcon = nodeid2con(nodeid, GFP_NOFS); |
| 726 | if (!newcon) { | 740 | if (!newcon) { |
| 727 | result = -ENOMEM; | 741 | result = -ENOMEM; |
| 728 | goto accept_err; | 742 | goto accept_err; |
| @@ -732,7 +746,7 @@ static int tcp_accept_from_sock(struct connection *con) | |||
| 732 | struct connection *othercon = newcon->othercon; | 746 | struct connection *othercon = newcon->othercon; |
| 733 | 747 | ||
| 734 | if (!othercon) { | 748 | if (!othercon) { |
| 735 | othercon = kmem_cache_zalloc(con_cache, GFP_KERNEL); | 749 | othercon = kmem_cache_zalloc(con_cache, GFP_NOFS); |
| 736 | if (!othercon) { | 750 | if (!othercon) { |
| 737 | log_print("failed to allocate incoming socket"); | 751 | log_print("failed to allocate incoming socket"); |
| 738 | mutex_unlock(&newcon->sock_mutex); | 752 | mutex_unlock(&newcon->sock_mutex); |
| @@ -1421,7 +1435,7 @@ static int work_start(void) | |||
| 1421 | static void stop_conn(struct connection *con) | 1435 | static void stop_conn(struct connection *con) |
| 1422 | { | 1436 | { |
| 1423 | con->flags |= 0x0F; | 1437 | con->flags |= 0x0F; |
| 1424 | if (con->sock) | 1438 | if (con->sock && con->sock->sk) |
| 1425 | con->sock->sk->sk_user_data = NULL; | 1439 | con->sock->sk->sk_user_data = NULL; |
| 1426 | } | 1440 | } |
| 1427 | 1441 | ||
diff --git a/fs/dlm/lowcomms.h b/fs/dlm/lowcomms.h index a9a9618c0d3f..1311e6426287 100644 --- a/fs/dlm/lowcomms.h +++ b/fs/dlm/lowcomms.h | |||
| @@ -2,7 +2,7 @@ | |||
| 2 | ******************************************************************************* | 2 | ******************************************************************************* |
| 3 | ** | 3 | ** |
| 4 | ** Copyright (C) Sistina Software, Inc. 1997-2003 All rights reserved. | 4 | ** Copyright (C) Sistina Software, Inc. 1997-2003 All rights reserved. |
| 5 | ** Copyright (C) 2004-2005 Red Hat, Inc. All rights reserved. | 5 | ** Copyright (C) 2004-2009 Red Hat, Inc. All rights reserved. |
| 6 | ** | 6 | ** |
| 7 | ** This copyrighted material is made available to anyone wishing to use, | 7 | ** This copyrighted material is made available to anyone wishing to use, |
| 8 | ** modify, copy, or redistribute it subject to the terms and conditions | 8 | ** modify, copy, or redistribute it subject to the terms and conditions |
| @@ -19,6 +19,7 @@ void dlm_lowcomms_stop(void); | |||
| 19 | int dlm_lowcomms_close(int nodeid); | 19 | int dlm_lowcomms_close(int nodeid); |
| 20 | void *dlm_lowcomms_get_buffer(int nodeid, int len, gfp_t allocation, char **ppc); | 20 | void *dlm_lowcomms_get_buffer(int nodeid, int len, gfp_t allocation, char **ppc); |
| 21 | void dlm_lowcomms_commit_buffer(void *mh); | 21 | void dlm_lowcomms_commit_buffer(void *mh); |
| 22 | int dlm_lowcomms_connect_node(int nodeid); | ||
| 22 | 23 | ||
| 23 | #endif /* __LOWCOMMS_DOT_H__ */ | 24 | #endif /* __LOWCOMMS_DOT_H__ */ |
| 24 | 25 | ||
diff --git a/fs/dlm/member.c b/fs/dlm/member.c index 26133f05ae3a..b128775913b2 100644 --- a/fs/dlm/member.c +++ b/fs/dlm/member.c | |||
| @@ -1,7 +1,7 @@ | |||
| 1 | /****************************************************************************** | 1 | /****************************************************************************** |
| 2 | ******************************************************************************* | 2 | ******************************************************************************* |
| 3 | ** | 3 | ** |
| 4 | ** Copyright (C) 2005-2008 Red Hat, Inc. All rights reserved. | 4 | ** Copyright (C) 2005-2009 Red Hat, Inc. All rights reserved. |
| 5 | ** | 5 | ** |
| 6 | ** This copyrighted material is made available to anyone wishing to use, | 6 | ** This copyrighted material is made available to anyone wishing to use, |
| 7 | ** modify, copy, or redistribute it subject to the terms and conditions | 7 | ** modify, copy, or redistribute it subject to the terms and conditions |
| @@ -17,6 +17,7 @@ | |||
| 17 | #include "recover.h" | 17 | #include "recover.h" |
| 18 | #include "rcom.h" | 18 | #include "rcom.h" |
| 19 | #include "config.h" | 19 | #include "config.h" |
| 20 | #include "lowcomms.h" | ||
| 20 | 21 | ||
| 21 | static void add_ordered_member(struct dlm_ls *ls, struct dlm_member *new) | 22 | static void add_ordered_member(struct dlm_ls *ls, struct dlm_member *new) |
| 22 | { | 23 | { |
| @@ -45,9 +46,9 @@ static void add_ordered_member(struct dlm_ls *ls, struct dlm_member *new) | |||
| 45 | static int dlm_add_member(struct dlm_ls *ls, int nodeid) | 46 | static int dlm_add_member(struct dlm_ls *ls, int nodeid) |
| 46 | { | 47 | { |
| 47 | struct dlm_member *memb; | 48 | struct dlm_member *memb; |
| 48 | int w; | 49 | int w, error; |
| 49 | 50 | ||
| 50 | memb = kzalloc(sizeof(struct dlm_member), GFP_KERNEL); | 51 | memb = kzalloc(sizeof(struct dlm_member), ls->ls_allocation); |
| 51 | if (!memb) | 52 | if (!memb) |
| 52 | return -ENOMEM; | 53 | return -ENOMEM; |
| 53 | 54 | ||
| @@ -57,6 +58,12 @@ static int dlm_add_member(struct dlm_ls *ls, int nodeid) | |||
| 57 | return w; | 58 | return w; |
| 58 | } | 59 | } |
| 59 | 60 | ||
| 61 | error = dlm_lowcomms_connect_node(nodeid); | ||
| 62 | if (error < 0) { | ||
| 63 | kfree(memb); | ||
| 64 | return error; | ||
| 65 | } | ||
| 66 | |||
| 60 | memb->nodeid = nodeid; | 67 | memb->nodeid = nodeid; |
| 61 | memb->weight = w; | 68 | memb->weight = w; |
| 62 | add_ordered_member(ls, memb); | 69 | add_ordered_member(ls, memb); |
| @@ -136,7 +143,7 @@ static void make_member_array(struct dlm_ls *ls) | |||
| 136 | 143 | ||
| 137 | ls->ls_total_weight = total; | 144 | ls->ls_total_weight = total; |
| 138 | 145 | ||
| 139 | array = kmalloc(sizeof(int) * total, GFP_KERNEL); | 146 | array = kmalloc(sizeof(int) * total, ls->ls_allocation); |
| 140 | if (!array) | 147 | if (!array) |
| 141 | return; | 148 | return; |
| 142 | 149 | ||
| @@ -219,7 +226,7 @@ int dlm_recover_members(struct dlm_ls *ls, struct dlm_recover *rv, int *neg_out) | |||
| 219 | continue; | 226 | continue; |
| 220 | log_debug(ls, "new nodeid %d is a re-added member", rv->new[i]); | 227 | log_debug(ls, "new nodeid %d is a re-added member", rv->new[i]); |
| 221 | 228 | ||
| 222 | memb = kzalloc(sizeof(struct dlm_member), GFP_KERNEL); | 229 | memb = kzalloc(sizeof(struct dlm_member), ls->ls_allocation); |
| 223 | if (!memb) | 230 | if (!memb) |
| 224 | return -ENOMEM; | 231 | return -ENOMEM; |
| 225 | memb->nodeid = rv->new[i]; | 232 | memb->nodeid = rv->new[i]; |
| @@ -334,7 +341,7 @@ int dlm_ls_start(struct dlm_ls *ls) | |||
| 334 | int *ids = NULL, *new = NULL; | 341 | int *ids = NULL, *new = NULL; |
| 335 | int error, ids_count = 0, new_count = 0; | 342 | int error, ids_count = 0, new_count = 0; |
| 336 | 343 | ||
| 337 | rv = kzalloc(sizeof(struct dlm_recover), GFP_KERNEL); | 344 | rv = kzalloc(sizeof(struct dlm_recover), ls->ls_allocation); |
| 338 | if (!rv) | 345 | if (!rv) |
| 339 | return -ENOMEM; | 346 | return -ENOMEM; |
| 340 | 347 | ||
diff --git a/fs/dlm/requestqueue.c b/fs/dlm/requestqueue.c index daa4183fbb84..7a2307c08911 100644 --- a/fs/dlm/requestqueue.c +++ b/fs/dlm/requestqueue.c | |||
| @@ -35,7 +35,7 @@ void dlm_add_requestqueue(struct dlm_ls *ls, int nodeid, struct dlm_message *ms) | |||
| 35 | struct rq_entry *e; | 35 | struct rq_entry *e; |
| 36 | int length = ms->m_header.h_length - sizeof(struct dlm_message); | 36 | int length = ms->m_header.h_length - sizeof(struct dlm_message); |
| 37 | 37 | ||
| 38 | e = kmalloc(sizeof(struct rq_entry) + length, GFP_KERNEL); | 38 | e = kmalloc(sizeof(struct rq_entry) + length, ls->ls_allocation); |
| 39 | if (!e) { | 39 | if (!e) { |
| 40 | log_print("dlm_add_requestqueue: out of memory len %d", length); | 40 | log_print("dlm_add_requestqueue: out of memory len %d", length); |
| 41 | return; | 41 | return; |
diff --git a/include/linux/dlm.h b/include/linux/dlm.h index b9cd38603fd8..0b3518c42356 100644 --- a/include/linux/dlm.h +++ b/include/linux/dlm.h | |||
| @@ -81,8 +81,8 @@ struct dlm_lksb { | |||
| 81 | * the cluster, the calling node joins it. | 81 | * the cluster, the calling node joins it. |
| 82 | */ | 82 | */ |
| 83 | 83 | ||
| 84 | int dlm_new_lockspace(char *name, int namelen, dlm_lockspace_t **lockspace, | 84 | int dlm_new_lockspace(const char *name, int namelen, |
| 85 | uint32_t flags, int lvblen); | 85 | dlm_lockspace_t **lockspace, uint32_t flags, int lvblen); |
| 86 | 86 | ||
| 87 | /* | 87 | /* |
| 88 | * dlm_release_lockspace | 88 | * dlm_release_lockspace |
