Module Name:    src
Committed By:   pooka
Date:           Wed May 20 13:56:36 UTC 2009

Modified Files:
        src/usr.sbin/puffs/mount_psshfs: fs.c mount_psshfs.8 node.c psshfs.c
            psshfs.h subr.c

Log Message:
Introduce -c [12], which can be used to open 1 or 2 ssh connections
to the server.  If "2" is specified, a separate connection is used
for data and directory operations.  Using two connections can
significantly increase directory operation performance on a saturated
link, at least up to 30x faster.


To generate a diff of this commit:
cvs rdiff -u -r1.18 -r1.19 src/usr.sbin/puffs/mount_psshfs/fs.c
cvs rdiff -u -r1.19 -r1.20 src/usr.sbin/puffs/mount_psshfs/mount_psshfs.8
cvs rdiff -u -r1.56 -r1.57 src/usr.sbin/puffs/mount_psshfs/node.c
cvs rdiff -u -r1.50 -r1.51 src/usr.sbin/puffs/mount_psshfs/psshfs.c
cvs rdiff -u -r1.35 -r1.36 src/usr.sbin/puffs/mount_psshfs/psshfs.h
cvs rdiff -u -r1.45 -r1.46 src/usr.sbin/puffs/mount_psshfs/subr.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/usr.sbin/puffs/mount_psshfs/fs.c
diff -u src/usr.sbin/puffs/mount_psshfs/fs.c:1.18 src/usr.sbin/puffs/mount_psshfs/fs.c:1.19
--- src/usr.sbin/puffs/mount_psshfs/fs.c:1.18	Mon Feb 23 18:43:46 2009
+++ src/usr.sbin/puffs/mount_psshfs/fs.c	Wed May 20 13:56:36 2009
@@ -1,4 +1,4 @@
-/*	$NetBSD: fs.c,v 1.18 2009/02/23 18:43:46 pooka Exp $	*/
+/*	$NetBSD: fs.c,v 1.19 2009/05/20 13:56:36 pooka Exp $	*/
 
 /*
  * Copyright (c) 2006  Antti Kantee.  All Rights Reserved.
@@ -27,7 +27,7 @@
 
 #include <sys/cdefs.h>
 #ifndef lint
-__RCSID("$NetBSD: fs.c,v 1.18 2009/02/23 18:43:46 pooka Exp $");
+__RCSID("$NetBSD: fs.c,v 1.19 2009/05/20 13:56:36 pooka Exp $");
 #endif /* !lint */
 
 #include <err.h>
@@ -84,7 +84,7 @@
 }};
 	
 int
