Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 346006
b: refs/heads/master
c: d3fcb49
h: refs/heads/master
v: v3
  • Loading branch information
Philipp Reisner committed Nov 8, 2012
1 parent 0c5d04d commit cc3a26c
Show file tree
Hide file tree
Showing 7 changed files with 23 additions and 4 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: ef356262846eb49821db7b20a131b6573e4c7d2e
refs/heads/master: d3fcb4908d8cce7f29cff16bbef3b08933148003
2 changes: 1 addition & 1 deletion trunk/drivers/block/drbd/drbd_int.h
Original file line number Diff line number Diff line change
Expand Up @@ -172,7 +172,7 @@ extern struct ratelimit_state drbd_ratelimit_state;
extern struct idr minors;
extern struct list_head drbd_tconns;
extern struct rw_semaphore drbd_cfg_rwsem;
/* drbd_cfg_rwsem protects: drbd_tconns list,
/* drbd_cfg_rwsem protects: drbd_tconns list, minors idr, tconn->volumes idr
note: non sleeping iterations over the idrs are protoected by RCU */

/* on the wire */
Expand Down
2 changes: 2 additions & 0 deletions trunk/drivers/block/drbd/drbd_main.c
Original file line number Diff line number Diff line change
Expand Up @@ -2266,8 +2266,10 @@ static void drbd_cleanup(void)

drbd_genl_unregister();

down_write(&drbd_cfg_rwsem);
idr_for_each_entry(&minors, mdev, i)
drbd_delete_device(mdev);
up_write(&drbd_cfg_rwsem);

drbd_destroy_mempools();
unregister_blkdev(DRBD_MAJOR, "drbd");
Expand Down
4 changes: 4 additions & 0 deletions trunk/drivers/block/drbd/drbd_nl.c
Original file line number Diff line number Diff line change
Expand Up @@ -328,8 +328,10 @@ static void conn_md_sync(struct drbd_tconn *tconn)
struct drbd_conf *mdev;
int vnr;

down_read(&drbd_cfg_rwsem);
idr_for_each_entry(&tconn->volumes, mdev, vnr)
drbd_md_sync(mdev);
up_read(&drbd_cfg_rwsem);
}

int conn_khelper(struct drbd_tconn *tconn, char *cmd)
Expand Down Expand Up @@ -2865,7 +2867,9 @@ int drbd_adm_add_minor(struct sk_buff *skb, struct genl_info *info)
goto out;
}

down_write(&drbd_cfg_rwsem);
retcode = conn_new_minor(adm_ctx.tconn, dh->minor, adm_ctx.volume);
up_write(&drbd_cfg_rwsem);
out:
drbd_adm_finish(info, retcode);
return 0;
Expand Down
2 changes: 2 additions & 0 deletions trunk/drivers/block/drbd/drbd_proc.c
Original file line number Diff line number Diff line change
Expand Up @@ -227,6 +227,7 @@ static int drbd_seq_show(struct seq_file *seq, void *v)
oos .. known out-of-sync kB
*/

down_read(&drbd_cfg_rwsem);
idr_for_each_entry(&minors, mdev, i) {
if (prev_i != i - 1)
seq_printf(seq, "\n");
Expand Down Expand Up @@ -293,6 +294,7 @@ static int drbd_seq_show(struct seq_file *seq, void *v)
}
}
}
up_read(&drbd_cfg_rwsem);

return 0;
}
Expand Down
13 changes: 11 additions & 2 deletions trunk/drivers/block/drbd/drbd_receiver.c
Original file line number Diff line number Diff line change
Expand Up @@ -964,7 +964,10 @@ static int drbd_connect(struct drbd_tconn *tconn)
if (drbd_send_protocol(tconn) == -EOPNOTSUPP)
return -1;

return !idr_for_each(&tconn->volumes, drbd_connected, tconn);
down_read(&drbd_cfg_rwsem);
h = !idr_for_each(&tconn->volumes, drbd_connected, tconn);
up_read(&drbd_cfg_rwsem);
return h;

out_release_sockets:
if (tconn->data.socket) {
Expand Down Expand Up @@ -4084,7 +4087,9 @@ static void drbd_disconnect(struct drbd_tconn *tconn)
drbd_thread_stop(&tconn->asender);
drbd_free_sock(tconn);

down_read(&drbd_cfg_rwsem);
idr_for_each(&tconn->volumes, drbd_disconnected, tconn);
up_read(&drbd_cfg_rwsem);
conn_info(tconn, "Connection closed\n");

if (conn_highest_role(tconn) == R_PRIMARY && conn_highest_pdsk(tconn) >= D_UNKNOWN)
Expand Down Expand Up @@ -4821,10 +4826,14 @@ static int tconn_finish_peer_reqs(struct drbd_tconn *tconn)
do {
clear_bit(SIGNAL_ASENDER, &tconn->flags);
flush_signals(current);
down_read(&drbd_cfg_rwsem);
idr_for_each_entry(&tconn->volumes, mdev, i) {
if (drbd_finish_peer_reqs(mdev))
if (drbd_finish_peer_reqs(mdev)) {
up_read(&drbd_cfg_rwsem);
return 1; /* error */
}
}
up_read(&drbd_cfg_rwsem);
set_bit(SIGNAL_ASENDER, &tconn->flags);

spin_lock_irq(&tconn->req_lock);
Expand Down
2 changes: 2 additions & 0 deletions trunk/drivers/block/drbd/drbd_worker.c
Original file line number Diff line number Diff line change
Expand Up @@ -1731,12 +1731,14 @@ int drbd_worker(struct drbd_thread *thi)
spin_unlock_irq(&tconn->data.work.q_lock);

drbd_thread_stop(&tconn->receiver);
down_read(&drbd_cfg_rwsem);
idr_for_each_entry(&tconn->volumes, mdev, vnr) {
D_ASSERT(mdev->state.disk == D_DISKLESS && mdev->state.conn == C_STANDALONE);
/* _drbd_set_state only uses stop_nowait.
* wait here for the exiting receiver. */
drbd_mdev_cleanup(mdev);
}
up_read(&drbd_cfg_rwsem);
clear_bit(OBJECT_DYING, &tconn->flags);
clear_bit(CONFIG_PENDING, &tconn->flags);
wake_up(&tconn->ping_wait);
Expand Down

0 comments on commit cc3a26c

Please sign in to comment.