From 6bbf53ca6269353c1d8174678b15aa4288a9cdb0 Mon Sep 17 00:00:00 2001 From: Andreas Gruenbacher Date: Fri, 8 Jul 2011 01:19:44 +0200 Subject: drbd: Move susp, susp_nod, susp_fen from connection to resource Signed-off-by: Andreas Gruenbacher Signed-off-by: Philipp Reisner diff --git a/drivers/block/drbd/drbd_int.h b/drivers/block/drbd/drbd_int.h index 3f379ff..af68d64 100644 --- a/drivers/block/drbd/drbd_int.h +++ b/drivers/block/drbd/drbd_int.h @@ -580,6 +580,10 @@ struct drbd_resource { struct res_opts res_opts; struct mutex conf_update; /* mutex for ready-copy-update of net_conf and disk_conf */ spinlock_t req_lock; + + unsigned susp:1; /* IO suspended by user */ + unsigned susp_nod:1; /* IO suspended because no data */ + unsigned susp_fen:1; /* IO suspended because fence peer handler runs */ }; struct drbd_connection { @@ -588,9 +592,6 @@ struct drbd_connection { struct kref kref; struct idr peer_devices; /* volume number to peer device mapping */ enum drbd_conns cstate; /* Only C_STANDALONE to C_WF_REPORT_PARAMS */ - unsigned susp:1; /* IO suspended by user */ - unsigned susp_nod:1; /* IO suspended because no data */ - unsigned susp_fen:1; /* IO suspended because fence peer handler runs */ struct mutex cstate_mutex; /* Protects graceful disconnects */ unsigned int connect_cnt; /* Inc each time a connection is established */ @@ -1507,12 +1508,13 @@ _drbd_set_state(struct drbd_device *device, union drbd_state ns, static inline union drbd_state drbd_read_state(struct drbd_device *device) { + struct drbd_resource *resource = device->resource; union drbd_state rv; rv.i = device->state.i; - rv.susp = first_peer_device(device)->connection->susp; - rv.susp_nod = first_peer_device(device)->connection->susp_nod; - rv.susp_fen = first_peer_device(device)->connection->susp_fen; + rv.susp = resource->susp; + rv.susp_nod = resource->susp_nod; + rv.susp_fen = resource->susp_fen; return rv; } @@ -2033,9 +2035,9 @@ static inline int drbd_state_is_stable(struct drbd_device *device) static inline int drbd_suspended(struct drbd_device *device) { - struct drbd_connection *connection = first_peer_device(device)->connection; + struct drbd_resource *resource = device->resource; - return connection->susp || connection->susp_fen || connection->susp_nod; + return resource->susp || resource->susp_fen || resource->susp_nod; } static inline bool may_inc_ap_bio(struct drbd_device *device) diff --git a/drivers/block/drbd/drbd_main.c b/drivers/block/drbd/drbd_main.c index fc43960..e07446e 100644 --- a/drivers/block/drbd/drbd_main.c +++ b/drivers/block/drbd/drbd_main.c @@ -2534,7 +2534,7 @@ struct drbd_resource *drbd_create_resource(const char *name) { struct drbd_resource *resource; - resource = kmalloc(sizeof(struct drbd_resource), GFP_KERNEL); + resource = kzalloc(sizeof(struct drbd_resource), GFP_KERNEL); if (!resource) return NULL; resource->name = kstrdup(name, GFP_KERNEL); diff --git a/drivers/block/drbd/drbd_nl.c b/drivers/block/drbd/drbd_nl.c index 684be38..5ed169d 100644 --- a/drivers/block/drbd/drbd_nl.c +++ b/drivers/block/drbd/drbd_nl.c @@ -1665,8 +1665,7 @@ int drbd_adm_attach(struct sk_buff *skb, struct genl_info *info) clear_bit(CRASHED_PRIMARY, &device->flags); if (drbd_md_test_flag(device->ldev, MDF_PRIMARY_IND) && - !(device->state.role == R_PRIMARY && - first_peer_device(device)->connection->susp_nod)) + !(device->state.role == R_PRIMARY && device->resource->susp_nod)) set_bit(CRASHED_PRIMARY, &device->flags); device->send_cnt = 0; diff --git a/drivers/block/drbd/drbd_state.c b/drivers/block/drbd/drbd_state.c index 10c8931..fbff4bf 100644 --- a/drivers/block/drbd/drbd_state.c +++ b/drivers/block/drbd/drbd_state.c @@ -1008,9 +1008,9 @@ __drbd_set_state(struct drbd_device *device, union drbd_state ns, did_remote = drbd_should_do_remote(device->state); device->state.i = ns.i; should_do_remote = drbd_should_do_remote(device->state); - first_peer_device(device)->connection->susp = ns.susp; - first_peer_device(device)->connection->susp_nod = ns.susp_nod; - first_peer_device(device)->connection->susp_fen = ns.susp_fen; + device->resource->susp = ns.susp; + device->resource->susp_nod = ns.susp_nod; + device->resource->susp_fen = ns.susp_fen; /* put replicated vs not-replicated requests in seperate epochs */ if (did_remote != should_do_remote) @@ -1219,6 +1219,7 @@ int drbd_bitmap_io_from_worker(struct drbd_device *device, static void after_state_ch(struct drbd_device *device, union drbd_state os, union drbd_state ns, enum chg_state_flags flags) { + struct drbd_resource *resource = device->resource; struct sib_info sib; sib.sib_reason = SIB_STATE_CHANGE; @@ -1253,7 +1254,7 @@ static void after_state_ch(struct drbd_device *device, union drbd_state os, conn_lowest_disk(connection) > D_NEGOTIATING) what = RESTART_FROZEN_DISK_IO; - if (connection->susp_nod && what != NOTHING) { + if (resource->susp_nod && what != NOTHING) { _tl_restart(connection, what); _conn_request_state(connection, (union drbd_state) { { .susp_nod = 1 } }, @@ -1267,7 +1268,7 @@ static void after_state_ch(struct drbd_device *device, union drbd_state os, struct drbd_connection *connection = first_peer_device(device)->connection; spin_lock_irq(&device->resource->req_lock); - if (connection->susp_fen && conn_lowest_conn(connection) >= C_CONNECTED) { + if (resource->susp_fen && conn_lowest_conn(connection) >= C_CONNECTED) { /* case2: The connection was established again: */ struct drbd_peer_device *peer_device; int vnr; @@ -1750,9 +1751,9 @@ conn_set_state(struct drbd_connection *connection, union drbd_state mask, union } }; } - ns_min.susp = ns_max.susp = connection->susp; - ns_min.susp_nod = ns_max.susp_nod = connection->susp_nod; - ns_min.susp_fen = ns_max.susp_fen = connection->susp_fen; + ns_min.susp = ns_max.susp = connection->resource->susp; + ns_min.susp_nod = ns_max.susp_nod = connection->resource->susp_nod; + ns_min.susp_fen = ns_max.susp_fen = connection->resource->susp_fen; *pns_min = ns_min; *pns_max = ns_max; -- cgit v0.10.2