-psshfs_handshake(struct puffs_usermount *pu)
+psshfs_handshake(struct puffs_usermount *pu, int fd)
 {
 	struct psshfs_ctx *pctx = puffs_getspecific(pu);
 	struct puffs_framebuf *pb;
@@ -100,10 +100,10 @@
 	pb = psbuf_makeout();
 	psbuf_put_1(pb, SSH_FXP_INIT);
 	psbuf_put_4(pb, SFTP_PROTOVERSION);
-	DO_IO(psbuf_write, pu, pb, pctx->sshfd, &done, rv);
+	DO_IO(psbuf_write, pu, pb, fd, &done, rv);
 
 	puffs_framebuf_recycle(pb);
-	DO_IO(psbuf_read, pu, pb, pctx->sshfd, &done, rv);
+	DO_IO(psbuf_read, pu, pb, fd, &done, rv);
 	if (psbuf_get_type(pb) != SSH_FXP_VERSION)
 		reterr((stderr, "invalid server response: %d",
 		    psbuf_get_type(pb)), EPROTO);
@@ -118,7 +118,7 @@
 			break;
 		if (psbuf_get_str(pb, &val, NULL) != 0)
 			break;
-		
+
 		for (extu = exttable; extu->ext; extu++)
 			if (strcmp(ext, extu->ext) == 0
 			    && strcmp(val, extu->val) == 0)
@@ -130,10 +130,10 @@
 	psbuf_put_1(pb, SSH_FXP_REALPATH);
 	psbuf_put_4(pb, NEXTREQ(pctx));
 	psbuf_put_str(pb, pctx->mountpath);
-	DO_IO(psbuf_write, pu, pb, pctx->sshfd, &done, rv);
+	DO_IO(psbuf_write, pu, pb, fd, &done, rv);
 
 	puffs_framebuf_recycle(pb);
-	DO_IO(psbuf_read, pu, pb, pctx->sshfd, &done, rv);
+	DO_IO(psbuf_read, pu, pb, fd, &done, rv);
 	if (psbuf_get_type(pb) != SSH_FXP_NAME)
 		reterr((stderr, "invalid server realpath response for \"%s\"",
 		    pctx->mountpath), EPROTO);
@@ -145,10 +145,10 @@
 	/* stat the rootdir so that we know it's a dir */
 	psbuf_recycleout(pb);
 	psbuf_req_str(pb, SSH_FXP_LSTAT, NEXTREQ(pctx), rootpath);
-	DO_IO(psbuf_write, pu, pb, pctx->sshfd, &done, rv);
+	DO_IO(psbuf_write, pu, pb, fd, &done, rv);
 
 	puffs_framebuf_recycle(pb);
-	DO_IO(psbuf_read, pu, pb, pctx->sshfd, &done, rv);
+	DO_IO(psbuf_read, pu, pb, fd, &done, rv);
 
 	rv = psbuf_expect_attrs(pb, &va);
 	if (rv)
@@ -187,7 +187,7 @@
 
 	psbuf_req_str(pb, SSH_FXP_EXTENDED, reqid, "stat...@openssh.com");
 	psbuf_put_str(pb, pctx->mountpath);
-	GETRESPONSE(pb);
+	GETRESPONSE(pb, pctx->sshfd);
 
 	type = psbuf_get_type(pb);
 	if (type != SSH_FXP_EXTENDED_REPLY) {
@@ -222,6 +222,11 @@
 
 	kill(pctx->sshpid, SIGTERM);
 	close(pctx->sshfd);
+	if (pctx->numconnections == 2) {
+		kill(pctx->sshpid_data, SIGTERM);
+		close(pctx->sshfd_data);
+	}
+
 	return 0;
 }
 

Index: src/usr.sbin/puffs/mount_psshfs/mount_psshfs.8
diff -u src/usr.sbin/puffs/mount_psshfs/mount_psshfs.8:1.19 src/usr.sbin/puffs/mount_psshfs/mount_psshfs.8:1.20
--- src/usr.sbin/puffs/mount_psshfs/mount_psshfs.8:1.19	Thu Feb 26 07:14:36 2009
+++ src/usr.sbin/puffs/mount_psshfs/mount_psshfs.8	Wed May 20 13:56:36 2009
@@ -1,4 +1,4 @@
-.\"	$NetBSD: mount_psshfs.8,v 1.19 2009/02/26 07:14:36 wiz Exp $
+.\"	$NetBSD: mount_psshfs.8,v 1.20 2009/05/20 13:56:36 pooka Exp $
 .\"
 .\" Copyright (c) 2007 Antti Kantee.  All rights reserved.
 .\"
@@ -23,7 +23,7 @@
 .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 .\" SUCH DAMAGE.
 .\"
-.Dd February 25, 2009
+.Dd May 20, 2009
 .Dt MOUNT_PSSHFS 8
 .Os
 .Sh NAME
@@ -56,6 +56,19 @@
 The following command line options are available:
 .Pp
 .Bl -tag -width xxx
+.It Fl c Ar nconnect
+Opens
+.Ar nconnect
+connections to the server.
+Currently, the value has to be 1 or 2.
+If 2 is specified, a second connection is opened for the reading
+and writing of data, while directory operations are performed on
+their own connection.
+This can greatly increase directory operation performance (ls,
+mkdir, etc.) if
+.Nm
+completely saturates the available bandwidth by doing bulk data copying.
+The default is 1.
 .It Fl e
 Makes the mounted file system NFS exportable.
 If this option is used, it is very important to understand that

Index: src/usr.sbin/puffs/mount_psshfs/node.c
diff -u src/usr.sbin/puffs/mount_psshfs/node.c:1.56 src/usr.sbin/puffs/mount_psshfs/node.c:1.57
--- src/usr.sbin/puffs/mount_psshfs/node.c:1.56	Sun Mar 29 16:06:53 2009
+++ src/usr.sbin/puffs/mount_psshfs/node.c	Wed May 20 13:56:36 2009
@@ -1,4 +1,4 @@
-/*	$NetBSD: node.c,v 1.56 2009/03/29 16:06:53 pooka Exp $	*/
+/*	$NetBSD: node.c,v 1.57 2009/05/20 13:56:36 pooka Exp $	*/
 
 /*
  * Copyright (c) 2006  Antti Kantee.  All Rights Reserved.
@@ -27,7 +27,7 @@
 
 #include <sys/cdefs.h>
 #ifndef lint
-__RCSID("$NetBSD: node.c,v 1.56 2009/03/29 16:06:53 pooka Exp $");
+__RCSID("$NetBSD: node.c,v 1.57 2009/05/20 13:56:36 pooka Exp $");
 #endif /* !lint */
 
 #include <assert.h>
@@ -148,7 +148,7 @@
 	}
 			
 	psbuf_put_vattr(pb, &kludgeva);
