diff options
-rw-r--r-- | drivers/block/drbd/drbd_actlog.c | 8 | ||||
-rw-r--r-- | drivers/block/drbd/drbd_bitmap.c | 8 | ||||
-rw-r--r-- | drivers/block/drbd/drbd_int.h | 58 | ||||
-rw-r--r-- | drivers/block/drbd/drbd_main.c | 156 | ||||
-rw-r--r-- | drivers/block/drbd/drbd_nl.c | 90 | ||||
-rw-r--r-- | drivers/block/drbd/drbd_proc.c | 6 | ||||
-rw-r--r-- | drivers/block/drbd/drbd_receiver.c | 246 | ||||
-rw-r--r-- | drivers/block/drbd/drbd_req.c | 48 | ||||
-rw-r--r-- | drivers/block/drbd/drbd_req.h | 4 | ||||
-rw-r--r-- | drivers/block/drbd/drbd_state.c | 73 | ||||
-rw-r--r-- | drivers/block/drbd/drbd_worker.c | 96 |
11 files changed, 416 insertions, 377 deletions
diff --git a/drivers/block/drbd/drbd_actlog.c b/drivers/block/drbd/drbd_actlog.c index 8b507455f71e..4af4dc166373 100644 --- a/drivers/block/drbd/drbd_actlog.c +++ b/drivers/block/drbd/drbd_actlog.c | |||
@@ -315,7 +315,7 @@ void drbd_al_begin_io_commit(struct drbd_device *device, bool delegate) | |||
315 | { | 315 | { |
316 | bool locked = false; | 316 | bool locked = false; |
317 | 317 | ||
318 | BUG_ON(delegate && current == device->connection->worker.task); | 318 | BUG_ON(delegate && current == first_peer_device(device)->connection->worker.task); |
319 | 319 | ||
320 | /* Serialize multiple transactions. | 320 | /* Serialize multiple transactions. |
321 | * This uses test_and_set_bit, memory barrier is implicit. | 321 | * This uses test_and_set_bit, memory barrier is implicit. |
@@ -354,7 +354,7 @@ void drbd_al_begin_io_commit(struct drbd_device *device, bool delegate) | |||
354 | */ | 354 | */ |
355 | void drbd_al_begin_io(struct drbd_device *device, struct drbd_interval *i, bool delegate) | 355 | void drbd_al_begin_io(struct drbd_device *device, struct drbd_interval *i, bool delegate) |
356 | { | 356 | { |
357 | BUG_ON(delegate && current == device->connection->worker.task); | 357 | BUG_ON(delegate && current == first_peer_device(device)->connection->worker.task); |
358 | 358 | ||
359 | if (drbd_al_begin_io_prepare(device, i)) | 359 | if (drbd_al_begin_io_prepare(device, i)) |
360 | drbd_al_begin_io_commit(device, delegate); | 360 | drbd_al_begin_io_commit(device, delegate); |
@@ -614,7 +614,7 @@ static int al_write_transaction(struct drbd_device *device, bool delegate) | |||
614 | init_completion(&al_work.event); | 614 | init_completion(&al_work.event); |
615 | al_work.w.cb = w_al_write_transaction; | 615 | al_work.w.cb = w_al_write_transaction; |
616 | al_work.w.device = device; | 616 | al_work.w.device = device; |
617 | drbd_queue_work_front(&device->connection->sender_work, &al_work.w); | 617 | drbd_queue_work_front(&first_peer_device(device)->connection->sender_work, &al_work.w); |
618 | wait_for_completion(&al_work.event); | 618 | wait_for_completion(&al_work.event); |
619 | return al_work.err; | 619 | return al_work.err; |
620 | } else | 620 | } else |
@@ -796,7 +796,7 @@ static void drbd_try_clear_on_disk_bm(struct drbd_device *device, sector_t secto | |||
796 | udw->enr = ext->lce.lc_number; | 796 | udw->enr = ext->lce.lc_number; |
797 | udw->w.cb = w_update_odbm; | 797 | udw->w.cb = w_update_odbm; |
798 | udw->w.device = device; | 798 | udw->w.device = device; |
799 | drbd_queue_work_front(&device->connection->sender_work, &udw->w); | 799 | drbd_queue_work_front(&first_peer_device(device)->connection->sender_work, &udw->w); |
800 | } else { | 800 | } else { |
801 | dev_warn(DEV, "Could not kmalloc an udw\n"); | 801 | dev_warn(DEV, "Could not kmalloc an udw\n"); |
802 | } | 802 | } |
diff --git a/drivers/block/drbd/drbd_bitmap.c b/drivers/block/drbd/drbd_bitmap.c index cd3e0dea7a5d..cb8e64978b8e 100644 --- a/drivers/block/drbd/drbd_bitmap.c +++ b/drivers/block/drbd/drbd_bitmap.c | |||
@@ -119,9 +119,9 @@ static void __bm_print_lock_info(struct drbd_device *device, const char *func) | |||
119 | if (!__ratelimit(&drbd_ratelimit_state)) | 119 | if (!__ratelimit(&drbd_ratelimit_state)) |
120 | return; | 120 | return; |
121 | dev_err(DEV, "FIXME %s in %s, bitmap locked for '%s' by %s\n", | 121 | dev_err(DEV, "FIXME %s in %s, bitmap locked for '%s' by %s\n", |
122 | drbd_task_to_thread_name(device->connection, current), | 122 | drbd_task_to_thread_name(first_peer_device(device)->connection, current), |
123 | func, b->bm_why ?: "?", | 123 | func, b->bm_why ?: "?", |
124 | drbd_task_to_thread_name(device->connection, b->bm_task)); | 124 | drbd_task_to_thread_name(first_peer_device(device)->connection, b->bm_task)); |
125 | } | 125 | } |
126 | 126 | ||
127 | void drbd_bm_lock(struct drbd_device *device, char *why, enum bm_flag flags) | 127 | void drbd_bm_lock(struct drbd_device *device, char *why, enum bm_flag flags) |
@@ -138,9 +138,9 @@ void drbd_bm_lock(struct drbd_device *device, char *why, enum bm_flag flags) | |||
138 | 138 | ||
139 | if (trylock_failed) { | 139 | if (trylock_failed) { |
140 | dev_warn(DEV, "%s going to '%s' but bitmap already locked for '%s' by %s\n", | 140 | dev_warn(DEV, "%s going to '%s' but bitmap already locked for '%s' by %s\n", |
141 | drbd_task_to_thread_name(device->connection, current), | 141 | drbd_task_to_thread_name(first_peer_device(device)->connection, current), |
142 | why, b->bm_why ?: "?", | 142 | why, b->bm_why ?: "?", |
143 | drbd_task_to_thread_name(device->connection, b->bm_task)); | 143 | drbd_task_to_thread_name(first_peer_device(device)->connection, b->bm_task)); |
144 | mutex_lock(&b->bm_change); | 144 | mutex_lock(&b->bm_change); |
145 | } | 145 | } |
146 | if (BM_LOCKED_MASK & b->bm_flags) | 146 | if (BM_LOCKED_MASK & b->bm_flags) |
diff --git a/drivers/block/drbd/drbd_int.h b/drivers/block/drbd/drbd_int.h index 32517a0cbc62..85e2f4b56a06 100644 --- a/drivers/block/drbd/drbd_int.h +++ b/drivers/block/drbd/drbd_int.h | |||
@@ -483,7 +483,7 @@ struct drbd_backing_dev { | |||
483 | struct block_device *backing_bdev; | 483 | struct block_device *backing_bdev; |
484 | struct block_device *md_bdev; | 484 | struct block_device *md_bdev; |
485 | struct drbd_md md; | 485 | struct drbd_md md; |
486 | struct disk_conf *disk_conf; /* RCU, for updates: device->connection->conf_update */ | 486 | struct disk_conf *disk_conf; /* RCU, for updates: first_peer_device(device)->connection->conf_update */ |
487 | sector_t known_size; /* last known size of that backing device */ | 487 | sector_t known_size; /* last known size of that backing device */ |
488 | }; | 488 | }; |
489 | 489 | ||
@@ -617,8 +617,14 @@ struct submit_worker { | |||
617 | struct list_head writes; | 617 | struct list_head writes; |
618 | }; | 618 | }; |
619 | 619 | ||
620 | struct drbd_device { | 620 | struct drbd_peer_device { |
621 | struct list_head peer_devices; | ||
622 | struct drbd_device *device; | ||
621 | struct drbd_connection *connection; | 623 | struct drbd_connection *connection; |
624 | }; | ||
625 | |||
626 | struct drbd_device { | ||
627 | struct list_head peer_devices; | ||
622 | int vnr; /* volume number within the connection */ | 628 | int vnr; /* volume number within the connection */ |
623 | struct kref kref; | 629 | struct kref kref; |
624 | 630 | ||
@@ -744,7 +750,7 @@ struct drbd_device { | |||
744 | struct bm_io_work bm_io_work; | 750 | struct bm_io_work bm_io_work; |
745 | u64 ed_uuid; /* UUID of the exposed data */ | 751 | u64 ed_uuid; /* UUID of the exposed data */ |
746 | struct mutex own_state_mutex; | 752 | struct mutex own_state_mutex; |
747 | struct mutex *state_mutex; /* either own_state_mutex or device->connection->cstate_mutex */ | 753 | struct mutex *state_mutex; /* either own_state_mutex or first_peer_device(device)->connection->cstate_mutex */ |
748 | char congestion_reason; /* Why we where congested... */ | 754 | char congestion_reason; /* Why we where congested... */ |
749 | atomic_t rs_sect_in; /* for incoming resync data rate, SyncTarget */ | 755 | atomic_t rs_sect_in; /* for incoming resync data rate, SyncTarget */ |
750 | atomic_t rs_sect_ev; /* for submitted resync data rate, both */ | 756 | atomic_t rs_sect_ev; /* for submitted resync data rate, both */ |
@@ -768,6 +774,20 @@ static inline struct drbd_device *minor_to_device(unsigned int minor) | |||
768 | return (struct drbd_device *)idr_find(&minors, minor); | 774 | return (struct drbd_device *)idr_find(&minors, minor); |
769 | } | 775 | } |
770 | 776 | ||
777 | static inline struct drbd_peer_device *first_peer_device(struct drbd_device *device) | ||
778 | { | ||
779 | return list_first_entry(&device->peer_devices, struct drbd_peer_device, peer_devices); | ||
780 | } | ||
781 | |||
782 | #define for_each_peer_device(peer_device, device) \ | ||
783 | list_for_each_entry(peer_device, &device->peer_devices, peer_devices) | ||
784 | |||
785 | #define for_each_peer_device_rcu(peer_device, device) \ | ||
786 | list_for_each_entry_rcu(peer_device, &device->peer_devices, peer_devices) | ||
787 | |||
788 | #define for_each_peer_device_safe(peer_device, tmp, device) \ | ||
789 | list_for_each_entry_safe(peer_device, tmp, &device->peer_devices, peer_devices) | ||
790 | |||
771 | static inline unsigned int device_to_minor(struct drbd_device *device) | 791 | static inline unsigned int device_to_minor(struct drbd_device *device) |
772 | { | 792 | { |
773 | return device->minor; | 793 | return device->minor; |
@@ -1154,7 +1174,7 @@ extern struct bio *bio_alloc_drbd(gfp_t gfp_mask); | |||
1154 | extern rwlock_t global_state_lock; | 1174 | extern rwlock_t global_state_lock; |
1155 | 1175 | ||
1156 | extern int conn_lowest_minor(struct drbd_connection *connection); | 1176 | extern int conn_lowest_minor(struct drbd_connection *connection); |
1157 | enum drbd_ret_code conn_new_minor(struct drbd_connection *connection, unsigned int minor, int vnr); | 1177 | enum drbd_ret_code drbd_create_minor(struct drbd_connection *connection, unsigned int minor, int vnr); |
1158 | extern void drbd_minor_destroy(struct kref *kref); | 1178 | extern void drbd_minor_destroy(struct kref *kref); |
1159 | 1179 | ||
1160 | extern int set_resource_options(struct drbd_connection *connection, struct res_opts *res_opts); | 1180 | extern int set_resource_options(struct drbd_connection *connection, struct res_opts *res_opts); |
@@ -1275,7 +1295,7 @@ extern void conn_flush_workqueue(struct drbd_connection *connection); | |||
1275 | extern int drbd_connected(struct drbd_device *device); | 1295 | extern int drbd_connected(struct drbd_device *device); |
1276 | static inline void drbd_flush_workqueue(struct drbd_device *device) | 1296 | static inline void drbd_flush_workqueue(struct drbd_device *device) |
1277 | { | 1297 | { |
1278 | conn_flush_workqueue(device->connection); | 1298 | conn_flush_workqueue(first_peer_device(device)->connection); |
1279 | } | 1299 | } |
1280 | 1300 | ||
1281 | /* Yes, there is kernel_setsockopt, but only since 2.6.18. | 1301 | /* Yes, there is kernel_setsockopt, but only since 2.6.18. |
@@ -1421,9 +1441,9 @@ static inline union drbd_state drbd_read_state(struct drbd_device *device) | |||
1421 | union drbd_state rv; | 1441 | union drbd_state rv; |
1422 | 1442 | ||
1423 | rv.i = device->state.i; | 1443 | rv.i = device->state.i; |
1424 | rv.susp = device->connection->susp; | 1444 | rv.susp = first_peer_device(device)->connection->susp; |
1425 | rv.susp_nod = device->connection->susp_nod; | 1445 | rv.susp_nod = first_peer_device(device)->connection->susp_nod; |
1426 | rv.susp_fen = device->connection->susp_fen; | 1446 | rv.susp_fen = first_peer_device(device)->connection->susp_fen; |
1427 | 1447 | ||
1428 | return rv; | 1448 | return rv; |
1429 | } | 1449 | } |
@@ -1505,9 +1525,9 @@ static inline void drbd_chk_io_error_(struct drbd_device *device, | |||
1505 | { | 1525 | { |
1506 | if (error) { | 1526 | if (error) { |
1507 | unsigned long flags; | 1527 | unsigned long flags; |
1508 | spin_lock_irqsave(&device->connection->req_lock, flags); | 1528 | spin_lock_irqsave(&first_peer_device(device)->connection->req_lock, flags); |
1509 | __drbd_chk_io_error_(device, forcedetach, where); | 1529 | __drbd_chk_io_error_(device, forcedetach, where); |
1510 | spin_unlock_irqrestore(&device->connection->req_lock, flags); | 1530 | spin_unlock_irqrestore(&first_peer_device(device)->connection->req_lock, flags); |
1511 | } | 1531 | } |
1512 | } | 1532 | } |
1513 | 1533 | ||
@@ -1783,7 +1803,7 @@ static inline void put_ldev(struct drbd_device *device) | |||
1783 | if (device->state.disk == D_FAILED) { | 1803 | if (device->state.disk == D_FAILED) { |
1784 | /* all application IO references gone. */ | 1804 | /* all application IO references gone. */ |
1785 | if (!test_and_set_bit(GO_DISKLESS, &device->flags)) | 1805 | if (!test_and_set_bit(GO_DISKLESS, &device->flags)) |
1786 | drbd_queue_work(&device->connection->sender_work, &device->go_diskless); | 1806 | drbd_queue_work(&first_peer_device(device)->connection->sender_work, &device->go_diskless); |
1787 | } | 1807 | } |
1788 | wake_up(&device->misc_wait); | 1808 | wake_up(&device->misc_wait); |
1789 | } | 1809 | } |
@@ -1865,7 +1885,7 @@ static inline int drbd_get_max_buffers(struct drbd_device *device) | |||
1865 | int mxb; | 1885 | int mxb; |
1866 | 1886 | ||
1867 | rcu_read_lock(); | 1887 | rcu_read_lock(); |
1868 | nc = rcu_dereference(device->connection->net_conf); | 1888 | nc = rcu_dereference(first_peer_device(device)->connection->net_conf); |
1869 | mxb = nc ? nc->max_buffers : 1000000; /* arbitrary limit on open requests */ | 1889 | mxb = nc ? nc->max_buffers : 1000000; /* arbitrary limit on open requests */ |
1870 | rcu_read_unlock(); | 1890 | rcu_read_unlock(); |
1871 | 1891 | ||
@@ -1908,7 +1928,7 @@ static inline int drbd_state_is_stable(struct drbd_device *device) | |||
1908 | 1928 | ||
1909 | /* Allow IO in BM exchange states with new protocols */ | 1929 | /* Allow IO in BM exchange states with new protocols */ |
1910 | case C_WF_BITMAP_S: | 1930 | case C_WF_BITMAP_S: |
1911 | if (device->connection->agreed_pro_version < 96) | 1931 | if (first_peer_device(device)->connection->agreed_pro_version < 96) |
1912 | return 0; | 1932 | return 0; |
1913 | break; | 1933 | break; |
1914 | 1934 | ||
@@ -1944,7 +1964,7 @@ static inline int drbd_state_is_stable(struct drbd_device *device) | |||
1944 | 1964 | ||
1945 | static inline int drbd_suspended(struct drbd_device *device) | 1965 | static inline int drbd_suspended(struct drbd_device *device) |
1946 | { | 1966 | { |
1947 | struct drbd_connection *connection = device->connection; | 1967 | struct drbd_connection *connection = first_peer_device(device)->connection; |
1948 | 1968 | ||
1949 | return connection->susp || connection->susp_fen || connection->susp_nod; | 1969 | return connection->susp || connection->susp_fen || connection->susp_nod; |
1950 | } | 1970 | } |
@@ -1979,11 +1999,11 @@ static inline bool inc_ap_bio_cond(struct drbd_device *device) | |||
1979 | { | 1999 | { |
1980 | bool rv = false; | 2000 | bool rv = false; |
1981 | 2001 | ||
1982 | spin_lock_irq(&device->connection->req_lock); | 2002 | spin_lock_irq(&first_peer_device(device)->connection->req_lock); |
1983 | rv = may_inc_ap_bio(device); | 2003 | rv = may_inc_ap_bio(device); |
1984 | if (rv) | 2004 | if (rv) |
1985 | atomic_inc(&device->ap_bio_cnt); | 2005 | atomic_inc(&device->ap_bio_cnt); |
1986 | spin_unlock_irq(&device->connection->req_lock); | 2006 | spin_unlock_irq(&first_peer_device(device)->connection->req_lock); |
1987 | 2007 | ||
1988 | return rv; | 2008 | return rv; |
1989 | } | 2009 | } |
@@ -2010,7 +2030,7 @@ static inline void dec_ap_bio(struct drbd_device *device) | |||
2010 | 2030 | ||
2011 | if (ap_bio == 0 && test_bit(BITMAP_IO, &device->flags)) { | 2031 | if (ap_bio == 0 && test_bit(BITMAP_IO, &device->flags)) { |
2012 | if (!test_and_set_bit(BITMAP_IO_QUEUED, &device->flags)) | 2032 | if (!test_and_set_bit(BITMAP_IO_QUEUED, &device->flags)) |
2013 | drbd_queue_work(&device->connection->sender_work, &device->bm_io_work.w); | 2033 | drbd_queue_work(&first_peer_device(device)->connection->sender_work, &device->bm_io_work.w); |
2014 | } | 2034 | } |
2015 | 2035 | ||
2016 | /* this currently does wake_up for every dec_ap_bio! | 2036 | /* this currently does wake_up for every dec_ap_bio! |
@@ -2022,8 +2042,8 @@ static inline void dec_ap_bio(struct drbd_device *device) | |||
2022 | 2042 | ||
2023 | static inline bool verify_can_do_stop_sector(struct drbd_device *device) | 2043 | static inline bool verify_can_do_stop_sector(struct drbd_device *device) |
2024 | { | 2044 | { |
2025 | return device->connection->agreed_pro_version >= 97 && | 2045 | return first_peer_device(device)->connection->agreed_pro_version >= 97 && |
2026 | device->connection->agreed_pro_version != 100; | 2046 | first_peer_device(device)->connection->agreed_pro_version != 100; |
2027 | } | 2047 | } |
2028 | 2048 | ||
2029 | static inline int drbd_set_ed_uuid(struct drbd_device *device, u64 val) | 2049 | static inline int drbd_set_ed_uuid(struct drbd_device *device, u64 val) |
diff --git a/drivers/block/drbd/drbd_main.c b/drivers/block/drbd/drbd_main.c index e4fd1806dc25..b7c858f51fa6 100644 --- a/drivers/block/drbd/drbd_main.c +++ b/drivers/block/drbd/drbd_main.c | |||
@@ -308,7 +308,7 @@ void tl_clear(struct drbd_connection *connection) | |||
308 | */ | 308 | */ |
309 | void tl_abort_disk_io(struct drbd_device *device) | 309 | void tl_abort_disk_io(struct drbd_device *device) |
310 | { | 310 | { |
311 | struct drbd_connection *connection = device->connection; | 311 | struct drbd_connection *connection = first_peer_device(device)->connection; |
312 | struct drbd_request *req, *r; | 312 | struct drbd_request *req, *r; |
313 | 313 | ||
314 | spin_lock_irq(&connection->req_lock); | 314 | spin_lock_irq(&connection->req_lock); |
@@ -633,7 +633,7 @@ void *conn_prepare_command(struct drbd_connection *connection, struct drbd_socke | |||
633 | 633 | ||
634 | void *drbd_prepare_command(struct drbd_device *device, struct drbd_socket *sock) | 634 | void *drbd_prepare_command(struct drbd_device *device, struct drbd_socket *sock) |
635 | { | 635 | { |
636 | return conn_prepare_command(device->connection, sock); | 636 | return conn_prepare_command(first_peer_device(device)->connection, sock); |
637 | } | 637 | } |
638 | 638 | ||
639 | static int __send_command(struct drbd_connection *connection, int vnr, | 639 | static int __send_command(struct drbd_connection *connection, int vnr, |
@@ -686,7 +686,7 @@ int drbd_send_command(struct drbd_device *device, struct drbd_socket *sock, | |||
686 | { | 686 | { |
687 | int err; | 687 | int err; |
688 | 688 | ||
689 | err = __send_command(device->connection, device->vnr, sock, cmd, header_size, | 689 | err = __send_command(first_peer_device(device)->connection, device->vnr, sock, cmd, header_size, |
690 | data, size); | 690 | data, size); |
691 | mutex_unlock(&sock->mutex); | 691 | mutex_unlock(&sock->mutex); |
692 | return err; | 692 | return err; |
@@ -717,18 +717,18 @@ int drbd_send_sync_param(struct drbd_device *device) | |||
717 | struct drbd_socket *sock; | 717 | struct drbd_socket *sock; |
718 | struct p_rs_param_95 *p; | 718 | struct p_rs_param_95 *p; |
719 | int size; | 719 | int size; |
720 | const int apv = device->connection->agreed_pro_version; | 720 | const int apv = first_peer_device(device)->connection->agreed_pro_version; |
721 | enum drbd_packet cmd; | 721 | enum drbd_packet cmd; |
722 | struct net_conf *nc; | 722 | struct net_conf *nc; |
723 | struct disk_conf *dc; | 723 | struct disk_conf *dc; |
724 | 724 | ||
725 | sock = &device->connection->data; | 725 | sock = &first_peer_device(device)->connection->data; |
726 | p = drbd_prepare_command(device, sock); | 726 | p = drbd_prepare_command(device, sock); |
727 | if (!p) | 727 | if (!p) |
728 | return -EIO; | 728 | return -EIO; |
729 | 729 | ||
730 | rcu_read_lock(); | 730 | rcu_read_lock(); |
731 | nc = rcu_dereference(device->connection->net_conf); | 731 | nc = rcu_dereference(first_peer_device(device)->connection->net_conf); |
732 | 732 | ||
733 | size = apv <= 87 ? sizeof(struct p_rs_param) | 733 | size = apv <= 87 ? sizeof(struct p_rs_param) |
734 | : apv == 88 ? sizeof(struct p_rs_param) | 734 | : apv == 88 ? sizeof(struct p_rs_param) |
@@ -831,7 +831,7 @@ static int _drbd_send_uuids(struct drbd_device *device, u64 uuid_flags) | |||
831 | if (!get_ldev_if_state(device, D_NEGOTIATING)) | 831 | if (!get_ldev_if_state(device, D_NEGOTIATING)) |
832 | return 0; | 832 | return 0; |
833 | 833 | ||
834 | sock = &device->connection->data; | 834 | sock = &first_peer_device(device)->connection->data; |
835 | p = drbd_prepare_command(device, sock); | 835 | p = drbd_prepare_command(device, sock); |
836 | if (!p) { | 836 | if (!p) { |
837 | put_ldev(device); | 837 | put_ldev(device); |
@@ -845,7 +845,7 @@ static int _drbd_send_uuids(struct drbd_device *device, u64 uuid_flags) | |||
845 | device->comm_bm_set = drbd_bm_total_weight(device); | 845 | device->comm_bm_set = drbd_bm_total_weight(device); |
846 | p->uuid[UI_SIZE] = cpu_to_be64(device->comm_bm_set); | 846 | p->uuid[UI_SIZE] = cpu_to_be64(device->comm_bm_set); |
847 | rcu_read_lock(); | 847 | rcu_read_lock(); |
848 | uuid_flags |= rcu_dereference(device->connection->net_conf)->discard_my_data ? 1 : 0; | 848 | uuid_flags |= rcu_dereference(first_peer_device(device)->connection->net_conf)->discard_my_data ? 1 : 0; |
849 | rcu_read_unlock(); | 849 | rcu_read_unlock(); |
850 | uuid_flags |= test_bit(CRASHED_PRIMARY, &device->flags) ? 2 : 0; | 850 | uuid_flags |= test_bit(CRASHED_PRIMARY, &device->flags) ? 2 : 0; |
851 | uuid_flags |= device->new_state_tmp.disk == D_INCONSISTENT ? 4 : 0; | 851 | uuid_flags |= device->new_state_tmp.disk == D_INCONSISTENT ? 4 : 0; |
@@ -900,7 +900,7 @@ void drbd_gen_and_send_sync_uuid(struct drbd_device *device) | |||
900 | drbd_print_uuids(device, "updated sync UUID"); | 900 | drbd_print_uuids(device, "updated sync UUID"); |
901 | drbd_md_sync(device); | 901 | drbd_md_sync(device); |
902 | 902 | ||
903 | sock = &device->connection->data; | 903 | sock = &first_peer_device(device)->connection->data; |
904 | p = drbd_prepare_command(device, sock); | 904 | p = drbd_prepare_command(device, sock); |
905 | if (p) { | 905 | if (p) { |
906 | p->uuid = cpu_to_be64(uuid); | 906 | p->uuid = cpu_to_be64(uuid); |
@@ -933,14 +933,14 @@ int drbd_send_sizes(struct drbd_device *device, int trigger_reply, enum dds_flag | |||
933 | max_bio_size = DRBD_MAX_BIO_SIZE; /* ... multiple BIOs per peer_request */ | 933 | max_bio_size = DRBD_MAX_BIO_SIZE; /* ... multiple BIOs per peer_request */ |
934 | } | 934 | } |
935 | 935 | ||
936 | sock = &device->connection->data; | 936 | sock = &first_peer_device(device)->connection->data; |
937 | p = drbd_prepare_command(device, sock); | 937 | p = drbd_prepare_command(device, sock); |
938 | if (!p) | 938 | if (!p) |
939 | return -EIO; | 939 | return -EIO; |
940 | 940 | ||
941 | if (device->connection->agreed_pro_version <= 94) | 941 | if (first_peer_device(device)->connection->agreed_pro_version <= 94) |
942 | max_bio_size = min(max_bio_size, DRBD_MAX_SIZE_H80_PACKET); | 942 | max_bio_size = min(max_bio_size, DRBD_MAX_SIZE_H80_PACKET); |
943 | else if (device->connection->agreed_pro_version < 100) | 943 | else if (first_peer_device(device)->connection->agreed_pro_version < 100) |
944 | max_bio_size = min(max_bio_size, DRBD_MAX_BIO_SIZE_P95); | 944 | max_bio_size = min(max_bio_size, DRBD_MAX_BIO_SIZE_P95); |
945 | 945 | ||
946 | p->d_size = cpu_to_be64(d_size); | 946 | p->d_size = cpu_to_be64(d_size); |
@@ -961,7 +961,7 @@ int drbd_send_current_state(struct drbd_device *device) | |||
961 | struct drbd_socket *sock; | 961 | struct drbd_socket *sock; |
962 | struct p_state *p; | 962 | struct p_state *p; |
963 | 963 | ||
964 | sock = &device->connection->data; | 964 | sock = &first_peer_device(device)->connection->data; |
965 | p = drbd_prepare_command(device, sock); | 965 | p = drbd_prepare_command(device, sock); |
966 | if (!p) | 966 | if (!p) |
967 | return -EIO; | 967 | return -EIO; |
@@ -984,7 +984,7 @@ int drbd_send_state(struct drbd_device *device, union drbd_state state) | |||
984 | struct drbd_socket *sock; | 984 | struct drbd_socket *sock; |
985 | struct p_state *p; | 985 | struct p_state *p; |
986 | 986 | ||
987 | sock = &device->connection->data; | 987 | sock = &first_peer_device(device)->connection->data; |
988 | p = drbd_prepare_command(device, sock); | 988 | p = drbd_prepare_command(device, sock); |
989 | if (!p) | 989 | if (!p) |
990 | return -EIO; | 990 | return -EIO; |
@@ -997,7 +997,7 @@ int drbd_send_state_req(struct drbd_device *device, union drbd_state mask, union | |||
997 | struct drbd_socket *sock; | 997 | struct drbd_socket *sock; |
998 | struct p_req_state *p; | 998 | struct p_req_state *p; |
999 | 999 | ||
1000 | sock = &device->connection->data; | 1000 | sock = &first_peer_device(device)->connection->data; |
1001 | p = drbd_prepare_command(device, sock); | 1001 | p = drbd_prepare_command(device, sock); |
1002 | if (!p) | 1002 | if (!p) |
1003 | return -EIO; | 1003 | return -EIO; |
@@ -1027,7 +1027,7 @@ void drbd_send_sr_reply(struct drbd_device *device, enum drbd_state_rv retcode) | |||
1027 | struct drbd_socket *sock; | 1027 | struct drbd_socket *sock; |
1028 | struct p_req_state_reply *p; | 1028 | struct p_req_state_reply *p; |
1029 | 1029 | ||
1030 | sock = &device->connection->meta; | 1030 | sock = &first_peer_device(device)->connection->meta; |
1031 | p = drbd_prepare_command(device, sock); | 1031 | p = drbd_prepare_command(device, sock); |
1032 | if (p) { | 1032 | if (p) { |
1033 | p->retcode = cpu_to_be32(retcode); | 1033 | p->retcode = cpu_to_be32(retcode); |
@@ -1081,9 +1081,9 @@ static int fill_bitmap_rle_bits(struct drbd_device *device, | |||
1081 | 1081 | ||
1082 | /* may we use this feature? */ | 1082 | /* may we use this feature? */ |
1083 | rcu_read_lock(); | 1083 | rcu_read_lock(); |
1084 | use_rle = rcu_dereference(device->connection->net_conf)->use_rle; | 1084 | use_rle = rcu_dereference(first_peer_device(device)->connection->net_conf)->use_rle; |
1085 | rcu_read_unlock(); | 1085 | rcu_read_unlock(); |
1086 | if (!use_rle || device->connection->agreed_pro_version < 90) | 1086 | if (!use_rle || first_peer_device(device)->connection->agreed_pro_version < 90) |
1087 | return 0; | 1087 | return 0; |
1088 | 1088 | ||
1089 | if (c->bit_offset >= c->bm_bits) | 1089 | if (c->bit_offset >= c->bm_bits) |
@@ -1172,8 +1172,8 @@ static int fill_bitmap_rle_bits(struct drbd_device *device, | |||
1172 | static int | 1172 | static int |
1173 | send_bitmap_rle_or_plain(struct drbd_device *device, struct bm_xfer_ctx *c) | 1173 | send_bitmap_rle_or_plain(struct drbd_device *device, struct bm_xfer_ctx *c) |
1174 | { | 1174 | { |
1175 | struct drbd_socket *sock = &device->connection->data; | 1175 | struct drbd_socket *sock = &first_peer_device(device)->connection->data; |
1176 | unsigned int header_size = drbd_header_size(device->connection); | 1176 | unsigned int header_size = drbd_header_size(first_peer_device(device)->connection); |
1177 | struct p_compressed_bm *p = sock->sbuf + header_size; | 1177 | struct p_compressed_bm *p = sock->sbuf + header_size; |
1178 | int len, err; | 1178 | int len, err; |
1179 | 1179 | ||
@@ -1184,7 +1184,7 @@ send_bitmap_rle_or_plain(struct drbd_device *device, struct bm_xfer_ctx *c) | |||
1184 | 1184 | ||
1185 | if (len) { | 1185 | if (len) { |
1186 | dcbp_set_code(p, RLE_VLI_Bits); | 1186 | dcbp_set_code(p, RLE_VLI_Bits); |
1187 | err = __send_command(device->connection, device->vnr, sock, | 1187 | err = __send_command(first_peer_device(device)->connection, device->vnr, sock, |
1188 | P_COMPRESSED_BITMAP, sizeof(*p) + len, | 1188 | P_COMPRESSED_BITMAP, sizeof(*p) + len, |
1189 | NULL, 0); | 1189 | NULL, 0); |
1190 | c->packets[0]++; | 1190 | c->packets[0]++; |
@@ -1205,7 +1205,7 @@ send_bitmap_rle_or_plain(struct drbd_device *device, struct bm_xfer_ctx *c) | |||
1205 | len = num_words * sizeof(*p); | 1205 | len = num_words * sizeof(*p); |
1206 | if (len) | 1206 | if (len) |
1207 | drbd_bm_get_lel(device, c->word_offset, num_words, p); | 1207 | drbd_bm_get_lel(device, c->word_offset, num_words, p); |
1208 | err = __send_command(device->connection, device->vnr, sock, P_BITMAP, len, NULL, 0); | 1208 | err = __send_command(first_peer_device(device)->connection, device->vnr, sock, P_BITMAP, len, NULL, 0); |
1209 | c->word_offset += num_words; | 1209 | c->word_offset += num_words; |
1210 | c->bit_offset = c->word_offset * BITS_PER_LONG; | 1210 | c->bit_offset = c->word_offset * BITS_PER_LONG; |
1211 | 1211 | ||
@@ -1265,7 +1265,7 @@ static int _drbd_send_bitmap(struct drbd_device *device) | |||
1265 | 1265 | ||
1266 | int drbd_send_bitmap(struct drbd_device *device) | 1266 | int drbd_send_bitmap(struct drbd_device *device) |
1267 | { | 1267 | { |
1268 | struct drbd_socket *sock = &device->connection->data; | 1268 | struct drbd_socket *sock = &first_peer_device(device)->connection->data; |
1269 | int err = -1; | 1269 | int err = -1; |
1270 | 1270 | ||
1271 | mutex_lock(&sock->mutex); | 1271 | mutex_lock(&sock->mutex); |
@@ -1309,7 +1309,7 @@ static int _drbd_send_ack(struct drbd_device *device, enum drbd_packet cmd, | |||
1309 | if (device->state.conn < C_CONNECTED) | 1309 | if (device->state.conn < C_CONNECTED) |
1310 | return -EIO; | 1310 | return -EIO; |
1311 | 1311 | ||
1312 | sock = &device->connection->meta; | 1312 | sock = &first_peer_device(device)->connection->meta; |
1313 | p = drbd_prepare_command(device, sock); | 1313 | p = drbd_prepare_command(device, sock); |
1314 | if (!p) | 1314 | if (!p) |
1315 | return -EIO; | 1315 | return -EIO; |
@@ -1326,8 +1326,8 @@ static int _drbd_send_ack(struct drbd_device *device, enum drbd_packet cmd, | |||
1326 | void drbd_send_ack_dp(struct drbd_device *device, enum drbd_packet cmd, | 1326 | void drbd_send_ack_dp(struct drbd_device *device, enum drbd_packet cmd, |
1327 | struct p_data *dp, int data_size) | 1327 | struct p_data *dp, int data_size) |
1328 | { | 1328 | { |
1329 | if (device->connection->peer_integrity_tfm) | 1329 | if (first_peer_device(device)->connection->peer_integrity_tfm) |
1330 | data_size -= crypto_hash_digestsize(device->connection->peer_integrity_tfm); | 1330 | data_size -= crypto_hash_digestsize(first_peer_device(device)->connection->peer_integrity_tfm); |
1331 | _drbd_send_ack(device, cmd, dp->sector, cpu_to_be32(data_size), | 1331 | _drbd_send_ack(device, cmd, dp->sector, cpu_to_be32(data_size), |
1332 | dp->block_id); | 1332 | dp->block_id); |
1333 | } | 1333 | } |
@@ -1370,7 +1370,7 @@ int drbd_send_drequest(struct drbd_device *device, int cmd, | |||
1370 | struct drbd_socket *sock; | 1370 | struct drbd_socket *sock; |
1371 | struct p_block_req *p; | 1371 | struct p_block_req *p; |
1372 | 1372 | ||
1373 | sock = &device->connection->data; | 1373 | sock = &first_peer_device(device)->connection->data; |
1374 | p = drbd_prepare_command(device, sock); | 1374 | p = drbd_prepare_command(device, sock); |
1375 | if (!p) | 1375 | if (!p) |
1376 | return -EIO; | 1376 | return -EIO; |
@@ -1388,7 +1388,7 @@ int drbd_send_drequest_csum(struct drbd_device *device, sector_t sector, int siz | |||
1388 | 1388 | ||
1389 | /* FIXME: Put the digest into the preallocated socket buffer. */ | 1389 | /* FIXME: Put the digest into the preallocated socket buffer. */ |
1390 | 1390 | ||
1391 | sock = &device->connection->data; | 1391 | sock = &first_peer_device(device)->connection->data; |
1392 | p = drbd_prepare_command(device, sock); | 1392 | p = drbd_prepare_command(device, sock); |
1393 | if (!p) | 1393 | if (!p) |
1394 | return -EIO; | 1394 | return -EIO; |
@@ -1404,7 +1404,7 @@ int drbd_send_ov_request(struct drbd_device *device, sector_t sector, int size) | |||
1404 | struct drbd_socket *sock; | 1404 | struct drbd_socket *sock; |
1405 | struct p_block_req *p; | 1405 | struct p_block_req *p; |
1406 | 1406 | ||
1407 | sock = &device->connection->data; | 1407 | sock = &first_peer_device(device)->connection->data; |
1408 | p = drbd_prepare_command(device, sock); | 1408 | p = drbd_prepare_command(device, sock); |
1409 | if (!p) | 1409 | if (!p) |
1410 | return -EIO; | 1410 | return -EIO; |
@@ -1476,9 +1476,9 @@ static int _drbd_no_send_page(struct drbd_device *device, struct page *page, | |||
1476 | void *addr; | 1476 | void *addr; |
1477 | int err; | 1477 | int err; |
1478 | 1478 | ||
1479 | socket = device->connection->data.socket; | 1479 | socket = first_peer_device(device)->connection->data.socket; |
1480 | addr = kmap(page) + offset; | 1480 | addr = kmap(page) + offset; |
1481 | err = drbd_send_all(device->connection, socket, addr, size, msg_flags); | 1481 | err = drbd_send_all(first_peer_device(device)->connection, socket, addr, size, msg_flags); |
1482 | kunmap(page); | 1482 | kunmap(page); |
1483 | if (!err) | 1483 | if (!err) |
1484 | device->send_cnt += size >> 9; | 1484 | device->send_cnt += size >> 9; |
@@ -1488,7 +1488,7 @@ static int _drbd_no_send_page(struct drbd_device *device, struct page *page, | |||
1488 | static int _drbd_send_page(struct drbd_device *device, struct page *page, | 1488 | static int _drbd_send_page(struct drbd_device *device, struct page *page, |
1489 | int offset, size_t size, unsigned msg_flags) | 1489 | int offset, size_t size, unsigned msg_flags) |
1490 | { | 1490 | { |
1491 | struct socket *socket = device->connection->data.socket; | 1491 | struct socket *socket = first_peer_device(device)->connection->data.socket; |
1492 | mm_segment_t oldfs = get_fs(); | 1492 | mm_segment_t oldfs = get_fs(); |
1493 | int len = size; | 1493 | int len = size; |
1494 | int err = -EIO; | 1494 | int err = -EIO; |
@@ -1503,7 +1503,7 @@ static int _drbd_send_page(struct drbd_device *device, struct page *page, | |||
1503 | return _drbd_no_send_page(device, page, offset, size, msg_flags); | 1503 | return _drbd_no_send_page(device, page, offset, size, msg_flags); |
1504 | 1504 | ||
1505 | msg_flags |= MSG_NOSIGNAL; | 1505 | msg_flags |= MSG_NOSIGNAL; |
1506 | drbd_update_congested(device->connection); | 1506 | drbd_update_congested(first_peer_device(device)->connection); |
1507 | set_fs(KERNEL_DS); | 1507 | set_fs(KERNEL_DS); |
1508 | do { | 1508 | do { |
1509 | int sent; | 1509 | int sent; |
@@ -1511,7 +1511,7 @@ static int _drbd_send_page(struct drbd_device *device, struct page *page, | |||
1511 | sent = socket->ops->sendpage(socket, page, offset, len, msg_flags); | 1511 | sent = socket->ops->sendpage(socket, page, offset, len, msg_flags); |
1512 | if (sent <= 0) { | 1512 | if (sent <= 0) { |
1513 | if (sent == -EAGAIN) { | 1513 | if (sent == -EAGAIN) { |
1514 | if (we_should_drop_the_connection(device->connection, socket)) | 1514 | if (we_should_drop_the_connection(first_peer_device(device)->connection, socket)) |
1515 | break; | 1515 | break; |
1516 | continue; | 1516 | continue; |
1517 | } | 1517 | } |
@@ -1525,7 +1525,7 @@ static int _drbd_send_page(struct drbd_device *device, struct page *page, | |||
1525 | offset += sent; | 1525 | offset += sent; |
1526 | } while (len > 0 /* THINK && device->cstate >= C_CONNECTED*/); | 1526 | } while (len > 0 /* THINK && device->cstate >= C_CONNECTED*/); |
1527 | set_fs(oldfs); | 1527 | set_fs(oldfs); |
1528 | clear_bit(NET_CONGESTED, &device->connection->flags); | 1528 | clear_bit(NET_CONGESTED, &first_peer_device(device)->connection->flags); |
1529 | 1529 | ||
1530 | if (len == 0) { | 1530 | if (len == 0) { |
1531 | err = 0; | 1531 | err = 0; |
@@ -1593,7 +1593,7 @@ static int _drbd_send_zc_ee(struct drbd_device *device, | |||
1593 | 1593 | ||
1594 | static u32 bio_flags_to_wire(struct drbd_device *device, unsigned long bi_rw) | 1594 | static u32 bio_flags_to_wire(struct drbd_device *device, unsigned long bi_rw) |
1595 | { | 1595 | { |
1596 | if (device->connection->agreed_pro_version >= 95) | 1596 | if (first_peer_device(device)->connection->agreed_pro_version >= 95) |
1597 | return (bi_rw & REQ_SYNC ? DP_RW_SYNC : 0) | | 1597 | return (bi_rw & REQ_SYNC ? DP_RW_SYNC : 0) | |
1598 | (bi_rw & REQ_FUA ? DP_FUA : 0) | | 1598 | (bi_rw & REQ_FUA ? DP_FUA : 0) | |
1599 | (bi_rw & REQ_FLUSH ? DP_FLUSH : 0) | | 1599 | (bi_rw & REQ_FLUSH ? DP_FLUSH : 0) | |
@@ -1613,9 +1613,10 @@ int drbd_send_dblock(struct drbd_device *device, struct drbd_request *req) | |||
1613 | int dgs; | 1613 | int dgs; |
1614 | int err; | 1614 | int err; |
1615 | 1615 | ||
1616 | sock = &device->connection->data; | 1616 | sock = &first_peer_device(device)->connection->data; |
1617 | p = drbd_prepare_command(device, sock); | 1617 | p = drbd_prepare_command(device, sock); |
1618 | dgs = device->connection->integrity_tfm ? crypto_hash_digestsize(device->connection->integrity_tfm) : 0; | 1618 | dgs = first_peer_device(device)->connection->integrity_tfm ? |
1619 | crypto_hash_digestsize(first_peer_device(device)->connection->integrity_tfm) : 0; | ||
1619 | 1620 | ||
1620 | if (!p) | 1621 | if (!p) |
1621 | return -EIO; | 1622 | return -EIO; |
@@ -1626,7 +1627,7 @@ int drbd_send_dblock(struct drbd_device *device, struct drbd_request *req) | |||
1626 | if (device->state.conn >= C_SYNC_SOURCE && | 1627 | if (device->state.conn >= C_SYNC_SOURCE && |
1627 | device->state.conn <= C_PAUSED_SYNC_T) | 1628 | device->state.conn <= C_PAUSED_SYNC_T) |
1628 | dp_flags |= DP_MAY_SET_IN_SYNC; | 1629 | dp_flags |= DP_MAY_SET_IN_SYNC; |
1629 | if (device->connection->agreed_pro_version >= 100) { | 1630 | if (first_peer_device(device)->connection->agreed_pro_version >= 100) { |
1630 | if (req->rq_state & RQ_EXP_RECEIVE_ACK) | 1631 | if (req->rq_state & RQ_EXP_RECEIVE_ACK) |
1631 | dp_flags |= DP_SEND_RECEIVE_ACK; | 1632 | dp_flags |= DP_SEND_RECEIVE_ACK; |
1632 | if (req->rq_state & RQ_EXP_WRITE_ACK) | 1633 | if (req->rq_state & RQ_EXP_WRITE_ACK) |
@@ -1634,8 +1635,8 @@ int drbd_send_dblock(struct drbd_device *device, struct drbd_request *req) | |||
1634 | } | 1635 | } |
1635 | p->dp_flags = cpu_to_be32(dp_flags); | 1636 | p->dp_flags = cpu_to_be32(dp_flags); |
1636 | if (dgs) | 1637 | if (dgs) |
1637 | drbd_csum_bio(device, device->connection->integrity_tfm, req->master_bio, p + 1); | 1638 | drbd_csum_bio(device, first_peer_device(device)->connection->integrity_tfm, req->master_bio, p + 1); |
1638 | err = __send_command(device->connection, device->vnr, sock, P_DATA, sizeof(*p) + dgs, NULL, req->i.size); | 1639 | err = __send_command(first_peer_device(device)->connection, device->vnr, sock, P_DATA, sizeof(*p) + dgs, NULL, req->i.size); |
1639 | if (!err) { | 1640 | if (!err) { |
1640 | /* For protocol A, we have to memcpy the payload into | 1641 | /* For protocol A, we have to memcpy the payload into |
1641 | * socket buffers, as we may complete right away | 1642 | * socket buffers, as we may complete right away |
@@ -1658,7 +1659,7 @@ int drbd_send_dblock(struct drbd_device *device, struct drbd_request *req) | |||
1658 | /* 64 byte, 512 bit, is the largest digest size | 1659 | /* 64 byte, 512 bit, is the largest digest size |
1659 | * currently supported in kernel crypto. */ | 1660 | * currently supported in kernel crypto. */ |
1660 | unsigned char digest[64]; | 1661 | unsigned char digest[64]; |
1661 | drbd_csum_bio(device, device->connection->integrity_tfm, req->master_bio, digest); | 1662 | drbd_csum_bio(device, first_peer_device(device)->connection->integrity_tfm, req->master_bio, digest); |
1662 | if (memcmp(p + 1, digest, dgs)) { | 1663 | if (memcmp(p + 1, digest, dgs)) { |
1663 | dev_warn(DEV, | 1664 | dev_warn(DEV, |
1664 | "Digest mismatch, buffer modified by upper layers during write: %llus +%u\n", | 1665 | "Digest mismatch, buffer modified by upper layers during write: %llus +%u\n", |
@@ -1685,10 +1686,11 @@ int drbd_send_block(struct drbd_device *device, enum drbd_packet cmd, | |||
1685 | int err; | 1686 | int err; |
1686 | int dgs; | 1687 | int dgs; |
1687 | 1688 | ||
1688 | sock = &device->connection->data; | 1689 | sock = &first_peer_device(device)->connection->data; |
1689 | p = drbd_prepare_command(device, sock); | 1690 | p = drbd_prepare_command(device, sock); |
1690 | 1691 | ||
1691 | dgs = device->connection->integrity_tfm ? crypto_hash_digestsize(device->connection->integrity_tfm) : 0; | 1692 | dgs = first_peer_device(device)->connection->integrity_tfm ? |
1693 | crypto_hash_digestsize(first_peer_device(device)->connection->integrity_tfm) : 0; | ||
1692 | 1694 | ||
1693 | if (!p) | 1695 | if (!p) |
1694 | return -EIO; | 1696 | return -EIO; |
@@ -1697,8 +1699,8 @@ int drbd_send_block(struct drbd_device *device, enum drbd_packet cmd, | |||
1697 | p->seq_num = 0; /* unused */ | 1699 | p->seq_num = 0; /* unused */ |
1698 | p->dp_flags = 0; | 1700 | p->dp_flags = 0; |
1699 | if (dgs) | 1701 | if (dgs) |
1700 | drbd_csum_ee(device, device->connection->integrity_tfm, peer_req, p + 1); | 1702 | drbd_csum_ee(device, first_peer_device(device)->connection->integrity_tfm, peer_req, p + 1); |
1701 | err = __send_command(device->connection, device->vnr, sock, cmd, sizeof(*p) + dgs, NULL, peer_req->i.size); | 1703 | err = __send_command(first_peer_device(device)->connection, device->vnr, sock, cmd, sizeof(*p) + dgs, NULL, peer_req->i.size); |
1702 | if (!err) | 1704 | if (!err) |
1703 | err = _drbd_send_zc_ee(device, peer_req); | 1705 | err = _drbd_send_zc_ee(device, peer_req); |
1704 | mutex_unlock(&sock->mutex); /* locked by drbd_prepare_command() */ | 1706 | mutex_unlock(&sock->mutex); /* locked by drbd_prepare_command() */ |
@@ -1711,7 +1713,7 @@ int drbd_send_out_of_sync(struct drbd_device *device, struct drbd_request *req) | |||
1711 | struct drbd_socket *sock; | 1713 | struct drbd_socket *sock; |
1712 | struct p_block_desc *p; | 1714 | struct p_block_desc *p; |
1713 | 1715 | ||
1714 | sock = &device->connection->data; | 1716 | sock = &first_peer_device(device)->connection->data; |
1715 | p = drbd_prepare_command(device, sock); | 1717 | p = drbd_prepare_command(device, sock); |
1716 | if (!p) | 1718 | if (!p) |
1717 | return -EIO; | 1719 | return -EIO; |
@@ -1832,7 +1834,7 @@ static int drbd_open(struct block_device *bdev, fmode_t mode) | |||
1832 | int rv = 0; | 1834 | int rv = 0; |
1833 | 1835 | ||
1834 | mutex_lock(&drbd_main_mutex); | 1836 | mutex_lock(&drbd_main_mutex); |
1835 | spin_lock_irqsave(&device->connection->req_lock, flags); | 1837 | spin_lock_irqsave(&first_peer_device(device)->connection->req_lock, flags); |
1836 | /* to have a stable device->state.role | 1838 | /* to have a stable device->state.role |
1837 | * and no race with updating open_cnt */ | 1839 | * and no race with updating open_cnt */ |
1838 | 1840 | ||
@@ -1845,7 +1847,7 @@ static int drbd_open(struct block_device *bdev, fmode_t mode) | |||
1845 | 1847 | ||
1846 | if (!rv) | 1848 | if (!rv) |
1847 | device->open_cnt++; | 1849 | device->open_cnt++; |
1848 | spin_unlock_irqrestore(&device->connection->req_lock, flags); | 1850 | spin_unlock_irqrestore(&first_peer_device(device)->connection->req_lock, flags); |
1849 | mutex_unlock(&drbd_main_mutex); | 1851 | mutex_unlock(&drbd_main_mutex); |
1850 | 1852 | ||
1851 | return rv; | 1853 | return rv; |
@@ -1950,9 +1952,9 @@ void drbd_init_set_defaults(struct drbd_device *device) | |||
1950 | void drbd_device_cleanup(struct drbd_device *device) | 1952 | void drbd_device_cleanup(struct drbd_device *device) |
1951 | { | 1953 | { |
1952 | int i; | 1954 | int i; |
1953 | if (device->connection->receiver.t_state != NONE) | 1955 | if (first_peer_device(device)->connection->receiver.t_state != NONE) |
1954 | dev_err(DEV, "ASSERT FAILED: receiver t_state == %d expected 0.\n", | 1956 | dev_err(DEV, "ASSERT FAILED: receiver t_state == %d expected 0.\n", |
1955 | device->connection->receiver.t_state); | 1957 | first_peer_device(device)->connection->receiver.t_state); |
1956 | 1958 | ||
1957 | device->al_writ_cnt = | 1959 | device->al_writ_cnt = |
1958 | device->bm_writ_cnt = | 1960 | device->bm_writ_cnt = |
@@ -1970,7 +1972,7 @@ void drbd_device_cleanup(struct drbd_device *device) | |||
1970 | device->rs_mark_left[i] = 0; | 1972 | device->rs_mark_left[i] = 0; |
1971 | device->rs_mark_time[i] = 0; | 1973 | device->rs_mark_time[i] = 0; |
1972 | } | 1974 | } |
1973 | D_ASSERT(device->connection->net_conf == NULL); | 1975 | D_ASSERT(first_peer_device(device)->connection->net_conf == NULL); |
1974 | 1976 | ||
1975 | drbd_set_my_capacity(device, 0); | 1977 | drbd_set_my_capacity(device, 0); |
1976 | if (device->bitmap) { | 1978 | if (device->bitmap) { |
@@ -1990,7 +1992,7 @@ void drbd_device_cleanup(struct drbd_device *device) | |||
1990 | D_ASSERT(list_empty(&device->read_ee)); | 1992 | D_ASSERT(list_empty(&device->read_ee)); |
1991 | D_ASSERT(list_empty(&device->net_ee)); | 1993 | D_ASSERT(list_empty(&device->net_ee)); |
1992 | D_ASSERT(list_empty(&device->resync_reads)); | 1994 | D_ASSERT(list_empty(&device->resync_reads)); |
1993 | D_ASSERT(list_empty(&device->connection->sender_work.q)); | 1995 | D_ASSERT(list_empty(&first_peer_device(device)->connection->sender_work.q)); |
1994 | D_ASSERT(list_empty(&device->resync_work.list)); | 1996 | D_ASSERT(list_empty(&device->resync_work.list)); |
1995 | D_ASSERT(list_empty(&device->unplug_work.list)); | 1997 | D_ASSERT(list_empty(&device->unplug_work.list)); |
1996 | D_ASSERT(list_empty(&device->go_diskless.list)); | 1998 | D_ASSERT(list_empty(&device->go_diskless.list)); |
@@ -2159,7 +2161,7 @@ static void drbd_release_all_peer_reqs(struct drbd_device *device) | |||
2159 | void drbd_minor_destroy(struct kref *kref) | 2161 | void drbd_minor_destroy(struct kref *kref) |
2160 | { | 2162 | { |
2161 | struct drbd_device *device = container_of(kref, struct drbd_device, kref); | 2163 | struct drbd_device *device = container_of(kref, struct drbd_device, kref); |
2162 | struct drbd_connection *connection = device->connection; | 2164 | struct drbd_connection *connection = first_peer_device(device)->connection; |
2163 | 2165 | ||
2164 | del_timer_sync(&device->request_timer); | 2166 | del_timer_sync(&device->request_timer); |
2165 | 2167 | ||
@@ -2190,6 +2192,7 @@ void drbd_minor_destroy(struct kref *kref) | |||
2190 | put_disk(device->vdisk); | 2192 | put_disk(device->vdisk); |
2191 | blk_cleanup_queue(device->rq_queue); | 2193 | blk_cleanup_queue(device->rq_queue); |
2192 | kfree(device->rs_plan_s); | 2194 | kfree(device->rs_plan_s); |
2195 | kfree(first_peer_device(device)); | ||
2193 | kfree(device); | 2196 | kfree(device); |
2194 | 2197 | ||
2195 | kref_put(&connection->kref, &conn_destroy); | 2198 | kref_put(&connection->kref, &conn_destroy); |
@@ -2300,7 +2303,7 @@ static void drbd_cleanup(void) | |||
2300 | 2303 | ||
2301 | idr_for_each_entry(&minors, device, i) { | 2304 | idr_for_each_entry(&minors, device, i) { |
2302 | idr_remove(&minors, device_to_minor(device)); | 2305 | idr_remove(&minors, device_to_minor(device)); |
2303 | idr_remove(&device->connection->volumes, device->vnr); | 2306 | idr_remove(&first_peer_device(device)->connection->volumes, device->vnr); |
2304 | destroy_workqueue(device->submit.wq); | 2307 | destroy_workqueue(device->submit.wq); |
2305 | del_gendisk(device->vdisk); | 2308 | del_gendisk(device->vdisk); |
2306 | /* synchronize_rcu(); No other threads running at this point */ | 2309 | /* synchronize_rcu(); No other threads running at this point */ |
@@ -2343,7 +2346,7 @@ static int drbd_congested(void *congested_data, int bdi_bits) | |||
2343 | goto out; | 2346 | goto out; |
2344 | } | 2347 | } |
2345 | 2348 | ||
2346 | if (test_bit(CALLBACK_PENDING, &device->connection->flags)) { | 2349 | if (test_bit(CALLBACK_PENDING, &first_peer_device(device)->connection->flags)) { |
2347 | r |= (1 << BDI_async_congested); | 2350 | r |= (1 << BDI_async_congested); |
2348 | /* Without good local data, we would need to read from remote, | 2351 | /* Without good local data, we would need to read from remote, |
2349 | * and that would need the worker thread as well, which is | 2352 | * and that would need the worker thread as well, which is |
@@ -2367,7 +2370,8 @@ static int drbd_congested(void *congested_data, int bdi_bits) | |||
2367 | reason = 'b'; | 2370 | reason = 'b'; |
2368 | } | 2371 | } |
2369 | 2372 | ||
2370 | if (bdi_bits & (1 << BDI_async_congested) && test_bit(NET_CONGESTED, &device->connection->flags)) { | 2373 | if (bdi_bits & (1 << BDI_async_congested) && |
2374 | test_bit(NET_CONGESTED, &first_peer_device(device)->connection->flags)) { | ||
2371 | r |= (1 << BDI_async_congested); | 2375 | r |= (1 << BDI_async_congested); |
2372 | reason = reason == 'b' ? 'a' : 'n'; | 2376 | reason = reason == 'b' ? 'a' : 'n'; |
2373 | } | 2377 | } |
@@ -2606,9 +2610,10 @@ static int init_submitter(struct drbd_device *device) | |||
2606 | return 0; | 2610 | return 0; |
2607 | } | 2611 | } |
2608 | 2612 | ||
2609 | enum drbd_ret_code conn_new_minor(struct drbd_connection *connection, unsigned int minor, int vnr) | 2613 | enum drbd_ret_code drbd_create_minor(struct drbd_connection *connection, unsigned int minor, int vnr) |
2610 | { | 2614 | { |
2611 | struct drbd_device *device; | 2615 | struct drbd_device *device; |
2616 | struct drbd_peer_device *peer_device; | ||
2612 | struct gendisk *disk; | 2617 | struct gendisk *disk; |
2613 | struct request_queue *q; | 2618 | struct request_queue *q; |
2614 | int vnr_got = vnr; | 2619 | int vnr_got = vnr; |
@@ -2623,9 +2628,15 @@ enum drbd_ret_code conn_new_minor(struct drbd_connection *connection, unsigned i | |||
2623 | device = kzalloc(sizeof(struct drbd_device), GFP_KERNEL); | 2628 | device = kzalloc(sizeof(struct drbd_device), GFP_KERNEL); |
2624 | if (!device) | 2629 | if (!device) |
2625 | return ERR_NOMEM; | 2630 | return ERR_NOMEM; |
2631 | peer_device = kzalloc(sizeof(struct drbd_peer_device), GFP_KERNEL); | ||
2632 | if (!peer_device) | ||
2633 | goto out_no_peer_device; | ||
2626 | 2634 | ||
2635 | INIT_LIST_HEAD(&device->peer_devices); | ||
2636 | list_add(&peer_device->peer_devices, &device->peer_devices); | ||
2627 | kref_get(&connection->kref); | 2637 | kref_get(&connection->kref); |
2628 | device->connection = connection; | 2638 | peer_device->connection = connection; |
2639 | peer_device->device = device; | ||
2629 | 2640 | ||
2630 | device->minor = minor; | 2641 | device->minor = minor; |
2631 | device->vnr = vnr; | 2642 | device->vnr = vnr; |
@@ -2666,7 +2677,7 @@ enum drbd_ret_code conn_new_minor(struct drbd_connection *connection, unsigned i | |||
2666 | blk_queue_max_hw_sectors(q, DRBD_MAX_BIO_SIZE_SAFE >> 8); | 2677 | blk_queue_max_hw_sectors(q, DRBD_MAX_BIO_SIZE_SAFE >> 8); |
2667 | blk_queue_bounce_limit(q, BLK_BOUNCE_ANY); | 2678 | blk_queue_bounce_limit(q, BLK_BOUNCE_ANY); |
2668 | blk_queue_merge_bvec(q, drbd_merge_bvec); | 2679 | blk_queue_merge_bvec(q, drbd_merge_bvec); |
2669 | q->queue_lock = &device->connection->req_lock; /* needed since we use */ | 2680 | q->queue_lock = &first_peer_device(device)->connection->req_lock; /* needed since we use */ |
2670 | 2681 | ||
2671 | device->md_io_page = alloc_page(GFP_KERNEL); | 2682 | device->md_io_page = alloc_page(GFP_KERNEL); |
2672 | if (!device->md_io_page) | 2683 | if (!device->md_io_page) |
@@ -2725,8 +2736,9 @@ out_no_io_page: | |||
2725 | out_no_disk: | 2736 | out_no_disk: |
2726 | blk_cleanup_queue(q); | 2737 | blk_cleanup_queue(q); |
2727 | out_no_q: | 2738 | out_no_q: |
2728 | kfree(device); | ||
2729 | kref_put(&connection->kref, &conn_destroy); | 2739 | kref_put(&connection->kref, &conn_destroy); |
2740 | out_no_peer_device: | ||
2741 | kfree(device); | ||
2730 | return err; | 2742 | return err; |
2731 | } | 2743 | } |
2732 | 2744 | ||
@@ -3172,14 +3184,14 @@ int drbd_md_read(struct drbd_device *device, struct drbd_backing_dev *bdev) | |||
3172 | 3184 | ||
3173 | rv = NO_ERROR; | 3185 | rv = NO_ERROR; |
3174 | 3186 | ||
3175 | spin_lock_irq(&device->connection->req_lock); | 3187 | spin_lock_irq(&first_peer_device(device)->connection->req_lock); |
3176 | if (device->state.conn < C_CONNECTED) { | 3188 | if (device->state.conn < C_CONNECTED) { |
3177 | unsigned int peer; | 3189 | unsigned int peer; |
3178 | peer = be32_to_cpu(buffer->la_peer_max_bio_size); | 3190 | peer = be32_to_cpu(buffer->la_peer_max_bio_size); |
3179 | peer = max(peer, DRBD_MAX_BIO_SIZE_SAFE); | 3191 | peer = max(peer, DRBD_MAX_BIO_SIZE_SAFE); |
3180 | device->peer_max_bio_size = peer; | 3192 | device->peer_max_bio_size = peer; |
3181 | } | 3193 | } |
3182 | spin_unlock_irq(&device->connection->req_lock); | 3194 | spin_unlock_irq(&first_peer_device(device)->connection->req_lock); |
3183 | 3195 | ||
3184 | err: | 3196 | err: |
3185 | drbd_md_put_buffer(device); | 3197 | drbd_md_put_buffer(device); |
@@ -3454,7 +3466,7 @@ void drbd_queue_bitmap_io(struct drbd_device *device, | |||
3454 | void (*done)(struct drbd_device *, int), | 3466 | void (*done)(struct drbd_device *, int), |
3455 | char *why, enum bm_flag flags) | 3467 | char *why, enum bm_flag flags) |
3456 | { | 3468 | { |
3457 | D_ASSERT(current == device->connection->worker.task); | 3469 | D_ASSERT(current == first_peer_device(device)->connection->worker.task); |
3458 | 3470 | ||
3459 | D_ASSERT(!test_bit(BITMAP_IO_QUEUED, &device->flags)); | 3471 | D_ASSERT(!test_bit(BITMAP_IO_QUEUED, &device->flags)); |
3460 | D_ASSERT(!test_bit(BITMAP_IO, &device->flags)); | 3472 | D_ASSERT(!test_bit(BITMAP_IO, &device->flags)); |
@@ -3468,13 +3480,13 @@ void drbd_queue_bitmap_io(struct drbd_device *device, | |||
3468 | device->bm_io_work.why = why; | 3480 | device->bm_io_work.why = why; |
3469 | device->bm_io_work.flags = flags; | 3481 | device->bm_io_work.flags = flags; |
3470 | 3482 | ||
3471 | spin_lock_irq(&device->connection->req_lock); | 3483 | spin_lock_irq(&first_peer_device(device)->connection->req_lock); |
3472 | set_bit(BITMAP_IO, &device->flags); | 3484 | set_bit(BITMAP_IO, &device->flags); |
3473 | if (atomic_read(&device->ap_bio_cnt) == 0) { | 3485 | if (atomic_read(&device->ap_bio_cnt) == 0) { |
3474 | if (!test_and_set_bit(BITMAP_IO_QUEUED, &device->flags)) | 3486 | if (!test_and_set_bit(BITMAP_IO_QUEUED, &device->flags)) |
3475 | drbd_queue_work(&device->connection->sender_work, &device->bm_io_work.w); | 3487 | drbd_queue_work(&first_peer_device(device)->connection->sender_work, &device->bm_io_work.w); |
3476 | } | 3488 | } |
3477 | spin_unlock_irq(&device->connection->req_lock); | 3489 | spin_unlock_irq(&first_peer_device(device)->connection->req_lock); |
3478 | } | 3490 | } |
3479 | 3491 | ||
3480 | /** | 3492 | /** |
@@ -3491,7 +3503,7 @@ int drbd_bitmap_io(struct drbd_device *device, int (*io_fn)(struct drbd_device * | |||
3491 | { | 3503 | { |
3492 | int rv; | 3504 | int rv; |
3493 | 3505 | ||
3494 | D_ASSERT(current != device->connection->worker.task); | 3506 | D_ASSERT(current != first_peer_device(device)->connection->worker.task); |
3495 | 3507 | ||
3496 | if ((flags & BM_LOCKED_SET_ALLOWED) == 0) | 3508 | if ((flags & BM_LOCKED_SET_ALLOWED) == 0) |
3497 | drbd_suspend_io(device); | 3509 | drbd_suspend_io(device); |
@@ -3532,7 +3544,7 @@ static void md_sync_timer_fn(unsigned long data) | |||
3532 | 3544 | ||
3533 | /* must not double-queue! */ | 3545 | /* must not double-queue! */ |
3534 | if (list_empty(&device->md_sync_work.list)) | 3546 | if (list_empty(&device->md_sync_work.list)) |
3535 | drbd_queue_work_front(&device->connection->sender_work, &device->md_sync_work); | 3547 | drbd_queue_work_front(&first_peer_device(device)->connection->sender_work, &device->md_sync_work); |
3536 | } | 3548 | } |
3537 | 3549 | ||
3538 | static int w_md_sync(struct drbd_work *w, int unused) | 3550 | static int w_md_sync(struct drbd_work *w, int unused) |
@@ -3631,7 +3643,7 @@ int drbd_wait_misc(struct drbd_device *device, struct drbd_interval *i) | |||
3631 | long timeout; | 3643 | long timeout; |
3632 | 3644 | ||
3633 | rcu_read_lock(); | 3645 | rcu_read_lock(); |
3634 | nc = rcu_dereference(device->connection->net_conf); | 3646 | nc = rcu_dereference(first_peer_device(device)->connection->net_conf); |
3635 | if (!nc) { | 3647 | if (!nc) { |
3636 | rcu_read_unlock(); | 3648 | rcu_read_unlock(); |
3637 | return -ETIMEDOUT; | 3649 | return -ETIMEDOUT; |
@@ -3642,10 +3654,10 @@ int drbd_wait_misc(struct drbd_device *device, struct drbd_interval *i) | |||
3642 | /* Indicate to wake up device->misc_wait on progress. */ | 3654 | /* Indicate to wake up device->misc_wait on progress. */ |
3643 | i->waiting = true; | 3655 | i->waiting = true; |
3644 | prepare_to_wait(&device->misc_wait, &wait, TASK_INTERRUPTIBLE); | 3656 | prepare_to_wait(&device->misc_wait, &wait, TASK_INTERRUPTIBLE); |
3645 | spin_unlock_irq(&device->connection->req_lock); | 3657 | spin_unlock_irq(&first_peer_device(device)->connection->req_lock); |
3646 | timeout = schedule_timeout(timeout); | 3658 | timeout = schedule_timeout(timeout); |
3647 | finish_wait(&device->misc_wait, &wait); | 3659 | finish_wait(&device->misc_wait, &wait); |
3648 | spin_lock_irq(&device->connection->req_lock); | 3660 | spin_lock_irq(&first_peer_device(device)->connection->req_lock); |
3649 | if (!timeout || device->state.conn < C_CONNECTED) | 3661 | if (!timeout || device->state.conn < C_CONNECTED) |
3650 | return -ETIMEDOUT; | 3662 | return -ETIMEDOUT; |
3651 | if (signal_pending(current)) | 3663 | if (signal_pending(current)) |
diff --git a/drivers/block/drbd/drbd_nl.c b/drivers/block/drbd/drbd_nl.c index 1b5b7ea7f7cc..a8c9c86e29f5 100644 --- a/drivers/block/drbd/drbd_nl.c +++ b/drivers/block/drbd/drbd_nl.c | |||
@@ -246,10 +246,10 @@ static int drbd_adm_prepare(struct sk_buff *skb, struct genl_info *info, | |||
246 | 246 | ||
247 | /* some more paranoia, if the request was over-determined */ | 247 | /* some more paranoia, if the request was over-determined */ |
248 | if (adm_ctx.device && adm_ctx.connection && | 248 | if (adm_ctx.device && adm_ctx.connection && |
249 | adm_ctx.device->connection != adm_ctx.connection) { | 249 | first_peer_device(adm_ctx.device)->connection != adm_ctx.connection) { |
250 | pr_warning("request: minor=%u, resource=%s; but that minor belongs to connection %s\n", | 250 | pr_warning("request: minor=%u, resource=%s; but that minor belongs to connection %s\n", |
251 | adm_ctx.minor, adm_ctx.resource_name, | 251 | adm_ctx.minor, adm_ctx.resource_name, |
252 | adm_ctx.device->connection->name); | 252 | first_peer_device(adm_ctx.device)->connection->name); |
253 | drbd_msg_put_info("minor exists in different resource"); | 253 | drbd_msg_put_info("minor exists in different resource"); |
254 | return ERR_INVALID_REQUEST; | 254 | return ERR_INVALID_REQUEST; |
255 | } | 255 | } |
@@ -258,7 +258,7 @@ static int drbd_adm_prepare(struct sk_buff *skb, struct genl_info *info, | |||
258 | adm_ctx.volume != adm_ctx.device->vnr) { | 258 | adm_ctx.volume != adm_ctx.device->vnr) { |
259 | pr_warning("request: minor=%u, volume=%u; but that minor is volume %u in %s\n", | 259 | pr_warning("request: minor=%u, volume=%u; but that minor is volume %u in %s\n", |
260 | adm_ctx.minor, adm_ctx.volume, | 260 | adm_ctx.minor, adm_ctx.volume, |
261 | adm_ctx.device->vnr, adm_ctx.device->connection->name); | 261 | adm_ctx.device->vnr, first_peer_device(adm_ctx.device)->connection->name); |
262 | drbd_msg_put_info("minor exists as different volume"); | 262 | drbd_msg_put_info("minor exists as different volume"); |
263 | return ERR_INVALID_REQUEST; | 263 | return ERR_INVALID_REQUEST; |
264 | } | 264 | } |
@@ -323,7 +323,7 @@ int drbd_khelper(struct drbd_device *device, char *cmd) | |||
323 | NULL }; | 323 | NULL }; |
324 | char mb[12]; | 324 | char mb[12]; |
325 | char *argv[] = {usermode_helper, cmd, mb, NULL }; | 325 | char *argv[] = {usermode_helper, cmd, mb, NULL }; |
326 | struct drbd_connection *connection = device->connection; | 326 | struct drbd_connection *connection = first_peer_device(device)->connection; |
327 | struct sib_info sib; | 327 | struct sib_info sib; |
328 | int ret; | 328 | int ret; |
329 | 329 | ||
@@ -544,7 +544,7 @@ drbd_set_role(struct drbd_device *device, enum drbd_role new_role, int force) | |||
544 | union drbd_state mask, val; | 544 | union drbd_state mask, val; |
545 | 545 | ||
546 | if (new_role == R_PRIMARY) | 546 | if (new_role == R_PRIMARY) |
547 | request_ping(device->connection); /* Detect a dead peer ASAP */ | 547 | request_ping(first_peer_device(device)->connection); /* Detect a dead peer ASAP */ |
548 | 548 | ||
549 | mutex_lock(device->state_mutex); | 549 | mutex_lock(device->state_mutex); |
550 | 550 | ||
@@ -575,7 +575,7 @@ drbd_set_role(struct drbd_device *device, enum drbd_role new_role, int force) | |||
575 | device->state.disk == D_CONSISTENT && mask.pdsk == 0) { | 575 | device->state.disk == D_CONSISTENT && mask.pdsk == 0) { |
576 | D_ASSERT(device->state.pdsk == D_UNKNOWN); | 576 | D_ASSERT(device->state.pdsk == D_UNKNOWN); |
577 | 577 | ||
578 | if (conn_try_outdate_peer(device->connection)) { | 578 | if (conn_try_outdate_peer(first_peer_device(device)->connection)) { |
579 | val.disk = D_UP_TO_DATE; | 579 | val.disk = D_UP_TO_DATE; |
580 | mask.disk = D_MASK; | 580 | mask.disk = D_MASK; |
581 | } | 581 | } |
@@ -585,7 +585,7 @@ drbd_set_role(struct drbd_device *device, enum drbd_role new_role, int force) | |||
585 | if (rv == SS_NOTHING_TO_DO) | 585 | if (rv == SS_NOTHING_TO_DO) |
586 | goto out; | 586 | goto out; |
587 | if (rv == SS_PRIMARY_NOP && mask.pdsk == 0) { | 587 | if (rv == SS_PRIMARY_NOP && mask.pdsk == 0) { |
588 | if (!conn_try_outdate_peer(device->connection) && force) { | 588 | if (!conn_try_outdate_peer(first_peer_device(device)->connection) && force) { |
589 | dev_warn(DEV, "Forced into split brain situation!\n"); | 589 | dev_warn(DEV, "Forced into split brain situation!\n"); |
590 | mask.pdsk = D_MASK; | 590 | mask.pdsk = D_MASK; |
591 | val.pdsk = D_OUTDATED; | 591 | val.pdsk = D_OUTDATED; |
@@ -598,7 +598,7 @@ drbd_set_role(struct drbd_device *device, enum drbd_role new_role, int force) | |||
598 | retry at most once more in this case. */ | 598 | retry at most once more in this case. */ |
599 | int timeo; | 599 | int timeo; |
600 | rcu_read_lock(); | 600 | rcu_read_lock(); |
601 | nc = rcu_dereference(device->connection->net_conf); | 601 | nc = rcu_dereference(first_peer_device(device)->connection->net_conf); |
602 | timeo = nc ? (nc->ping_timeo + 1) * HZ / 10 : 1; | 602 | timeo = nc ? (nc->ping_timeo + 1) * HZ / 10 : 1; |
603 | rcu_read_unlock(); | 603 | rcu_read_unlock(); |
604 | schedule_timeout_interruptible(timeo); | 604 | schedule_timeout_interruptible(timeo); |
@@ -633,11 +633,11 @@ drbd_set_role(struct drbd_device *device, enum drbd_role new_role, int force) | |||
633 | put_ldev(device); | 633 | put_ldev(device); |
634 | } | 634 | } |
635 | } else { | 635 | } else { |
636 | mutex_lock(&device->connection->conf_update); | 636 | mutex_lock(&first_peer_device(device)->connection->conf_update); |
637 | nc = device->connection->net_conf; | 637 | nc = first_peer_device(device)->connection->net_conf; |
638 | if (nc) | 638 | if (nc) |
639 | nc->discard_my_data = 0; /* without copy; single bit op is atomic */ | 639 | nc->discard_my_data = 0; /* without copy; single bit op is atomic */ |
640 | mutex_unlock(&device->connection->conf_update); | 640 | mutex_unlock(&first_peer_device(device)->connection->conf_update); |
641 | 641 | ||
642 | set_disk_ro(device->vdisk, false); | 642 | set_disk_ro(device->vdisk, false); |
643 | if (get_ldev(device)) { | 643 | if (get_ldev(device)) { |
@@ -1134,12 +1134,12 @@ void drbd_reconsider_max_bio_size(struct drbd_device *device) | |||
1134 | Because new from 8.3.8 onwards the peer can use multiple | 1134 | Because new from 8.3.8 onwards the peer can use multiple |
1135 | BIOs for a single peer_request */ | 1135 | BIOs for a single peer_request */ |
1136 | if (device->state.conn >= C_WF_REPORT_PARAMS) { | 1136 | if (device->state.conn >= C_WF_REPORT_PARAMS) { |
1137 | if (device->connection->agreed_pro_version < 94) | 1137 | if (first_peer_device(device)->connection->agreed_pro_version < 94) |
1138 | peer = min(device->peer_max_bio_size, DRBD_MAX_SIZE_H80_PACKET); | 1138 | peer = min(device->peer_max_bio_size, DRBD_MAX_SIZE_H80_PACKET); |
1139 | /* Correct old drbd (up to 8.3.7) if it believes it can do more than 32KiB */ | 1139 | /* Correct old drbd (up to 8.3.7) if it believes it can do more than 32KiB */ |
1140 | else if (device->connection->agreed_pro_version == 94) | 1140 | else if (first_peer_device(device)->connection->agreed_pro_version == 94) |
1141 | peer = DRBD_MAX_SIZE_H80_PACKET; | 1141 | peer = DRBD_MAX_SIZE_H80_PACKET; |
1142 | else if (device->connection->agreed_pro_version < 100) | 1142 | else if (first_peer_device(device)->connection->agreed_pro_version < 100) |
1143 | peer = DRBD_MAX_BIO_SIZE_P95; /* drbd 8.3.8 onwards, before 8.4.0 */ | 1143 | peer = DRBD_MAX_BIO_SIZE_P95; /* drbd 8.3.8 onwards, before 8.4.0 */ |
1144 | else | 1144 | else |
1145 | peer = DRBD_MAX_BIO_SIZE; | 1145 | peer = DRBD_MAX_BIO_SIZE; |
@@ -1190,10 +1190,10 @@ static void drbd_suspend_al(struct drbd_device *device) | |||
1190 | } | 1190 | } |
1191 | 1191 | ||
1192 | drbd_al_shrink(device); | 1192 | drbd_al_shrink(device); |
1193 | spin_lock_irq(&device->connection->req_lock); | 1193 | spin_lock_irq(&first_peer_device(device)->connection->req_lock); |
1194 | if (device->state.conn < C_CONNECTED) | 1194 | if (device->state.conn < C_CONNECTED) |
1195 | s = !test_and_set_bit(AL_SUSPENDED, &device->flags); | 1195 | s = !test_and_set_bit(AL_SUSPENDED, &device->flags); |
1196 | spin_unlock_irq(&device->connection->req_lock); | 1196 | spin_unlock_irq(&first_peer_device(device)->connection->req_lock); |
1197 | lc_unlock(device->act_log); | 1197 | lc_unlock(device->act_log); |
1198 | 1198 | ||
1199 | if (s) | 1199 | if (s) |
@@ -1264,7 +1264,7 @@ int drbd_adm_disk_opts(struct sk_buff *skb, struct genl_info *info) | |||
1264 | goto fail; | 1264 | goto fail; |
1265 | } | 1265 | } |
1266 | 1266 | ||
1267 | mutex_lock(&device->connection->conf_update); | 1267 | mutex_lock(&first_peer_device(device)->connection->conf_update); |
1268 | old_disk_conf = device->ldev->disk_conf; | 1268 | old_disk_conf = device->ldev->disk_conf; |
1269 | *new_disk_conf = *old_disk_conf; | 1269 | *new_disk_conf = *old_disk_conf; |
1270 | if (should_set_defaults(info)) | 1270 | if (should_set_defaults(info)) |
@@ -1327,7 +1327,7 @@ int drbd_adm_disk_opts(struct sk_buff *skb, struct genl_info *info) | |||
1327 | rcu_assign_pointer(device->rs_plan_s, new_plan); | 1327 | rcu_assign_pointer(device->rs_plan_s, new_plan); |
1328 | } | 1328 | } |
1329 | 1329 | ||
1330 | mutex_unlock(&device->connection->conf_update); | 1330 | mutex_unlock(&first_peer_device(device)->connection->conf_update); |
1331 | 1331 | ||
1332 | if (new_disk_conf->al_updates) | 1332 | if (new_disk_conf->al_updates) |
1333 | device->ldev->md.flags &= ~MDF_AL_DISABLED; | 1333 | device->ldev->md.flags &= ~MDF_AL_DISABLED; |
@@ -1339,7 +1339,7 @@ int drbd_adm_disk_opts(struct sk_buff *skb, struct genl_info *info) | |||
1339 | else | 1339 | else |
1340 | set_bit(MD_NO_FUA, &device->flags); | 1340 | set_bit(MD_NO_FUA, &device->flags); |
1341 | 1341 | ||
1342 | drbd_bump_write_ordering(device->connection, WO_bdev_flush); | 1342 | drbd_bump_write_ordering(first_peer_device(device)->connection, WO_bdev_flush); |
1343 | 1343 | ||
1344 | drbd_md_sync(device); | 1344 | drbd_md_sync(device); |
1345 | 1345 | ||
@@ -1353,7 +1353,7 @@ int drbd_adm_disk_opts(struct sk_buff *skb, struct genl_info *info) | |||
1353 | goto success; | 1353 | goto success; |
1354 | 1354 | ||
1355 | fail_unlock: | 1355 | fail_unlock: |
1356 | mutex_unlock(&device->connection->conf_update); | 1356 | mutex_unlock(&first_peer_device(device)->connection->conf_update); |
1357 | fail: | 1357 | fail: |
1358 | kfree(new_disk_conf); | 1358 | kfree(new_disk_conf); |
1359 | kfree(new_plan); | 1359 | kfree(new_plan); |
@@ -1388,7 +1388,7 @@ int drbd_adm_attach(struct sk_buff *skb, struct genl_info *info) | |||
1388 | goto finish; | 1388 | goto finish; |
1389 | 1389 | ||
1390 | device = adm_ctx.device; | 1390 | device = adm_ctx.device; |
1391 | conn_reconfig_start(device->connection); | 1391 | conn_reconfig_start(first_peer_device(device)->connection); |
1392 | 1392 | ||
1393 | /* if you want to reconfigure, please tear down first */ | 1393 | /* if you want to reconfigure, please tear down first */ |
1394 | if (device->state.disk > D_DISKLESS) { | 1394 | if (device->state.disk > D_DISKLESS) { |
@@ -1455,7 +1455,7 @@ int drbd_adm_attach(struct sk_buff *skb, struct genl_info *info) | |||
1455 | goto fail; | 1455 | goto fail; |
1456 | 1456 | ||
1457 | rcu_read_lock(); | 1457 | rcu_read_lock(); |
1458 | nc = rcu_dereference(device->connection->net_conf); | 1458 | nc = rcu_dereference(first_peer_device(device)->connection->net_conf); |
1459 | if (nc) { | 1459 | if (nc) { |
1460 | if (new_disk_conf->fencing == FP_STONITH && nc->wire_protocol == DRBD_PROT_A) { | 1460 | if (new_disk_conf->fencing == FP_STONITH && nc->wire_protocol == DRBD_PROT_A) { |
1461 | rcu_read_unlock(); | 1461 | rcu_read_unlock(); |
@@ -1636,7 +1636,7 @@ int drbd_adm_attach(struct sk_buff *skb, struct genl_info *info) | |||
1636 | new_disk_conf = NULL; | 1636 | new_disk_conf = NULL; |
1637 | new_plan = NULL; | 1637 | new_plan = NULL; |
1638 | 1638 | ||
1639 | drbd_bump_write_ordering(device->connection, WO_bdev_flush); | 1639 | drbd_bump_write_ordering(first_peer_device(device)->connection, WO_bdev_flush); |
1640 | 1640 | ||
1641 | if (drbd_md_test_flag(device->ldev, MDF_CRASHED_PRIMARY)) | 1641 | if (drbd_md_test_flag(device->ldev, MDF_CRASHED_PRIMARY)) |
1642 | set_bit(CRASHED_PRIMARY, &device->flags); | 1642 | set_bit(CRASHED_PRIMARY, &device->flags); |
@@ -1644,7 +1644,8 @@ int drbd_adm_attach(struct sk_buff *skb, struct genl_info *info) | |||
1644 | clear_bit(CRASHED_PRIMARY, &device->flags); | 1644 | clear_bit(CRASHED_PRIMARY, &device->flags); |
1645 | 1645 | ||
1646 | if (drbd_md_test_flag(device->ldev, MDF_PRIMARY_IND) && | 1646 | if (drbd_md_test_flag(device->ldev, MDF_PRIMARY_IND) && |
1647 | !(device->state.role == R_PRIMARY && device->connection->susp_nod)) | 1647 | !(device->state.role == R_PRIMARY && |
1648 | first_peer_device(device)->connection->susp_nod)) | ||
1648 | set_bit(CRASHED_PRIMARY, &device->flags); | 1649 | set_bit(CRASHED_PRIMARY, &device->flags); |
1649 | 1650 | ||
1650 | device->send_cnt = 0; | 1651 | device->send_cnt = 0; |
@@ -1702,7 +1703,7 @@ int drbd_adm_attach(struct sk_buff *skb, struct genl_info *info) | |||
1702 | if (_drbd_bm_total_weight(device) == drbd_bm_bits(device)) | 1703 | if (_drbd_bm_total_weight(device) == drbd_bm_bits(device)) |
1703 | drbd_suspend_al(device); /* IO is still suspended here... */ | 1704 | drbd_suspend_al(device); /* IO is still suspended here... */ |
1704 | 1705 | ||
1705 | spin_lock_irq(&device->connection->req_lock); | 1706 | spin_lock_irq(&first_peer_device(device)->connection->req_lock); |
1706 | os = drbd_read_state(device); | 1707 | os = drbd_read_state(device); |
1707 | ns = os; | 1708 | ns = os; |
1708 | /* If MDF_CONSISTENT is not set go into inconsistent state, | 1709 | /* If MDF_CONSISTENT is not set go into inconsistent state, |
@@ -1754,7 +1755,7 @@ int drbd_adm_attach(struct sk_buff *skb, struct genl_info *info) | |||
1754 | } | 1755 | } |
1755 | 1756 | ||
1756 | rv = _drbd_set_state(device, ns, CS_VERBOSE, NULL); | 1757 | rv = _drbd_set_state(device, ns, CS_VERBOSE, NULL); |
1757 | spin_unlock_irq(&device->connection->req_lock); | 1758 | spin_unlock_irq(&first_peer_device(device)->connection->req_lock); |
1758 | 1759 | ||
1759 | if (rv < SS_SUCCESS) | 1760 | if (rv < SS_SUCCESS) |
1760 | goto force_diskless_dec; | 1761 | goto force_diskless_dec; |
@@ -1771,7 +1772,7 @@ int drbd_adm_attach(struct sk_buff *skb, struct genl_info *info) | |||
1771 | 1772 | ||
1772 | kobject_uevent(&disk_to_dev(device->vdisk)->kobj, KOBJ_CHANGE); | 1773 | kobject_uevent(&disk_to_dev(device->vdisk)->kobj, KOBJ_CHANGE); |
1773 | put_ldev(device); | 1774 | put_ldev(device); |
1774 | conn_reconfig_done(device->connection); | 1775 | conn_reconfig_done(first_peer_device(device)->connection); |
1775 | drbd_adm_finish(info, retcode); | 1776 | drbd_adm_finish(info, retcode); |
1776 | return 0; | 1777 | return 0; |
1777 | 1778 | ||
@@ -1781,7 +1782,7 @@ int drbd_adm_attach(struct sk_buff *skb, struct genl_info *info) | |||
1781 | drbd_force_state(device, NS(disk, D_DISKLESS)); | 1782 | drbd_force_state(device, NS(disk, D_DISKLESS)); |
1782 | drbd_md_sync(device); | 1783 | drbd_md_sync(device); |
1783 | fail: | 1784 | fail: |
1784 | conn_reconfig_done(device->connection); | 1785 | conn_reconfig_done(first_peer_device(device)->connection); |
1785 | if (nbc) { | 1786 | if (nbc) { |
1786 | if (nbc->backing_bdev) | 1787 | if (nbc->backing_bdev) |
1787 | blkdev_put(nbc->backing_bdev, | 1788 | blkdev_put(nbc->backing_bdev, |
@@ -2357,7 +2358,7 @@ void resync_after_online_grow(struct drbd_device *device) | |||
2357 | if (device->state.role != device->state.peer) | 2358 | if (device->state.role != device->state.peer) |
2358 | iass = (device->state.role == R_PRIMARY); | 2359 | iass = (device->state.role == R_PRIMARY); |
2359 | else | 2360 | else |
2360 | iass = test_bit(RESOLVE_CONFLICTS, &device->connection->flags); | 2361 | iass = test_bit(RESOLVE_CONFLICTS, &first_peer_device(device)->connection->flags); |
2361 | 2362 | ||
2362 | if (iass) | 2363 | if (iass) |
2363 | drbd_start_resync(device, C_SYNC_SOURCE); | 2364 | drbd_start_resync(device, C_SYNC_SOURCE); |
@@ -2412,7 +2413,7 @@ int drbd_adm_resize(struct sk_buff *skb, struct genl_info *info) | |||
2412 | goto fail_ldev; | 2413 | goto fail_ldev; |
2413 | } | 2414 | } |
2414 | 2415 | ||
2415 | if (rs.no_resync && device->connection->agreed_pro_version < 93) { | 2416 | if (rs.no_resync && first_peer_device(device)->connection->agreed_pro_version < 93) { |
2416 | retcode = ERR_NEED_APV_93; | 2417 | retcode = ERR_NEED_APV_93; |
2417 | goto fail_ldev; | 2418 | goto fail_ldev; |
2418 | } | 2419 | } |
@@ -2454,12 +2455,12 @@ int drbd_adm_resize(struct sk_buff *skb, struct genl_info *info) | |||
2454 | device->ldev->known_size = drbd_get_capacity(device->ldev->backing_bdev); | 2455 | device->ldev->known_size = drbd_get_capacity(device->ldev->backing_bdev); |
2455 | 2456 | ||
2456 | if (new_disk_conf) { | 2457 | if (new_disk_conf) { |
2457 | mutex_lock(&device->connection->conf_update); | 2458 | mutex_lock(&first_peer_device(device)->connection->conf_update); |
2458 | old_disk_conf = device->ldev->disk_conf; | 2459 | old_disk_conf = device->ldev->disk_conf; |
2459 | *new_disk_conf = *old_disk_conf; | 2460 | *new_disk_conf = *old_disk_conf; |
2460 | new_disk_conf->disk_size = (sector_t)rs.resize_size; | 2461 | new_disk_conf->disk_size = (sector_t)rs.resize_size; |
2461 | rcu_assign_pointer(device->ldev->disk_conf, new_disk_conf); | 2462 | rcu_assign_pointer(device->ldev->disk_conf, new_disk_conf); |
2462 | mutex_unlock(&device->connection->conf_update); | 2463 | mutex_unlock(&first_peer_device(device)->connection->conf_update); |
2463 | synchronize_rcu(); | 2464 | synchronize_rcu(); |
2464 | kfree(old_disk_conf); | 2465 | kfree(old_disk_conf); |
2465 | } | 2466 | } |
@@ -2710,9 +2711,9 @@ int drbd_adm_resume_io(struct sk_buff *skb, struct genl_info *info) | |||
2710 | retcode = drbd_request_state(device, NS3(susp, 0, susp_nod, 0, susp_fen, 0)); | 2711 | retcode = drbd_request_state(device, NS3(susp, 0, susp_nod, 0, susp_fen, 0)); |
2711 | if (retcode == SS_SUCCESS) { | 2712 | if (retcode == SS_SUCCESS) { |
2712 | if (device->state.conn < C_CONNECTED) | 2713 | if (device->state.conn < C_CONNECTED) |
2713 | tl_clear(device->connection); | 2714 | tl_clear(first_peer_device(device)->connection); |
2714 | if (device->state.disk == D_DISKLESS || device->state.disk == D_FAILED) | 2715 | if (device->state.disk == D_DISKLESS || device->state.disk == D_FAILED) |
2715 | tl_restart(device->connection, FAIL_FROZEN_DISK_IO); | 2716 | tl_restart(first_peer_device(device)->connection, FAIL_FROZEN_DISK_IO); |
2716 | } | 2717 | } |
2717 | drbd_resume_io(device); | 2718 | drbd_resume_io(device); |
2718 | 2719 | ||
@@ -2778,10 +2779,10 @@ static int nla_put_status_info(struct sk_buff *skb, struct drbd_device *device, | |||
2778 | 2779 | ||
2779 | /* We need to add connection name and volume number information still. | 2780 | /* We need to add connection name and volume number information still. |
2780 | * Minor number is in drbd_genlmsghdr. */ | 2781 | * Minor number is in drbd_genlmsghdr. */ |
2781 | if (nla_put_drbd_cfg_context(skb, device->connection, device->vnr)) | 2782 | if (nla_put_drbd_cfg_context(skb, first_peer_device(device)->connection, device->vnr)) |
2782 | goto nla_put_failure; | 2783 | goto nla_put_failure; |
2783 | 2784 | ||
2784 | if (res_opts_to_skb(skb, &device->connection->res_opts, exclude_sensitive)) | 2785 | if (res_opts_to_skb(skb, &first_peer_device(device)->connection->res_opts, exclude_sensitive)) |
2785 | goto nla_put_failure; | 2786 | goto nla_put_failure; |
2786 | 2787 | ||
2787 | rcu_read_lock(); | 2788 | rcu_read_lock(); |
@@ -2794,7 +2795,7 @@ static int nla_put_status_info(struct sk_buff *skb, struct drbd_device *device, | |||
2794 | if (!err) { | 2795 | if (!err) { |
2795 | struct net_conf *nc; | 2796 | struct net_conf *nc; |
2796 | 2797 | ||
2797 | nc = rcu_dereference(device->connection->net_conf); | 2798 | nc = rcu_dereference(first_peer_device(device)->connection->net_conf); |
2798 | if (nc) | 2799 | if (nc) |
2799 | err = net_conf_to_skb(skb, nc, exclude_sensitive); | 2800 | err = net_conf_to_skb(skb, nc, exclude_sensitive); |
2800 | } | 2801 | } |
@@ -2981,7 +2982,7 @@ next_connection: | |||
2981 | } | 2982 | } |
2982 | 2983 | ||
2983 | D_ASSERT(device->vnr == volume); | 2984 | D_ASSERT(device->vnr == volume); |
2984 | D_ASSERT(device->connection == connection); | 2985 | D_ASSERT(first_peer_device(device)->connection == connection); |
2985 | 2986 | ||
2986 | dh->minor = device_to_minor(device); | 2987 | dh->minor = device_to_minor(device); |
2987 | dh->ret_code = NO_ERROR; | 2988 | dh->ret_code = NO_ERROR; |
@@ -3168,7 +3169,8 @@ int drbd_adm_new_c_uuid(struct sk_buff *skb, struct genl_info *info) | |||
3168 | } | 3169 | } |
3169 | 3170 | ||
3170 | /* this is "skip initial sync", assume to be clean */ | 3171 | /* this is "skip initial sync", assume to be clean */ |
3171 | if (device->state.conn == C_CONNECTED && device->connection->agreed_pro_version >= 90 && | 3172 | if (device->state.conn == C_CONNECTED && |
3173 | first_peer_device(device)->connection->agreed_pro_version >= 90 && | ||
3172 | device->ldev->md.uuid[UI_CURRENT] == UUID_JUST_CREATED && args.clear_bm) { | 3174 | device->ldev->md.uuid[UI_CURRENT] == UUID_JUST_CREATED && args.clear_bm) { |
3173 | dev_info(DEV, "Preparing to skip initial sync\n"); | 3175 | dev_info(DEV, "Preparing to skip initial sync\n"); |
3174 | skip_initial_sync = 1; | 3176 | skip_initial_sync = 1; |
@@ -3191,10 +3193,10 @@ int drbd_adm_new_c_uuid(struct sk_buff *skb, struct genl_info *info) | |||
3191 | drbd_send_uuids_skip_initial_sync(device); | 3193 | drbd_send_uuids_skip_initial_sync(device); |
3192 | _drbd_uuid_set(device, UI_BITMAP, 0); | 3194 | _drbd_uuid_set(device, UI_BITMAP, 0); |
3193 | drbd_print_uuids(device, "cleared bitmap UUID"); | 3195 | drbd_print_uuids(device, "cleared bitmap UUID"); |
3194 | spin_lock_irq(&device->connection->req_lock); | 3196 | spin_lock_irq(&first_peer_device(device)->connection->req_lock); |
3195 | _drbd_set_state(_NS2(device, disk, D_UP_TO_DATE, pdsk, D_UP_TO_DATE), | 3197 | _drbd_set_state(_NS2(device, disk, D_UP_TO_DATE, pdsk, D_UP_TO_DATE), |
3196 | CS_VERBOSE, NULL); | 3198 | CS_VERBOSE, NULL); |
3197 | spin_unlock_irq(&device->connection->req_lock); | 3199 | spin_unlock_irq(&first_peer_device(device)->connection->req_lock); |
3198 | } | 3200 | } |
3199 | } | 3201 | } |
3200 | 3202 | ||
@@ -3287,7 +3289,7 @@ int drbd_adm_add_minor(struct sk_buff *skb, struct genl_info *info) | |||
3287 | } | 3289 | } |
3288 | 3290 | ||
3289 | /* drbd_adm_prepare made sure already | 3291 | /* drbd_adm_prepare made sure already |
3290 | * that device->connection and device->vnr match the request. */ | 3292 | * that first_peer_device(device)->connection and device->vnr match the request. */ |
3291 | if (adm_ctx.device) { | 3293 | if (adm_ctx.device) { |
3292 | if (info->nlhdr->nlmsg_flags & NLM_F_EXCL) | 3294 | if (info->nlhdr->nlmsg_flags & NLM_F_EXCL) |
3293 | retcode = ERR_MINOR_EXISTS; | 3295 | retcode = ERR_MINOR_EXISTS; |
@@ -3295,7 +3297,7 @@ int drbd_adm_add_minor(struct sk_buff *skb, struct genl_info *info) | |||
3295 | goto out; | 3297 | goto out; |
3296 | } | 3298 | } |
3297 | 3299 | ||
3298 | retcode = conn_new_minor(adm_ctx.connection, dh->minor, adm_ctx.volume); | 3300 | retcode = drbd_create_minor(adm_ctx.connection, dh->minor, adm_ctx.volume); |
3299 | out: | 3301 | out: |
3300 | drbd_adm_finish(info, retcode); | 3302 | drbd_adm_finish(info, retcode); |
3301 | return 0; | 3303 | return 0; |
@@ -3310,7 +3312,7 @@ static enum drbd_ret_code adm_delete_minor(struct drbd_device *device) | |||
3310 | device->state.role == R_SECONDARY) { | 3312 | device->state.role == R_SECONDARY) { |
3311 | _drbd_request_state(device, NS(conn, C_WF_REPORT_PARAMS), | 3313 | _drbd_request_state(device, NS(conn, C_WF_REPORT_PARAMS), |
3312 | CS_VERBOSE + CS_WAIT_COMPLETE); | 3314 | CS_VERBOSE + CS_WAIT_COMPLETE); |
3313 | idr_remove(&device->connection->volumes, device->vnr); | 3315 | idr_remove(&first_peer_device(device)->connection->volumes, device->vnr); |
3314 | idr_remove(&minors, device_to_minor(device)); | 3316 | idr_remove(&minors, device_to_minor(device)); |
3315 | destroy_workqueue(device->submit.wq); | 3317 | destroy_workqueue(device->submit.wq); |
3316 | del_gendisk(device->vdisk); | 3318 | del_gendisk(device->vdisk); |
diff --git a/drivers/block/drbd/drbd_proc.c b/drivers/block/drbd/drbd_proc.c index 9c4d413655e3..f1c81c101fad 100644 --- a/drivers/block/drbd/drbd_proc.c +++ b/drivers/block/drbd/drbd_proc.c | |||
@@ -251,7 +251,7 @@ static int drbd_seq_show(struct seq_file *seq, void *v) | |||
251 | /* reset device->congestion_reason */ | 251 | /* reset device->congestion_reason */ |
252 | bdi_rw_congested(&device->rq_queue->backing_dev_info); | 252 | bdi_rw_congested(&device->rq_queue->backing_dev_info); |
253 | 253 | ||
254 | nc = rcu_dereference(device->connection->net_conf); | 254 | nc = rcu_dereference(first_peer_device(device)->connection->net_conf); |
255 | wp = nc ? nc->wire_protocol - DRBD_PROT_A + 'A' : ' '; | 255 | wp = nc ? nc->wire_protocol - DRBD_PROT_A + 'A' : ' '; |
256 | seq_printf(seq, | 256 | seq_printf(seq, |
257 | "%2d: cs:%s ro:%s/%s ds:%s/%s %c %c%c%c%c%c%c\n" | 257 | "%2d: cs:%s ro:%s/%s ds:%s/%s %c %c%c%c%c%c%c\n" |
@@ -280,8 +280,8 @@ static int drbd_seq_show(struct seq_file *seq, void *v) | |||
280 | atomic_read(&device->rs_pending_cnt), | 280 | atomic_read(&device->rs_pending_cnt), |
281 | atomic_read(&device->unacked_cnt), | 281 | atomic_read(&device->unacked_cnt), |
282 | atomic_read(&device->ap_bio_cnt), | 282 | atomic_read(&device->ap_bio_cnt), |
283 | device->connection->epochs, | 283 | first_peer_device(device)->connection->epochs, |
284 | write_ordering_chars[device->connection->write_ordering] | 284 | write_ordering_chars[first_peer_device(device)->connection->write_ordering] |
285 | ); | 285 | ); |
286 | seq_printf(seq, " oos:%llu\n", | 286 | seq_printf(seq, " oos:%llu\n", |
287 | Bit2KB((unsigned long long) | 287 | Bit2KB((unsigned long long) |
diff --git a/drivers/block/drbd/drbd_receiver.c b/drivers/block/drbd/drbd_receiver.c index 42dbf5d86a43..e08e99f756a5 100644 --- a/drivers/block/drbd/drbd_receiver.c +++ b/drivers/block/drbd/drbd_receiver.c | |||
@@ -221,9 +221,9 @@ static void drbd_kick_lo_and_reclaim_net(struct drbd_device *device) | |||
221 | LIST_HEAD(reclaimed); | 221 | LIST_HEAD(reclaimed); |
222 | struct drbd_peer_request *peer_req, *t; | 222 | struct drbd_peer_request *peer_req, *t; |
223 | 223 | ||
224 | spin_lock_irq(&device->connection->req_lock); | 224 | spin_lock_irq(&first_peer_device(device)->connection->req_lock); |
225 | reclaim_finished_net_peer_reqs(device, &reclaimed); | 225 | reclaim_finished_net_peer_reqs(device, &reclaimed); |
226 | spin_unlock_irq(&device->connection->req_lock); | 226 | spin_unlock_irq(&first_peer_device(device)->connection->req_lock); |
227 | 227 | ||
228 | list_for_each_entry_safe(peer_req, t, &reclaimed, w.list) | 228 | list_for_each_entry_safe(peer_req, t, &reclaimed, w.list) |
229 | drbd_free_net_peer_req(device, peer_req); | 229 | drbd_free_net_peer_req(device, peer_req); |
@@ -252,7 +252,7 @@ struct page *drbd_alloc_pages(struct drbd_device *device, unsigned int number, | |||
252 | /* Yes, we may run up to @number over max_buffers. If we | 252 | /* Yes, we may run up to @number over max_buffers. If we |
253 | * follow it strictly, the admin will get it wrong anyways. */ | 253 | * follow it strictly, the admin will get it wrong anyways. */ |
254 | rcu_read_lock(); | 254 | rcu_read_lock(); |
255 | nc = rcu_dereference(device->connection->net_conf); | 255 | nc = rcu_dereference(first_peer_device(device)->connection->net_conf); |
256 | mxb = nc ? nc->max_buffers : 1000000; | 256 | mxb = nc ? nc->max_buffers : 1000000; |
257 | rcu_read_unlock(); | 257 | rcu_read_unlock(); |
258 | 258 | ||
@@ -288,7 +288,7 @@ struct page *drbd_alloc_pages(struct drbd_device *device, unsigned int number, | |||
288 | } | 288 | } |
289 | 289 | ||
290 | /* Must not be used from irq, as that may deadlock: see drbd_alloc_pages. | 290 | /* Must not be used from irq, as that may deadlock: see drbd_alloc_pages. |
291 | * Is also used from inside an other spin_lock_irq(&device->connection->req_lock); | 291 | * Is also used from inside an other spin_lock_irq(&first_peer_device(device)->connection->req_lock); |
292 | * Either links the page chain back to the global pool, | 292 | * Either links the page chain back to the global pool, |
293 | * or returns all pages to the system. */ | 293 | * or returns all pages to the system. */ |
294 | static void drbd_free_pages(struct drbd_device *device, struct page *page, int is_net) | 294 | static void drbd_free_pages(struct drbd_device *device, struct page *page, int is_net) |
@@ -396,9 +396,9 @@ int drbd_free_peer_reqs(struct drbd_device *device, struct list_head *list) | |||
396 | int count = 0; | 396 | int count = 0; |
397 | int is_net = list == &device->net_ee; | 397 | int is_net = list == &device->net_ee; |
398 | 398 | ||
399 | spin_lock_irq(&device->connection->req_lock); | 399 | spin_lock_irq(&first_peer_device(device)->connection->req_lock); |
400 | list_splice_init(list, &work_list); | 400 | list_splice_init(list, &work_list); |
401 | spin_unlock_irq(&device->connection->req_lock); | 401 | spin_unlock_irq(&first_peer_device(device)->connection->req_lock); |
402 | 402 | ||
403 | list_for_each_entry_safe(peer_req, t, &work_list, w.list) { | 403 | list_for_each_entry_safe(peer_req, t, &work_list, w.list) { |
404 | __drbd_free_peer_req(device, peer_req, is_net); | 404 | __drbd_free_peer_req(device, peer_req, is_net); |
@@ -417,10 +417,10 @@ static int drbd_finish_peer_reqs(struct drbd_device *device) | |||
417 | struct drbd_peer_request *peer_req, *t; | 417 | struct drbd_peer_request *peer_req, *t; |
418 | int err = 0; | 418 | int err = 0; |
419 | 419 | ||
420 | spin_lock_irq(&device->connection->req_lock); | 420 | spin_lock_irq(&first_peer_device(device)->connection->req_lock); |
421 | reclaim_finished_net_peer_reqs(device, &reclaimed); | 421 | reclaim_finished_net_peer_reqs(device, &reclaimed); |
422 | list_splice_init(&device->done_ee, &work_list); | 422 | list_splice_init(&device->done_ee, &work_list); |
423 | spin_unlock_irq(&device->connection->req_lock); | 423 | spin_unlock_irq(&first_peer_device(device)->connection->req_lock); |
424 | 424 | ||
425 | list_for_each_entry_safe(peer_req, t, &reclaimed, w.list) | 425 | list_for_each_entry_safe(peer_req, t, &reclaimed, w.list) |
426 | drbd_free_net_peer_req(device, peer_req); | 426 | drbd_free_net_peer_req(device, peer_req); |
@@ -452,19 +452,19 @@ static void _drbd_wait_ee_list_empty(struct drbd_device *device, | |||
452 | * and calling prepare_to_wait in the fast path */ | 452 | * and calling prepare_to_wait in the fast path */ |
453 | while (!list_empty(head)) { | 453 | while (!list_empty(head)) { |
454 | prepare_to_wait(&device->ee_wait, &wait, TASK_UNINTERRUPTIBLE); | 454 | prepare_to_wait(&device->ee_wait, &wait, TASK_UNINTERRUPTIBLE); |
455 | spin_unlock_irq(&device->connection->req_lock); | 455 | spin_unlock_irq(&first_peer_device(device)->connection->req_lock); |
456 | io_schedule(); | 456 | io_schedule(); |
457 | finish_wait(&device->ee_wait, &wait); | 457 | finish_wait(&device->ee_wait, &wait); |
458 | spin_lock_irq(&device->connection->req_lock); | 458 | spin_lock_irq(&first_peer_device(device)->connection->req_lock); |
459 | } | 459 | } |
460 | } | 460 | } |
461 | 461 | ||
462 | static void drbd_wait_ee_list_empty(struct drbd_device *device, | 462 | static void drbd_wait_ee_list_empty(struct drbd_device *device, |
463 | struct list_head *head) | 463 | struct list_head *head) |
464 | { | 464 | { |
465 | spin_lock_irq(&device->connection->req_lock); | 465 | spin_lock_irq(&first_peer_device(device)->connection->req_lock); |
466 | _drbd_wait_ee_list_empty(device, head); | 466 | _drbd_wait_ee_list_empty(device, head); |
467 | spin_unlock_irq(&device->connection->req_lock); | 467 | spin_unlock_irq(&first_peer_device(device)->connection->req_lock); |
468 | } | 468 | } |
469 | 469 | ||
470 | static int drbd_recv_short(struct socket *sock, void *buf, size_t size, int flags) | 470 | static int drbd_recv_short(struct socket *sock, void *buf, size_t size, int flags) |
@@ -838,8 +838,8 @@ int drbd_connected(struct drbd_device *device) | |||
838 | atomic_set(&device->packet_seq, 0); | 838 | atomic_set(&device->packet_seq, 0); |
839 | device->peer_seq = 0; | 839 | device->peer_seq = 0; |
840 | 840 | ||
841 | device->state_mutex = device->connection->agreed_pro_version < 100 ? | 841 | device->state_mutex = first_peer_device(device)->connection->agreed_pro_version < 100 ? |
842 | &device->connection->cstate_mutex : | 842 | &first_peer_device(device)->connection->cstate_mutex : |
843 | &device->own_state_mutex; | 843 | &device->own_state_mutex; |
844 | 844 | ||
845 | err = drbd_send_sync_param(device); | 845 | err = drbd_send_sync_param(device); |
@@ -1492,18 +1492,18 @@ read_in_block(struct drbd_device *device, u64 id, sector_t sector, | |||
1492 | struct drbd_peer_request *peer_req; | 1492 | struct drbd_peer_request *peer_req; |
1493 | struct page *page; | 1493 | struct page *page; |
1494 | int dgs, ds, err; | 1494 | int dgs, ds, err; |
1495 | void *dig_in = device->connection->int_dig_in; | 1495 | void *dig_in = first_peer_device(device)->connection->int_dig_in; |
1496 | void *dig_vv = device->connection->int_dig_vv; | 1496 | void *dig_vv = first_peer_device(device)->connection->int_dig_vv; |
1497 | unsigned long *data; | 1497 | unsigned long *data; |
1498 | 1498 | ||
1499 | dgs = 0; | 1499 | dgs = 0; |
1500 | if (device->connection->peer_integrity_tfm) { | 1500 | if (first_peer_device(device)->connection->peer_integrity_tfm) { |
1501 | dgs = crypto_hash_digestsize(device->connection->peer_integrity_tfm); | 1501 | dgs = crypto_hash_digestsize(first_peer_device(device)->connection->peer_integrity_tfm); |
1502 | /* | 1502 | /* |
1503 | * FIXME: Receive the incoming digest into the receive buffer | 1503 | * FIXME: Receive the incoming digest into the receive buffer |
1504 | * here, together with its struct p_data? | 1504 | * here, together with its struct p_data? |
1505 | */ | 1505 | */ |
1506 | err = drbd_recv_all_warn(device->connection, dig_in, dgs); | 1506 | err = drbd_recv_all_warn(first_peer_device(device)->connection, dig_in, dgs); |
1507 | if (err) | 1507 | if (err) |
1508 | return NULL; | 1508 | return NULL; |
1509 | data_size -= dgs; | 1509 | data_size -= dgs; |
@@ -1539,7 +1539,7 @@ read_in_block(struct drbd_device *device, u64 id, sector_t sector, | |||
1539 | page_chain_for_each(page) { | 1539 | page_chain_for_each(page) { |
1540 | unsigned len = min_t(int, ds, PAGE_SIZE); | 1540 | unsigned len = min_t(int, ds, PAGE_SIZE); |
1541 | data = kmap(page); | 1541 | data = kmap(page); |
1542 | err = drbd_recv_all_warn(device->connection, data, len); | 1542 | err = drbd_recv_all_warn(first_peer_device(device)->connection, data, len); |
1543 | if (drbd_insert_fault(device, DRBD_FAULT_RECEIVE)) { | 1543 | if (drbd_insert_fault(device, DRBD_FAULT_RECEIVE)) { |
1544 | dev_err(DEV, "Fault injection: Corrupting data on receive\n"); | 1544 | dev_err(DEV, "Fault injection: Corrupting data on receive\n"); |
1545 | data[0] = data[0] ^ (unsigned long)-1; | 1545 | data[0] = data[0] ^ (unsigned long)-1; |
@@ -1553,7 +1553,7 @@ read_in_block(struct drbd_device *device, u64 id, sector_t sector, | |||
1553 | } | 1553 | } |
1554 | 1554 | ||
1555 | if (dgs) { | 1555 | if (dgs) { |
1556 | drbd_csum_ee(device, device->connection->peer_integrity_tfm, peer_req, dig_vv); | 1556 | drbd_csum_ee(device, first_peer_device(device)->connection->peer_integrity_tfm, peer_req, dig_vv); |
1557 | if (memcmp(dig_in, dig_vv, dgs)) { | 1557 | if (memcmp(dig_in, dig_vv, dgs)) { |
1558 | dev_err(DEV, "Digest integrity check FAILED: %llus +%u\n", | 1558 | dev_err(DEV, "Digest integrity check FAILED: %llus +%u\n", |
1559 | (unsigned long long)sector, data_size); | 1559 | (unsigned long long)sector, data_size); |
@@ -1583,7 +1583,7 @@ static int drbd_drain_block(struct drbd_device *device, int data_size) | |||
1583 | while (data_size) { | 1583 | while (data_size) { |
1584 | unsigned int len = min_t(int, data_size, PAGE_SIZE); | 1584 | unsigned int len = min_t(int, data_size, PAGE_SIZE); |
1585 | 1585 | ||
1586 | err = drbd_recv_all_warn(device->connection, data, len); | 1586 | err = drbd_recv_all_warn(first_peer_device(device)->connection, data, len); |
1587 | if (err) | 1587 | if (err) |
1588 | break; | 1588 | break; |
1589 | data_size -= len; | 1589 | data_size -= len; |
@@ -1600,13 +1600,13 @@ static int recv_dless_read(struct drbd_device *device, struct drbd_request *req, | |||
1600 | struct bvec_iter iter; | 1600 | struct bvec_iter iter; |
1601 | struct bio *bio; | 1601 | struct bio *bio; |
1602 | int dgs, err, expect; | 1602 | int dgs, err, expect; |
1603 | void *dig_in = device->connection->int_dig_in; | 1603 | void *dig_in = first_peer_device(device)->connection->int_dig_in; |
1604 | void *dig_vv = device->connection->int_dig_vv; | 1604 | void *dig_vv = first_peer_device(device)->connection->int_dig_vv; |
1605 | 1605 | ||
1606 | dgs = 0; | 1606 | dgs = 0; |
1607 | if (device->connection->peer_integrity_tfm) { | 1607 | if (first_peer_device(device)->connection->peer_integrity_tfm) { |
1608 | dgs = crypto_hash_digestsize(device->connection->peer_integrity_tfm); | 1608 | dgs = crypto_hash_digestsize(first_peer_device(device)->connection->peer_integrity_tfm); |
1609 | err = drbd_recv_all_warn(device->connection, dig_in, dgs); | 1609 | err = drbd_recv_all_warn(first_peer_device(device)->connection, dig_in, dgs); |
1610 | if (err) | 1610 | if (err) |
1611 | return err; | 1611 | return err; |
1612 | data_size -= dgs; | 1612 | data_size -= dgs; |
@@ -1622,7 +1622,7 @@ static int recv_dless_read(struct drbd_device *device, struct drbd_request *req, | |||
1622 | bio_for_each_segment(bvec, bio, iter) { | 1622 | bio_for_each_segment(bvec, bio, iter) { |
1623 | void *mapped = kmap(bvec.bv_page) + bvec.bv_offset; | 1623 | void *mapped = kmap(bvec.bv_page) + bvec.bv_offset; |
1624 | expect = min_t(int, data_size, bvec.bv_len); | 1624 | expect = min_t(int, data_size, bvec.bv_len); |
1625 | err = drbd_recv_all_warn(device->connection, mapped, expect); | 1625 | err = drbd_recv_all_warn(first_peer_device(device)->connection, mapped, expect); |
1626 | kunmap(bvec.bv_page); | 1626 | kunmap(bvec.bv_page); |
1627 | if (err) | 1627 | if (err) |
1628 | return err; | 1628 | return err; |
@@ -1630,7 +1630,7 @@ static int recv_dless_read(struct drbd_device *device, struct drbd_request *req, | |||
1630 | } | 1630 | } |
1631 | 1631 | ||
1632 | if (dgs) { | 1632 | if (dgs) { |
1633 | drbd_csum_bio(device, device->connection->peer_integrity_tfm, bio, dig_vv); | 1633 | drbd_csum_bio(device, first_peer_device(device)->connection->peer_integrity_tfm, bio, dig_vv); |
1634 | if (memcmp(dig_in, dig_vv, dgs)) { | 1634 | if (memcmp(dig_in, dig_vv, dgs)) { |
1635 | dev_err(DEV, "Digest integrity check FAILED. Broken NICs?\n"); | 1635 | dev_err(DEV, "Digest integrity check FAILED. Broken NICs?\n"); |
1636 | return -EINVAL; | 1636 | return -EINVAL; |
@@ -1685,9 +1685,9 @@ static int recv_resync_read(struct drbd_device *device, sector_t sector, int dat | |||
1685 | 1685 | ||
1686 | peer_req->w.cb = e_end_resync_block; | 1686 | peer_req->w.cb = e_end_resync_block; |
1687 | 1687 | ||
1688 | spin_lock_irq(&device->connection->req_lock); | 1688 | spin_lock_irq(&first_peer_device(device)->connection->req_lock); |
1689 | list_add(&peer_req->w.list, &device->sync_ee); | 1689 | list_add(&peer_req->w.list, &device->sync_ee); |
1690 | spin_unlock_irq(&device->connection->req_lock); | 1690 | spin_unlock_irq(&first_peer_device(device)->connection->req_lock); |
1691 | 1691 | ||
1692 | atomic_add(data_size >> 9, &device->rs_sect_ev); | 1692 | atomic_add(data_size >> 9, &device->rs_sect_ev); |
1693 | if (drbd_submit_peer_request(device, peer_req, WRITE, DRBD_FAULT_RS_WR) == 0) | 1693 | if (drbd_submit_peer_request(device, peer_req, WRITE, DRBD_FAULT_RS_WR) == 0) |
@@ -1695,9 +1695,9 @@ static int recv_resync_read(struct drbd_device *device, sector_t sector, int dat | |||
1695 | 1695 | ||
1696 | /* don't care for the reason here */ | 1696 | /* don't care for the reason here */ |
1697 | dev_err(DEV, "submit failed, triggering re-connect\n"); | 1697 | dev_err(DEV, "submit failed, triggering re-connect\n"); |
1698 | spin_lock_irq(&device->connection->req_lock); | 1698 | spin_lock_irq(&first_peer_device(device)->connection->req_lock); |
1699 | list_del(&peer_req->w.list); | 1699 | list_del(&peer_req->w.list); |
1700 | spin_unlock_irq(&device->connection->req_lock); | 1700 | spin_unlock_irq(&first_peer_device(device)->connection->req_lock); |
1701 | 1701 | ||
1702 | drbd_free_peer_req(device, peer_req); | 1702 | drbd_free_peer_req(device, peer_req); |
1703 | fail: | 1703 | fail: |
@@ -1736,9 +1736,9 @@ static int receive_DataReply(struct drbd_connection *connection, struct packet_i | |||
1736 | 1736 | ||
1737 | sector = be64_to_cpu(p->sector); | 1737 | sector = be64_to_cpu(p->sector); |
1738 | 1738 | ||
1739 | spin_lock_irq(&device->connection->req_lock); | 1739 | spin_lock_irq(&first_peer_device(device)->connection->req_lock); |
1740 | req = find_request(device, &device->read_requests, p->block_id, sector, false, __func__); | 1740 | req = find_request(device, &device->read_requests, p->block_id, sector, false, __func__); |
1741 | spin_unlock_irq(&device->connection->req_lock); | 1741 | spin_unlock_irq(&first_peer_device(device)->connection->req_lock); |
1742 | if (unlikely(!req)) | 1742 | if (unlikely(!req)) |
1743 | return -EIO; | 1743 | return -EIO; |
1744 | 1744 | ||
@@ -1837,16 +1837,16 @@ static int e_end_block(struct drbd_work *w, int cancel) | |||
1837 | /* we delete from the conflict detection hash _after_ we sent out the | 1837 | /* we delete from the conflict detection hash _after_ we sent out the |
1838 | * P_WRITE_ACK / P_NEG_ACK, to get the sequence number right. */ | 1838 | * P_WRITE_ACK / P_NEG_ACK, to get the sequence number right. */ |
1839 | if (peer_req->flags & EE_IN_INTERVAL_TREE) { | 1839 | if (peer_req->flags & EE_IN_INTERVAL_TREE) { |
1840 | spin_lock_irq(&device->connection->req_lock); | 1840 | spin_lock_irq(&first_peer_device(device)->connection->req_lock); |
1841 | D_ASSERT(!drbd_interval_empty(&peer_req->i)); | 1841 | D_ASSERT(!drbd_interval_empty(&peer_req->i)); |
1842 | drbd_remove_epoch_entry_interval(device, peer_req); | 1842 | drbd_remove_epoch_entry_interval(device, peer_req); |
1843 | if (peer_req->flags & EE_RESTART_REQUESTS) | 1843 | if (peer_req->flags & EE_RESTART_REQUESTS) |
1844 | restart_conflicting_writes(device, sector, peer_req->i.size); | 1844 | restart_conflicting_writes(device, sector, peer_req->i.size); |
1845 | spin_unlock_irq(&device->connection->req_lock); | 1845 | spin_unlock_irq(&first_peer_device(device)->connection->req_lock); |
1846 | } else | 1846 | } else |
1847 | D_ASSERT(drbd_interval_empty(&peer_req->i)); | 1847 | D_ASSERT(drbd_interval_empty(&peer_req->i)); |
1848 | 1848 | ||
1849 | drbd_may_finish_epoch(device->connection, peer_req->epoch, EV_PUT + (cancel ? EV_CLEANUP : 0)); | 1849 | drbd_may_finish_epoch(first_peer_device(device)->connection, peer_req->epoch, EV_PUT + (cancel ? EV_CLEANUP : 0)); |
1850 | 1850 | ||
1851 | return err; | 1851 | return err; |
1852 | } | 1852 | } |
@@ -1871,7 +1871,7 @@ static int e_send_superseded(struct drbd_work *w, int unused) | |||
1871 | 1871 | ||
1872 | static int e_send_retry_write(struct drbd_work *w, int unused) | 1872 | static int e_send_retry_write(struct drbd_work *w, int unused) |
1873 | { | 1873 | { |
1874 | struct drbd_connection *connection = w->device->connection; | 1874 | struct drbd_connection *connection = first_peer_device(w->device)->connection; |
1875 | 1875 | ||
1876 | return e_send_ack(w, connection->agreed_pro_version >= 100 ? | 1876 | return e_send_ack(w, connection->agreed_pro_version >= 100 ? |
1877 | P_RETRY_WRITE : P_SUPERSEDED); | 1877 | P_RETRY_WRITE : P_SUPERSEDED); |
@@ -1896,7 +1896,7 @@ static void update_peer_seq(struct drbd_device *device, unsigned int peer_seq) | |||
1896 | { | 1896 | { |
1897 | unsigned int newest_peer_seq; | 1897 | unsigned int newest_peer_seq; |
1898 | 1898 | ||
1899 | if (test_bit(RESOLVE_CONFLICTS, &device->connection->flags)) { | 1899 | if (test_bit(RESOLVE_CONFLICTS, &first_peer_device(device)->connection->flags)) { |
1900 | spin_lock(&device->peer_seq_lock); | 1900 | spin_lock(&device->peer_seq_lock); |
1901 | newest_peer_seq = seq_max(device->peer_seq, peer_seq); | 1901 | newest_peer_seq = seq_max(device->peer_seq, peer_seq); |
1902 | device->peer_seq = newest_peer_seq; | 1902 | device->peer_seq = newest_peer_seq; |
@@ -1918,7 +1918,7 @@ static bool overlapping_resync_write(struct drbd_device *device, struct drbd_pee | |||
1918 | struct drbd_peer_request *rs_req; | 1918 | struct drbd_peer_request *rs_req; |
1919 | bool rv = 0; | 1919 | bool rv = 0; |
1920 | 1920 | ||
1921 | spin_lock_irq(&device->connection->req_lock); | 1921 | spin_lock_irq(&first_peer_device(device)->connection->req_lock); |
1922 | list_for_each_entry(rs_req, &device->sync_ee, w.list) { | 1922 | list_for_each_entry(rs_req, &device->sync_ee, w.list) { |
1923 | if (overlaps(peer_req->i.sector, peer_req->i.size, | 1923 | if (overlaps(peer_req->i.sector, peer_req->i.size, |
1924 | rs_req->i.sector, rs_req->i.size)) { | 1924 | rs_req->i.sector, rs_req->i.size)) { |
@@ -1926,7 +1926,7 @@ static bool overlapping_resync_write(struct drbd_device *device, struct drbd_pee | |||
1926 | break; | 1926 | break; |
1927 | } | 1927 | } |
1928 | } | 1928 | } |
1929 | spin_unlock_irq(&device->connection->req_lock); | 1929 | spin_unlock_irq(&first_peer_device(device)->connection->req_lock); |
1930 | 1930 | ||
1931 | return rv; | 1931 | return rv; |
1932 | } | 1932 | } |
@@ -1958,7 +1958,7 @@ static int wait_for_and_update_peer_seq(struct drbd_device *device, const u32 pe | |||
1958 | long timeout; | 1958 | long timeout; |
1959 | int ret = 0, tp; | 1959 | int ret = 0, tp; |
1960 | 1960 | ||
1961 | if (!test_bit(RESOLVE_CONFLICTS, &device->connection->flags)) | 1961 | if (!test_bit(RESOLVE_CONFLICTS, &first_peer_device(device)->connection->flags)) |
1962 | return 0; | 1962 | return 0; |
1963 | 1963 | ||
1964 | spin_lock(&device->peer_seq_lock); | 1964 | spin_lock(&device->peer_seq_lock); |
@@ -1974,7 +1974,7 @@ static int wait_for_and_update_peer_seq(struct drbd_device *device, const u32 pe | |||
1974 | } | 1974 | } |
1975 | 1975 | ||
1976 | rcu_read_lock(); | 1976 | rcu_read_lock(); |
1977 | tp = rcu_dereference(device->connection->net_conf)->two_primaries; | 1977 | tp = rcu_dereference(first_peer_device(device)->connection->net_conf)->two_primaries; |
1978 | rcu_read_unlock(); | 1978 | rcu_read_unlock(); |
1979 | 1979 | ||
1980 | if (!tp) | 1980 | if (!tp) |
@@ -1984,7 +1984,7 @@ static int wait_for_and_update_peer_seq(struct drbd_device *device, const u32 pe | |||
1984 | prepare_to_wait(&device->seq_wait, &wait, TASK_INTERRUPTIBLE); | 1984 | prepare_to_wait(&device->seq_wait, &wait, TASK_INTERRUPTIBLE); |
1985 | spin_unlock(&device->peer_seq_lock); | 1985 | spin_unlock(&device->peer_seq_lock); |
1986 | rcu_read_lock(); | 1986 | rcu_read_lock(); |
1987 | timeout = rcu_dereference(device->connection->net_conf)->ping_timeo*HZ/10; | 1987 | timeout = rcu_dereference(first_peer_device(device)->connection->net_conf)->ping_timeo*HZ/10; |
1988 | rcu_read_unlock(); | 1988 | rcu_read_unlock(); |
1989 | timeout = schedule_timeout(timeout); | 1989 | timeout = schedule_timeout(timeout); |
1990 | spin_lock(&device->peer_seq_lock); | 1990 | spin_lock(&device->peer_seq_lock); |
@@ -2027,10 +2027,10 @@ static void fail_postponed_requests(struct drbd_device *device, sector_t sector, | |||
2027 | continue; | 2027 | continue; |
2028 | req->rq_state &= ~RQ_POSTPONED; | 2028 | req->rq_state &= ~RQ_POSTPONED; |
2029 | __req_mod(req, NEG_ACKED, &m); | 2029 | __req_mod(req, NEG_ACKED, &m); |
2030 | spin_unlock_irq(&device->connection->req_lock); | 2030 | spin_unlock_irq(&first_peer_device(device)->connection->req_lock); |
2031 | if (m.bio) | 2031 | if (m.bio) |
2032 | complete_master_bio(device, &m); | 2032 | complete_master_bio(device, &m); |
2033 | spin_lock_irq(&device->connection->req_lock); | 2033 | spin_lock_irq(&first_peer_device(device)->connection->req_lock); |
2034 | goto repeat; | 2034 | goto repeat; |
2035 | } | 2035 | } |
2036 | } | 2036 | } |
@@ -2038,7 +2038,7 @@ static void fail_postponed_requests(struct drbd_device *device, sector_t sector, | |||
2038 | static int handle_write_conflicts(struct drbd_device *device, | 2038 | static int handle_write_conflicts(struct drbd_device *device, |
2039 | struct drbd_peer_request *peer_req) | 2039 | struct drbd_peer_request *peer_req) |
2040 | { | 2040 | { |
2041 | struct drbd_connection *connection = device->connection; | 2041 | struct drbd_connection *connection = first_peer_device(device)->connection; |
2042 | bool resolve_conflicts = test_bit(RESOLVE_CONFLICTS, &connection->flags); | 2042 | bool resolve_conflicts = test_bit(RESOLVE_CONFLICTS, &connection->flags); |
2043 | sector_t sector = peer_req->i.sector; | 2043 | sector_t sector = peer_req->i.sector; |
2044 | const unsigned int size = peer_req->i.size; | 2044 | const unsigned int size = peer_req->i.size; |
@@ -2092,7 +2092,7 @@ static int handle_write_conflicts(struct drbd_device *device, | |||
2092 | peer_req->w.cb = superseded ? e_send_superseded : | 2092 | peer_req->w.cb = superseded ? e_send_superseded : |
2093 | e_send_retry_write; | 2093 | e_send_retry_write; |
2094 | list_add_tail(&peer_req->w.list, &device->done_ee); | 2094 | list_add_tail(&peer_req->w.list, &device->done_ee); |
2095 | wake_asender(device->connection); | 2095 | wake_asender(first_peer_device(device)->connection); |
2096 | 2096 | ||
2097 | err = -ENOENT; | 2097 | err = -ENOENT; |
2098 | goto out; | 2098 | goto out; |
@@ -2121,7 +2121,7 @@ static int handle_write_conflicts(struct drbd_device *device, | |||
2121 | */ | 2121 | */ |
2122 | err = drbd_wait_misc(device, &req->i); | 2122 | err = drbd_wait_misc(device, &req->i); |
2123 | if (err) { | 2123 | if (err) { |
2124 | _conn_request_state(device->connection, | 2124 | _conn_request_state(first_peer_device(device)->connection, |
2125 | NS(conn, C_TIMEOUT), | 2125 | NS(conn, C_TIMEOUT), |
2126 | CS_HARD); | 2126 | CS_HARD); |
2127 | fail_postponed_requests(device, sector, size); | 2127 | fail_postponed_requests(device, sector, size); |
@@ -2204,17 +2204,17 @@ static int receive_Data(struct drbd_connection *connection, struct packet_info * | |||
2204 | spin_unlock(&connection->epoch_lock); | 2204 | spin_unlock(&connection->epoch_lock); |
2205 | 2205 | ||
2206 | rcu_read_lock(); | 2206 | rcu_read_lock(); |
2207 | tp = rcu_dereference(device->connection->net_conf)->two_primaries; | 2207 | tp = rcu_dereference(first_peer_device(device)->connection->net_conf)->two_primaries; |
2208 | rcu_read_unlock(); | 2208 | rcu_read_unlock(); |
2209 | if (tp) { | 2209 | if (tp) { |
2210 | peer_req->flags |= EE_IN_INTERVAL_TREE; | 2210 | peer_req->flags |= EE_IN_INTERVAL_TREE; |
2211 | err = wait_for_and_update_peer_seq(device, peer_seq); | 2211 | err = wait_for_and_update_peer_seq(device, peer_seq); |
2212 | if (err) | 2212 | if (err) |
2213 | goto out_interrupted; | 2213 | goto out_interrupted; |
2214 | spin_lock_irq(&device->connection->req_lock); | 2214 | spin_lock_irq(&first_peer_device(device)->connection->req_lock); |
2215 | err = handle_write_conflicts(device, peer_req); | 2215 | err = handle_write_conflicts(device, peer_req); |
2216 | if (err) { | 2216 | if (err) { |
2217 | spin_unlock_irq(&device->connection->req_lock); | 2217 | spin_unlock_irq(&first_peer_device(device)->connection->req_lock); |
2218 | if (err == -ENOENT) { | 2218 | if (err == -ENOENT) { |
2219 | put_ldev(device); | 2219 | put_ldev(device); |
2220 | return 0; | 2220 | return 0; |
@@ -2223,17 +2223,17 @@ static int receive_Data(struct drbd_connection *connection, struct packet_info * | |||
2223 | } | 2223 | } |
2224 | } else { | 2224 | } else { |
2225 | update_peer_seq(device, peer_seq); | 2225 | update_peer_seq(device, peer_seq); |
2226 | spin_lock_irq(&device->connection->req_lock); | 2226 | spin_lock_irq(&first_peer_device(device)->connection->req_lock); |
2227 | } | 2227 | } |
2228 | list_add(&peer_req->w.list, &device->active_ee); | 2228 | list_add(&peer_req->w.list, &device->active_ee); |
2229 | spin_unlock_irq(&device->connection->req_lock); | 2229 | spin_unlock_irq(&first_peer_device(device)->connection->req_lock); |
2230 | 2230 | ||
2231 | if (device->state.conn == C_SYNC_TARGET) | 2231 | if (device->state.conn == C_SYNC_TARGET) |
2232 | wait_event(device->ee_wait, !overlapping_resync_write(device, peer_req)); | 2232 | wait_event(device->ee_wait, !overlapping_resync_write(device, peer_req)); |
2233 | 2233 | ||
2234 | if (device->connection->agreed_pro_version < 100) { | 2234 | if (first_peer_device(device)->connection->agreed_pro_version < 100) { |
2235 | rcu_read_lock(); | 2235 | rcu_read_lock(); |
2236 | switch (rcu_dereference(device->connection->net_conf)->wire_protocol) { | 2236 | switch (rcu_dereference(first_peer_device(device)->connection->net_conf)->wire_protocol) { |
2237 | case DRBD_PROT_C: | 2237 | case DRBD_PROT_C: |
2238 | dp_flags |= DP_SEND_WRITE_ACK; | 2238 | dp_flags |= DP_SEND_WRITE_ACK; |
2239 | break; | 2239 | break; |
@@ -2271,10 +2271,10 @@ static int receive_Data(struct drbd_connection *connection, struct packet_info * | |||
2271 | 2271 | ||
2272 | /* don't care for the reason here */ | 2272 | /* don't care for the reason here */ |
2273 | dev_err(DEV, "submit failed, triggering re-connect\n"); | 2273 | dev_err(DEV, "submit failed, triggering re-connect\n"); |
2274 | spin_lock_irq(&device->connection->req_lock); | 2274 | spin_lock_irq(&first_peer_device(device)->connection->req_lock); |
2275 | list_del(&peer_req->w.list); | 2275 | list_del(&peer_req->w.list); |
2276 | drbd_remove_epoch_entry_interval(device, peer_req); | 2276 | drbd_remove_epoch_entry_interval(device, peer_req); |
2277 | spin_unlock_irq(&device->connection->req_lock); | 2277 | spin_unlock_irq(&first_peer_device(device)->connection->req_lock); |
2278 | if (peer_req->flags & EE_CALL_AL_COMPLETE_IO) | 2278 | if (peer_req->flags & EE_CALL_AL_COMPLETE_IO) |
2279 | drbd_al_complete_io(device, &peer_req->i); | 2279 | drbd_al_complete_io(device, &peer_req->i); |
2280 | 2280 | ||
@@ -2450,11 +2450,11 @@ static int receive_DataRequest(struct drbd_connection *connection, struct packet | |||
2450 | peer_req->digest = di; | 2450 | peer_req->digest = di; |
2451 | peer_req->flags |= EE_HAS_DIGEST; | 2451 | peer_req->flags |= EE_HAS_DIGEST; |
2452 | 2452 | ||
2453 | if (drbd_recv_all(device->connection, di->digest, pi->size)) | 2453 | if (drbd_recv_all(first_peer_device(device)->connection, di->digest, pi->size)) |
2454 | goto out_free_e; | 2454 | goto out_free_e; |
2455 | 2455 | ||
2456 | if (pi->cmd == P_CSUM_RS_REQUEST) { | 2456 | if (pi->cmd == P_CSUM_RS_REQUEST) { |
2457 | D_ASSERT(device->connection->agreed_pro_version >= 89); | 2457 | D_ASSERT(first_peer_device(device)->connection->agreed_pro_version >= 89); |
2458 | peer_req->w.cb = w_e_end_csum_rs_req; | 2458 | peer_req->w.cb = w_e_end_csum_rs_req; |
2459 | /* used in the sector offset progress display */ | 2459 | /* used in the sector offset progress display */ |
2460 | device->bm_resync_fo = BM_SECT_TO_BIT(sector); | 2460 | device->bm_resync_fo = BM_SECT_TO_BIT(sector); |
@@ -2471,7 +2471,7 @@ static int receive_DataRequest(struct drbd_connection *connection, struct packet | |||
2471 | 2471 | ||
2472 | case P_OV_REQUEST: | 2472 | case P_OV_REQUEST: |
2473 | if (device->ov_start_sector == ~(sector_t)0 && | 2473 | if (device->ov_start_sector == ~(sector_t)0 && |
2474 | device->connection->agreed_pro_version >= 90) { | 2474 | first_peer_device(device)->connection->agreed_pro_version >= 90) { |
2475 | unsigned long now = jiffies; | 2475 | unsigned long now = jiffies; |
2476 | int i; | 2476 | int i; |
2477 | device->ov_start_sector = sector; | 2477 | device->ov_start_sector = sector; |
@@ -2525,18 +2525,18 @@ submit_for_resync: | |||
2525 | 2525 | ||
2526 | submit: | 2526 | submit: |
2527 | inc_unacked(device); | 2527 | inc_unacked(device); |
2528 | spin_lock_irq(&device->connection->req_lock); | 2528 | spin_lock_irq(&first_peer_device(device)->connection->req_lock); |
2529 | list_add_tail(&peer_req->w.list, &device->read_ee); | 2529 | list_add_tail(&peer_req->w.list, &device->read_ee); |
2530 | spin_unlock_irq(&device->connection->req_lock); | 2530 | spin_unlock_irq(&first_peer_device(device)->connection->req_lock); |
2531 | 2531 | ||
2532 | if (drbd_submit_peer_request(device, peer_req, READ, fault_type) == 0) | 2532 | if (drbd_submit_peer_request(device, peer_req, READ, fault_type) == 0) |
2533 | return 0; | 2533 | return 0; |
2534 | 2534 | ||
2535 | /* don't care for the reason here */ | 2535 | /* don't care for the reason here */ |
2536 | dev_err(DEV, "submit failed, triggering re-connect\n"); | 2536 | dev_err(DEV, "submit failed, triggering re-connect\n"); |
2537 | spin_lock_irq(&device->connection->req_lock); | 2537 | spin_lock_irq(&first_peer_device(device)->connection->req_lock); |
2538 | list_del(&peer_req->w.list); | 2538 | list_del(&peer_req->w.list); |
2539 | spin_unlock_irq(&device->connection->req_lock); | 2539 | spin_unlock_irq(&first_peer_device(device)->connection->req_lock); |
2540 | /* no drbd_rs_complete_io(), we are dropping the connection anyways */ | 2540 | /* no drbd_rs_complete_io(), we are dropping the connection anyways */ |
2541 | 2541 | ||
2542 | out_free_e: | 2542 | out_free_e: |
@@ -2558,7 +2558,7 @@ static int drbd_asb_recover_0p(struct drbd_device *device) __must_hold(local) | |||
2558 | ch_self = device->comm_bm_set; | 2558 | ch_self = device->comm_bm_set; |
2559 | 2559 | ||
2560 | rcu_read_lock(); | 2560 | rcu_read_lock(); |
2561 | after_sb_0p = rcu_dereference(device->connection->net_conf)->after_sb_0p; | 2561 | after_sb_0p = rcu_dereference(first_peer_device(device)->connection->net_conf)->after_sb_0p; |
2562 | rcu_read_unlock(); | 2562 | rcu_read_unlock(); |
2563 | switch (after_sb_0p) { | 2563 | switch (after_sb_0p) { |
2564 | case ASB_CONSENSUS: | 2564 | case ASB_CONSENSUS: |
@@ -2593,7 +2593,7 @@ static int drbd_asb_recover_0p(struct drbd_device *device) __must_hold(local) | |||
2593 | "Using discard-least-changes instead\n"); | 2593 | "Using discard-least-changes instead\n"); |
2594 | case ASB_DISCARD_ZERO_CHG: | 2594 | case ASB_DISCARD_ZERO_CHG: |
2595 | if (ch_peer == 0 && ch_self == 0) { | 2595 | if (ch_peer == 0 && ch_self == 0) { |
2596 | rv = test_bit(RESOLVE_CONFLICTS, &device->connection->flags) | 2596 | rv = test_bit(RESOLVE_CONFLICTS, &first_peer_device(device)->connection->flags) |
2597 | ? -1 : 1; | 2597 | ? -1 : 1; |
2598 | break; | 2598 | break; |
2599 | } else { | 2599 | } else { |
@@ -2609,7 +2609,7 @@ static int drbd_asb_recover_0p(struct drbd_device *device) __must_hold(local) | |||
2609 | rv = 1; | 2609 | rv = 1; |
2610 | else /* ( ch_self == ch_peer ) */ | 2610 | else /* ( ch_self == ch_peer ) */ |
2611 | /* Well, then use something else. */ | 2611 | /* Well, then use something else. */ |
2612 | rv = test_bit(RESOLVE_CONFLICTS, &device->connection->flags) | 2612 | rv = test_bit(RESOLVE_CONFLICTS, &first_peer_device(device)->connection->flags) |
2613 | ? -1 : 1; | 2613 | ? -1 : 1; |
2614 | break; | 2614 | break; |
2615 | case ASB_DISCARD_LOCAL: | 2615 | case ASB_DISCARD_LOCAL: |
@@ -2628,7 +2628,7 @@ static int drbd_asb_recover_1p(struct drbd_device *device) __must_hold(local) | |||
2628 | enum drbd_after_sb_p after_sb_1p; | 2628 | enum drbd_after_sb_p after_sb_1p; |
2629 | 2629 | ||
2630 | rcu_read_lock(); | 2630 | rcu_read_lock(); |
2631 | after_sb_1p = rcu_dereference(device->connection->net_conf)->after_sb_1p; | 2631 | after_sb_1p = rcu_dereference(first_peer_device(device)->connection->net_conf)->after_sb_1p; |
2632 | rcu_read_unlock(); | 2632 | rcu_read_unlock(); |
2633 | switch (after_sb_1p) { | 2633 | switch (after_sb_1p) { |
2634 | case ASB_DISCARD_YOUNGER_PRI: | 2634 | case ASB_DISCARD_YOUNGER_PRI: |
@@ -2681,7 +2681,7 @@ static int drbd_asb_recover_2p(struct drbd_device *device) __must_hold(local) | |||
2681 | enum drbd_after_sb_p after_sb_2p; | 2681 | enum drbd_after_sb_p after_sb_2p; |
2682 | 2682 | ||
2683 | rcu_read_lock(); | 2683 | rcu_read_lock(); |
2684 | after_sb_2p = rcu_dereference(device->connection->net_conf)->after_sb_2p; | 2684 | after_sb_2p = rcu_dereference(first_peer_device(device)->connection->net_conf)->after_sb_2p; |
2685 | rcu_read_unlock(); | 2685 | rcu_read_unlock(); |
2686 | switch (after_sb_2p) { | 2686 | switch (after_sb_2p) { |
2687 | case ASB_DISCARD_YOUNGER_PRI: | 2687 | case ASB_DISCARD_YOUNGER_PRI: |
@@ -2777,7 +2777,7 @@ static int drbd_uuid_compare(struct drbd_device *device, int *rule_nr) __must_ho | |||
2777 | 2777 | ||
2778 | if (device->p_uuid[UI_BITMAP] == (u64)0 && device->ldev->md.uuid[UI_BITMAP] != (u64)0) { | 2778 | if (device->p_uuid[UI_BITMAP] == (u64)0 && device->ldev->md.uuid[UI_BITMAP] != (u64)0) { |
2779 | 2779 | ||
2780 | if (device->connection->agreed_pro_version < 91) | 2780 | if (first_peer_device(device)->connection->agreed_pro_version < 91) |
2781 | return -1091; | 2781 | return -1091; |
2782 | 2782 | ||
2783 | if ((device->ldev->md.uuid[UI_BITMAP] & ~((u64)1)) == (device->p_uuid[UI_HISTORY_START] & ~((u64)1)) && | 2783 | if ((device->ldev->md.uuid[UI_BITMAP] & ~((u64)1)) == (device->p_uuid[UI_HISTORY_START] & ~((u64)1)) && |
@@ -2800,7 +2800,7 @@ static int drbd_uuid_compare(struct drbd_device *device, int *rule_nr) __must_ho | |||
2800 | 2800 | ||
2801 | if (device->ldev->md.uuid[UI_BITMAP] == (u64)0 && device->p_uuid[UI_BITMAP] != (u64)0) { | 2801 | if (device->ldev->md.uuid[UI_BITMAP] == (u64)0 && device->p_uuid[UI_BITMAP] != (u64)0) { |
2802 | 2802 | ||
2803 | if (device->connection->agreed_pro_version < 91) | 2803 | if (first_peer_device(device)->connection->agreed_pro_version < 91) |
2804 | return -1091; | 2804 | return -1091; |
2805 | 2805 | ||
2806 | if ((device->ldev->md.uuid[UI_HISTORY_START] & ~((u64)1)) == (device->p_uuid[UI_BITMAP] & ~((u64)1)) && | 2806 | if ((device->ldev->md.uuid[UI_HISTORY_START] & ~((u64)1)) == (device->p_uuid[UI_BITMAP] & ~((u64)1)) && |
@@ -2833,7 +2833,7 @@ static int drbd_uuid_compare(struct drbd_device *device, int *rule_nr) __must_ho | |||
2833 | case 1: /* self_pri && !peer_pri */ return 1; | 2833 | case 1: /* self_pri && !peer_pri */ return 1; |
2834 | case 2: /* !self_pri && peer_pri */ return -1; | 2834 | case 2: /* !self_pri && peer_pri */ return -1; |
2835 | case 3: /* self_pri && peer_pri */ | 2835 | case 3: /* self_pri && peer_pri */ |
2836 | dc = test_bit(RESOLVE_CONFLICTS, &device->connection->flags); | 2836 | dc = test_bit(RESOLVE_CONFLICTS, &first_peer_device(device)->connection->flags); |
2837 | return dc ? -1 : 1; | 2837 | return dc ? -1 : 1; |
2838 | } | 2838 | } |
2839 | } | 2839 | } |
@@ -2846,14 +2846,14 @@ static int drbd_uuid_compare(struct drbd_device *device, int *rule_nr) __must_ho | |||
2846 | *rule_nr = 51; | 2846 | *rule_nr = 51; |
2847 | peer = device->p_uuid[UI_HISTORY_START] & ~((u64)1); | 2847 | peer = device->p_uuid[UI_HISTORY_START] & ~((u64)1); |
2848 | if (self == peer) { | 2848 | if (self == peer) { |
2849 | if (device->connection->agreed_pro_version < 96 ? | 2849 | if (first_peer_device(device)->connection->agreed_pro_version < 96 ? |
2850 | (device->ldev->md.uuid[UI_HISTORY_START] & ~((u64)1)) == | 2850 | (device->ldev->md.uuid[UI_HISTORY_START] & ~((u64)1)) == |
2851 | (device->p_uuid[UI_HISTORY_START + 1] & ~((u64)1)) : | 2851 | (device->p_uuid[UI_HISTORY_START + 1] & ~((u64)1)) : |
2852 | peer + UUID_NEW_BM_OFFSET == (device->p_uuid[UI_BITMAP] & ~((u64)1))) { | 2852 | peer + UUID_NEW_BM_OFFSET == (device->p_uuid[UI_BITMAP] & ~((u64)1))) { |
2853 | /* The last P_SYNC_UUID did not get though. Undo the last start of | 2853 | /* The last P_SYNC_UUID did not get though. Undo the last start of |
2854 | resync as sync source modifications of the peer's UUIDs. */ | 2854 | resync as sync source modifications of the peer's UUIDs. */ |
2855 | 2855 | ||
2856 | if (device->connection->agreed_pro_version < 91) | 2856 | if (first_peer_device(device)->connection->agreed_pro_version < 91) |
2857 | return -1091; | 2857 | return -1091; |
2858 | 2858 | ||
2859 | device->p_uuid[UI_BITMAP] = device->p_uuid[UI_HISTORY_START]; | 2859 | device->p_uuid[UI_BITMAP] = device->p_uuid[UI_HISTORY_START]; |
@@ -2883,14 +2883,14 @@ static int drbd_uuid_compare(struct drbd_device *device, int *rule_nr) __must_ho | |||
2883 | *rule_nr = 71; | 2883 | *rule_nr = 71; |
2884 | self = device->ldev->md.uuid[UI_HISTORY_START] & ~((u64)1); | 2884 | self = device->ldev->md.uuid[UI_HISTORY_START] & ~((u64)1); |
2885 | if (self == peer) { | 2885 | if (self == peer) { |
2886 | if (device->connection->agreed_pro_version < 96 ? | 2886 | if (first_peer_device(device)->connection->agreed_pro_version < 96 ? |
2887 | (device->ldev->md.uuid[UI_HISTORY_START + 1] & ~((u64)1)) == | 2887 | (device->ldev->md.uuid[UI_HISTORY_START + 1] & ~((u64)1)) == |
2888 | (device->p_uuid[UI_HISTORY_START] & ~((u64)1)) : | 2888 | (device->p_uuid[UI_HISTORY_START] & ~((u64)1)) : |
2889 | self + UUID_NEW_BM_OFFSET == (device->ldev->md.uuid[UI_BITMAP] & ~((u64)1))) { | 2889 | self + UUID_NEW_BM_OFFSET == (device->ldev->md.uuid[UI_BITMAP] & ~((u64)1))) { |
2890 | /* The last P_SYNC_UUID did not get though. Undo the last start of | 2890 | /* The last P_SYNC_UUID did not get though. Undo the last start of |
2891 | resync as sync source modifications of our UUIDs. */ | 2891 | resync as sync source modifications of our UUIDs. */ |
2892 | 2892 | ||
2893 | if (device->connection->agreed_pro_version < 91) | 2893 | if (first_peer_device(device)->connection->agreed_pro_version < 91) |
2894 | return -1091; | 2894 | return -1091; |
2895 | 2895 | ||
2896 | __drbd_uuid_set(device, UI_BITMAP, device->ldev->md.uuid[UI_HISTORY_START]); | 2896 | __drbd_uuid_set(device, UI_BITMAP, device->ldev->md.uuid[UI_HISTORY_START]); |
@@ -2982,7 +2982,7 @@ static enum drbd_conns drbd_sync_handshake(struct drbd_device *device, enum drbd | |||
2982 | drbd_khelper(device, "initial-split-brain"); | 2982 | drbd_khelper(device, "initial-split-brain"); |
2983 | 2983 | ||
2984 | rcu_read_lock(); | 2984 | rcu_read_lock(); |
2985 | nc = rcu_dereference(device->connection->net_conf); | 2985 | nc = rcu_dereference(first_peer_device(device)->connection->net_conf); |
2986 | 2986 | ||
2987 | if (hg == 100 || (hg == -100 && nc->always_asbp)) { | 2987 | if (hg == 100 || (hg == -100 && nc->always_asbp)) { |
2988 | int pcount = (device->state.role == R_PRIMARY) | 2988 | int pcount = (device->state.role == R_PRIMARY) |
@@ -3057,7 +3057,7 @@ static enum drbd_conns drbd_sync_handshake(struct drbd_device *device, enum drbd | |||
3057 | } | 3057 | } |
3058 | } | 3058 | } |
3059 | 3059 | ||
3060 | if (tentative || test_bit(CONN_DRY_RUN, &device->connection->flags)) { | 3060 | if (tentative || test_bit(CONN_DRY_RUN, &first_peer_device(device)->connection->flags)) { |
3061 | if (hg == 0) | 3061 | if (hg == 0) |
3062 | dev_info(DEV, "dry-run connect: No resync, would become Connected immediately.\n"); | 3062 | dev_info(DEV, "dry-run connect: No resync, would become Connected immediately.\n"); |
3063 | else | 3063 | else |
@@ -3361,17 +3361,17 @@ static int receive_SyncParam(struct drbd_connection *connection, struct packet_i | |||
3361 | p = pi->data; | 3361 | p = pi->data; |
3362 | memset(p->verify_alg, 0, 2 * SHARED_SECRET_MAX); | 3362 | memset(p->verify_alg, 0, 2 * SHARED_SECRET_MAX); |
3363 | 3363 | ||
3364 | err = drbd_recv_all(device->connection, p, header_size); | 3364 | err = drbd_recv_all(first_peer_device(device)->connection, p, header_size); |
3365 | if (err) | 3365 | if (err) |
3366 | return err; | 3366 | return err; |
3367 | 3367 | ||
3368 | mutex_lock(&device->connection->conf_update); | 3368 | mutex_lock(&first_peer_device(device)->connection->conf_update); |
3369 | old_net_conf = device->connection->net_conf; | 3369 | old_net_conf = first_peer_device(device)->connection->net_conf; |
3370 | if (get_ldev(device)) { | 3370 | if (get_ldev(device)) { |
3371 | new_disk_conf = kzalloc(sizeof(struct disk_conf), GFP_KERNEL); | 3371 | new_disk_conf = kzalloc(sizeof(struct disk_conf), GFP_KERNEL); |
3372 | if (!new_disk_conf) { | 3372 | if (!new_disk_conf) { |
3373 | put_ldev(device); | 3373 | put_ldev(device); |
3374 | mutex_unlock(&device->connection->conf_update); | 3374 | mutex_unlock(&first_peer_device(device)->connection->conf_update); |
3375 | dev_err(DEV, "Allocation of new disk_conf failed\n"); | 3375 | dev_err(DEV, "Allocation of new disk_conf failed\n"); |
3376 | return -ENOMEM; | 3376 | return -ENOMEM; |
3377 | } | 3377 | } |
@@ -3392,7 +3392,7 @@ static int receive_SyncParam(struct drbd_connection *connection, struct packet_i | |||
3392 | goto reconnect; | 3392 | goto reconnect; |
3393 | } | 3393 | } |
3394 | 3394 | ||
3395 | err = drbd_recv_all(device->connection, p->verify_alg, data_size); | 3395 | err = drbd_recv_all(first_peer_device(device)->connection, p->verify_alg, data_size); |
3396 | if (err) | 3396 | if (err) |
3397 | goto reconnect; | 3397 | goto reconnect; |
3398 | /* we expect NUL terminated string */ | 3398 | /* we expect NUL terminated string */ |
@@ -3466,15 +3466,15 @@ static int receive_SyncParam(struct drbd_connection *connection, struct packet_i | |||
3466 | if (verify_tfm) { | 3466 | if (verify_tfm) { |
3467 | strcpy(new_net_conf->verify_alg, p->verify_alg); | 3467 | strcpy(new_net_conf->verify_alg, p->verify_alg); |
3468 | new_net_conf->verify_alg_len = strlen(p->verify_alg) + 1; | 3468 | new_net_conf->verify_alg_len = strlen(p->verify_alg) + 1; |
3469 | crypto_free_hash(device->connection->verify_tfm); | 3469 | crypto_free_hash(first_peer_device(device)->connection->verify_tfm); |
3470 | device->connection->verify_tfm = verify_tfm; | 3470 | first_peer_device(device)->connection->verify_tfm = verify_tfm; |
3471 | dev_info(DEV, "using verify-alg: \"%s\"\n", p->verify_alg); | 3471 | dev_info(DEV, "using verify-alg: \"%s\"\n", p->verify_alg); |
3472 | } | 3472 | } |
3473 | if (csums_tfm) { | 3473 | if (csums_tfm) { |
3474 | strcpy(new_net_conf->csums_alg, p->csums_alg); | 3474 | strcpy(new_net_conf->csums_alg, p->csums_alg); |
3475 | new_net_conf->csums_alg_len = strlen(p->csums_alg) + 1; | 3475 | new_net_conf->csums_alg_len = strlen(p->csums_alg) + 1; |
3476 | crypto_free_hash(device->connection->csums_tfm); | 3476 | crypto_free_hash(first_peer_device(device)->connection->csums_tfm); |
3477 | device->connection->csums_tfm = csums_tfm; | 3477 | first_peer_device(device)->connection->csums_tfm = csums_tfm; |
3478 | dev_info(DEV, "using csums-alg: \"%s\"\n", p->csums_alg); | 3478 | dev_info(DEV, "using csums-alg: \"%s\"\n", p->csums_alg); |
3479 | } | 3479 | } |
3480 | rcu_assign_pointer(connection->net_conf, new_net_conf); | 3480 | rcu_assign_pointer(connection->net_conf, new_net_conf); |
@@ -3491,7 +3491,7 @@ static int receive_SyncParam(struct drbd_connection *connection, struct packet_i | |||
3491 | rcu_assign_pointer(device->rs_plan_s, new_plan); | 3491 | rcu_assign_pointer(device->rs_plan_s, new_plan); |
3492 | } | 3492 | } |
3493 | 3493 | ||
3494 | mutex_unlock(&device->connection->conf_update); | 3494 | mutex_unlock(&first_peer_device(device)->connection->conf_update); |
3495 | synchronize_rcu(); | 3495 | synchronize_rcu(); |
3496 | if (new_net_conf) | 3496 | if (new_net_conf) |
3497 | kfree(old_net_conf); | 3497 | kfree(old_net_conf); |
@@ -3505,7 +3505,7 @@ reconnect: | |||
3505 | put_ldev(device); | 3505 | put_ldev(device); |
3506 | kfree(new_disk_conf); | 3506 | kfree(new_disk_conf); |
3507 | } | 3507 | } |
3508 | mutex_unlock(&device->connection->conf_update); | 3508 | mutex_unlock(&first_peer_device(device)->connection->conf_update); |
3509 | return -EIO; | 3509 | return -EIO; |
3510 | 3510 | ||
3511 | disconnect: | 3511 | disconnect: |
@@ -3514,13 +3514,13 @@ disconnect: | |||
3514 | put_ldev(device); | 3514 | put_ldev(device); |
3515 | kfree(new_disk_conf); | 3515 | kfree(new_disk_conf); |
3516 | } | 3516 | } |
3517 | mutex_unlock(&device->connection->conf_update); | 3517 | mutex_unlock(&first_peer_device(device)->connection->conf_update); |
3518 | /* just for completeness: actually not needed, | 3518 | /* just for completeness: actually not needed, |
3519 | * as this is not reached if csums_tfm was ok. */ | 3519 | * as this is not reached if csums_tfm was ok. */ |
3520 | crypto_free_hash(csums_tfm); | 3520 | crypto_free_hash(csums_tfm); |
3521 | /* but free the verify_tfm again, if csums_tfm did not work out */ | 3521 | /* but free the verify_tfm again, if csums_tfm did not work out */ |
3522 | crypto_free_hash(verify_tfm); | 3522 | crypto_free_hash(verify_tfm); |
3523 | conn_request_state(device->connection, NS(conn, C_DISCONNECTING), CS_HARD); | 3523 | conn_request_state(first_peer_device(device)->connection, NS(conn, C_DISCONNECTING), CS_HARD); |
3524 | return -EIO; | 3524 | return -EIO; |
3525 | } | 3525 | } |
3526 | 3526 | ||
@@ -3579,7 +3579,7 @@ static int receive_sizes(struct drbd_connection *connection, struct packet_info | |||
3579 | device->state.disk >= D_OUTDATED && | 3579 | device->state.disk >= D_OUTDATED && |
3580 | device->state.conn < C_CONNECTED) { | 3580 | device->state.conn < C_CONNECTED) { |
3581 | dev_err(DEV, "The peer's disk size is too small!\n"); | 3581 | dev_err(DEV, "The peer's disk size is too small!\n"); |
3582 | conn_request_state(device->connection, NS(conn, C_DISCONNECTING), CS_HARD); | 3582 | conn_request_state(first_peer_device(device)->connection, NS(conn, C_DISCONNECTING), CS_HARD); |
3583 | put_ldev(device); | 3583 | put_ldev(device); |
3584 | return -EIO; | 3584 | return -EIO; |
3585 | } | 3585 | } |
@@ -3594,13 +3594,13 @@ static int receive_sizes(struct drbd_connection *connection, struct packet_info | |||
3594 | return -ENOMEM; | 3594 | return -ENOMEM; |
3595 | } | 3595 | } |
3596 | 3596 | ||
3597 | mutex_lock(&device->connection->conf_update); | 3597 | mutex_lock(&first_peer_device(device)->connection->conf_update); |
3598 | old_disk_conf = device->ldev->disk_conf; | 3598 | old_disk_conf = device->ldev->disk_conf; |
3599 | *new_disk_conf = *old_disk_conf; | 3599 | *new_disk_conf = *old_disk_conf; |
3600 | new_disk_conf->disk_size = p_usize; | 3600 | new_disk_conf->disk_size = p_usize; |
3601 | 3601 | ||
3602 | rcu_assign_pointer(device->ldev->disk_conf, new_disk_conf); | 3602 | rcu_assign_pointer(device->ldev->disk_conf, new_disk_conf); |
3603 | mutex_unlock(&device->connection->conf_update); | 3603 | mutex_unlock(&first_peer_device(device)->connection->conf_update); |
3604 | synchronize_rcu(); | 3604 | synchronize_rcu(); |
3605 | kfree(old_disk_conf); | 3605 | kfree(old_disk_conf); |
3606 | 3606 | ||
@@ -3687,14 +3687,14 @@ static int receive_uuids(struct drbd_connection *connection, struct packet_info | |||
3687 | (device->ed_uuid & ~((u64)1)) != (p_uuid[UI_CURRENT] & ~((u64)1))) { | 3687 | (device->ed_uuid & ~((u64)1)) != (p_uuid[UI_CURRENT] & ~((u64)1))) { |
3688 | dev_err(DEV, "Can only connect to data with current UUID=%016llX\n", | 3688 | dev_err(DEV, "Can only connect to data with current UUID=%016llX\n", |
3689 | (unsigned long long)device->ed_uuid); | 3689 | (unsigned long long)device->ed_uuid); |
3690 | conn_request_state(device->connection, NS(conn, C_DISCONNECTING), CS_HARD); | 3690 | conn_request_state(first_peer_device(device)->connection, NS(conn, C_DISCONNECTING), CS_HARD); |
3691 | return -EIO; | 3691 | return -EIO; |
3692 | } | 3692 | } |
3693 | 3693 | ||
3694 | if (get_ldev(device)) { | 3694 | if (get_ldev(device)) { |
3695 | int skip_initial_sync = | 3695 | int skip_initial_sync = |
3696 | device->state.conn == C_CONNECTED && | 3696 | device->state.conn == C_CONNECTED && |
3697 | device->connection->agreed_pro_version >= 90 && | 3697 | first_peer_device(device)->connection->agreed_pro_version >= 90 && |
3698 | device->ldev->md.uuid[UI_CURRENT] == UUID_JUST_CREATED && | 3698 | device->ldev->md.uuid[UI_CURRENT] == UUID_JUST_CREATED && |
3699 | (p_uuid[UI_FLAGS] & 8); | 3699 | (p_uuid[UI_FLAGS] & 8); |
3700 | if (skip_initial_sync) { | 3700 | if (skip_initial_sync) { |
@@ -3777,7 +3777,7 @@ static int receive_req_state(struct drbd_connection *connection, struct packet_i | |||
3777 | mask.i = be32_to_cpu(p->mask); | 3777 | mask.i = be32_to_cpu(p->mask); |
3778 | val.i = be32_to_cpu(p->val); | 3778 | val.i = be32_to_cpu(p->val); |
3779 | 3779 | ||
3780 | if (test_bit(RESOLVE_CONFLICTS, &device->connection->flags) && | 3780 | if (test_bit(RESOLVE_CONFLICTS, &first_peer_device(device)->connection->flags) && |
3781 | mutex_is_locked(device->state_mutex)) { | 3781 | mutex_is_locked(device->state_mutex)) { |
3782 | drbd_send_sr_reply(device, SS_CONCURRENT_ST_CHG); | 3782 | drbd_send_sr_reply(device, SS_CONCURRENT_ST_CHG); |
3783 | return 0; | 3783 | return 0; |
@@ -3839,10 +3839,10 @@ static int receive_state(struct drbd_connection *connection, struct packet_info | |||
3839 | dev_info(DEV, "real peer disk state = %s\n", drbd_disk_str(real_peer_disk)); | 3839 | dev_info(DEV, "real peer disk state = %s\n", drbd_disk_str(real_peer_disk)); |
3840 | } | 3840 | } |
3841 | 3841 | ||
3842 | spin_lock_irq(&device->connection->req_lock); | 3842 | spin_lock_irq(&first_peer_device(device)->connection->req_lock); |
3843 | retry: | 3843 | retry: |
3844 | os = ns = drbd_read_state(device); | 3844 | os = ns = drbd_read_state(device); |
3845 | spin_unlock_irq(&device->connection->req_lock); | 3845 | spin_unlock_irq(&first_peer_device(device)->connection->req_lock); |
3846 | 3846 | ||
3847 | /* If some other part of the code (asender thread, timeout) | 3847 | /* If some other part of the code (asender thread, timeout) |
3848 | * already decided to close the connection again, | 3848 | * already decided to close the connection again, |
@@ -3936,16 +3936,16 @@ static int receive_state(struct drbd_connection *connection, struct packet_info | |||
3936 | peer_state.disk = D_DISKLESS; | 3936 | peer_state.disk = D_DISKLESS; |
3937 | real_peer_disk = D_DISKLESS; | 3937 | real_peer_disk = D_DISKLESS; |
3938 | } else { | 3938 | } else { |
3939 | if (test_and_clear_bit(CONN_DRY_RUN, &device->connection->flags)) | 3939 | if (test_and_clear_bit(CONN_DRY_RUN, &first_peer_device(device)->connection->flags)) |
3940 | return -EIO; | 3940 | return -EIO; |
3941 | D_ASSERT(os.conn == C_WF_REPORT_PARAMS); | 3941 | D_ASSERT(os.conn == C_WF_REPORT_PARAMS); |
3942 | conn_request_state(device->connection, NS(conn, C_DISCONNECTING), CS_HARD); | 3942 | conn_request_state(first_peer_device(device)->connection, NS(conn, C_DISCONNECTING), CS_HARD); |
3943 | return -EIO; | 3943 | return -EIO; |
3944 | } | 3944 | } |
3945 | } | 3945 | } |
3946 | } | 3946 | } |
3947 | 3947 | ||
3948 | spin_lock_irq(&device->connection->req_lock); | 3948 | spin_lock_irq(&first_peer_device(device)->connection->req_lock); |
3949 | if (os.i != drbd_read_state(device).i) | 3949 | if (os.i != drbd_read_state(device).i) |
3950 | goto retry; | 3950 | goto retry; |
3951 | clear_bit(CONSIDER_RESYNC, &device->flags); | 3951 | clear_bit(CONSIDER_RESYNC, &device->flags); |
@@ -3959,20 +3959,20 @@ static int receive_state(struct drbd_connection *connection, struct packet_info | |||
3959 | test_bit(NEW_CUR_UUID, &device->flags)) { | 3959 | test_bit(NEW_CUR_UUID, &device->flags)) { |
3960 | /* Do not allow tl_restart(RESEND) for a rebooted peer. We can only allow this | 3960 | /* Do not allow tl_restart(RESEND) for a rebooted peer. We can only allow this |
3961 | for temporal network outages! */ | 3961 | for temporal network outages! */ |
3962 | spin_unlock_irq(&device->connection->req_lock); | 3962 | spin_unlock_irq(&first_peer_device(device)->connection->req_lock); |
3963 | dev_err(DEV, "Aborting Connect, can not thaw IO with an only Consistent peer\n"); | 3963 | dev_err(DEV, "Aborting Connect, can not thaw IO with an only Consistent peer\n"); |
3964 | tl_clear(device->connection); | 3964 | tl_clear(first_peer_device(device)->connection); |
3965 | drbd_uuid_new_current(device); | 3965 | drbd_uuid_new_current(device); |
3966 | clear_bit(NEW_CUR_UUID, &device->flags); | 3966 | clear_bit(NEW_CUR_UUID, &device->flags); |
3967 | conn_request_state(device->connection, NS2(conn, C_PROTOCOL_ERROR, susp, 0), CS_HARD); | 3967 | conn_request_state(first_peer_device(device)->connection, NS2(conn, C_PROTOCOL_ERROR, susp, 0), CS_HARD); |
3968 | return -EIO; | 3968 | return -EIO; |
3969 | } | 3969 | } |
3970 | rv = _drbd_set_state(device, ns, cs_flags, NULL); | 3970 | rv = _drbd_set_state(device, ns, cs_flags, NULL); |
3971 | ns = drbd_read_state(device); | 3971 | ns = drbd_read_state(device); |
3972 | spin_unlock_irq(&device->connection->req_lock); | 3972 | spin_unlock_irq(&first_peer_device(device)->connection->req_lock); |
3973 | 3973 | ||
3974 | if (rv < SS_SUCCESS) { | 3974 | if (rv < SS_SUCCESS) { |
3975 | conn_request_state(device->connection, NS(conn, C_DISCONNECTING), CS_HARD); | 3975 | conn_request_state(first_peer_device(device)->connection, NS(conn, C_DISCONNECTING), CS_HARD); |
3976 | return -EIO; | 3976 | return -EIO; |
3977 | } | 3977 | } |
3978 | 3978 | ||
@@ -4038,7 +4038,7 @@ receive_bitmap_plain(struct drbd_device *device, unsigned int size, | |||
4038 | unsigned long *p, struct bm_xfer_ctx *c) | 4038 | unsigned long *p, struct bm_xfer_ctx *c) |
4039 | { | 4039 | { |
4040 | unsigned int data_size = DRBD_SOCKET_BUFFER_SIZE - | 4040 | unsigned int data_size = DRBD_SOCKET_BUFFER_SIZE - |
4041 | drbd_header_size(device->connection); | 4041 | drbd_header_size(first_peer_device(device)->connection); |
4042 | unsigned int num_words = min_t(size_t, data_size / sizeof(*p), | 4042 | unsigned int num_words = min_t(size_t, data_size / sizeof(*p), |
4043 | c->bm_words - c->word_offset); | 4043 | c->bm_words - c->word_offset); |
4044 | unsigned int want = num_words * sizeof(*p); | 4044 | unsigned int want = num_words * sizeof(*p); |
@@ -4050,7 +4050,7 @@ receive_bitmap_plain(struct drbd_device *device, unsigned int size, | |||
4050 | } | 4050 | } |
4051 | if (want == 0) | 4051 | if (want == 0) |
4052 | return 0; | 4052 | return 0; |
4053 | err = drbd_recv_all(device->connection, p, want); | 4053 | err = drbd_recv_all(first_peer_device(device)->connection, p, want); |
4054 | if (err) | 4054 | if (err) |
4055 | return err; | 4055 | return err; |
4056 | 4056 | ||
@@ -4168,7 +4168,7 @@ decode_bitmap_c(struct drbd_device *device, | |||
4168 | * during all our tests. */ | 4168 | * during all our tests. */ |
4169 | 4169 | ||
4170 | dev_err(DEV, "receive_bitmap_c: unknown encoding %u\n", p->encoding); | 4170 | dev_err(DEV, "receive_bitmap_c: unknown encoding %u\n", p->encoding); |
4171 | conn_request_state(device->connection, NS(conn, C_PROTOCOL_ERROR), CS_HARD); | 4171 | conn_request_state(first_peer_device(device)->connection, NS(conn, C_PROTOCOL_ERROR), CS_HARD); |
4172 | return -EIO; | 4172 | return -EIO; |
4173 | } | 4173 | } |
4174 | 4174 | ||
@@ -4176,7 +4176,7 @@ void INFO_bm_xfer_stats(struct drbd_device *device, | |||
4176 | const char *direction, struct bm_xfer_ctx *c) | 4176 | const char *direction, struct bm_xfer_ctx *c) |
4177 | { | 4177 | { |
4178 | /* what would it take to transfer it "plaintext" */ | 4178 | /* what would it take to transfer it "plaintext" */ |
4179 | unsigned int header_size = drbd_header_size(device->connection); | 4179 | unsigned int header_size = drbd_header_size(first_peer_device(device)->connection); |
4180 | unsigned int data_size = DRBD_SOCKET_BUFFER_SIZE - header_size; | 4180 | unsigned int data_size = DRBD_SOCKET_BUFFER_SIZE - header_size; |
4181 | unsigned int plain = | 4181 | unsigned int plain = |
4182 | header_size * (DIV_ROUND_UP(c->bm_words, data_size) + 1) + | 4182 | header_size * (DIV_ROUND_UP(c->bm_words, data_size) + 1) + |
@@ -4253,7 +4253,7 @@ static int receive_bitmap(struct drbd_connection *connection, struct packet_info | |||
4253 | err = -EIO; | 4253 | err = -EIO; |
4254 | goto out; | 4254 | goto out; |
4255 | } | 4255 | } |
4256 | err = drbd_recv_all(device->connection, p, pi->size); | 4256 | err = drbd_recv_all(first_peer_device(device)->connection, p, pi->size); |
4257 | if (err) | 4257 | if (err) |
4258 | goto out; | 4258 | goto out; |
4259 | err = decode_bitmap_c(device, p, &c, pi->size); | 4259 | err = decode_bitmap_c(device, p, &c, pi->size); |
@@ -4271,7 +4271,7 @@ static int receive_bitmap(struct drbd_connection *connection, struct packet_info | |||
4271 | goto out; | 4271 | goto out; |
4272 | break; | 4272 | break; |
4273 | } | 4273 | } |
4274 | err = drbd_recv_header(device->connection, pi); | 4274 | err = drbd_recv_header(first_peer_device(device)->connection, pi); |
4275 | if (err) | 4275 | if (err) |
4276 | goto out; | 4276 | goto out; |
4277 | } | 4277 | } |
@@ -4491,11 +4491,11 @@ static int drbd_disconnected(struct drbd_device *device) | |||
4491 | unsigned int i; | 4491 | unsigned int i; |
4492 | 4492 | ||
4493 | /* wait for current activity to cease. */ | 4493 | /* wait for current activity to cease. */ |
4494 | spin_lock_irq(&device->connection->req_lock); | 4494 | spin_lock_irq(&first_peer_device(device)->connection->req_lock); |
4495 | _drbd_wait_ee_list_empty(device, &device->active_ee); | 4495 | _drbd_wait_ee_list_empty(device, &device->active_ee); |
4496 | _drbd_wait_ee_list_empty(device, &device->sync_ee); | 4496 | _drbd_wait_ee_list_empty(device, &device->sync_ee); |
4497 | _drbd_wait_ee_list_empty(device, &device->read_ee); | 4497 | _drbd_wait_ee_list_empty(device, &device->read_ee); |
4498 | spin_unlock_irq(&device->connection->req_lock); | 4498 | spin_unlock_irq(&first_peer_device(device)->connection->req_lock); |
4499 | 4499 | ||
4500 | /* We do not have data structures that would allow us to | 4500 | /* We do not have data structures that would allow us to |
4501 | * get the rs_pending_cnt down to 0 again. | 4501 | * get the rs_pending_cnt down to 0 again. |
@@ -4536,7 +4536,7 @@ static int drbd_disconnected(struct drbd_device *device) | |||
4536 | device->p_uuid = NULL; | 4536 | device->p_uuid = NULL; |
4537 | 4537 | ||
4538 | if (!drbd_suspended(device)) | 4538 | if (!drbd_suspended(device)) |
4539 | tl_clear(device->connection); | 4539 | tl_clear(first_peer_device(device)->connection); |
4540 | 4540 | ||
4541 | drbd_md_sync(device); | 4541 | drbd_md_sync(device); |
4542 | 4542 | ||
@@ -4937,7 +4937,7 @@ static int got_IsInSync(struct drbd_connection *connection, struct packet_info * | |||
4937 | if (!device) | 4937 | if (!device) |
4938 | return -EIO; | 4938 | return -EIO; |
4939 | 4939 | ||
4940 | D_ASSERT(device->connection->agreed_pro_version >= 89); | 4940 | D_ASSERT(first_peer_device(device)->connection->agreed_pro_version >= 89); |
4941 | 4941 | ||
4942 | update_peer_seq(device, be32_to_cpu(p->seq_num)); | 4942 | update_peer_seq(device, be32_to_cpu(p->seq_num)); |
4943 | 4943 | ||
@@ -4962,14 +4962,14 @@ validate_req_change_req_state(struct drbd_device *device, u64 id, sector_t secto | |||
4962 | struct drbd_request *req; | 4962 | struct drbd_request *req; |
4963 | struct bio_and_error m; | 4963 | struct bio_and_error m; |
4964 | 4964 | ||
4965 | spin_lock_irq(&device->connection->req_lock); | 4965 | spin_lock_irq(&first_peer_device(device)->connection->req_lock); |
4966 | req = find_request(device, root, id, sector, missing_ok, func); | 4966 | req = find_request(device, root, id, sector, missing_ok, func); |
4967 | if (unlikely(!req)) { | 4967 | if (unlikely(!req)) { |
4968 | spin_unlock_irq(&device->connection->req_lock); | 4968 | spin_unlock_irq(&first_peer_device(device)->connection->req_lock); |
4969 | return -EIO; | 4969 | return -EIO; |
4970 | } | 4970 | } |
4971 | __req_mod(req, what, &m); | 4971 | __req_mod(req, what, &m); |
4972 | spin_unlock_irq(&device->connection->req_lock); | 4972 | spin_unlock_irq(&first_peer_device(device)->connection->req_lock); |
4973 | 4973 | ||
4974 | if (m.bio) | 4974 | if (m.bio) |
4975 | complete_master_bio(device, &m); | 4975 | complete_master_bio(device, &m); |
@@ -5169,7 +5169,7 @@ static int got_OVResult(struct drbd_connection *connection, struct packet_info * | |||
5169 | if (w) { | 5169 | if (w) { |
5170 | w->cb = w_ov_finished; | 5170 | w->cb = w_ov_finished; |
5171 | w->device = device; | 5171 | w->device = device; |
5172 | drbd_queue_work(&device->connection->sender_work, w); | 5172 | drbd_queue_work(&first_peer_device(device)->connection->sender_work, w); |
5173 | } else { | 5173 | } else { |
5174 | dev_err(DEV, "kmalloc(w) failed."); | 5174 | dev_err(DEV, "kmalloc(w) failed."); |
5175 | ov_out_of_sync_print(device); | 5175 | ov_out_of_sync_print(device); |
diff --git a/drivers/block/drbd/drbd_req.c b/drivers/block/drbd/drbd_req.c index a33a35e4655d..dd1033472763 100644 --- a/drivers/block/drbd/drbd_req.c +++ b/drivers/block/drbd/drbd_req.c | |||
@@ -274,8 +274,8 @@ void drbd_req_complete(struct drbd_request *req, struct bio_and_error *m) | |||
274 | * and reset the transfer log epoch write_cnt. | 274 | * and reset the transfer log epoch write_cnt. |
275 | */ | 275 | */ |
276 | if (rw == WRITE && | 276 | if (rw == WRITE && |
277 | req->epoch == atomic_read(&device->connection->current_tle_nr)) | 277 | req->epoch == atomic_read(&first_peer_device(device)->connection->current_tle_nr)) |
278 | start_new_tl_epoch(device->connection); | 278 | start_new_tl_epoch(first_peer_device(device)->connection); |
279 | 279 | ||
280 | /* Update disk stats */ | 280 | /* Update disk stats */ |
281 | _drbd_end_io_acct(device, req); | 281 | _drbd_end_io_acct(device, req); |
@@ -477,7 +477,7 @@ int __req_mod(struct drbd_request *req, enum drbd_req_event what, | |||
477 | * and from w_read_retry_remote */ | 477 | * and from w_read_retry_remote */ |
478 | D_ASSERT(!(req->rq_state & RQ_NET_MASK)); | 478 | D_ASSERT(!(req->rq_state & RQ_NET_MASK)); |
479 | rcu_read_lock(); | 479 | rcu_read_lock(); |
480 | nc = rcu_dereference(device->connection->net_conf); | 480 | nc = rcu_dereference(first_peer_device(device)->connection->net_conf); |
481 | p = nc->wire_protocol; | 481 | p = nc->wire_protocol; |
482 | rcu_read_unlock(); | 482 | rcu_read_unlock(); |
483 | req->rq_state |= | 483 | req->rq_state |= |
@@ -542,7 +542,7 @@ int __req_mod(struct drbd_request *req, enum drbd_req_event what, | |||
542 | D_ASSERT((req->rq_state & RQ_LOCAL_MASK) == 0); | 542 | D_ASSERT((req->rq_state & RQ_LOCAL_MASK) == 0); |
543 | mod_rq_state(req, m, 0, RQ_NET_QUEUED); | 543 | mod_rq_state(req, m, 0, RQ_NET_QUEUED); |
544 | req->w.cb = w_send_read_req; | 544 | req->w.cb = w_send_read_req; |
545 | drbd_queue_work(&device->connection->sender_work, &req->w); | 545 | drbd_queue_work(&first_peer_device(device)->connection->sender_work, &req->w); |
546 | break; | 546 | break; |
547 | 547 | ||
548 | case QUEUE_FOR_NET_WRITE: | 548 | case QUEUE_FOR_NET_WRITE: |
@@ -577,22 +577,22 @@ int __req_mod(struct drbd_request *req, enum drbd_req_event what, | |||
577 | D_ASSERT(req->rq_state & RQ_NET_PENDING); | 577 | D_ASSERT(req->rq_state & RQ_NET_PENDING); |
578 | mod_rq_state(req, m, 0, RQ_NET_QUEUED|RQ_EXP_BARR_ACK); | 578 | mod_rq_state(req, m, 0, RQ_NET_QUEUED|RQ_EXP_BARR_ACK); |
579 | req->w.cb = w_send_dblock; | 579 | req->w.cb = w_send_dblock; |
580 | drbd_queue_work(&device->connection->sender_work, &req->w); | 580 | drbd_queue_work(&first_peer_device(device)->connection->sender_work, &req->w); |
581 | 581 | ||
582 | /* close the epoch, in case it outgrew the limit */ | 582 | /* close the epoch, in case it outgrew the limit */ |
583 | rcu_read_lock(); | 583 | rcu_read_lock(); |
584 | nc = rcu_dereference(device->connection->net_conf); | 584 | nc = rcu_dereference(first_peer_device(device)->connection->net_conf); |
585 | p = nc->max_epoch_size; | 585 | p = nc->max_epoch_size; |
586 | rcu_read_unlock(); | 586 | rcu_read_unlock(); |
587 | if (device->connection->current_tle_writes >= p) | 587 | if (first_peer_device(device)->connection->current_tle_writes >= p) |
588 | start_new_tl_epoch(device->connection); | 588 | start_new_tl_epoch(first_peer_device(device)->connection); |
589 | 589 | ||
590 | break; | 590 | break; |
591 | 591 | ||
592 | case QUEUE_FOR_SEND_OOS: | 592 | case QUEUE_FOR_SEND_OOS: |
593 | mod_rq_state(req, m, 0, RQ_NET_QUEUED); | 593 | mod_rq_state(req, m, 0, RQ_NET_QUEUED); |
594 | req->w.cb = w_send_out_of_sync; | 594 | req->w.cb = w_send_out_of_sync; |
595 | drbd_queue_work(&device->connection->sender_work, &req->w); | 595 | drbd_queue_work(&first_peer_device(device)->connection->sender_work, &req->w); |
596 | break; | 596 | break; |
597 | 597 | ||
598 | case READ_RETRY_REMOTE_CANCELED: | 598 | case READ_RETRY_REMOTE_CANCELED: |
@@ -704,7 +704,7 @@ int __req_mod(struct drbd_request *req, enum drbd_req_event what, | |||
704 | 704 | ||
705 | get_ldev(device); /* always succeeds in this call path */ | 705 | get_ldev(device); /* always succeeds in this call path */ |
706 | req->w.cb = w_restart_disk_io; | 706 | req->w.cb = w_restart_disk_io; |
707 | drbd_queue_work(&device->connection->sender_work, &req->w); | 707 | drbd_queue_work(&first_peer_device(device)->connection->sender_work, &req->w); |
708 | break; | 708 | break; |
709 | 709 | ||
710 | case RESEND: | 710 | case RESEND: |
@@ -725,7 +725,7 @@ int __req_mod(struct drbd_request *req, enum drbd_req_event what, | |||
725 | 725 | ||
726 | mod_rq_state(req, m, RQ_COMPLETION_SUSP, RQ_NET_QUEUED|RQ_NET_PENDING); | 726 | mod_rq_state(req, m, RQ_COMPLETION_SUSP, RQ_NET_QUEUED|RQ_NET_PENDING); |
727 | if (req->w.cb) { | 727 | if (req->w.cb) { |
728 | drbd_queue_work(&device->connection->sender_work, &req->w); | 728 | drbd_queue_work(&first_peer_device(device)->connection->sender_work, &req->w); |
729 | rv = req->rq_state & RQ_WRITE ? MR_WRITE : MR_READ; | 729 | rv = req->rq_state & RQ_WRITE ? MR_WRITE : MR_READ; |
730 | } /* else: FIXME can this happen? */ | 730 | } /* else: FIXME can this happen? */ |
731 | break; | 731 | break; |
@@ -757,7 +757,7 @@ int __req_mod(struct drbd_request *req, enum drbd_req_event what, | |||
757 | break; | 757 | break; |
758 | 758 | ||
759 | case QUEUE_AS_DRBD_BARRIER: | 759 | case QUEUE_AS_DRBD_BARRIER: |
760 | start_new_tl_epoch(device->connection); | 760 | start_new_tl_epoch(first_peer_device(device)->connection); |
761 | mod_rq_state(req, m, 0, RQ_NET_OK|RQ_NET_DONE); | 761 | mod_rq_state(req, m, 0, RQ_NET_OK|RQ_NET_DONE); |
762 | break; | 762 | break; |
763 | }; | 763 | }; |
@@ -851,9 +851,9 @@ static void complete_conflicting_writes(struct drbd_request *req) | |||
851 | break; | 851 | break; |
852 | /* Indicate to wake up device->misc_wait on progress. */ | 852 | /* Indicate to wake up device->misc_wait on progress. */ |
853 | i->waiting = true; | 853 | i->waiting = true; |
854 | spin_unlock_irq(&device->connection->req_lock); | 854 | spin_unlock_irq(&first_peer_device(device)->connection->req_lock); |
855 | schedule(); | 855 | schedule(); |
856 | spin_lock_irq(&device->connection->req_lock); | 856 | spin_lock_irq(&first_peer_device(device)->connection->req_lock); |
857 | } | 857 | } |
858 | finish_wait(&device->misc_wait, &wait); | 858 | finish_wait(&device->misc_wait, &wait); |
859 | } | 859 | } |
@@ -861,7 +861,7 @@ static void complete_conflicting_writes(struct drbd_request *req) | |||
861 | /* called within req_lock and rcu_read_lock() */ | 861 | /* called within req_lock and rcu_read_lock() */ |
862 | static void maybe_pull_ahead(struct drbd_device *device) | 862 | static void maybe_pull_ahead(struct drbd_device *device) |
863 | { | 863 | { |
864 | struct drbd_connection *connection = device->connection; | 864 | struct drbd_connection *connection = first_peer_device(device)->connection; |
865 | struct net_conf *nc; | 865 | struct net_conf *nc; |
866 | bool congested = false; | 866 | bool congested = false; |
867 | enum drbd_on_congestion on_congestion; | 867 | enum drbd_on_congestion on_congestion; |
@@ -894,7 +894,7 @@ static void maybe_pull_ahead(struct drbd_device *device) | |||
894 | 894 | ||
895 | if (congested) { | 895 | if (congested) { |
896 | /* start a new epoch for non-mirrored writes */ | 896 | /* start a new epoch for non-mirrored writes */ |
897 | start_new_tl_epoch(device->connection); | 897 | start_new_tl_epoch(first_peer_device(device)->connection); |
898 | 898 | ||
899 | if (on_congestion == OC_PULL_AHEAD) | 899 | if (on_congestion == OC_PULL_AHEAD) |
900 | _drbd_set_state(_NS(device, conn, C_AHEAD), 0, NULL); | 900 | _drbd_set_state(_NS(device, conn, C_AHEAD), 0, NULL); |
@@ -1078,7 +1078,7 @@ static void drbd_send_and_submit(struct drbd_device *device, struct drbd_request | |||
1078 | struct bio_and_error m = { NULL, }; | 1078 | struct bio_and_error m = { NULL, }; |
1079 | bool no_remote = false; | 1079 | bool no_remote = false; |
1080 | 1080 | ||
1081 | spin_lock_irq(&device->connection->req_lock); | 1081 | spin_lock_irq(&first_peer_device(device)->connection->req_lock); |
1082 | if (rw == WRITE) { | 1082 | if (rw == WRITE) { |
1083 | /* This may temporarily give up the req_lock, | 1083 | /* This may temporarily give up the req_lock, |
1084 | * but will re-aquire it before it returns here. | 1084 | * but will re-aquire it before it returns here. |
@@ -1112,15 +1112,15 @@ static void drbd_send_and_submit(struct drbd_device *device, struct drbd_request | |||
1112 | } | 1112 | } |
1113 | 1113 | ||
1114 | /* which transfer log epoch does this belong to? */ | 1114 | /* which transfer log epoch does this belong to? */ |
1115 | req->epoch = atomic_read(&device->connection->current_tle_nr); | 1115 | req->epoch = atomic_read(&first_peer_device(device)->connection->current_tle_nr); |
1116 | 1116 | ||
1117 | /* no point in adding empty flushes to the transfer log, | 1117 | /* no point in adding empty flushes to the transfer log, |
1118 | * they are mapped to drbd barriers already. */ | 1118 | * they are mapped to drbd barriers already. */ |
1119 | if (likely(req->i.size!=0)) { | 1119 | if (likely(req->i.size!=0)) { |
1120 | if (rw == WRITE) | 1120 | if (rw == WRITE) |
1121 | device->connection->current_tle_writes++; | 1121 | first_peer_device(device)->connection->current_tle_writes++; |
1122 | 1122 | ||
1123 | list_add_tail(&req->tl_requests, &device->connection->transfer_log); | 1123 | list_add_tail(&req->tl_requests, &first_peer_device(device)->connection->transfer_log); |
1124 | } | 1124 | } |
1125 | 1125 | ||
1126 | if (rw == WRITE) { | 1126 | if (rw == WRITE) { |
@@ -1140,9 +1140,9 @@ static void drbd_send_and_submit(struct drbd_device *device, struct drbd_request | |||
1140 | /* needs to be marked within the same spinlock */ | 1140 | /* needs to be marked within the same spinlock */ |
1141 | _req_mod(req, TO_BE_SUBMITTED); | 1141 | _req_mod(req, TO_BE_SUBMITTED); |
1142 | /* but we need to give up the spinlock to submit */ | 1142 | /* but we need to give up the spinlock to submit */ |
1143 | spin_unlock_irq(&device->connection->req_lock); | 1143 | spin_unlock_irq(&first_peer_device(device)->connection->req_lock); |
1144 | drbd_submit_req_private_bio(req); | 1144 | drbd_submit_req_private_bio(req); |
1145 | spin_lock_irq(&device->connection->req_lock); | 1145 | spin_lock_irq(&first_peer_device(device)->connection->req_lock); |
1146 | } else if (no_remote) { | 1146 | } else if (no_remote) { |
1147 | nodata: | 1147 | nodata: |
1148 | if (__ratelimit(&drbd_ratelimit_state)) | 1148 | if (__ratelimit(&drbd_ratelimit_state)) |
@@ -1155,7 +1155,7 @@ nodata: | |||
1155 | out: | 1155 | out: |
1156 | if (drbd_req_put_completion_ref(req, &m, 1)) | 1156 | if (drbd_req_put_completion_ref(req, &m, 1)) |
1157 | kref_put(&req->kref, drbd_req_destroy); | 1157 | kref_put(&req->kref, drbd_req_destroy); |
1158 | spin_unlock_irq(&device->connection->req_lock); | 1158 | spin_unlock_irq(&first_peer_device(device)->connection->req_lock); |
1159 | 1159 | ||
1160 | if (m.bio) | 1160 | if (m.bio) |
1161 | complete_master_bio(device, &m); | 1161 | complete_master_bio(device, &m); |
@@ -1336,7 +1336,7 @@ static struct drbd_request *find_oldest_request(struct drbd_connection *connecti | |||
1336 | void request_timer_fn(unsigned long data) | 1336 | void request_timer_fn(unsigned long data) |
1337 | { | 1337 | { |
1338 | struct drbd_device *device = (struct drbd_device *) data; | 1338 | struct drbd_device *device = (struct drbd_device *) data; |
1339 | struct drbd_connection *connection = device->connection; | 1339 | struct drbd_connection *connection = first_peer_device(device)->connection; |
1340 | struct drbd_request *req; /* oldest request */ | 1340 | struct drbd_request *req; /* oldest request */ |
1341 | struct net_conf *nc; | 1341 | struct net_conf *nc; |
1342 | unsigned long ent = 0, dt = 0, et, nt; /* effective timeout = ko_count * timeout */ | 1342 | unsigned long ent = 0, dt = 0, et, nt; /* effective timeout = ko_count * timeout */ |
diff --git a/drivers/block/drbd/drbd_req.h b/drivers/block/drbd/drbd_req.h index 407404bb8807..27283e619a07 100644 --- a/drivers/block/drbd/drbd_req.h +++ b/drivers/block/drbd/drbd_req.h | |||
@@ -318,9 +318,9 @@ static inline int req_mod(struct drbd_request *req, | |||
318 | struct bio_and_error m; | 318 | struct bio_and_error m; |
319 | int rv; | 319 | int rv; |
320 | 320 | ||
321 | spin_lock_irqsave(&device->connection->req_lock, flags); | 321 | spin_lock_irqsave(&first_peer_device(device)->connection->req_lock, flags); |
322 | rv = __req_mod(req, what, &m); | 322 | rv = __req_mod(req, what, &m); |
323 | spin_unlock_irqrestore(&device->connection->req_lock, flags); | 323 | spin_unlock_irqrestore(&first_peer_device(device)->connection->req_lock, flags); |
324 | 324 | ||
325 | if (m.bio) | 325 | if (m.bio) |
326 | complete_master_bio(device, &m); | 326 | complete_master_bio(device, &m); |
diff --git a/drivers/block/drbd/drbd_state.c b/drivers/block/drbd/drbd_state.c index ecc63cf85d85..22c4e7d57a80 100644 --- a/drivers/block/drbd/drbd_state.c +++ b/drivers/block/drbd/drbd_state.c | |||
@@ -237,10 +237,10 @@ drbd_change_state(struct drbd_device *device, enum chg_state_flags f, | |||
237 | union drbd_state ns; | 237 | union drbd_state ns; |
238 | enum drbd_state_rv rv; | 238 | enum drbd_state_rv rv; |
239 | 239 | ||
240 | spin_lock_irqsave(&device->connection->req_lock, flags); | 240 | spin_lock_irqsave(&first_peer_device(device)->connection->req_lock, flags); |
241 | ns = apply_mask_val(drbd_read_state(device), mask, val); | 241 | ns = apply_mask_val(drbd_read_state(device), mask, val); |
242 | rv = _drbd_set_state(device, ns, f, NULL); | 242 | rv = _drbd_set_state(device, ns, f, NULL); |
243 | spin_unlock_irqrestore(&device->connection->req_lock, flags); | 243 | spin_unlock_irqrestore(&first_peer_device(device)->connection->req_lock, flags); |
244 | 244 | ||
245 | return rv; | 245 | return rv; |
246 | } | 246 | } |
@@ -271,7 +271,7 @@ _req_st_cond(struct drbd_device *device, union drbd_state mask, | |||
271 | if (test_and_clear_bit(CL_ST_CHG_FAIL, &device->flags)) | 271 | if (test_and_clear_bit(CL_ST_CHG_FAIL, &device->flags)) |
272 | return SS_CW_FAILED_BY_PEER; | 272 | return SS_CW_FAILED_BY_PEER; |
273 | 273 | ||
274 | spin_lock_irqsave(&device->connection->req_lock, flags); | 274 | spin_lock_irqsave(&first_peer_device(device)->connection->req_lock, flags); |
275 | os = drbd_read_state(device); | 275 | os = drbd_read_state(device); |
276 | ns = sanitize_state(device, apply_mask_val(os, mask, val), NULL); | 276 | ns = sanitize_state(device, apply_mask_val(os, mask, val), NULL); |
277 | rv = is_valid_transition(os, ns); | 277 | rv = is_valid_transition(os, ns); |
@@ -283,12 +283,12 @@ _req_st_cond(struct drbd_device *device, union drbd_state mask, | |||
283 | if (rv == SS_UNKNOWN_ERROR) { | 283 | if (rv == SS_UNKNOWN_ERROR) { |
284 | rv = is_valid_state(device, ns); | 284 | rv = is_valid_state(device, ns); |
285 | if (rv >= SS_SUCCESS) { | 285 | if (rv >= SS_SUCCESS) { |
286 | rv = is_valid_soft_transition(os, ns, device->connection); | 286 | rv = is_valid_soft_transition(os, ns, first_peer_device(device)->connection); |
287 | if (rv >= SS_SUCCESS) | 287 | if (rv >= SS_SUCCESS) |
288 | rv = SS_UNKNOWN_ERROR; /* cont waiting, otherwise fail. */ | 288 | rv = SS_UNKNOWN_ERROR; /* cont waiting, otherwise fail. */ |
289 | } | 289 | } |
290 | } | 290 | } |
291 | spin_unlock_irqrestore(&device->connection->req_lock, flags); | 291 | spin_unlock_irqrestore(&first_peer_device(device)->connection->req_lock, flags); |
292 | 292 | ||
293 | return rv; | 293 | return rv; |
294 | } | 294 | } |
@@ -317,20 +317,20 @@ drbd_req_state(struct drbd_device *device, union drbd_state mask, | |||
317 | if (f & CS_SERIALIZE) | 317 | if (f & CS_SERIALIZE) |
318 | mutex_lock(device->state_mutex); | 318 | mutex_lock(device->state_mutex); |
319 | 319 | ||
320 | spin_lock_irqsave(&device->connection->req_lock, flags); | 320 | spin_lock_irqsave(&first_peer_device(device)->connection->req_lock, flags); |
321 | os = drbd_read_state(device); | 321 | os = drbd_read_state(device); |
322 | ns = sanitize_state(device, apply_mask_val(os, mask, val), NULL); | 322 | ns = sanitize_state(device, apply_mask_val(os, mask, val), NULL); |
323 | rv = is_valid_transition(os, ns); | 323 | rv = is_valid_transition(os, ns); |
324 | if (rv < SS_SUCCESS) { | 324 | if (rv < SS_SUCCESS) { |
325 | spin_unlock_irqrestore(&device->connection->req_lock, flags); | 325 | spin_unlock_irqrestore(&first_peer_device(device)->connection->req_lock, flags); |
326 | goto abort; | 326 | goto abort; |
327 | } | 327 | } |
328 | 328 | ||
329 | if (cl_wide_st_chg(device, os, ns)) { | 329 | if (cl_wide_st_chg(device, os, ns)) { |
330 | rv = is_valid_state(device, ns); | 330 | rv = is_valid_state(device, ns); |
331 | if (rv == SS_SUCCESS) | 331 | if (rv == SS_SUCCESS) |
332 | rv = is_valid_soft_transition(os, ns, device->connection); | 332 | rv = is_valid_soft_transition(os, ns, first_peer_device(device)->connection); |
333 | spin_unlock_irqrestore(&device->connection->req_lock, flags); | 333 | spin_unlock_irqrestore(&first_peer_device(device)->connection->req_lock, flags); |
334 | 334 | ||
335 | if (rv < SS_SUCCESS) { | 335 | if (rv < SS_SUCCESS) { |
336 | if (f & CS_VERBOSE) | 336 | if (f & CS_VERBOSE) |
@@ -353,17 +353,17 @@ drbd_req_state(struct drbd_device *device, union drbd_state mask, | |||
353 | print_st_err(device, os, ns, rv); | 353 | print_st_err(device, os, ns, rv); |
354 | goto abort; | 354 | goto abort; |
355 | } | 355 | } |
356 | spin_lock_irqsave(&device->connection->req_lock, flags); | 356 | spin_lock_irqsave(&first_peer_device(device)->connection->req_lock, flags); |
357 | ns = apply_mask_val(drbd_read_state(device), mask, val); | 357 | ns = apply_mask_val(drbd_read_state(device), mask, val); |
358 | rv = _drbd_set_state(device, ns, f, &done); | 358 | rv = _drbd_set_state(device, ns, f, &done); |
359 | } else { | 359 | } else { |
360 | rv = _drbd_set_state(device, ns, f, &done); | 360 | rv = _drbd_set_state(device, ns, f, &done); |
361 | } | 361 | } |
362 | 362 | ||
363 | spin_unlock_irqrestore(&device->connection->req_lock, flags); | 363 | spin_unlock_irqrestore(&first_peer_device(device)->connection->req_lock, flags); |
364 | 364 | ||
365 | if (f & CS_WAIT_COMPLETE && rv == SS_SUCCESS) { | 365 | if (f & CS_WAIT_COMPLETE && rv == SS_SUCCESS) { |
366 | D_ASSERT(current != device->connection->worker.task); | 366 | D_ASSERT(current != first_peer_device(device)->connection->worker.task); |
367 | wait_for_completion(&done); | 367 | wait_for_completion(&done); |
368 | } | 368 | } |
369 | 369 | ||
@@ -519,12 +519,12 @@ is_valid_state(struct drbd_device *device, union drbd_state ns) | |||
519 | put_ldev(device); | 519 | put_ldev(device); |
520 | } | 520 | } |
521 | 521 | ||
522 | nc = rcu_dereference(device->connection->net_conf); | 522 | nc = rcu_dereference(first_peer_device(device)->connection->net_conf); |
523 | if (nc) { | 523 | if (nc) { |
524 | if (!nc->two_primaries && ns.role == R_PRIMARY) { | 524 | if (!nc->two_primaries && ns.role == R_PRIMARY) { |
525 | if (ns.peer == R_PRIMARY) | 525 | if (ns.peer == R_PRIMARY) |
526 | rv = SS_TWO_PRIMARIES; | 526 | rv = SS_TWO_PRIMARIES; |
527 | else if (conn_highest_peer(device->connection) == R_PRIMARY) | 527 | else if (conn_highest_peer(first_peer_device(device)->connection) == R_PRIMARY) |
528 | rv = SS_O_VOL_PEER_PRI; | 528 | rv = SS_O_VOL_PEER_PRI; |
529 | } | 529 | } |
530 | } | 530 | } |
@@ -565,7 +565,7 @@ is_valid_state(struct drbd_device *device, union drbd_state ns) | |||
565 | rv = SS_NO_VERIFY_ALG; | 565 | rv = SS_NO_VERIFY_ALG; |
566 | 566 | ||
567 | else if ((ns.conn == C_VERIFY_S || ns.conn == C_VERIFY_T) && | 567 | else if ((ns.conn == C_VERIFY_S || ns.conn == C_VERIFY_T) && |
568 | device->connection->agreed_pro_version < 88) | 568 | first_peer_device(device)->connection->agreed_pro_version < 88) |
569 | rv = SS_NOT_SUPPORTED; | 569 | rv = SS_NOT_SUPPORTED; |
570 | 570 | ||
571 | else if (ns.role == R_PRIMARY && ns.disk < D_UP_TO_DATE && ns.pdsk < D_UP_TO_DATE) | 571 | else if (ns.role == R_PRIMARY && ns.disk < D_UP_TO_DATE && ns.pdsk < D_UP_TO_DATE) |
@@ -871,7 +871,7 @@ static union drbd_state sanitize_state(struct drbd_device *device, union drbd_st | |||
871 | (ns.role == R_PRIMARY && ns.conn < C_CONNECTED && ns.pdsk > D_OUTDATED)) | 871 | (ns.role == R_PRIMARY && ns.conn < C_CONNECTED && ns.pdsk > D_OUTDATED)) |
872 | ns.susp_fen = 1; /* Suspend IO while fence-peer handler runs (peer lost) */ | 872 | ns.susp_fen = 1; /* Suspend IO while fence-peer handler runs (peer lost) */ |
873 | 873 | ||
874 | if (device->connection->res_opts.on_no_data == OND_SUSPEND_IO && | 874 | if (first_peer_device(device)->connection->res_opts.on_no_data == OND_SUSPEND_IO && |
875 | (ns.role == R_PRIMARY && ns.disk < D_UP_TO_DATE && ns.pdsk < D_UP_TO_DATE)) | 875 | (ns.role == R_PRIMARY && ns.disk < D_UP_TO_DATE && ns.pdsk < D_UP_TO_DATE)) |
876 | ns.susp_nod = 1; /* Suspend IO while no data available (no accessible data available) */ | 876 | ns.susp_nod = 1; /* Suspend IO while no data available (no accessible data available) */ |
877 | 877 | ||
@@ -899,7 +899,7 @@ void drbd_resume_al(struct drbd_device *device) | |||
899 | /* helper for __drbd_set_state */ | 899 | /* helper for __drbd_set_state */ |
900 | static void set_ov_position(struct drbd_device *device, enum drbd_conns cs) | 900 | static void set_ov_position(struct drbd_device *device, enum drbd_conns cs) |
901 | { | 901 | { |
902 | if (device->connection->agreed_pro_version < 90) | 902 | if (first_peer_device(device)->connection->agreed_pro_version < 90) |
903 | device->ov_start_sector = 0; | 903 | device->ov_start_sector = 0; |
904 | device->rs_total = drbd_bm_bits(device); | 904 | device->rs_total = drbd_bm_bits(device); |
905 | device->ov_position = 0; | 905 | device->ov_position = 0; |
@@ -962,9 +962,9 @@ __drbd_set_state(struct drbd_device *device, union drbd_state ns, | |||
962 | this happen...*/ | 962 | this happen...*/ |
963 | 963 | ||
964 | if (is_valid_state(device, os) == rv) | 964 | if (is_valid_state(device, os) == rv) |
965 | rv = is_valid_soft_transition(os, ns, device->connection); | 965 | rv = is_valid_soft_transition(os, ns, first_peer_device(device)->connection); |
966 | } else | 966 | } else |
967 | rv = is_valid_soft_transition(os, ns, device->connection); | 967 | rv = is_valid_soft_transition(os, ns, first_peer_device(device)->connection); |
968 | } | 968 | } |
969 | 969 | ||
970 | if (rv < SS_SUCCESS) { | 970 | if (rv < SS_SUCCESS) { |
@@ -981,7 +981,8 @@ __drbd_set_state(struct drbd_device *device, union drbd_state ns, | |||
981 | sanitize_state(). Only display it here if we where not called from | 981 | sanitize_state(). Only display it here if we where not called from |
982 | _conn_request_state() */ | 982 | _conn_request_state() */ |
983 | if (!(flags & CS_DC_SUSP)) | 983 | if (!(flags & CS_DC_SUSP)) |
984 | conn_pr_state_change(device->connection, os, ns, (flags & ~CS_DC_MASK) | CS_DC_SUSP); | 984 | conn_pr_state_change(first_peer_device(device)->connection, os, ns, |
985 | (flags & ~CS_DC_MASK) | CS_DC_SUSP); | ||
985 | 986 | ||
986 | /* if we are going -> D_FAILED or D_DISKLESS, grab one extra reference | 987 | /* if we are going -> D_FAILED or D_DISKLESS, grab one extra reference |
987 | * on the ldev here, to be sure the transition -> D_DISKLESS resp. | 988 | * on the ldev here, to be sure the transition -> D_DISKLESS resp. |
@@ -994,25 +995,25 @@ __drbd_set_state(struct drbd_device *device, union drbd_state ns, | |||
994 | did_remote = drbd_should_do_remote(device->state); | 995 | did_remote = drbd_should_do_remote(device->state); |
995 | device->state.i = ns.i; | 996 | device->state.i = ns.i; |
996 | should_do_remote = drbd_should_do_remote(device->state); | 997 | should_do_remote = drbd_should_do_remote(device->state); |
997 | device->connection->susp = ns.susp; | 998 | first_peer_device(device)->connection->susp = ns.susp; |
998 | device->connection->susp_nod = ns.susp_nod; | 999 | first_peer_device(device)->connection->susp_nod = ns.susp_nod; |
999 | device->connection->susp_fen = ns.susp_fen; | 1000 | first_peer_device(device)->connection->susp_fen = ns.susp_fen; |
1000 | 1001 | ||
1001 | /* put replicated vs not-replicated requests in seperate epochs */ | 1002 | /* put replicated vs not-replicated requests in seperate epochs */ |
1002 | if (did_remote != should_do_remote) | 1003 | if (did_remote != should_do_remote) |
1003 | start_new_tl_epoch(device->connection); | 1004 | start_new_tl_epoch(first_peer_device(device)->connection); |
1004 | 1005 | ||
1005 | if (os.disk == D_ATTACHING && ns.disk >= D_NEGOTIATING) | 1006 | if (os.disk == D_ATTACHING && ns.disk >= D_NEGOTIATING) |
1006 | drbd_print_uuids(device, "attached to UUIDs"); | 1007 | drbd_print_uuids(device, "attached to UUIDs"); |
1007 | 1008 | ||
1008 | /* Wake up role changes, that were delayed because of connection establishing */ | 1009 | /* Wake up role changes, that were delayed because of connection establishing */ |
1009 | if (os.conn == C_WF_REPORT_PARAMS && ns.conn != C_WF_REPORT_PARAMS && | 1010 | if (os.conn == C_WF_REPORT_PARAMS && ns.conn != C_WF_REPORT_PARAMS && |
1010 | no_peer_wf_report_params(device->connection)) | 1011 | no_peer_wf_report_params(first_peer_device(device)->connection)) |
1011 | clear_bit(STATE_SENT, &device->connection->flags); | 1012 | clear_bit(STATE_SENT, &first_peer_device(device)->connection->flags); |
1012 | 1013 | ||
1013 | wake_up(&device->misc_wait); | 1014 | wake_up(&device->misc_wait); |
1014 | wake_up(&device->state_wait); | 1015 | wake_up(&device->state_wait); |
1015 | wake_up(&device->connection->ping_wait); | 1016 | wake_up(&first_peer_device(device)->connection->ping_wait); |
1016 | 1017 | ||
1017 | /* Aborted verify run, or we reached the stop sector. | 1018 | /* Aborted verify run, or we reached the stop sector. |
1018 | * Log the last position, unless end-of-device. */ | 1019 | * Log the last position, unless end-of-device. */ |
@@ -1101,21 +1102,21 @@ __drbd_set_state(struct drbd_device *device, union drbd_state ns, | |||
1101 | 1102 | ||
1102 | /* Receiver should clean up itself */ | 1103 | /* Receiver should clean up itself */ |
1103 | if (os.conn != C_DISCONNECTING && ns.conn == C_DISCONNECTING) | 1104 | if (os.conn != C_DISCONNECTING && ns.conn == C_DISCONNECTING) |
1104 | drbd_thread_stop_nowait(&device->connection->receiver); | 1105 | drbd_thread_stop_nowait(&first_peer_device(device)->connection->receiver); |
1105 | 1106 | ||
1106 | /* Now the receiver finished cleaning up itself, it should die */ | 1107 | /* Now the receiver finished cleaning up itself, it should die */ |
1107 | if (os.conn != C_STANDALONE && ns.conn == C_STANDALONE) | 1108 | if (os.conn != C_STANDALONE && ns.conn == C_STANDALONE) |
1108 | drbd_thread_stop_nowait(&device->connection->receiver); | 1109 | drbd_thread_stop_nowait(&first_peer_device(device)->connection->receiver); |
1109 | 1110 | ||
1110 | /* Upon network failure, we need to restart the receiver. */ | 1111 | /* Upon network failure, we need to restart the receiver. */ |
1111 | if (os.conn > C_WF_CONNECTION && | 1112 | if (os.conn > C_WF_CONNECTION && |
1112 | ns.conn <= C_TEAR_DOWN && ns.conn >= C_TIMEOUT) | 1113 | ns.conn <= C_TEAR_DOWN && ns.conn >= C_TIMEOUT) |
1113 | drbd_thread_restart_nowait(&device->connection->receiver); | 1114 | drbd_thread_restart_nowait(&first_peer_device(device)->connection->receiver); |
1114 | 1115 | ||
1115 | /* Resume AL writing if we get a connection */ | 1116 | /* Resume AL writing if we get a connection */ |
1116 | if (os.conn < C_CONNECTED && ns.conn >= C_CONNECTED) { | 1117 | if (os.conn < C_CONNECTED && ns.conn >= C_CONNECTED) { |
1117 | drbd_resume_al(device); | 1118 | drbd_resume_al(device); |
1118 | device->connection->connect_cnt++; | 1119 | first_peer_device(device)->connection->connect_cnt++; |
1119 | } | 1120 | } |
1120 | 1121 | ||
1121 | /* remember last attach time so request_timer_fn() won't | 1122 | /* remember last attach time so request_timer_fn() won't |
@@ -1133,7 +1134,7 @@ __drbd_set_state(struct drbd_device *device, union drbd_state ns, | |||
1133 | ascw->w.cb = w_after_state_ch; | 1134 | ascw->w.cb = w_after_state_ch; |
1134 | ascw->w.device = device; | 1135 | ascw->w.device = device; |
1135 | ascw->done = done; | 1136 | ascw->done = done; |
1136 | drbd_queue_work(&device->connection->sender_work, &ascw->w); | 1137 | drbd_queue_work(&first_peer_device(device)->connection->sender_work, &ascw->w); |
1137 | } else { | 1138 | } else { |
1138 | dev_err(DEV, "Could not kmalloc an ascw\n"); | 1139 | dev_err(DEV, "Could not kmalloc an ascw\n"); |
1139 | } | 1140 | } |
@@ -1181,7 +1182,7 @@ int drbd_bitmap_io_from_worker(struct drbd_device *device, | |||
1181 | { | 1182 | { |
1182 | int rv; | 1183 | int rv; |
1183 | 1184 | ||
1184 | D_ASSERT(current == device->connection->worker.task); | 1185 | D_ASSERT(current == first_peer_device(device)->connection->worker.task); |
1185 | 1186 | ||
1186 | /* open coded non-blocking drbd_suspend_io(device); */ | 1187 | /* open coded non-blocking drbd_suspend_io(device); */ |
1187 | set_bit(SUSPEND_IO, &device->flags); | 1188 | set_bit(SUSPEND_IO, &device->flags); |
@@ -1228,7 +1229,7 @@ static void after_state_ch(struct drbd_device *device, union drbd_state os, | |||
1228 | state change. This function might sleep */ | 1229 | state change. This function might sleep */ |
1229 | 1230 | ||
1230 | if (ns.susp_nod) { | 1231 | if (ns.susp_nod) { |
1231 | struct drbd_connection *connection = device->connection; | 1232 | struct drbd_connection *connection = first_peer_device(device)->connection; |
1232 | enum drbd_req_event what = NOTHING; | 1233 | enum drbd_req_event what = NOTHING; |
1233 | 1234 | ||
1234 | spin_lock_irq(&connection->req_lock); | 1235 | spin_lock_irq(&connection->req_lock); |
@@ -1250,7 +1251,7 @@ static void after_state_ch(struct drbd_device *device, union drbd_state os, | |||
1250 | } | 1251 | } |
1251 | 1252 | ||
1252 | if (ns.susp_fen) { | 1253 | if (ns.susp_fen) { |
1253 | struct drbd_connection *connection = device->connection; | 1254 | struct drbd_connection *connection = first_peer_device(device)->connection; |
1254 | 1255 | ||
1255 | spin_lock_irq(&connection->req_lock); | 1256 | spin_lock_irq(&connection->req_lock); |
1256 | if (connection->susp_fen && conn_lowest_conn(connection) >= C_CONNECTED) { | 1257 | if (connection->susp_fen && conn_lowest_conn(connection) >= C_CONNECTED) { |
@@ -1277,7 +1278,7 @@ static void after_state_ch(struct drbd_device *device, union drbd_state os, | |||
1277 | * which is unexpected. */ | 1278 | * which is unexpected. */ |
1278 | if ((os.conn != C_SYNC_SOURCE && os.conn != C_PAUSED_SYNC_S) && | 1279 | if ((os.conn != C_SYNC_SOURCE && os.conn != C_PAUSED_SYNC_S) && |
1279 | (ns.conn == C_SYNC_SOURCE || ns.conn == C_PAUSED_SYNC_S) && | 1280 | (ns.conn == C_SYNC_SOURCE || ns.conn == C_PAUSED_SYNC_S) && |
1280 | device->connection->agreed_pro_version >= 96 && get_ldev(device)) { | 1281 | first_peer_device(device)->connection->agreed_pro_version >= 96 && get_ldev(device)) { |
1281 | drbd_gen_and_send_sync_uuid(device); | 1282 | drbd_gen_and_send_sync_uuid(device); |
1282 | put_ldev(device); | 1283 | put_ldev(device); |
1283 | } | 1284 | } |
diff --git a/drivers/block/drbd/drbd_worker.c b/drivers/block/drbd/drbd_worker.c index 5b3f12a42230..aa1ad7f39786 100644 --- a/drivers/block/drbd/drbd_worker.c +++ b/drivers/block/drbd/drbd_worker.c | |||
@@ -102,16 +102,16 @@ static void drbd_endio_read_sec_final(struct drbd_peer_request *peer_req) __rele | |||
102 | unsigned long flags = 0; | 102 | unsigned long flags = 0; |
103 | struct drbd_device *device = peer_req->w.device; | 103 | struct drbd_device *device = peer_req->w.device; |
104 | 104 | ||
105 | spin_lock_irqsave(&device->connection->req_lock, flags); | 105 | spin_lock_irqsave(&first_peer_device(device)->connection->req_lock, flags); |
106 | device->read_cnt += peer_req->i.size >> 9; | 106 | device->read_cnt += peer_req->i.size >> 9; |
107 | list_del(&peer_req->w.list); | 107 | list_del(&peer_req->w.list); |
108 | if (list_empty(&device->read_ee)) | 108 | if (list_empty(&device->read_ee)) |
109 | wake_up(&device->ee_wait); | 109 | wake_up(&device->ee_wait); |
110 | if (test_bit(__EE_WAS_ERROR, &peer_req->flags)) | 110 | if (test_bit(__EE_WAS_ERROR, &peer_req->flags)) |
111 | __drbd_chk_io_error(device, DRBD_READ_ERROR); | 111 | __drbd_chk_io_error(device, DRBD_READ_ERROR); |
112 | spin_unlock_irqrestore(&device->connection->req_lock, flags); | 112 | spin_unlock_irqrestore(&first_peer_device(device)->connection->req_lock, flags); |
113 | 113 | ||
114 | drbd_queue_work(&device->connection->sender_work, &peer_req->w); | 114 | drbd_queue_work(&first_peer_device(device)->connection->sender_work, &peer_req->w); |
115 | put_ldev(device); | 115 | put_ldev(device); |
116 | } | 116 | } |
117 | 117 | ||
@@ -134,7 +134,7 @@ static void drbd_endio_write_sec_final(struct drbd_peer_request *peer_req) __rel | |||
134 | do_al_complete_io = peer_req->flags & EE_CALL_AL_COMPLETE_IO; | 134 | do_al_complete_io = peer_req->flags & EE_CALL_AL_COMPLETE_IO; |
135 | block_id = peer_req->block_id; | 135 | block_id = peer_req->block_id; |
136 | 136 | ||
137 | spin_lock_irqsave(&device->connection->req_lock, flags); | 137 | spin_lock_irqsave(&first_peer_device(device)->connection->req_lock, flags); |
138 | device->writ_cnt += peer_req->i.size >> 9; | 138 | device->writ_cnt += peer_req->i.size >> 9; |
139 | list_move_tail(&peer_req->w.list, &device->done_ee); | 139 | list_move_tail(&peer_req->w.list, &device->done_ee); |
140 | 140 | ||
@@ -150,7 +150,7 @@ static void drbd_endio_write_sec_final(struct drbd_peer_request *peer_req) __rel | |||
150 | 150 | ||
151 | if (test_bit(__EE_WAS_ERROR, &peer_req->flags)) | 151 | if (test_bit(__EE_WAS_ERROR, &peer_req->flags)) |
152 | __drbd_chk_io_error(device, DRBD_WRITE_ERROR); | 152 | __drbd_chk_io_error(device, DRBD_WRITE_ERROR); |
153 | spin_unlock_irqrestore(&device->connection->req_lock, flags); | 153 | spin_unlock_irqrestore(&first_peer_device(device)->connection->req_lock, flags); |
154 | 154 | ||
155 | if (block_id == ID_SYNCER) | 155 | if (block_id == ID_SYNCER) |
156 | drbd_rs_complete_io(device, i.sector); | 156 | drbd_rs_complete_io(device, i.sector); |
@@ -161,7 +161,7 @@ static void drbd_endio_write_sec_final(struct drbd_peer_request *peer_req) __rel | |||
161 | if (do_al_complete_io) | 161 | if (do_al_complete_io) |
162 | drbd_al_complete_io(device, &i); | 162 | drbd_al_complete_io(device, &i); |
163 | 163 | ||
164 | wake_asender(device->connection); | 164 | wake_asender(first_peer_device(device)->connection); |
165 | put_ldev(device); | 165 | put_ldev(device); |
166 | } | 166 | } |
167 | 167 | ||
@@ -273,9 +273,9 @@ void drbd_request_endio(struct bio *bio, int error) | |||
273 | req->private_bio = ERR_PTR(error); | 273 | req->private_bio = ERR_PTR(error); |
274 | 274 | ||
275 | /* not req_mod(), we need irqsave here! */ | 275 | /* not req_mod(), we need irqsave here! */ |
276 | spin_lock_irqsave(&device->connection->req_lock, flags); | 276 | spin_lock_irqsave(&first_peer_device(device)->connection->req_lock, flags); |
277 | __req_mod(req, what, &m); | 277 | __req_mod(req, what, &m); |
278 | spin_unlock_irqrestore(&device->connection->req_lock, flags); | 278 | spin_unlock_irqrestore(&first_peer_device(device)->connection->req_lock, flags); |
279 | put_ldev(device); | 279 | put_ldev(device); |
280 | 280 | ||
281 | if (m.bio) | 281 | if (m.bio) |
@@ -345,12 +345,12 @@ static int w_e_send_csum(struct drbd_work *w, int cancel) | |||
345 | if (unlikely((peer_req->flags & EE_WAS_ERROR) != 0)) | 345 | if (unlikely((peer_req->flags & EE_WAS_ERROR) != 0)) |
346 | goto out; | 346 | goto out; |
347 | 347 | ||
348 | digest_size = crypto_hash_digestsize(device->connection->csums_tfm); | 348 | digest_size = crypto_hash_digestsize(first_peer_device(device)->connection->csums_tfm); |
349 | digest = kmalloc(digest_size, GFP_NOIO); | 349 | digest = kmalloc(digest_size, GFP_NOIO); |
350 | if (digest) { | 350 | if (digest) { |
351 | sector_t sector = peer_req->i.sector; | 351 | sector_t sector = peer_req->i.sector; |
352 | unsigned int size = peer_req->i.size; | 352 | unsigned int size = peer_req->i.size; |
353 | drbd_csum_ee(device, device->connection->csums_tfm, peer_req, digest); | 353 | drbd_csum_ee(device, first_peer_device(device)->connection->csums_tfm, peer_req, digest); |
354 | /* Free peer_req and pages before send. | 354 | /* Free peer_req and pages before send. |
355 | * In case we block on congestion, we could otherwise run into | 355 | * In case we block on congestion, we could otherwise run into |
356 | * some distributed deadlock, if the other side blocks on | 356 | * some distributed deadlock, if the other side blocks on |
@@ -397,9 +397,9 @@ static int read_for_csum(struct drbd_device *device, sector_t sector, int size) | |||
397 | goto defer; | 397 | goto defer; |
398 | 398 | ||
399 | peer_req->w.cb = w_e_send_csum; | 399 | peer_req->w.cb = w_e_send_csum; |
400 | spin_lock_irq(&device->connection->req_lock); | 400 | spin_lock_irq(&first_peer_device(device)->connection->req_lock); |
401 | list_add(&peer_req->w.list, &device->read_ee); | 401 | list_add(&peer_req->w.list, &device->read_ee); |
402 | spin_unlock_irq(&device->connection->req_lock); | 402 | spin_unlock_irq(&first_peer_device(device)->connection->req_lock); |
403 | 403 | ||
404 | atomic_add(size >> 9, &device->rs_sect_ev); | 404 | atomic_add(size >> 9, &device->rs_sect_ev); |
405 | if (drbd_submit_peer_request(device, peer_req, READ, DRBD_FAULT_RS_RD) == 0) | 405 | if (drbd_submit_peer_request(device, peer_req, READ, DRBD_FAULT_RS_RD) == 0) |
@@ -409,9 +409,9 @@ static int read_for_csum(struct drbd_device *device, sector_t sector, int size) | |||
409 | * because bio_add_page failed (probably broken lower level driver), | 409 | * because bio_add_page failed (probably broken lower level driver), |
410 | * retry may or may not help. | 410 | * retry may or may not help. |
411 | * If it does not, you may need to force disconnect. */ | 411 | * If it does not, you may need to force disconnect. */ |
412 | spin_lock_irq(&device->connection->req_lock); | 412 | spin_lock_irq(&first_peer_device(device)->connection->req_lock); |
413 | list_del(&peer_req->w.list); | 413 | list_del(&peer_req->w.list); |
414 | spin_unlock_irq(&device->connection->req_lock); | 414 | spin_unlock_irq(&first_peer_device(device)->connection->req_lock); |
415 | 415 | ||
416 | drbd_free_peer_req(device, peer_req); | 416 | drbd_free_peer_req(device, peer_req); |
417 | defer: | 417 | defer: |
@@ -439,7 +439,7 @@ void resync_timer_fn(unsigned long data) | |||
439 | struct drbd_device *device = (struct drbd_device *) data; | 439 | struct drbd_device *device = (struct drbd_device *) data; |
440 | 440 | ||
441 | if (list_empty(&device->resync_work.list)) | 441 | if (list_empty(&device->resync_work.list)) |
442 | drbd_queue_work(&device->connection->sender_work, &device->resync_work); | 442 | drbd_queue_work(&first_peer_device(device)->connection->sender_work, &device->resync_work); |
443 | } | 443 | } |
444 | 444 | ||
445 | static void fifo_set(struct fifo_buffer *fb, int value) | 445 | static void fifo_set(struct fifo_buffer *fb, int value) |
@@ -597,15 +597,15 @@ int w_make_resync_request(struct drbd_work *w, int cancel) | |||
597 | 597 | ||
598 | for (i = 0; i < number; i++) { | 598 | for (i = 0; i < number; i++) { |
599 | /* Stop generating RS requests, when half of the send buffer is filled */ | 599 | /* Stop generating RS requests, when half of the send buffer is filled */ |
600 | mutex_lock(&device->connection->data.mutex); | 600 | mutex_lock(&first_peer_device(device)->connection->data.mutex); |
601 | if (device->connection->data.socket) { | 601 | if (first_peer_device(device)->connection->data.socket) { |
602 | queued = device->connection->data.socket->sk->sk_wmem_queued; | 602 | queued = first_peer_device(device)->connection->data.socket->sk->sk_wmem_queued; |
603 | sndbuf = device->connection->data.socket->sk->sk_sndbuf; | 603 | sndbuf = first_peer_device(device)->connection->data.socket->sk->sk_sndbuf; |
604 | } else { | 604 | } else { |
605 | queued = 1; | 605 | queued = 1; |
606 | sndbuf = 0; | 606 | sndbuf = 0; |
607 | } | 607 | } |
608 | mutex_unlock(&device->connection->data.mutex); | 608 | mutex_unlock(&first_peer_device(device)->connection->data.mutex); |
609 | if (queued > sndbuf / 2) | 609 | if (queued > sndbuf / 2) |
610 | goto requeue; | 610 | goto requeue; |
611 | 611 | ||
@@ -675,7 +675,8 @@ next_sector: | |||
675 | /* adjust very last sectors, in case we are oddly sized */ | 675 | /* adjust very last sectors, in case we are oddly sized */ |
676 | if (sector + (size>>9) > capacity) | 676 | if (sector + (size>>9) > capacity) |
677 | size = (capacity-sector)<<9; | 677 | size = (capacity-sector)<<9; |
678 | if (device->connection->agreed_pro_version >= 89 && device->connection->csums_tfm) { | 678 | if (first_peer_device(device)->connection->agreed_pro_version >= 89 && |
679 | first_peer_device(device)->connection->csums_tfm) { | ||
679 | switch (read_for_csum(device, sector, size)) { | 680 | switch (read_for_csum(device, sector, size)) { |
680 | case -EIO: /* Disk failure */ | 681 | case -EIO: /* Disk failure */ |
681 | put_ldev(device); | 682 | put_ldev(device); |
@@ -800,7 +801,7 @@ static int w_resync_finished(struct drbd_work *w, int cancel) | |||
800 | 801 | ||
801 | static void ping_peer(struct drbd_device *device) | 802 | static void ping_peer(struct drbd_device *device) |
802 | { | 803 | { |
803 | struct drbd_connection *connection = device->connection; | 804 | struct drbd_connection *connection = first_peer_device(device)->connection; |
804 | 805 | ||
805 | clear_bit(GOT_PING_ACK, &connection->flags); | 806 | clear_bit(GOT_PING_ACK, &connection->flags); |
806 | request_ping(connection); | 807 | request_ping(connection); |
@@ -831,7 +832,7 @@ int drbd_resync_finished(struct drbd_device *device) | |||
831 | if (w) { | 832 | if (w) { |
832 | w->cb = w_resync_finished; | 833 | w->cb = w_resync_finished; |
833 | w->device = device; | 834 | w->device = device; |
834 | drbd_queue_work(&device->connection->sender_work, w); | 835 | drbd_queue_work(&first_peer_device(device)->connection->sender_work, w); |
835 | return 1; | 836 | return 1; |
836 | } | 837 | } |
837 | dev_err(DEV, "Warn failed to drbd_rs_del_all() and to kmalloc(w).\n"); | 838 | dev_err(DEV, "Warn failed to drbd_rs_del_all() and to kmalloc(w).\n"); |
@@ -854,7 +855,7 @@ int drbd_resync_finished(struct drbd_device *device) | |||
854 | 855 | ||
855 | ping_peer(device); | 856 | ping_peer(device); |
856 | 857 | ||
857 | spin_lock_irq(&device->connection->req_lock); | 858 | spin_lock_irq(&first_peer_device(device)->connection->req_lock); |
858 | os = drbd_read_state(device); | 859 | os = drbd_read_state(device); |
859 | 860 | ||
860 | verify_done = (os.conn == C_VERIFY_S || os.conn == C_VERIFY_T); | 861 | verify_done = (os.conn == C_VERIFY_S || os.conn == C_VERIFY_T); |
@@ -885,7 +886,7 @@ int drbd_resync_finished(struct drbd_device *device) | |||
885 | if (os.conn == C_SYNC_TARGET || os.conn == C_PAUSED_SYNC_T) | 886 | if (os.conn == C_SYNC_TARGET || os.conn == C_PAUSED_SYNC_T) |
886 | khelper_cmd = "after-resync-target"; | 887 | khelper_cmd = "after-resync-target"; |
887 | 888 | ||
888 | if (device->connection->csums_tfm && device->rs_total) { | 889 | if (first_peer_device(device)->connection->csums_tfm && device->rs_total) { |
889 | const unsigned long s = device->rs_same_csum; | 890 | const unsigned long s = device->rs_same_csum; |
890 | const unsigned long t = device->rs_total; | 891 | const unsigned long t = device->rs_total; |
891 | const int ratio = | 892 | const int ratio = |
@@ -943,7 +944,7 @@ int drbd_resync_finished(struct drbd_device *device) | |||
943 | 944 | ||
944 | _drbd_set_state(device, ns, CS_VERBOSE, NULL); | 945 | _drbd_set_state(device, ns, CS_VERBOSE, NULL); |
945 | out_unlock: | 946 | out_unlock: |
946 | spin_unlock_irq(&device->connection->req_lock); | 947 | spin_unlock_irq(&first_peer_device(device)->connection->req_lock); |
947 | put_ldev(device); | 948 | put_ldev(device); |
948 | out: | 949 | out: |
949 | device->rs_total = 0; | 950 | device->rs_total = 0; |
@@ -970,9 +971,9 @@ static void move_to_net_ee_or_free(struct drbd_device *device, struct drbd_peer_ | |||
970 | int i = (peer_req->i.size + PAGE_SIZE -1) >> PAGE_SHIFT; | 971 | int i = (peer_req->i.size + PAGE_SIZE -1) >> PAGE_SHIFT; |
971 | atomic_add(i, &device->pp_in_use_by_net); | 972 | atomic_add(i, &device->pp_in_use_by_net); |
972 | atomic_sub(i, &device->pp_in_use); | 973 | atomic_sub(i, &device->pp_in_use); |
973 | spin_lock_irq(&device->connection->req_lock); | 974 | spin_lock_irq(&first_peer_device(device)->connection->req_lock); |
974 | list_add_tail(&peer_req->w.list, &device->net_ee); | 975 | list_add_tail(&peer_req->w.list, &device->net_ee); |
975 | spin_unlock_irq(&device->connection->req_lock); | 976 | spin_unlock_irq(&first_peer_device(device)->connection->req_lock); |
976 | wake_up(&drbd_pp_wait); | 977 | wake_up(&drbd_pp_wait); |
977 | } else | 978 | } else |
978 | drbd_free_peer_req(device, peer_req); | 979 | drbd_free_peer_req(device, peer_req); |
@@ -1096,13 +1097,13 @@ int w_e_end_csum_rs_req(struct drbd_work *w, int cancel) | |||
1096 | /* quick hack to try to avoid a race against reconfiguration. | 1097 | /* quick hack to try to avoid a race against reconfiguration. |
1097 | * a real fix would be much more involved, | 1098 | * a real fix would be much more involved, |
1098 | * introducing more locking mechanisms */ | 1099 | * introducing more locking mechanisms */ |
1099 | if (device->connection->csums_tfm) { | 1100 | if (first_peer_device(device)->connection->csums_tfm) { |
1100 | digest_size = crypto_hash_digestsize(device->connection->csums_tfm); | 1101 | digest_size = crypto_hash_digestsize(first_peer_device(device)->connection->csums_tfm); |
1101 | D_ASSERT(digest_size == di->digest_size); | 1102 | D_ASSERT(digest_size == di->digest_size); |
1102 | digest = kmalloc(digest_size, GFP_NOIO); | 1103 | digest = kmalloc(digest_size, GFP_NOIO); |
1103 | } | 1104 | } |
1104 | if (digest) { | 1105 | if (digest) { |
1105 | drbd_csum_ee(device, device->connection->csums_tfm, peer_req, digest); | 1106 | drbd_csum_ee(device, first_peer_device(device)->connection->csums_tfm, peer_req, digest); |
1106 | eq = !memcmp(digest, di->digest, digest_size); | 1107 | eq = !memcmp(digest, di->digest, digest_size); |
1107 | kfree(digest); | 1108 | kfree(digest); |
1108 | } | 1109 | } |
@@ -1146,7 +1147,7 @@ int w_e_end_ov_req(struct drbd_work *w, int cancel) | |||
1146 | if (unlikely(cancel)) | 1147 | if (unlikely(cancel)) |
1147 | goto out; | 1148 | goto out; |
1148 | 1149 | ||
1149 | digest_size = crypto_hash_digestsize(device->connection->verify_tfm); | 1150 | digest_size = crypto_hash_digestsize(first_peer_device(device)->connection->verify_tfm); |
1150 | digest = kmalloc(digest_size, GFP_NOIO); | 1151 | digest = kmalloc(digest_size, GFP_NOIO); |
1151 | if (!digest) { | 1152 | if (!digest) { |
1152 | err = 1; /* terminate the connection in case the allocation failed */ | 1153 | err = 1; /* terminate the connection in case the allocation failed */ |
@@ -1154,7 +1155,7 @@ int w_e_end_ov_req(struct drbd_work *w, int cancel) | |||
1154 | } | 1155 | } |
1155 | 1156 | ||
1156 | if (likely(!(peer_req->flags & EE_WAS_ERROR))) | 1157 | if (likely(!(peer_req->flags & EE_WAS_ERROR))) |
1157 | drbd_csum_ee(device, device->connection->verify_tfm, peer_req, digest); | 1158 | drbd_csum_ee(device, first_peer_device(device)->connection->verify_tfm, peer_req, digest); |
1158 | else | 1159 | else |
1159 | memset(digest, 0, digest_size); | 1160 | memset(digest, 0, digest_size); |
1160 | 1161 | ||
@@ -1217,10 +1218,10 @@ int w_e_end_ov_reply(struct drbd_work *w, int cancel) | |||
1217 | di = peer_req->digest; | 1218 | di = peer_req->digest; |
1218 | 1219 | ||
1219 | if (likely((peer_req->flags & EE_WAS_ERROR) == 0)) { | 1220 | if (likely((peer_req->flags & EE_WAS_ERROR) == 0)) { |
1220 | digest_size = crypto_hash_digestsize(device->connection->verify_tfm); | 1221 | digest_size = crypto_hash_digestsize(first_peer_device(device)->connection->verify_tfm); |
1221 | digest = kmalloc(digest_size, GFP_NOIO); | 1222 | digest = kmalloc(digest_size, GFP_NOIO); |
1222 | if (digest) { | 1223 | if (digest) { |
1223 | drbd_csum_ee(device, device->connection->verify_tfm, peer_req, digest); | 1224 | drbd_csum_ee(device, first_peer_device(device)->connection->verify_tfm, peer_req, digest); |
1224 | 1225 | ||
1225 | D_ASSERT(digest_size == di->digest_size); | 1226 | D_ASSERT(digest_size == di->digest_size); |
1226 | eq = !memcmp(digest, di->digest, digest_size); | 1227 | eq = !memcmp(digest, di->digest, digest_size); |
@@ -1297,7 +1298,7 @@ int w_send_write_hint(struct drbd_work *w, int cancel) | |||
1297 | 1298 | ||
1298 | if (cancel) | 1299 | if (cancel) |
1299 | return 0; | 1300 | return 0; |
1300 | sock = &device->connection->data; | 1301 | sock = &first_peer_device(device)->connection->data; |
1301 | if (!drbd_prepare_command(device, sock)) | 1302 | if (!drbd_prepare_command(device, sock)) |
1302 | return -EIO; | 1303 | return -EIO; |
1303 | return drbd_send_command(device, sock, P_UNPLUG_REMOTE, 0, NULL, 0); | 1304 | return drbd_send_command(device, sock, P_UNPLUG_REMOTE, 0, NULL, 0); |
@@ -1328,7 +1329,7 @@ int w_send_out_of_sync(struct drbd_work *w, int cancel) | |||
1328 | { | 1329 | { |
1329 | struct drbd_request *req = container_of(w, struct drbd_request, w); | 1330 | struct drbd_request *req = container_of(w, struct drbd_request, w); |
1330 | struct drbd_device *device = w->device; | 1331 | struct drbd_device *device = w->device; |
1331 | struct drbd_connection *connection = device->connection; | 1332 | struct drbd_connection *connection = first_peer_device(device)->connection; |
1332 | int err; | 1333 | int err; |
1333 | 1334 | ||
1334 | if (unlikely(cancel)) { | 1335 | if (unlikely(cancel)) { |
@@ -1358,7 +1359,7 @@ int w_send_dblock(struct drbd_work *w, int cancel) | |||
1358 | { | 1359 | { |
1359 | struct drbd_request *req = container_of(w, struct drbd_request, w); | 1360 | struct drbd_request *req = container_of(w, struct drbd_request, w); |
1360 | struct drbd_device *device = w->device; | 1361 | struct drbd_device *device = w->device; |
1361 | struct drbd_connection *connection = device->connection; | 1362 | struct drbd_connection *connection = first_peer_device(device)->connection; |
1362 | int err; | 1363 | int err; |
1363 | 1364 | ||
1364 | if (unlikely(cancel)) { | 1365 | if (unlikely(cancel)) { |
@@ -1386,7 +1387,7 @@ int w_send_read_req(struct drbd_work *w, int cancel) | |||
1386 | { | 1387 | { |
1387 | struct drbd_request *req = container_of(w, struct drbd_request, w); | 1388 | struct drbd_request *req = container_of(w, struct drbd_request, w); |
1388 | struct drbd_device *device = w->device; | 1389 | struct drbd_device *device = w->device; |
1389 | struct drbd_connection *connection = device->connection; | 1390 | struct drbd_connection *connection = first_peer_device(device)->connection; |
1390 | int err; | 1391 | int err; |
1391 | 1392 | ||
1392 | if (unlikely(cancel)) { | 1393 | if (unlikely(cancel)) { |
@@ -1581,7 +1582,7 @@ void start_resync_timer_fn(unsigned long data) | |||
1581 | { | 1582 | { |
1582 | struct drbd_device *device = (struct drbd_device *) data; | 1583 | struct drbd_device *device = (struct drbd_device *) data; |
1583 | 1584 | ||
1584 | drbd_queue_work(&device->connection->sender_work, &device->start_resync_work); | 1585 | drbd_queue_work(&first_peer_device(device)->connection->sender_work, &device->start_resync_work); |
1585 | } | 1586 | } |
1586 | 1587 | ||
1587 | int w_start_resync(struct drbd_work *w, int cancel) | 1588 | int w_start_resync(struct drbd_work *w, int cancel) |
@@ -1628,7 +1629,7 @@ void drbd_start_resync(struct drbd_device *device, enum drbd_conns side) | |||
1628 | if (r > 0) { | 1629 | if (r > 0) { |
1629 | dev_info(DEV, "before-resync-target handler returned %d, " | 1630 | dev_info(DEV, "before-resync-target handler returned %d, " |
1630 | "dropping connection.\n", r); | 1631 | "dropping connection.\n", r); |
1631 | conn_request_state(device->connection, NS(conn, C_DISCONNECTING), CS_HARD); | 1632 | conn_request_state(first_peer_device(device)->connection, NS(conn, C_DISCONNECTING), CS_HARD); |
1632 | return; | 1633 | return; |
1633 | } | 1634 | } |
1634 | } else /* C_SYNC_SOURCE */ { | 1635 | } else /* C_SYNC_SOURCE */ { |
@@ -1641,14 +1642,15 @@ void drbd_start_resync(struct drbd_device *device, enum drbd_conns side) | |||
1641 | } else { | 1642 | } else { |
1642 | dev_info(DEV, "before-resync-source handler returned %d, " | 1643 | dev_info(DEV, "before-resync-source handler returned %d, " |
1643 | "dropping connection.\n", r); | 1644 | "dropping connection.\n", r); |
1644 | conn_request_state(device->connection, NS(conn, C_DISCONNECTING), CS_HARD); | 1645 | conn_request_state(first_peer_device(device)->connection, |
1646 | NS(conn, C_DISCONNECTING), CS_HARD); | ||
1645 | return; | 1647 | return; |
1646 | } | 1648 | } |
1647 | } | 1649 | } |
1648 | } | 1650 | } |
1649 | } | 1651 | } |
1650 | 1652 | ||
1651 | if (current == device->connection->worker.task) { | 1653 | if (current == first_peer_device(device)->connection->worker.task) { |
1652 | /* The worker should not sleep waiting for state_mutex, | 1654 | /* The worker should not sleep waiting for state_mutex, |
1653 | that can take long */ | 1655 | that can take long */ |
1654 | if (!mutex_trylock(device->state_mutex)) { | 1656 | if (!mutex_trylock(device->state_mutex)) { |
@@ -1727,10 +1729,12 @@ void drbd_start_resync(struct drbd_device *device, enum drbd_conns side) | |||
1727 | * drbd_resync_finished from here in that case. | 1729 | * drbd_resync_finished from here in that case. |
1728 | * We drbd_gen_and_send_sync_uuid here for protocol < 96, | 1730 | * We drbd_gen_and_send_sync_uuid here for protocol < 96, |
1729 | * and from after_state_ch otherwise. */ | 1731 | * and from after_state_ch otherwise. */ |
1730 | if (side == C_SYNC_SOURCE && device->connection->agreed_pro_version < 96) | 1732 | if (side == C_SYNC_SOURCE && |
1733 | first_peer_device(device)->connection->agreed_pro_version < 96) | ||
1731 | drbd_gen_and_send_sync_uuid(device); | 1734 | drbd_gen_and_send_sync_uuid(device); |
1732 | 1735 | ||
1733 | if (device->connection->agreed_pro_version < 95 && device->rs_total == 0) { | 1736 | if (first_peer_device(device)->connection->agreed_pro_version < 95 && |
1737 | device->rs_total == 0) { | ||
1734 | /* This still has a race (about when exactly the peers | 1738 | /* This still has a race (about when exactly the peers |
1735 | * detect connection loss) that can lead to a full sync | 1739 | * detect connection loss) that can lead to a full sync |
1736 | * on next handshake. In 8.3.9 we fixed this with explicit | 1740 | * on next handshake. In 8.3.9 we fixed this with explicit |
@@ -1746,7 +1750,7 @@ void drbd_start_resync(struct drbd_device *device, enum drbd_conns side) | |||
1746 | int timeo; | 1750 | int timeo; |
1747 | 1751 | ||
1748 | rcu_read_lock(); | 1752 | rcu_read_lock(); |
1749 | nc = rcu_dereference(device->connection->net_conf); | 1753 | nc = rcu_dereference(first_peer_device(device)->connection->net_conf); |
1750 | timeo = nc->ping_int * HZ + nc->ping_timeo * HZ / 9; | 1754 | timeo = nc->ping_int * HZ + nc->ping_timeo * HZ / 9; |
1751 | rcu_read_unlock(); | 1755 | rcu_read_unlock(); |
1752 | schedule_timeout_interruptible(timeo); | 1756 | schedule_timeout_interruptible(timeo); |