[DRBD-cvs] svn commit by lars - r2289 - branches/drbd-0.7/drbd -
don't look at the socket without holding the appropriat
drbd-cvs at lists.linbit.com
drbd-cvs at lists.linbit.com
Thu Jul 20 14:12:44 CEST 2006
Author: lars
Date: 2006-07-20 14:12:42 +0200 (Thu, 20 Jul 2006)
New Revision: 2289
Modified:
branches/drbd-0.7/drbd/drbd_int.h
branches/drbd-0.7/drbd/drbd_main.c
Log:
don't look at the socket without holding the appropriate mutex
Modified: branches/drbd-0.7/drbd/drbd_int.h
===================================================================
--- branches/drbd-0.7/drbd/drbd_int.h 2006-07-20 10:57:56 UTC (rev 2288)
+++ branches/drbd-0.7/drbd/drbd_int.h 2006-07-20 12:12:42 UTC (rev 2289)
@@ -832,7 +832,9 @@
extern int _drbd_send_cmd(drbd_dev *mdev, struct socket *sock,
Drbd_Packet_Cmd cmd, Drbd_Header *h,
size_t size, unsigned msg_flags);
-extern int drbd_send_cmd(drbd_dev *mdev, struct socket *sock,
+#define USE_DATA_SOCKET 1
+#define USE_META_SOCKET 0
+extern int drbd_send_cmd(drbd_dev *mdev, int use_data_socket,
Drbd_Packet_Cmd cmd, Drbd_Header *h, size_t size);
extern int drbd_send_sync_param(drbd_dev *mdev, struct syncer_config *sc);
extern int drbd_send_b_ack(drbd_dev *mdev, u32 barrier_nr,
@@ -1271,19 +1273,19 @@
static inline int drbd_send_short_cmd(drbd_dev *mdev, Drbd_Packet_Cmd cmd)
{
Drbd_Header h;
- return drbd_send_cmd(mdev,mdev->data.socket,cmd,&h,sizeof(h));
+ return drbd_send_cmd(mdev,USE_DATA_SOCKET,cmd,&h,sizeof(h));
}
static inline int drbd_send_ping(drbd_dev *mdev)
{
Drbd_Header h;
- return drbd_send_cmd(mdev,mdev->meta.socket,Ping,&h,sizeof(h));
+ return drbd_send_cmd(mdev,USE_META_SOCKET,Ping,&h,sizeof(h));
}
static inline int drbd_send_ping_ack(drbd_dev *mdev)
{
Drbd_Header h;
- return drbd_send_cmd(mdev,mdev->meta.socket,PingAck,&h,sizeof(h));
+ return drbd_send_cmd(mdev,USE_META_SOCKET,PingAck,&h,sizeof(h));
}
static inline void drbd_thread_stop(struct Drbd_thread *thi)
Modified: branches/drbd-0.7/drbd/drbd_main.c
===================================================================
--- branches/drbd-0.7/drbd/drbd_main.c 2006-07-20 10:57:56 UTC (rev 2288)
+++ branches/drbd-0.7/drbd/drbd_main.c 2006-07-20 12:12:42 UTC (rev 2289)
@@ -628,6 +628,7 @@
UNLOCK_SIGMASK(current,flags);
}
+/* the appropriate socket mutex must be held already */
int _drbd_send_cmd(drbd_dev *mdev, struct socket *sock,
Drbd_Packet_Cmd cmd, Drbd_Header *h,
size_t size, unsigned msg_flags)
@@ -652,32 +653,36 @@
return ok;
}
-int drbd_send_cmd(drbd_dev *mdev, struct socket *sock,
+/* don't pass the socket. we may only look at it
+ * when we hold the appropriate socket mutex.
+ */
+int drbd_send_cmd(drbd_dev *mdev, int use_data_socket,
Drbd_Packet_Cmd cmd, Drbd_Header* h, size_t size)
{
- int ok;
+ int ok = 0;
sigset_t old_blocked;
+ struct socket *sock;
- if (sock == mdev->data.socket) {
+ if (use_data_socket) {
down(&mdev->data.mutex);
- if (sock != mdev->data.socket) {
- /* verify drbd_disconnect: drbd_free_sock may free this
- * socket while we have been waiting in down.
- */
- up(&mdev->data.mutex);
- return 0; /* not ok */
- }
spin_lock(&mdev->send_task_lock);
mdev->send_task=current;
spin_unlock(&mdev->send_task_lock);
- } else
+ sock = mdev->data.socket;
+ } else {
down(&mdev->meta.mutex);
+ sock = mdev->meta.socket;
+ }
- old_blocked = drbd_block_all_signals();
- ok = _drbd_send_cmd(mdev,sock,cmd,h,size,0);
- restore_old_sigset(old_blocked);
+ /* drbd_disconnect() could have called drbd_free_sock()
+ * while we were waiting in down()... */
+ if (likely(sock != NULL)) {
+ old_blocked = drbd_block_all_signals();
+ ok = _drbd_send_cmd(mdev, sock, cmd, h, size, 0);
+ restore_old_sigset(old_blocked);
+ }
- if (sock == mdev->data.socket) {
+ if (use_data_socket) {
spin_lock(&mdev->send_task_lock);
mdev->send_task=NULL;
spin_unlock(&mdev->send_task_lock);
@@ -697,7 +702,7 @@
p.skip = cpu_to_be32(sc->skip);
p.group = cpu_to_be32(sc->group);
- ok = drbd_send_cmd(mdev,mdev->data.socket,SyncParam,(Drbd_Header*)&p,sizeof(p));
+ ok = drbd_send_cmd(mdev,USE_DATA_SOCKET,SyncParam,(Drbd_Header*)&p,sizeof(p));
if ( ok
&& (mdev->cstate == SkippedSyncS || mdev->cstate == SkippedSyncT)
&& !sc->skip )
@@ -739,7 +744,7 @@
p.flags = cpu_to_be32(flags);
p.magic = BE_DRBD_MAGIC;
- ok = drbd_send_cmd(mdev,mdev->data.socket,ReportParams,(Drbd_Header*)&p,sizeof(p));
+ ok = drbd_send_cmd(mdev,USE_DATA_SOCKET,ReportParams,(Drbd_Header*)&p,sizeof(p));
if (have_disk) dec_local(mdev);
return ok;
}
@@ -827,7 +832,7 @@
p.barrier = barrier_nr;
p.set_size = cpu_to_be32(set_size);
- ok = drbd_send_cmd(mdev,mdev->meta.socket,BarrierAck,(Drbd_Header*)&p,sizeof(p));
+ ok = drbd_send_cmd(mdev,USE_META_SOCKET,BarrierAck,(Drbd_Header*)&p,sizeof(p));
return ok;
}
@@ -842,7 +847,7 @@
p.blksize = cpu_to_be32(drbd_ee_get_size(e));
if (!mdev->meta.socket || mdev->cstate < Connected) return FALSE;
- ok = drbd_send_cmd(mdev,mdev->meta.socket,cmd,(Drbd_Header*)&p,sizeof(p));
+ ok = drbd_send_cmd(mdev,USE_META_SOCKET,cmd,(Drbd_Header*)&p,sizeof(p));
return ok;
}
@@ -856,7 +861,7 @@
p.block_id = block_id;
p.blksize = cpu_to_be32(size);
- ok = drbd_send_cmd(mdev,mdev->data.socket,cmd,(Drbd_Header*)&p,sizeof(p));
+ ok = drbd_send_cmd(mdev,USE_DATA_SOCKET,cmd,(Drbd_Header*)&p,sizeof(p));
return ok;
}
@@ -1151,7 +1156,7 @@
*/
/*
- * you should have down()ed the appropriate [m]sock_mutex elsewhere!
+ * you must have down()ed the appropriate [m]sock_mutex elsewhere!
*/
int drbd_send(drbd_dev *mdev, struct socket *sock,
void* buf, size_t size, unsigned msg_flags)
More information about the drbd-cvs
mailing list