-	GETRESPONSE(pb);
+	GETRESPONSE(pb, pctx->sshfd);
 
 	rv = psbuf_expect_status(pb);
 	if (rv == 0)
@@ -173,7 +173,7 @@
 	psbuf_req_str(pb, SSH_FXP_OPEN, reqid, PCNPATH(pcn));
 	psbuf_put_4(pb, SSH_FXF_WRITE | SSH_FXF_CREAT | SSH_FXF_TRUNC);
 	psbuf_put_vattr(pb, va);
-	GETRESPONSE(pb);
+	GETRESPONSE(pb, pctx->sshfd);
 	rv = psbuf_expect_handle(pb, &fhand, &fhandlen);
 	if (rv)
 		goto out;
@@ -190,7 +190,7 @@
 		struct puffs_framebuf *pb2 = psbuf_makeout();
 		reqid = NEXTREQ(pctx);
 		psbuf_req_str(pb2, SSH_FXP_REMOVE, reqid, PCNPATH(pcn));
-		JUSTSEND(pb2);
+		JUSTSEND(pb2, pctx->sshfd);
 		rv = ENOMEM;
 	}
 
@@ -200,7 +200,7 @@
 	reqid = NEXTREQ(pctx);
 	psbuf_recycleout(pb);
 	psbuf_req_data(pb, SSH_FXP_CLOSE, reqid, fhand, fhandlen);
-	JUSTSEND(pb);
+	JUSTSEND(pb, pctx->sshfd);
 	free(fhand);
 	return rv;
 
@@ -248,7 +248,7 @@
 		psbuf_put_4(pb, SSH_FXF_READ);
 		psbuf_put_vattr(pb, &va);
 
