$NetBSD: patch-ap,v 1.1 2000/08/22 15:08:45 wennmach Exp $ Avoid deadlock situation. From arla-current via Assar and Love. Index: xfs_dev-bsd.c =================================================================== RCS file: /afs/stacken.kth.se/src/SourceRepository/arla/xfs/bsd/xfs_dev-bsd.c,v retrieving revision 1.24 diff -u -w -r1.24 xfs_dev-bsd.c --- xfs/bsd/xfs_dev-bsd.c 2000/07/22 03:59:04 1.24 +++ xfs/bsd/xfs_dev-bsd.c 2000/08/19 10:16:51 @@ -50,7 +50,7 @@ { XFSDEB(XDEBDEV, ("xfsopen dev = %d.%d, flag = %d, devtype = %d\n", major(dev), minor(dev), flag, devtype)); - return xfs_devopen_common(dev); + return xfs_devopen_common(dev, proc); } int Index: xfs_dev-common.c =================================================================== RCS file: /afs/stacken.kth.se/src/SourceRepository/arla/xfs/bsd/xfs_dev-common.c,v retrieving revision 1.39 diff -u -w -r1.39 xfs_dev-common.c --- xfs/bsd/xfs_dev-common.c 2000/07/17 16:23:47 1.39 +++ xfs/bsd/xfs_dev-common.c 2000/08/19 10:27:35 @@ -92,7 +92,7 @@ * Only allow one open. */ int -xfs_devopen_common(dev_t dev) +xfs_devopen_common(dev_t dev, struct proc *p) { struct xfs_channel *chan; @@ -105,8 +105,10 @@ if (chan->status & CHANNEL_OPENED) { XFSDEB(XDEBDEV, ("xfs_devopen: already open\n")); return EBUSY; - } else + } else { chan->status |= CHANNEL_OPENED; + chan->proc = p; + } chan->message_buffer = xfs_alloc(MAX_XMSG_SIZE); @@ -372,7 +374,8 @@ */ int -xfs_message_rpc(int fd, struct xfs_message_header * message, u_int size) +xfs_message_rpc(int fd, struct xfs_message_header * message, u_int size, + struct proc *proc) { int ret; struct xfs_channel *chan = &xfs_channel[fd]; Index: xfs_dev-osf.c =================================================================== RCS file: /afs/stacken.kth.se/src/SourceRepository/arla/xfs/bsd/xfs_dev-osf.c,v retrieving revision 1.7 diff -u -w -r1.7 xfs_dev-osf.c --- xfs/bsd/xfs_dev-osf.c 2000/03/18 00:51:40 1.7 +++ xfs/bsd/xfs_dev-osf.c 2000/08/19 10:17:25 @@ -51,7 +51,7 @@ { XFSDEB(XDEBDEV, ("xfsopen dev = %d.%d, flag = %d, format = %d\n", major(dev), minor(dev), flag, format)); - return xfs_devopen_common(dev); + return xfs_devopen_common(dev, u.u_procp); } static int Index: xfs_syscalls-common.c =================================================================== RCS file: /afs/stacken.kth.se/src/SourceRepository/arla/xfs/bsd/xfs_syscalls-common.c,v retrieving revision 1.51 diff -u -w -r1.51 xfs_syscalls-common.c --- xfs/bsd/xfs_syscalls-common.c 2000/08/02 00:06:16 1.51 +++ xfs/bsd/xfs_syscalls-common.c 2000/08/19 10:23:15 @@ -462,7 +462,7 @@ msg.cred.uid = xfs_proc_to_ruid(p); msg.cred.pag = xfs_get_pag(xfs_proc_to_cred(p)); - error = xfs_message_rpc(0, &msg.header, sizeof(msg)); /* XXX */ + error = xfs_message_rpc(0, &msg.header, sizeof(msg), p); /* XXX */ msg2 = (struct xfs_message_wakeup_data *) &msg; if (error == 0) Index: xfs_vfsops-common.c =================================================================== RCS file: /afs/stacken.kth.se/src/SourceRepository/arla/xfs/bsd/xfs_vfsops-common.c,v retrieving revision 1.27 diff -u -w -r1.27 xfs_vfsops-common.c --- xfs/bsd/xfs_vfsops-common.c 2000/08/01 20:36:56 1.27 +++ xfs/bsd/xfs_vfsops-common.c 2000/08/19 10:23:23 @@ -240,7 +240,7 @@ msg.header.opcode = XFS_MSG_GETROOT; msg.cred.uid = cred->cr_uid; msg.cred.pag = xfs_get_pag(cred); - error = xfs_message_rpc(xfsp->fd, &msg.header, sizeof(msg)); + error = xfs_message_rpc(xfsp->fd, &msg.header, sizeof(msg), proc); if (error == 0) error = ((struct xfs_message_wakeup *) & msg)->error; } while (error == 0); Index: xfs_vnodeops-common.c =================================================================== RCS file: /afs/stacken.kth.se/src/SourceRepository/arla/xfs/bsd/xfs_vnodeops-common.c,v retrieving revision 1.59 diff -u -w -r1.59 xfs_vnodeops-common.c --- xfs/bsd/xfs_vnodeops-common.c 2000/08/17 00:38:36 1.59 +++ xfs/bsd/xfs_vnodeops-common.c 2000/08/19 10:28:19 @@ -71,7 +71,7 @@ msg.handle = xn->handle; msg.tokens = tok; - error = xfs_message_rpc(xfsp->fd, &msg.header, sizeof(msg)); + error = xfs_message_rpc(xfsp->fd, &msg.header, sizeof(msg), p); if (error == 0) error = ((struct xfs_message_wakeup *) & msg)->error; @@ -103,7 +103,7 @@ msg.cred.uid = cred->cr_uid; msg.cred.pag = pag; msg.handle = xn->handle; - error = xfs_message_rpc(xfsp->fd, &msg.header, sizeof(msg)); + error = xfs_message_rpc(xfsp->fd, &msg.header, sizeof(msg), p); if (error == 0) error = ((struct xfs_message_wakeup *) & msg)->error; } else { @@ -132,7 +132,7 @@ msg.cred.uid = cred->cr_uid; msg.cred.pag = pag; msg.handle = xn->handle; - error = xfs_message_rpc(xfsp->fd, &msg.header, sizeof(msg)); + error = xfs_message_rpc(xfsp->fd, &msg.header, sizeof(msg), p); if (error == 0) error = ((struct xfs_message_wakeup *) & msg)->error; } else { @@ -163,7 +163,7 @@ msg.handle = xn->handle; msg.tokens = tok; - error = xfs_message_rpc(xfsp->fd, &msg.header, sizeof(msg)); + error = xfs_message_rpc(xfsp->fd, &msg.header, sizeof(msg), p); if (error == 0) error = ((struct xfs_message_wakeup *) & msg)->error; @@ -229,7 +229,7 @@ vattr2xfs_attr(&xn->attr, &msg.attr); msg.flag = flag; - error = xfs_message_rpc(xfsp->fd, &msg.header, sizeof(msg)); + error = xfs_message_rpc(xfsp->fd, &msg.header, sizeof(msg), p); if (error == 0) error = ((struct xfs_message_wakeup *) & msg)->error; @@ -432,7 +432,7 @@ } XFS_TOKEN_CLEAR(xn, XFS_ATTR_VALID, XFS_ATTR_MASK); - error = xfs_message_rpc(xfsp->fd, &msg.header, sizeof(msg)); + error = xfs_message_rpc(xfsp->fd, &msg.header, sizeof(msg), p); if (error == 0) error = ((struct xfs_message_wakeup *) & msg)->error; } @@ -552,7 +552,7 @@ bcopy(cnp->cn_nameptr, msg.name, cnp->cn_namelen); msg.name[cnp->cn_namelen] = '\0'; - error = xfs_message_rpc(xfsp->fd, &msg.header, sizeof(msg)); + error = xfs_message_rpc(xfsp->fd, &msg.header, sizeof(msg), proc); if (error == 0) error = ((struct xfs_message_wakeup *) & msg)->error; @@ -603,7 +603,7 @@ } - error = xfs_message_rpc(xfsp->fd, &msg.header, sizeof(msg)); + error = xfs_message_rpc(xfsp->fd, &msg.header, sizeof(msg), p); if (error == 0) error = ((struct xfs_message_wakeup *) & msg)->error; @@ -637,7 +637,7 @@ msg.cred.uid = cred->cr_uid; msg.cred.pag = xfs_get_pag(cred); - error = xfs_message_rpc(xfsp->fd, &msg.header, sizeof(msg)); + error = xfs_message_rpc(xfsp->fd, &msg.header, sizeof(msg), p); if (error == 0) error = ((struct xfs_message_wakeup *) &msg)->error; @@ -685,7 +685,7 @@ strncpy(msg.new_name, tname, 256); msg.cred.uid = cred->cr_uid; msg.cred.pag = xfs_get_pag(cred); - error = xfs_message_rpc(xfsp->fd, &msg.header, sizeof(msg)); + error = xfs_message_rpc(xfsp->fd, &msg.header, sizeof(msg), p); if (error == 0) error = ((struct xfs_message_wakeup *) &msg)->error; @@ -722,7 +722,7 @@ msg.cred.uid = 0; msg.cred.pag = XFS_ANONYMOUSID; } - error = xfs_message_rpc(xfsp->fd, &msg.header, sizeof(msg)); + error = xfs_message_rpc(xfsp->fd, &msg.header, sizeof(msg), p); if (error == 0) error = ((struct xfs_message_wakeup *) & msg)->error; } @@ -749,7 +749,7 @@ strncpy(msg.name, name, 256); msg.cred.uid = cred->cr_uid; msg.cred.pag = xfs_get_pag(cred); - error = xfs_message_rpc(xfsp->fd, &msg.header, sizeof(msg)); + error = xfs_message_rpc(xfsp->fd, &msg.header, sizeof(msg), p); if (error == 0) error = ((struct xfs_message_wakeup *) &msg)->error; @@ -823,7 +823,7 @@ msg.cred.uid = cred->cr_uid; msg.cred.pag = xfs_get_pag(cred); - error = xfs_message_rpc(xfsp->fd, &msg.header, sizeof(msg)); + error = xfs_message_rpc(xfsp->fd, &msg.header, sizeof(msg), p); if (error == 0) error = ((struct xfs_message_wakeup *) & msg)->error; @@ -857,7 +857,7 @@ strncpy (msg.contents, target, sizeof(msg.contents)); msg.contents[sizeof(msg.contents) - 1] = '\0'; - error = xfs_message_rpc(xfsp->fd, &msg.header, sizeof(msg)); + error = xfs_message_rpc(xfsp->fd, &msg.header, sizeof(msg), proc); if (error == 0) error = ((struct xfs_message_wakeup *) & msg)->error; @@ -998,7 +998,7 @@ msg.cred.uid = 0; msg.cred.pag = XFS_ANONYMOUSID; } - error = xfs_message_rpc(xfsp->fd, &msg.header, sizeof(msg)); + error = xfs_message_rpc(xfsp->fd, &msg.header, sizeof(msg), p); if (error == 0) error = ((struct xfs_message_wakeup *) & msg)->error; } Index: xfs/xfs_dev.h =================================================================== RCS file: /afs/stacken.kth.se/src/SourceRepository/arla/xfs/bsd/xfs/xfs_dev.h,v retrieving revision 1.13 diff -u -w -r1.13 xfs_dev.h --- xfs/bsd/xfs/xfs_dev.h 2000/04/02 21:28:24 1.13 +++ xfs/bsd/xfs/xfs_dev.h 2000/08/19 10:26:53 @@ -68,6 +68,7 @@ int status; #define CHANNEL_OPENED 0x1 #define CHANNEL_WAITING 0x2 + struct proc *proc; }; extern struct xfs_channel xfs_channel[NXFS]; @@ -108,7 +109,7 @@ xfs_outq(struct xfs_link *p); int -xfs_devopen_common(dev_t dev); +xfs_devopen_common(dev_t dev, struct proc *); #ifndef __osf__ /* XXX - we should do the same for osf */ int xfs_devopen(dev_t dev, int flag, int devtype, struct proc *proc); @@ -131,7 +132,8 @@ xfs_message_send(int fd, struct xfs_message_header * message, u_int size); int -xfs_message_rpc(int fd, struct xfs_message_header * message, u_int size); +xfs_message_rpc(int fd, struct xfs_message_header * message, u_int size, + struct proc *p); int xfs_message_receive(int fd,