summaryrefslogtreecommitdiffstats
path: root/sys/fs/portalfs
diff options
context:
space:
mode:
authorrwatson <rwatson@FreeBSD.org>2004-06-24 00:47:23 +0000
committerrwatson <rwatson@FreeBSD.org>2004-06-24 00:47:23 +0000
commitf22a8169c3e592aeeea3ebbec7a1cecfd2605340 (patch)
tree324f20945f6d7db8d2f6360eb56a794f329ed2be /sys/fs/portalfs
parent1f3c0d81182f0e6936642aa3d8a1d0004a3a84e0 (diff)
downloadFreeBSD-src-f22a8169c3e592aeeea3ebbec7a1cecfd2605340.zip
FreeBSD-src-f22a8169c3e592aeeea3ebbec7a1cecfd2605340.tar.gz
Remove spls from portal_open(). Acquire socket lock while sleeping
waiting for the socket to connect and use msleep() on the socket mute rather than tsleep(). Acquire socket buffer mutexes around read-modify-write of socket buffer flags.
Diffstat (limited to 'sys/fs/portalfs')
-rw-r--r--sys/fs/portalfs/portal_vnops.c15
1 files changed, 8 insertions, 7 deletions
diff --git a/sys/fs/portalfs/portal_vnops.c b/sys/fs/portalfs/portal_vnops.c
index 261e626..dce9165 100644
--- a/sys/fs/portalfs/portal_vnops.c
+++ b/sys/fs/portalfs/portal_vnops.c
@@ -216,7 +216,6 @@ portal_open(ap)
struct portalnode *pt;
struct thread *td = ap->a_td;
struct vnode *vp = ap->a_vp;
- int s;
struct uio auio;
struct iovec aiov[2];
int res;
@@ -284,16 +283,18 @@ portal_open(ap)
* will happen if the server dies. Sleep for 5 second intervals
* and keep polling the reference count. XXX.
*/
- s = splnet();
+ /* XXXRW: Locking? */
+ SOCK_LOCK(so);
while ((so->so_state & SS_ISCONNECTING) && so->so_error == 0) {
if (fmp->pm_server->f_count == 1) {
+ SOCK_UNLOCK(so);
error = ECONNREFUSED;
- splx(s);
goto bad;
}
- (void) tsleep((caddr_t) &so->so_timeo, PSOCK, "portalcon", 5 * hz);
+ (void) msleep((caddr_t) &so->so_timeo, SOCK_MTX(so), PSOCK,
+ "portalcon", 5 * hz);
}
- splx(s);
+ SOCK_UNLOCK(so);
if (so->so_error) {
error = so->so_error;
@@ -303,12 +304,12 @@ portal_open(ap)
/*
* Set miscellaneous flags
*/
- so->so_rcv.sb_timeo = 0;
- so->so_snd.sb_timeo = 0;
SOCKBUF_LOCK(&so->so_rcv);
+ so->so_rcv.sb_timeo = 0;
so->so_rcv.sb_flags |= SB_NOINTR;
SOCKBUF_UNLOCK(&so->so_rcv);
SOCKBUF_LOCK(&so->so_snd);
+ so->so_snd.sb_timeo = 0;
so->so_snd.sb_flags |= SB_NOINTR;
SOCKBUF_UNLOCK(&so->so_snd);
OpenPOWER on IntegriCloud