-		if (puffs_framev_enqueue_cb(pu, pctx->sshfd, pb,
+		if (puffs_framev_enqueue_cb(pu, pctx->sshfd_data, pb,
 		    lazyopen_rresp, psn, 0) == -1) {
 			rv = errno;
 			puffs_framebuf_destroy(pb);
@@ -266,7 +266,7 @@
 		psbuf_put_4(pb2, SSH_FXF_WRITE);
 		psbuf_put_vattr(pb2, &va);
 
-		if (puffs_framev_enqueue_cb(pu, pctx->sshfd, pb2,
+		if (puffs_framev_enqueue_cb(pu, pctx->sshfd_data, pb2,
 		    lazyopen_wresp, psn, 0) == -1) {
 			rv = errno;
 			puffs_framebuf_destroy(pb2);
@@ -480,7 +480,7 @@
 		puffs_cc_yield(pcc);
 	}
 
-	GETRESPONSE(pb);
+	GETRESPONSE(pb, pctx->sshfd_data);
 
 	rv = psbuf_do_data(pb, buf, &readlen);
 	if (rv == 0)
@@ -574,7 +574,7 @@
 	psbuf_req_data(pb, SSH_FXP_WRITE, reqid, psn->fhand_w,psn->fhand_w_len);
 	psbuf_put_8(pb, offset);
 	psbuf_put_data(pb, buf, writelen);
-	GETRESPONSE(pb);
+	GETRESPONSE(pb, pctx->sshfd_data);
 
 	rv = psbuf_expect_status(pb);
 	if (rv == 0)
@@ -626,7 +626,7 @@
 	}
 
 	psbuf_req_str(pb, SSH_FXP_READLINK, reqid, PNPATH(pn));
-	GETRESPONSE(pb);
+	GETRESPONSE(pb, pctx->sshfd);
 
 	rv = psbuf_expect_name(pb, &count);
 	if (rv)
@@ -662,7 +662,7 @@
 		op = SSH_FXP_REMOVE;
 
 	psbuf_req_str(pb, op, reqid, PNPATH(pn));
-	GETRESPONSE(pb);
+	GETRESPONSE(pb, pctx->sshfd);
 
 	rv = psbuf_expect_status(pb);
 	if (rv == 0)
@@ -715,7 +715,7 @@
 
 	psbuf_req_str(pb, SSH_FXP_MKDIR, reqid, PCNPATH(pcn));
 	psbuf_put_vattr(pb, va);
-	GETRESPONSE(pb);
+	GETRESPONSE(pb, pctx->sshfd);
 
 	rv = psbuf_expect_status(pb);
 	if (rv)
@@ -729,7 +729,7 @@
 		reqid = NEXTREQ(pctx);
 		psbuf_recycleout(pb2);
 		psbuf_req_str(pb2, SSH_FXP_RMDIR, reqid, PCNPATH(pcn));
-		JUSTSEND(pb2);
+		JUSTSEND(pb2, pctx->sshfd);
 		rv = ENOMEM;
 	}
 
@@ -757,7 +757,7 @@
 	 */
 	psbuf_req_str(pb, SSH_FXP_SYMLINK, reqid, link_target);
 	psbuf_put_str(pb, PCNPATH(pcn));
-	GETRESPONSE(pb);
+	GETRESPONSE(pb, pctx->sshfd);
 
 	rv = psbuf_expect_status(pb);
 	if (rv)
@@ -771,7 +771,7 @@
 		reqid = NEXTREQ(pctx);
 		psbuf_recycleout(pb2);
 		psbuf_req_str(pb2, SSH_FXP_REMOVE, reqid, PCNPATH(pcn));
-		JUSTSEND(pb2);
+		JUSTSEND(pb2, pctx->sshfd);
 		rv = ENOMEM;
 	}
 
@@ -804,7 +804,7 @@
 
 	psbuf_req_str(pb, SSH_FXP_RENAME, reqid, PCNPATH(pcn_src));
 	psbuf_put_str(pb, PCNPATH(pcn_targ));
-	GETRESPONSE(pb);
+	GETRESPONSE(pb, pctx->sshfd);
 
 	rv = psbuf_expect_status(pb);
 	if (rv == 0) {

Index: src/usr.sbin/puffs/mount_psshfs/psshfs.c
diff -u src/usr.sbin/puffs/mount_psshfs/psshfs.c:1.50 src/usr.sbin/puffs/mount_psshfs/psshfs.c:1.51
--- src/usr.sbin/puffs/mount_psshfs/psshfs.c:1.50	Mon Feb 23 18:43:46 2009
+++ src/usr.sbin/puffs/mount_psshfs/psshfs.c	Wed May 20 13:56:36 2009
@@ -1,4 +1,4 @@
-/*	$NetBSD: psshfs.c,v 1.50 2009/02/23 18:43:46 pooka Exp $	*/
+/*	$NetBSD: psshfs.c,v 1.51 2009/05/20 13:56:36 pooka Exp $	*/
 
 /*
  * Copyright (c) 2006  Antti Kantee.  All Rights Reserved.
@@ -41,7 +41,7 @@
 
 #include <sys/cdefs.h>
 #ifndef lint
-__RCSID("$NetBSD: psshfs.c,v 1.50 2009/02/23 18:43:46 pooka Exp $");
+__RCSID("$NetBSD: psshfs.c,v 1.51 2009/05/20 13:56:36 pooka Exp $");
 #endif /* !lint */
 
 #include <sys/types.h>
@@ -60,7 +60,7 @@
 
 #include "psshfs.h"
 
-static int	pssh_connect(struct psshfs_ctx *);
+static int	pssh_connect(struct puffs_usermount *, int);
 static void	psshfs_loopfn(struct puffs_usermount *);
 static void	usage(void);
 static void	add_ssharg(char ***, int *, char *);
@@ -87,7 +87,7 @@
 {
 
 	fprintf(stderr, "usage: %s "
-	    "[-es] [-F configfile] [-O sshopt=value] [-o opts] "
+	    "[-ceprst] [-F configfile] [-O sshopt=value] [-o opts] "
 	    "u...@host:path mountpath\n",
 	    getprogname());
 	exit(1);
@@ -116,8 +116,8 @@
 	char *hostpath;
 	int mntflags, pflags, ch;
 	int detach;
-	int exportfs, refreshival;
-	int nargs, x;
+	int exportfs, refreshival, numconnections;
+	int nargs;
 
 	setprogname(argv[0]);
 
@@ -125,6 +125,7 @@
 		usage();
 
 	mntflags = pflags = exportfs = nargs = 0;
+	numconnections = 1;
 	detach = 1;
 	refreshival = DEFAULTREFRESH;
 	notfn = puffs_framev_unmountonclose;
@@ -133,8 +134,17 @@
 	add_ssharg(&sshargs, &nargs, "-axs");
 	add_ssharg(&sshargs, &nargs, "-oClearAllForwardings=yes");
 
-	while ((ch = getopt(argc, argv, "eF:o:O:pr:st:")) != -1) {
+	while ((ch = getopt(argc, argv, "c:eF:o:O:pr:st:")) != -1) {
 		switch (ch) {
+		case 'c':
+			numconnections = atoi(optarg);
+			if (numconnections < 1 || numconnections > 2) {
+				fprintf(stderr, "%s: only 1 or 2 connections "
+				    "permitted currently\n", getprogname());
+				usage();
+				/*NOTREACHED*/
+			}
+			break;
 		case 'e':
 			exportfs = 1;
 			break;
@@ -214,6 +224,7 @@
 	memset(&pctx, 0, sizeof(pctx));
 	pctx.mounttime = time(NULL);
 	pctx.refreshival = refreshival;
+	pctx.numconnections = numconnections;
 
 	userhost = argv[0];
 	hostpath = strchr(userhost, ':');
@@ -234,26 +245,29 @@
 		return errno;
 	puffs_setroot(pu, pn_root);
 
+	puffs_framev_init(pu, psbuf_read, psbuf_write, psbuf_cmp, NULL, notfn);
+
 	signal(SIGHUP, takehup);
 	puffs_ml_setloopfn(pu, psshfs_loopfn);
-	if (pssh_connect(&pctx) == -1)
-		err(1, "can't connect");
+	if (pssh_connect(pu, PSSHFD_META) == -1)
+		err(1, "can't connect meta");
+	if (puffs_framev_addfd(pu, pctx.sshfd,
+	    PUFFS_FBIO_READ | PUFFS_FBIO_WRITE) == -1)
+		err(1, "framebuf addfd meta");
+	if (numconnections == 2) {
+		if (pssh_connect(pu, PSSHFD_DATA) == -1)
+			err(1, "can't connect data");
+		if (puffs_framev_addfd(pu, pctx.sshfd_data,
+		    PUFFS_FBIO_READ | PUFFS_FBIO_WRITE) == -1)
+			err(1, "framebuf addfd data");
+	} else {
+		pctx.sshfd_data = pctx.sshfd;
+	}
 
 	if (exportfs)
 		puffs_setfhsize(pu, sizeof(struct psshfs_fid),
 		    PUFFS_FHFLAG_NFSV2 | PUFFS_FHFLAG_NFSV3);
 
-	if (psshfs_handshake(pu) != 0)
-		errx(1, "psshfs_handshake");
-	x = 1;
-	if (ioctl(pctx.sshfd, FIONBIO, &x) == -1)
-		err(1, "nonblocking descriptor");
-
-	puffs_framev_init(pu, psbuf_read, psbuf_write, psbuf_cmp, NULL, notfn);
-	if (puffs_framev_addfd(pu, pctx.sshfd,
-	    PUFFS_FBIO_READ | PUFFS_FBIO_WRITE) == -1)
-		err(1, "framebuf addfd");
-
 	rva = &pn_root->pn_va;
 	rva->va_fileid = pctx.nextino++;
 	rva->va_nlink = 101; /* XXX */
@@ -280,36 +294,43 @@
 psshfs_notify(struct puffs_usermount *pu, int fd, int what)
 {
 	struct psshfs_ctx *pctx = puffs_getspecific(pu);
-	int x, nretry;
+	int x, nretry, which, newfd;
+
+	if (fd == pctx->sshfd) {
+		which = PSSHFD_META;
+	} else {
+		assert(fd == pctx->sshfd_data);
+		which = PSSHFD_DATA;
+	}
 
 	if (puffs_getstate(pu) != PUFFS_STATE_RUNNING)
 		return;
 
 	if (what != (PUFFS_FBIO_READ | PUFFS_FBIO_WRITE)) {
-		puffs_framev_removefd(pu, pctx->sshfd, ECONNRESET);
+		puffs_framev_removefd(pu, fd, ECONNRESET);
 		return;
 	}
-	close(pctx->sshfd);
+	close(fd);
 
 	for (nretry = 0;;nretry++) {
-		if (pssh_connect(pctx) == -1)
+		if ((newfd = pssh_connect(pu, which)) == -1)
 			goto retry2;
 
-		if (psshfs_handshake(pu) != 0)
+		if (psshfs_handshake(pu, newfd) != 0)
 			goto retry1;
 
 		x = 1;
-		if (ioctl(pctx->sshfd, FIONBIO, &x) == -1)
+		if (ioctl(newfd, FIONBIO, &x) == -1)
 			goto retry1;
 
-		if (puffs_framev_addfd(pu, pctx->sshfd,
+		if (puffs_framev_addfd(pu, newfd,
 		    PUFFS_FBIO_READ | PUFFS_FBIO_WRITE) == -1)
 			goto retry1;
 
 		break;
  retry1:
 		fprintf(stderr, "reconnect failed... ");
-		close(pctx->sshfd);
+		close(newfd);
  retry2:
 		if (nretry < RETRY_MAX) {
 			fprintf(stderr, "retrying\n");
@@ -322,12 +343,24 @@
 }
 
 static int
-pssh_connect(struct psshfs_ctx *pctx)
+pssh_connect(struct puffs_usermount *pu, int which)
 {
+	struct psshfs_ctx *pctx = puffs_getspecific(pu);
 	char **sshargs = pctx->sshargs;
 	int fds[2];
 	pid_t pid;
-	int dnfd;
+	int dnfd, x;
+	int *sshfd;
+	pid_t *sshpid;
+
+	if (which == PSSHFD_META) {
+		sshfd = &pctx->sshfd;
+		sshpid = &pctx->sshpid;
+	} else {
+		assert(which == PSSHFD_DATA);
+		sshfd = &pctx->sshfd_data;
+		sshpid = &pctx->sshpid_data;
+	}
 
 	if (socketpair(AF_UNIX, SOCK_STREAM, 0, fds) == -1)
 		return -1;
@@ -350,15 +383,22 @@
 			dup2(dnfd, STDERR_FILENO);
 
 		execvp(sshargs[0], sshargs);
+		/*NOTREACHED*/
 		break;
 	default:
-		pctx->sshpid = pid;
-		pctx->sshfd = fds[1];
+		*sshpid = pid;
+		*sshfd = fds[1];
 		close(fds[0]);
 		break;
 	}
 
-	return 0;
+	if (psshfs_handshake(pu, *sshfd) != 0)
+		errx(1, "psshfs_handshake %d", which);
+	x = 1;
+	if (ioctl(*sshfd, FIONBIO, &x) == -1)
+		err(1, "nonblocking descriptor %d", which);
+
+	return *sshfd;
 }
 
 static void *

Index: src/usr.sbin/puffs/mount_psshfs/psshfs.h
diff -u src/usr.sbin/puffs/mount_psshfs/psshfs.h:1.35 src/usr.sbin/puffs/mount_psshfs/psshfs.h:1.36
--- src/usr.sbin/puffs/mount_psshfs/psshfs.h:1.35	Mon Feb 23 18:43:46 2009
+++ src/usr.sbin/puffs/mount_psshfs/psshfs.h	Wed May 20 13:56:36 2009
@@ -1,4 +1,4 @@
-/*	$NetBSD: psshfs.h,v 1.35 2009/02/23 18:43:46 pooka Exp $	*/
+/*	$NetBSD: psshfs.h,v 1.36 2009/05/20 13:56:36 pooka Exp $	*/
 
 /*
  * Copyright (c) 2006, 2007  Antti Kantee.  All Rights Reserved.
@@ -65,25 +65,25 @@
 	puffs_framebuf_destroy(pb);					\
 	return (rv)
 
-#define GETRESPONSE(pb)							\
+#define GETRESPONSE(pb, fd)						\
 do {									\
-	if (puffs_framev_enqueue_cc(pcc, pctx->sshfd, pb, 0) == -1) {	\
+	if (puffs_framev_enqueue_cc(pcc, fd, pb, 0) == -1) 	{	\
 		rv = errno;						\
 		goto out;						\
 	}								\
 } while (/*CONSTCOND*/0)
 
-#define JUSTSEND(pb)							\
+#define JUSTSEND(pb,fd)							\
 do {									\
-	if (puffs_framev_enqueue_justsend(pu,pctx->sshfd,pb,1,0) == -1){\
+	if (puffs_framev_enqueue_justsend(pu, fd, pb, 1, 0) == -1) {	\
 		rv = errno;						\
 		goto out;						\
 	}								\
 } while (/*CONSTCOND*/0)
 
-#define SENDCB(pb, f, a)						\
+#define SENDCB(pb, fd, f, a)						\
 do {									\
-	if (puffs_framev_enqueue_cb(pu, pctx->sshfd, pb,f,a,0) == -1) {	\
+	if (puffs_framev_enqueue_cb(pu, fd, pb, f, a, 0) == -1) {	\
 		rv = errno;						\
 		goto out;						\
 	}								\
@@ -153,8 +153,12 @@
 #define HANDLE_WRITE	0x2
 
 struct psshfs_ctx {
+	int numconnections;
 	int sshfd;
+	int sshfd_data;
 	pid_t sshpid;
+	pid_t sshpid_data;
+
 	const char *mountpath;
 	char **sshargs;
 
@@ -173,8 +177,10 @@
 
 	int refreshival;
 };
+#define PSSHFD_META 0
+#define PSSHFD_DATA 1
 
-int	psshfs_handshake(struct puffs_usermount *);
+int	psshfs_handshake(struct puffs_usermount *, int);
 
 int	psbuf_read(struct puffs_usermount *, struct puffs_framebuf *,int,int*);
 int	psbuf_write(struct puffs_usermount *, struct puffs_framebuf *,int,int*);

Index: src/usr.sbin/puffs/mount_psshfs/subr.c
diff -u src/usr.sbin/puffs/mount_psshfs/subr.c:1.45 src/usr.sbin/puffs/mount_psshfs/subr.c:1.46
--- src/usr.sbin/puffs/mount_psshfs/subr.c:1.45	Thu Dec 13 14:59:00 2007
+++ src/usr.sbin/puffs/mount_psshfs/subr.c	Wed May 20 13:56:36 2009
@@ -1,4 +1,4 @@
-/*      $NetBSD: subr.c,v 1.45 2007/12/13 14:59:00 pooka Exp $        */
+/*      $NetBSD: subr.c,v 1.46 2009/05/20 13:56:36 pooka Exp $        */
 
 /*
  * Copyright (c) 2006  Antti Kantee.  All Rights Reserved.
@@ -27,7 +27,7 @@
 
 #include <sys/cdefs.h>
 #ifndef lint
-__RCSID("$NetBSD: subr.c,v 1.45 2007/12/13 14:59:00 pooka Exp $");
+__RCSID("$NetBSD: subr.c,v 1.46 2009/05/20 13:56:36 pooka Exp $");
 #endif /* !lint */
 
 #include <assert.h>
@@ -134,7 +134,7 @@
 		reqid = NEXTREQ(pctx);
 		psbuf_req_data(pb1, SSH_FXP_CLOSE, reqid,
 		    psn->fhand_r, psn->fhand_r_len);
-		puffs_framev_enqueue_justsend(pu, pctx->sshfd, pb1, 1, 0);
+		puffs_framev_enqueue_justsend(pu, pctx->sshfd_data, pb1, 1, 0);
 		free(psn->fhand_r);
 		psn->fhand_r = NULL;
 	}
@@ -146,7 +146,7 @@
 		reqid = NEXTREQ(pctx);
 		psbuf_req_data(pb2, SSH_FXP_CLOSE, reqid,
 		    psn->fhand_w, psn->fhand_w_len);
-		puffs_framev_enqueue_justsend(pu, pctx->sshfd, pb2, 1, 0);
+		puffs_framev_enqueue_justsend(pu, pctx->sshfd_data, pb2, 1, 0);
 		free(psn->fhand_w);
 		psn->fhand_w = NULL;
 	}
@@ -220,7 +220,7 @@
 	PSSHFSAUTOVAR(pu);
 
 	psbuf_req_str(pb, SSH_FXP_LSTAT, reqid, path);
-	GETRESPONSE(pb);
+	GETRESPONSE(pb, pctx->sshfd);
 
 	rv = psbuf_expect_attrs(pb, vap);
 
@@ -307,7 +307,7 @@
 		reqid = NEXTREQ(pctx);
 		psbuf_recycleout(pb);
 		psbuf_req_data(pb, SSH_FXP_READDIR, reqid, dhand, dhandlen);
-		GETRESPONSE(pb);
+		GETRESPONSE(pb, pctx->sshfd);
 
 		/* check for EOF */
 		if (psbuf_get_type(pb) == SSH_FXP_STATUS) {

Reply via email to