diff options
author | Alex Elder <elder@dreamhost.com> | 2012-02-14 15:05:33 -0500 |
---|---|---|
committer | Alex Elder <elder@dreamhost.com> | 2012-03-22 11:47:50 -0400 |
commit | 6173d1f02fb19c0fba02857ae4e1109b5ec95034 (patch) | |
tree | c837bfe920220d138ba99d8fac2ac781bb2a44ac /net | |
parent | e0f43c9419c1900e5b50de4261e9686a45a0a2b8 (diff) |
libceph: encapsulate some messenger cleanup code
Define a helper function to perform various cleanup operations. Use
it both in the exit routine and in the init routine in the event of
an error.
Signed-off-by: Alex Elder <elder@dreamhost.com>
Signed-off-by: Sage Weil <sage@newdream.net>
Diffstat (limited to 'net')
-rw-r--r-- | net/ceph/messenger.c | 38 |
1 files changed, 20 insertions, 18 deletions
diff --git a/net/ceph/messenger.c b/net/ceph/messenger.c index 31f59ac03d8a..c3023a600ad2 100644 --- a/net/ceph/messenger.c +++ b/net/ceph/messenger.c | |||
@@ -99,6 +99,20 @@ static void encode_my_addr(struct ceph_messenger *msgr) | |||
99 | */ | 99 | */ |
100 | static struct workqueue_struct *ceph_msgr_wq; | 100 | static struct workqueue_struct *ceph_msgr_wq; |
101 | 101 | ||
102 | void _ceph_msgr_exit(void) | ||
103 | { | ||
104 | if (ceph_msgr_wq) | ||
105 | destroy_workqueue(ceph_msgr_wq); | ||
106 | |||
107 | BUG_ON(zero_page_address == NULL); | ||
108 | zero_page_address = NULL; | ||
109 | |||
110 | BUG_ON(zero_page == NULL); | ||
111 | kunmap(zero_page); | ||
112 | page_cache_release(zero_page); | ||
113 | zero_page = NULL; | ||
114 | } | ||
115 | |||
102 | int ceph_msgr_init(void) | 116 | int ceph_msgr_init(void) |
103 | { | 117 | { |
104 | BUG_ON(zero_page != NULL); | 118 | BUG_ON(zero_page != NULL); |
@@ -109,33 +123,21 @@ int ceph_msgr_init(void) | |||
109 | zero_page_address = kmap(zero_page); | 123 | zero_page_address = kmap(zero_page); |
110 | 124 | ||
111 | ceph_msgr_wq = alloc_workqueue("ceph-msgr", WQ_NON_REENTRANT, 0); | 125 | ceph_msgr_wq = alloc_workqueue("ceph-msgr", WQ_NON_REENTRANT, 0); |
112 | if (!ceph_msgr_wq) { | 126 | if (ceph_msgr_wq) |
113 | pr_err("msgr_init failed to create workqueue\n"); | 127 | return 0; |
114 | |||
115 | zero_page_address = NULL; | ||
116 | kunmap(zero_page); | ||
117 | page_cache_release(zero_page); | ||
118 | zero_page = NULL; | ||
119 | 128 | ||
120 | return -ENOMEM; | 129 | pr_err("msgr_init failed to create workqueue\n"); |
121 | } | 130 | _ceph_msgr_exit(); |
122 | 131 | ||
123 | return 0; | 132 | return -ENOMEM; |
124 | } | 133 | } |
125 | EXPORT_SYMBOL(ceph_msgr_init); | 134 | EXPORT_SYMBOL(ceph_msgr_init); |
126 | 135 | ||
127 | void ceph_msgr_exit(void) | 136 | void ceph_msgr_exit(void) |
128 | { | 137 | { |
129 | BUG_ON(ceph_msgr_wq == NULL); | 138 | BUG_ON(ceph_msgr_wq == NULL); |
130 | destroy_workqueue(ceph_msgr_wq); | ||
131 | 139 | ||
132 | BUG_ON(zero_page_address == NULL); | 140 | _ceph_msgr_exit(); |
133 | zero_page_address = NULL; | ||
134 | |||
135 | BUG_ON(zero_page == NULL); | ||
136 | kunmap(zero_page); | ||
137 | page_cache_release(zero_page); | ||
138 | zero_page = NULL; | ||
139 | } | 141 | } |
140 | EXPORT_SYMBOL(ceph_msgr_exit); | 142 | EXPORT_SYMBOL(ceph_msgr_exit); |
141 | 143 | ||