diff options
Diffstat (limited to 'fs/ocfs2/cluster')
-rw-r--r-- | fs/ocfs2/cluster/heartbeat.c | 158 | ||||
-rw-r--r-- | fs/ocfs2/cluster/tcp.c | 35 | ||||
-rw-r--r-- | fs/ocfs2/cluster/tcp.h | 6 | ||||
-rw-r--r-- | fs/ocfs2/cluster/tcp_internal.h | 12 |
4 files changed, 74 insertions, 137 deletions
diff --git a/fs/ocfs2/cluster/heartbeat.c b/fs/ocfs2/cluster/heartbeat.c index 277ca67a2ad6..5a9779bb9236 100644 --- a/fs/ocfs2/cluster/heartbeat.c +++ b/fs/ocfs2/cluster/heartbeat.c | |||
@@ -184,10 +184,9 @@ static void o2hb_disarm_write_timeout(struct o2hb_region *reg) | |||
184 | flush_scheduled_work(); | 184 | flush_scheduled_work(); |
185 | } | 185 | } |
186 | 186 | ||
187 | static inline void o2hb_bio_wait_init(struct o2hb_bio_wait_ctxt *wc, | 187 | static inline void o2hb_bio_wait_init(struct o2hb_bio_wait_ctxt *wc) |
188 | unsigned int num_ios) | ||
189 | { | 188 | { |
190 | atomic_set(&wc->wc_num_reqs, num_ios); | 189 | atomic_set(&wc->wc_num_reqs, 1); |
191 | init_completion(&wc->wc_io_complete); | 190 | init_completion(&wc->wc_io_complete); |
192 | wc->wc_error = 0; | 191 | wc->wc_error = 0; |
193 | } | 192 | } |
@@ -212,6 +211,7 @@ static void o2hb_wait_on_io(struct o2hb_region *reg, | |||
212 | struct address_space *mapping = reg->hr_bdev->bd_inode->i_mapping; | 211 | struct address_space *mapping = reg->hr_bdev->bd_inode->i_mapping; |
213 | 212 | ||
214 | blk_run_address_space(mapping); | 213 | blk_run_address_space(mapping); |
214 | o2hb_bio_wait_dec(wc, 1); | ||
215 | 215 | ||
216 | wait_for_completion(&wc->wc_io_complete); | 216 | wait_for_completion(&wc->wc_io_complete); |
217 | } | 217 | } |
@@ -231,6 +231,7 @@ static int o2hb_bio_end_io(struct bio *bio, | |||
231 | return 1; | 231 | return 1; |
232 | 232 | ||
233 | o2hb_bio_wait_dec(wc, 1); | 233 | o2hb_bio_wait_dec(wc, 1); |
234 | bio_put(bio); | ||
234 | return 0; | 235 | return 0; |
235 | } | 236 | } |
236 | 237 | ||
@@ -238,23 +239,22 @@ static int o2hb_bio_end_io(struct bio *bio, | |||
238 | * start_slot. */ | 239 | * start_slot. */ |
239 | static struct bio *o2hb_setup_one_bio(struct o2hb_region *reg, | 240 | static struct bio *o2hb_setup_one_bio(struct o2hb_region *reg, |
240 | struct o2hb_bio_wait_ctxt *wc, | 241 | struct o2hb_bio_wait_ctxt *wc, |
241 | unsigned int start_slot, | 242 | unsigned int *current_slot, |
242 | unsigned int num_slots) | 243 | unsigned int max_slots) |
243 | { | 244 | { |
244 | int i, nr_vecs, len, first_page, last_page; | 245 | int len, current_page; |
245 | unsigned int vec_len, vec_start; | 246 | unsigned int vec_len, vec_start; |
246 | unsigned int bits = reg->hr_block_bits; | 247 | unsigned int bits = reg->hr_block_bits; |
247 | unsigned int spp = reg->hr_slots_per_page; | 248 | unsigned int spp = reg->hr_slots_per_page; |
249 | unsigned int cs = *current_slot; | ||
248 | struct bio *bio; | 250 | struct bio *bio; |
249 | struct page *page; | 251 | struct page *page; |
250 | 252 | ||
251 | nr_vecs = (num_slots + spp - 1) / spp; | ||
252 | |||
253 | /* Testing has shown this allocation to take long enough under | 253 | /* Testing has shown this allocation to take long enough under |
254 | * GFP_KERNEL that the local node can get fenced. It would be | 254 | * GFP_KERNEL that the local node can get fenced. It would be |
255 | * nicest if we could pre-allocate these bios and avoid this | 255 | * nicest if we could pre-allocate these bios and avoid this |
256 | * all together. */ | 256 | * all together. */ |
257 | bio = bio_alloc(GFP_ATOMIC, nr_vecs); | 257 | bio = bio_alloc(GFP_ATOMIC, 16); |
258 | if (!bio) { | 258 | if (!bio) { |
259 | mlog(ML_ERROR, "Could not alloc slots BIO!\n"); | 259 | mlog(ML_ERROR, "Could not alloc slots BIO!\n"); |
260 | bio = ERR_PTR(-ENOMEM); | 260 | bio = ERR_PTR(-ENOMEM); |
@@ -262,137 +262,53 @@ static struct bio *o2hb_setup_one_bio(struct o2hb_region *reg, | |||
262 | } | 262 | } |
263 | 263 | ||
264 | /* Must put everything in 512 byte sectors for the bio... */ | 264 | /* Must put everything in 512 byte sectors for the bio... */ |
265 | bio->bi_sector = (reg->hr_start_block + start_slot) << (bits - 9); | 265 | bio->bi_sector = (reg->hr_start_block + cs) << (bits - 9); |
266 | bio->bi_bdev = reg->hr_bdev; | 266 | bio->bi_bdev = reg->hr_bdev; |
267 | bio->bi_private = wc; | 267 | bio->bi_private = wc; |
268 | bio->bi_end_io = o2hb_bio_end_io; | 268 | bio->bi_end_io = o2hb_bio_end_io; |
269 | 269 | ||
270 | first_page = start_slot / spp; | 270 | vec_start = (cs << bits) % PAGE_CACHE_SIZE; |
271 | last_page = first_page + nr_vecs; | 271 | while(cs < max_slots) { |
272 | vec_start = (start_slot << bits) % PAGE_CACHE_SIZE; | 272 | current_page = cs / spp; |
273 | for(i = first_page; i < last_page; i++) { | 273 | page = reg->hr_slot_data[current_page]; |
274 | page = reg->hr_slot_data[i]; | ||
275 | 274 | ||
276 | vec_len = PAGE_CACHE_SIZE; | 275 | vec_len = min(PAGE_CACHE_SIZE, |
277 | /* last page might be short */ | 276 | (max_slots-cs) * (PAGE_CACHE_SIZE/spp) ); |
278 | if (((i + 1) * spp) > (start_slot + num_slots)) | ||
279 | vec_len = ((num_slots + start_slot) % spp) << bits; | ||
280 | vec_len -= vec_start; | ||
281 | 277 | ||
282 | mlog(ML_HB_BIO, "page %d, vec_len = %u, vec_start = %u\n", | 278 | mlog(ML_HB_BIO, "page %d, vec_len = %u, vec_start = %u\n", |
283 | i, vec_len, vec_start); | 279 | current_page, vec_len, vec_start); |
284 | 280 | ||
285 | len = bio_add_page(bio, page, vec_len, vec_start); | 281 | len = bio_add_page(bio, page, vec_len, vec_start); |
286 | if (len != vec_len) { | 282 | if (len != vec_len) break; |
287 | bio_put(bio); | ||
288 | bio = ERR_PTR(-EIO); | ||
289 | |||
290 | mlog(ML_ERROR, "Error adding page to bio i = %d, " | ||
291 | "vec_len = %u, len = %d\n, start = %u\n", | ||
292 | i, vec_len, len, vec_start); | ||
293 | goto bail; | ||
294 | } | ||
295 | 283 | ||
284 | cs += vec_len / (PAGE_CACHE_SIZE/spp); | ||
296 | vec_start = 0; | 285 | vec_start = 0; |
297 | } | 286 | } |
298 | 287 | ||
299 | bail: | 288 | bail: |
289 | *current_slot = cs; | ||
300 | return bio; | 290 | return bio; |
301 | } | 291 | } |
302 | 292 | ||
303 | /* | ||
304 | * Compute the maximum number of sectors the bdev can handle in one bio, | ||
305 | * as a power of two. | ||
306 | * | ||
307 | * Stolen from oracleasm, thanks Joel! | ||
308 | */ | ||
309 | static int compute_max_sectors(struct block_device *bdev) | ||
310 | { | ||
311 | int max_pages, max_sectors, pow_two_sectors; | ||
312 | |||
313 | struct request_queue *q; | ||
314 | |||
315 | q = bdev_get_queue(bdev); | ||
316 | max_pages = q->max_sectors >> (PAGE_SHIFT - 9); | ||
317 | if (max_pages > BIO_MAX_PAGES) | ||
318 | max_pages = BIO_MAX_PAGES; | ||
319 | if (max_pages > q->max_phys_segments) | ||
320 | max_pages = q->max_phys_segments; | ||
321 | if (max_pages > q->max_hw_segments) | ||
322 | max_pages = q->max_hw_segments; | ||
323 | max_pages--; /* Handle I/Os that straddle a page */ | ||
324 | |||
325 | if (max_pages) { | ||
326 | max_sectors = max_pages << (PAGE_SHIFT - 9); | ||
327 | } else { | ||
328 | /* If BIO contains 1 or less than 1 page. */ | ||
329 | max_sectors = q->max_sectors; | ||
330 | } | ||
331 | /* Why is fls() 1-based???? */ | ||
332 | pow_two_sectors = 1 << (fls(max_sectors) - 1); | ||
333 | |||
334 | return pow_two_sectors; | ||
335 | } | ||
336 | |||
337 | static inline void o2hb_compute_request_limits(struct o2hb_region *reg, | ||
338 | unsigned int num_slots, | ||
339 | unsigned int *num_bios, | ||
340 | unsigned int *slots_per_bio) | ||
341 | { | ||
342 | unsigned int max_sectors, io_sectors; | ||
343 | |||
344 | max_sectors = compute_max_sectors(reg->hr_bdev); | ||
345 | |||
346 | io_sectors = num_slots << (reg->hr_block_bits - 9); | ||
347 | |||
348 | *num_bios = (io_sectors + max_sectors - 1) / max_sectors; | ||
349 | *slots_per_bio = max_sectors >> (reg->hr_block_bits - 9); | ||
350 | |||
351 | mlog(ML_HB_BIO, "My io size is %u sectors for %u slots. This " | ||
352 | "device can handle %u sectors of I/O\n", io_sectors, num_slots, | ||
353 | max_sectors); | ||
354 | mlog(ML_HB_BIO, "Will need %u bios holding %u slots each\n", | ||
355 | *num_bios, *slots_per_bio); | ||
356 | } | ||
357 | |||
358 | static int o2hb_read_slots(struct o2hb_region *reg, | 293 | static int o2hb_read_slots(struct o2hb_region *reg, |
359 | unsigned int max_slots) | 294 | unsigned int max_slots) |
360 | { | 295 | { |
361 | unsigned int num_bios, slots_per_bio, start_slot, num_slots; | 296 | unsigned int current_slot=0; |
362 | int i, status; | 297 | int status; |
363 | struct o2hb_bio_wait_ctxt wc; | 298 | struct o2hb_bio_wait_ctxt wc; |
364 | struct bio **bios; | ||
365 | struct bio *bio; | 299 | struct bio *bio; |
366 | 300 | ||
367 | o2hb_compute_request_limits(reg, max_slots, &num_bios, &slots_per_bio); | 301 | o2hb_bio_wait_init(&wc); |
368 | 302 | ||
369 | bios = kcalloc(num_bios, sizeof(struct bio *), GFP_KERNEL); | 303 | while(current_slot < max_slots) { |
370 | if (!bios) { | 304 | bio = o2hb_setup_one_bio(reg, &wc, ¤t_slot, max_slots); |
371 | status = -ENOMEM; | ||
372 | mlog_errno(status); | ||
373 | return status; | ||
374 | } | ||
375 | |||
376 | o2hb_bio_wait_init(&wc, num_bios); | ||
377 | |||
378 | num_slots = slots_per_bio; | ||
379 | for(i = 0; i < num_bios; i++) { | ||
380 | start_slot = i * slots_per_bio; | ||
381 | |||
382 | /* adjust num_slots at last bio */ | ||
383 | if (max_slots < (start_slot + num_slots)) | ||
384 | num_slots = max_slots - start_slot; | ||
385 | |||
386 | bio = o2hb_setup_one_bio(reg, &wc, start_slot, num_slots); | ||
387 | if (IS_ERR(bio)) { | 305 | if (IS_ERR(bio)) { |
388 | o2hb_bio_wait_dec(&wc, num_bios - i); | ||
389 | |||
390 | status = PTR_ERR(bio); | 306 | status = PTR_ERR(bio); |
391 | mlog_errno(status); | 307 | mlog_errno(status); |
392 | goto bail_and_wait; | 308 | goto bail_and_wait; |
393 | } | 309 | } |
394 | bios[i] = bio; | ||
395 | 310 | ||
311 | atomic_inc(&wc.wc_num_reqs); | ||
396 | submit_bio(READ, bio); | 312 | submit_bio(READ, bio); |
397 | } | 313 | } |
398 | 314 | ||
@@ -403,38 +319,30 @@ bail_and_wait: | |||
403 | if (wc.wc_error && !status) | 319 | if (wc.wc_error && !status) |
404 | status = wc.wc_error; | 320 | status = wc.wc_error; |
405 | 321 | ||
406 | if (bios) { | ||
407 | for(i = 0; i < num_bios; i++) | ||
408 | if (bios[i]) | ||
409 | bio_put(bios[i]); | ||
410 | kfree(bios); | ||
411 | } | ||
412 | |||
413 | return status; | 322 | return status; |
414 | } | 323 | } |
415 | 324 | ||
416 | static int o2hb_issue_node_write(struct o2hb_region *reg, | 325 | static int o2hb_issue_node_write(struct o2hb_region *reg, |
417 | struct bio **write_bio, | ||
418 | struct o2hb_bio_wait_ctxt *write_wc) | 326 | struct o2hb_bio_wait_ctxt *write_wc) |
419 | { | 327 | { |
420 | int status; | 328 | int status; |
421 | unsigned int slot; | 329 | unsigned int slot; |
422 | struct bio *bio; | 330 | struct bio *bio; |
423 | 331 | ||
424 | o2hb_bio_wait_init(write_wc, 1); | 332 | o2hb_bio_wait_init(write_wc); |
425 | 333 | ||
426 | slot = o2nm_this_node(); | 334 | slot = o2nm_this_node(); |
427 | 335 | ||
428 | bio = o2hb_setup_one_bio(reg, write_wc, slot, 1); | 336 | bio = o2hb_setup_one_bio(reg, write_wc, &slot, slot+1); |
429 | if (IS_ERR(bio)) { | 337 | if (IS_ERR(bio)) { |
430 | status = PTR_ERR(bio); | 338 | status = PTR_ERR(bio); |
431 | mlog_errno(status); | 339 | mlog_errno(status); |
432 | goto bail; | 340 | goto bail; |
433 | } | 341 | } |
434 | 342 | ||
343 | atomic_inc(&write_wc->wc_num_reqs); | ||
435 | submit_bio(WRITE, bio); | 344 | submit_bio(WRITE, bio); |
436 | 345 | ||
437 | *write_bio = bio; | ||
438 | status = 0; | 346 | status = 0; |
439 | bail: | 347 | bail: |
440 | return status; | 348 | return status; |
@@ -826,7 +734,6 @@ static int o2hb_do_disk_heartbeat(struct o2hb_region *reg) | |||
826 | { | 734 | { |
827 | int i, ret, highest_node, change = 0; | 735 | int i, ret, highest_node, change = 0; |
828 | unsigned long configured_nodes[BITS_TO_LONGS(O2NM_MAX_NODES)]; | 736 | unsigned long configured_nodes[BITS_TO_LONGS(O2NM_MAX_NODES)]; |
829 | struct bio *write_bio; | ||
830 | struct o2hb_bio_wait_ctxt write_wc; | 737 | struct o2hb_bio_wait_ctxt write_wc; |
831 | 738 | ||
832 | ret = o2nm_configured_node_map(configured_nodes, | 739 | ret = o2nm_configured_node_map(configured_nodes, |
@@ -864,7 +771,7 @@ static int o2hb_do_disk_heartbeat(struct o2hb_region *reg) | |||
864 | 771 | ||
865 | /* And fire off the write. Note that we don't wait on this I/O | 772 | /* And fire off the write. Note that we don't wait on this I/O |
866 | * until later. */ | 773 | * until later. */ |
867 | ret = o2hb_issue_node_write(reg, &write_bio, &write_wc); | 774 | ret = o2hb_issue_node_write(reg, &write_wc); |
868 | if (ret < 0) { | 775 | if (ret < 0) { |
869 | mlog_errno(ret); | 776 | mlog_errno(ret); |
870 | return ret; | 777 | return ret; |
@@ -882,7 +789,6 @@ static int o2hb_do_disk_heartbeat(struct o2hb_region *reg) | |||
882 | * people we find in our steady state have seen us. | 789 | * people we find in our steady state have seen us. |
883 | */ | 790 | */ |
884 | o2hb_wait_on_io(reg, &write_wc); | 791 | o2hb_wait_on_io(reg, &write_wc); |
885 | bio_put(write_bio); | ||
886 | if (write_wc.wc_error) { | 792 | if (write_wc.wc_error) { |
887 | /* Do not re-arm the write timeout on I/O error - we | 793 | /* Do not re-arm the write timeout on I/O error - we |
888 | * can't be sure that the new block ever made it to | 794 | * can't be sure that the new block ever made it to |
@@ -943,7 +849,6 @@ static int o2hb_thread(void *data) | |||
943 | { | 849 | { |
944 | int i, ret; | 850 | int i, ret; |
945 | struct o2hb_region *reg = data; | 851 | struct o2hb_region *reg = data; |
946 | struct bio *write_bio; | ||
947 | struct o2hb_bio_wait_ctxt write_wc; | 852 | struct o2hb_bio_wait_ctxt write_wc; |
948 | struct timeval before_hb, after_hb; | 853 | struct timeval before_hb, after_hb; |
949 | unsigned int elapsed_msec; | 854 | unsigned int elapsed_msec; |
@@ -993,10 +898,9 @@ static int o2hb_thread(void *data) | |||
993 | * | 898 | * |
994 | * XXX: Should we skip this on unclean_stop? */ | 899 | * XXX: Should we skip this on unclean_stop? */ |
995 | o2hb_prepare_block(reg, 0); | 900 | o2hb_prepare_block(reg, 0); |
996 | ret = o2hb_issue_node_write(reg, &write_bio, &write_wc); | 901 | ret = o2hb_issue_node_write(reg, &write_wc); |
997 | if (ret == 0) { | 902 | if (ret == 0) { |
998 | o2hb_wait_on_io(reg, &write_wc); | 903 | o2hb_wait_on_io(reg, &write_wc); |
999 | bio_put(write_bio); | ||
1000 | } else { | 904 | } else { |
1001 | mlog_errno(ret); | 905 | mlog_errno(ret); |
1002 | } | 906 | } |
diff --git a/fs/ocfs2/cluster/tcp.c b/fs/ocfs2/cluster/tcp.c index ae4ff4a6636b..1718215fc018 100644 --- a/fs/ocfs2/cluster/tcp.c +++ b/fs/ocfs2/cluster/tcp.c | |||
@@ -556,6 +556,8 @@ static void o2net_register_callbacks(struct sock *sk, | |||
556 | sk->sk_data_ready = o2net_data_ready; | 556 | sk->sk_data_ready = o2net_data_ready; |
557 | sk->sk_state_change = o2net_state_change; | 557 | sk->sk_state_change = o2net_state_change; |
558 | 558 | ||
559 | mutex_init(&sc->sc_send_lock); | ||
560 | |||
559 | write_unlock_bh(&sk->sk_callback_lock); | 561 | write_unlock_bh(&sk->sk_callback_lock); |
560 | } | 562 | } |
561 | 563 | ||
@@ -688,6 +690,7 @@ static void o2net_handler_put(struct o2net_msg_handler *nmh) | |||
688 | * be given to the handler if their payload is longer than the max. */ | 690 | * be given to the handler if their payload is longer than the max. */ |
689 | int o2net_register_handler(u32 msg_type, u32 key, u32 max_len, | 691 | int o2net_register_handler(u32 msg_type, u32 key, u32 max_len, |
690 | o2net_msg_handler_func *func, void *data, | 692 | o2net_msg_handler_func *func, void *data, |
693 | o2net_post_msg_handler_func *post_func, | ||
691 | struct list_head *unreg_list) | 694 | struct list_head *unreg_list) |
692 | { | 695 | { |
693 | struct o2net_msg_handler *nmh = NULL; | 696 | struct o2net_msg_handler *nmh = NULL; |
@@ -722,6 +725,7 @@ int o2net_register_handler(u32 msg_type, u32 key, u32 max_len, | |||
722 | 725 | ||
723 | nmh->nh_func = func; | 726 | nmh->nh_func = func; |
724 | nmh->nh_func_data = data; | 727 | nmh->nh_func_data = data; |
728 | nmh->nh_post_func = post_func; | ||
725 | nmh->nh_msg_type = msg_type; | 729 | nmh->nh_msg_type = msg_type; |
726 | nmh->nh_max_len = max_len; | 730 | nmh->nh_max_len = max_len; |
727 | nmh->nh_key = key; | 731 | nmh->nh_key = key; |
@@ -856,10 +860,12 @@ static void o2net_sendpage(struct o2net_sock_container *sc, | |||
856 | ssize_t ret; | 860 | ssize_t ret; |
857 | 861 | ||
858 | 862 | ||
863 | mutex_lock(&sc->sc_send_lock); | ||
859 | ret = sc->sc_sock->ops->sendpage(sc->sc_sock, | 864 | ret = sc->sc_sock->ops->sendpage(sc->sc_sock, |
860 | virt_to_page(kmalloced_virt), | 865 | virt_to_page(kmalloced_virt), |
861 | (long)kmalloced_virt & ~PAGE_MASK, | 866 | (long)kmalloced_virt & ~PAGE_MASK, |
862 | size, MSG_DONTWAIT); | 867 | size, MSG_DONTWAIT); |
868 | mutex_unlock(&sc->sc_send_lock); | ||
863 | if (ret != size) { | 869 | if (ret != size) { |
864 | mlog(ML_ERROR, "sendpage of size %zu to " SC_NODEF_FMT | 870 | mlog(ML_ERROR, "sendpage of size %zu to " SC_NODEF_FMT |
865 | " failed with %zd\n", size, SC_NODEF_ARGS(sc), ret); | 871 | " failed with %zd\n", size, SC_NODEF_ARGS(sc), ret); |
@@ -974,8 +980,10 @@ int o2net_send_message_vec(u32 msg_type, u32 key, struct kvec *caller_vec, | |||
974 | 980 | ||
975 | /* finally, convert the message header to network byte-order | 981 | /* finally, convert the message header to network byte-order |
976 | * and send */ | 982 | * and send */ |
983 | mutex_lock(&sc->sc_send_lock); | ||
977 | ret = o2net_send_tcp_msg(sc->sc_sock, vec, veclen, | 984 | ret = o2net_send_tcp_msg(sc->sc_sock, vec, veclen, |
978 | sizeof(struct o2net_msg) + caller_bytes); | 985 | sizeof(struct o2net_msg) + caller_bytes); |
986 | mutex_unlock(&sc->sc_send_lock); | ||
979 | msglog(msg, "sending returned %d\n", ret); | 987 | msglog(msg, "sending returned %d\n", ret); |
980 | if (ret < 0) { | 988 | if (ret < 0) { |
981 | mlog(0, "error returned from o2net_send_tcp_msg=%d\n", ret); | 989 | mlog(0, "error returned from o2net_send_tcp_msg=%d\n", ret); |
@@ -1049,6 +1057,7 @@ static int o2net_process_message(struct o2net_sock_container *sc, | |||
1049 | int ret = 0, handler_status; | 1057 | int ret = 0, handler_status; |
1050 | enum o2net_system_error syserr; | 1058 | enum o2net_system_error syserr; |
1051 | struct o2net_msg_handler *nmh = NULL; | 1059 | struct o2net_msg_handler *nmh = NULL; |
1060 | void *ret_data = NULL; | ||
1052 | 1061 | ||
1053 | msglog(hdr, "processing message\n"); | 1062 | msglog(hdr, "processing message\n"); |
1054 | 1063 | ||
@@ -1101,17 +1110,26 @@ static int o2net_process_message(struct o2net_sock_container *sc, | |||
1101 | sc->sc_msg_type = be16_to_cpu(hdr->msg_type); | 1110 | sc->sc_msg_type = be16_to_cpu(hdr->msg_type); |
1102 | handler_status = (nmh->nh_func)(hdr, sizeof(struct o2net_msg) + | 1111 | handler_status = (nmh->nh_func)(hdr, sizeof(struct o2net_msg) + |
1103 | be16_to_cpu(hdr->data_len), | 1112 | be16_to_cpu(hdr->data_len), |
1104 | nmh->nh_func_data); | 1113 | nmh->nh_func_data, &ret_data); |
1105 | do_gettimeofday(&sc->sc_tv_func_stop); | 1114 | do_gettimeofday(&sc->sc_tv_func_stop); |
1106 | 1115 | ||
1107 | out_respond: | 1116 | out_respond: |
1108 | /* this destroys the hdr, so don't use it after this */ | 1117 | /* this destroys the hdr, so don't use it after this */ |
1118 | mutex_lock(&sc->sc_send_lock); | ||
1109 | ret = o2net_send_status_magic(sc->sc_sock, hdr, syserr, | 1119 | ret = o2net_send_status_magic(sc->sc_sock, hdr, syserr, |
1110 | handler_status); | 1120 | handler_status); |
1121 | mutex_unlock(&sc->sc_send_lock); | ||
1111 | hdr = NULL; | 1122 | hdr = NULL; |
1112 | mlog(0, "sending handler status %d, syserr %d returned %d\n", | 1123 | mlog(0, "sending handler status %d, syserr %d returned %d\n", |
1113 | handler_status, syserr, ret); | 1124 | handler_status, syserr, ret); |
1114 | 1125 | ||
1126 | if (nmh) { | ||
1127 | BUG_ON(ret_data != NULL && nmh->nh_post_func == NULL); | ||
1128 | if (nmh->nh_post_func) | ||
1129 | (nmh->nh_post_func)(handler_status, nmh->nh_func_data, | ||
1130 | ret_data); | ||
1131 | } | ||
1132 | |||
1115 | out: | 1133 | out: |
1116 | if (nmh) | 1134 | if (nmh) |
1117 | o2net_handler_put(nmh); | 1135 | o2net_handler_put(nmh); |
@@ -1795,13 +1813,13 @@ out: | |||
1795 | ready(sk, bytes); | 1813 | ready(sk, bytes); |
1796 | } | 1814 | } |
1797 | 1815 | ||
1798 | static int o2net_open_listening_sock(__be16 port) | 1816 | static int o2net_open_listening_sock(__be32 addr, __be16 port) |
1799 | { | 1817 | { |
1800 | struct socket *sock = NULL; | 1818 | struct socket *sock = NULL; |
1801 | int ret; | 1819 | int ret; |
1802 | struct sockaddr_in sin = { | 1820 | struct sockaddr_in sin = { |
1803 | .sin_family = PF_INET, | 1821 | .sin_family = PF_INET, |
1804 | .sin_addr = { .s_addr = (__force u32)htonl(INADDR_ANY) }, | 1822 | .sin_addr = { .s_addr = (__force u32)addr }, |
1805 | .sin_port = (__force u16)port, | 1823 | .sin_port = (__force u16)port, |
1806 | }; | 1824 | }; |
1807 | 1825 | ||
@@ -1824,15 +1842,15 @@ static int o2net_open_listening_sock(__be16 port) | |||
1824 | sock->sk->sk_reuse = 1; | 1842 | sock->sk->sk_reuse = 1; |
1825 | ret = sock->ops->bind(sock, (struct sockaddr *)&sin, sizeof(sin)); | 1843 | ret = sock->ops->bind(sock, (struct sockaddr *)&sin, sizeof(sin)); |
1826 | if (ret < 0) { | 1844 | if (ret < 0) { |
1827 | mlog(ML_ERROR, "unable to bind socket to port %d, ret=%d\n", | 1845 | mlog(ML_ERROR, "unable to bind socket at %u.%u.%u.%u:%u, " |
1828 | ntohs(port), ret); | 1846 | "ret=%d\n", NIPQUAD(addr), ntohs(port), ret); |
1829 | goto out; | 1847 | goto out; |
1830 | } | 1848 | } |
1831 | 1849 | ||
1832 | ret = sock->ops->listen(sock, 64); | 1850 | ret = sock->ops->listen(sock, 64); |
1833 | if (ret < 0) { | 1851 | if (ret < 0) { |
1834 | mlog(ML_ERROR, "unable to listen on port %d, ret=%d\n", | 1852 | mlog(ML_ERROR, "unable to listen on %u.%u.%u.%u:%u, ret=%d\n", |
1835 | ntohs(port), ret); | 1853 | NIPQUAD(addr), ntohs(port), ret); |
1836 | } | 1854 | } |
1837 | 1855 | ||
1838 | out: | 1856 | out: |
@@ -1865,7 +1883,8 @@ int o2net_start_listening(struct o2nm_node *node) | |||
1865 | return -ENOMEM; /* ? */ | 1883 | return -ENOMEM; /* ? */ |
1866 | } | 1884 | } |
1867 | 1885 | ||
1868 | ret = o2net_open_listening_sock(node->nd_ipv4_port); | 1886 | ret = o2net_open_listening_sock(node->nd_ipv4_address, |
1887 | node->nd_ipv4_port); | ||
1869 | if (ret) { | 1888 | if (ret) { |
1870 | destroy_workqueue(o2net_wq); | 1889 | destroy_workqueue(o2net_wq); |
1871 | o2net_wq = NULL; | 1890 | o2net_wq = NULL; |
diff --git a/fs/ocfs2/cluster/tcp.h b/fs/ocfs2/cluster/tcp.h index 21a4e43df836..da880fc215f0 100644 --- a/fs/ocfs2/cluster/tcp.h +++ b/fs/ocfs2/cluster/tcp.h | |||
@@ -50,7 +50,10 @@ struct o2net_msg | |||
50 | __u8 buf[0]; | 50 | __u8 buf[0]; |
51 | }; | 51 | }; |
52 | 52 | ||
53 | typedef int (o2net_msg_handler_func)(struct o2net_msg *msg, u32 len, void *data); | 53 | typedef int (o2net_msg_handler_func)(struct o2net_msg *msg, u32 len, void *data, |
54 | void **ret_data); | ||
55 | typedef void (o2net_post_msg_handler_func)(int status, void *data, | ||
56 | void *ret_data); | ||
54 | 57 | ||
55 | #define O2NET_MAX_PAYLOAD_BYTES (4096 - sizeof(struct o2net_msg)) | 58 | #define O2NET_MAX_PAYLOAD_BYTES (4096 - sizeof(struct o2net_msg)) |
56 | 59 | ||
@@ -99,6 +102,7 @@ int o2net_send_message_vec(u32 msg_type, u32 key, struct kvec *vec, | |||
99 | 102 | ||
100 | int o2net_register_handler(u32 msg_type, u32 key, u32 max_len, | 103 | int o2net_register_handler(u32 msg_type, u32 key, u32 max_len, |
101 | o2net_msg_handler_func *func, void *data, | 104 | o2net_msg_handler_func *func, void *data, |
105 | o2net_post_msg_handler_func *post_func, | ||
102 | struct list_head *unreg_list); | 106 | struct list_head *unreg_list); |
103 | void o2net_unregister_handler_list(struct list_head *list); | 107 | void o2net_unregister_handler_list(struct list_head *list); |
104 | 108 | ||
diff --git a/fs/ocfs2/cluster/tcp_internal.h b/fs/ocfs2/cluster/tcp_internal.h index b700dc9624d1..4dae5df5e467 100644 --- a/fs/ocfs2/cluster/tcp_internal.h +++ b/fs/ocfs2/cluster/tcp_internal.h | |||
@@ -38,6 +38,12 @@ | |||
38 | * locking semantics of the file system using the protocol. It should | 38 | * locking semantics of the file system using the protocol. It should |
39 | * be somewhere else, I'm sure, but right now it isn't. | 39 | * be somewhere else, I'm sure, but right now it isn't. |
40 | * | 40 | * |
41 | * New in version 7: | ||
42 | * - DLM join domain includes the live nodemap | ||
43 | * | ||
44 | * New in version 6: | ||
45 | * - DLM lockres remote refcount fixes. | ||
46 | * | ||
41 | * New in version 5: | 47 | * New in version 5: |
42 | * - Network timeout checking protocol | 48 | * - Network timeout checking protocol |
43 | * | 49 | * |
@@ -51,7 +57,7 @@ | |||
51 | * - full 64 bit i_size in the metadata lock lvbs | 57 | * - full 64 bit i_size in the metadata lock lvbs |
52 | * - introduction of "rw" lock and pushing meta/data locking down | 58 | * - introduction of "rw" lock and pushing meta/data locking down |
53 | */ | 59 | */ |
54 | #define O2NET_PROTOCOL_VERSION 5ULL | 60 | #define O2NET_PROTOCOL_VERSION 7ULL |
55 | struct o2net_handshake { | 61 | struct o2net_handshake { |
56 | __be64 protocol_version; | 62 | __be64 protocol_version; |
57 | __be64 connector_id; | 63 | __be64 connector_id; |
@@ -149,6 +155,8 @@ struct o2net_sock_container { | |||
149 | struct timeval sc_tv_func_stop; | 155 | struct timeval sc_tv_func_stop; |
150 | u32 sc_msg_key; | 156 | u32 sc_msg_key; |
151 | u16 sc_msg_type; | 157 | u16 sc_msg_type; |
158 | |||
159 | struct mutex sc_send_lock; | ||
152 | }; | 160 | }; |
153 | 161 | ||
154 | struct o2net_msg_handler { | 162 | struct o2net_msg_handler { |
@@ -158,6 +166,8 @@ struct o2net_msg_handler { | |||
158 | u32 nh_key; | 166 | u32 nh_key; |
159 | o2net_msg_handler_func *nh_func; | 167 | o2net_msg_handler_func *nh_func; |
160 | o2net_msg_handler_func *nh_func_data; | 168 | o2net_msg_handler_func *nh_func_data; |
169 | o2net_post_msg_handler_func | ||
170 | *nh_post_func; | ||
161 | struct kref nh_kref; | 171 | struct kref nh_kref; |
162 | struct list_head nh_unregister_item; | 172 | struct list_head nh_unregister_item; |
163 | }; | 173 | }; |