Module Name: src Committed By: yamt Date: Wed Dec 29 22:56:59 UTC 2010
Modified Files: src/tests/fs/common: fstest_puffs.c Log Message: don't assume atomic read/write on socketpair. puffs_kargs at least is too large to assume atomic read/write. this makes some tests including fs/puffs/t_basic pass on my environment. To generate a diff of this commit: cvs rdiff -u -r1.6 -r1.7 src/tests/fs/common/fstest_puffs.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/tests/fs/common/fstest_puffs.c diff -u src/tests/fs/common/fstest_puffs.c:1.6 src/tests/fs/common/fstest_puffs.c:1.7 --- src/tests/fs/common/fstest_puffs.c:1.6 Mon Nov 1 16:27:07 2010 +++ src/tests/fs/common/fstest_puffs.c Wed Dec 29 22:56:59 2010 @@ -1,4 +1,4 @@ -/* $NetBSD: fstest_puffs.c,v 1.6 2010/11/01 16:27:07 pooka Exp $ */ +/* $NetBSD: fstest_puffs.c,v 1.7 2010/12/29 22:56:59 yamt Exp $ */ /* * Copyright (c) 2010 The NetBSD Foundation, Inc. @@ -55,6 +55,44 @@ static bool mayquit = false; +static ssize_t +xread(int fd, void *vp, size_t n) +{ + size_t left; + + left = n; + do { + ssize_t ssz; + + ssz = read(fd, vp, left); + if (ssz == -1) { + return ssz; + } + left -= ssz; + vp = (char *)vp + ssz; + } while (left > 0); + return n; +} + +static ssize_t +xwrite(int fd, const void *vp, size_t n) +{ + size_t left; + + left = n; + do { + ssize_t ssz; + + ssz = write(fd, vp, left); + if (ssz == -1) { + return ssz; + } + left -= ssz; + vp = (const char *)vp + ssz; + } while (left > 0); + return n; +} + /* * Threads which shovel data between comfd and /dev/puffs. * (cannot use polling since fd's are in different namespaces) @@ -102,7 +140,7 @@ } n = phdr->pth_framelen; - if (write(comfd, buf, n) != n) { + if (xwrite(comfd, buf, n) != n) { fprintf(stderr, "readshovel write %zd / %d\n", n, errno); break; } @@ -143,7 +181,7 @@ toread = sizeof(struct putter_hdr); assert(toread < BUFSIZE); do { - n = read(comfd, buf+off, toread); + n = xread(comfd, buf+off, toread); if (n <= 0) { fprintf(stderr, "writeshovel read %zd / %d\n", n, errno); @@ -269,30 +307,30 @@ } /* read args */ - if ((n = read(sv[1], &len, sizeof(len))) != sizeof(len)) + if ((n = xread(sv[1], &len, sizeof(len))) != sizeof(len)) err(1, "mp 1 %zd", n); if (len > MAXPATHLEN) err(1, "mntpath > MAXPATHLEN"); - if ((size_t)read(sv[1], args->pta_dir, len) != len) + if ((size_t)xread(sv[1], args->pta_dir, len) != len) err(1, "mp 2"); - if (read(sv[1], &len, sizeof(len)) != sizeof(len)) + if (xread(sv[1], &len, sizeof(len)) != sizeof(len)) err(1, "fn 1"); if (len > MAXPATHLEN) err(1, "devpath > MAXPATHLEN"); - if ((size_t)read(sv[1], args->pta_dev, len) != len) + if ((size_t)xread(sv[1], args->pta_dev, len) != len) err(1, "fn 2"); - if (read(sv[1], &mntflags, sizeof(mntflags)) != sizeof(mntflags)) + if (xread(sv[1], &mntflags, sizeof(mntflags)) != sizeof(mntflags)) err(1, "mntflags"); - if (read(sv[1], &args->pta_pargslen, sizeof(args->pta_pargslen)) + if (xread(sv[1], &args->pta_pargslen, sizeof(args->pta_pargslen)) != sizeof(args->pta_pargslen)) err(1, "puffstest_args len"); args->pta_pargs = malloc(args->pta_pargslen); if (args->pta_pargs == NULL) err(1, "malloc"); - if (read(sv[1], args->pta_pargs, args->pta_pargslen) + if (xread(sv[1], args->pta_pargs, args->pta_pargslen) != (ssize_t)args->pta_pargslen) err(1, "puffstest_args"); - if (read(sv[1], pflags, sizeof(*pflags)) != sizeof(*pflags)) + if (xread(sv[1], pflags, sizeof(*pflags)) != sizeof(*pflags)) err(1, "pflags"); args->pta_childpid = childpid;