diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2009-06-12 16:17:12 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2009-06-12 16:17:12 -0400 |
commit | c53567ad4528b6efefc3fc22a354d20f6226a098 (patch) | |
tree | faa289a41715e0a9a174623a76c7d52b10d4a6df /fs | |
parent | 4ddbac98980fe0a42cf57af5d1032e024aced6a1 (diff) | |
parent | 748285ccf7ea76d3d76d0d5f2945ad6fb91f5329 (diff) |
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/teigland/dlm
* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/teigland/dlm:
dlm: use more NOFS allocation
dlm: connect to nodes earlier
dlm: fix use count with multiple joins
dlm: Make name input parameter of {,dlm_}new_lockspace() const
Diffstat (limited to 'fs')
-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 |
6 files changed, 46 insertions, 24 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; |