Fixes short 9ns dirent reads
authorBarret Rhoden <brho@cs.berkeley.edu>
Sat, 26 Apr 2014 01:27:21 +0000 (18:27 -0700)
committerBarret Rhoden <brho@cs.berkeley.edu>
Sat, 26 Apr 2014 01:33:00 +0000 (18:33 -0700)
Things like 'ps' were failing.  There might have been others.  The read
method would work, but it was possible to squeeze in multiple Ms in the
buffer for a single kdirent read.  End result, we'd miss entries every
so often.  For devproc, we'd miss the second of three processes.

This didn't take as long to figure this out as when it happened to
devmnt, but still took took long.

I put in a check in devdirread which should trip if our minimum is wrong
again.

kern/include/ns.h
kern/src/ns/dev.c
kern/src/ns/sysfile.c

index 0716238..ca80abe 100644 (file)
@@ -121,6 +121,9 @@ struct dir {
        char *muid;                                     /* last modifier name */
 };
 
+/* Part of the dirty kdirent hack in sysread.  Used to be 59... */
+#define MIN_M_BUF_SZ 52                        /* TODO: 53 is the smallest i've seen */
+
 struct waitmsg {
        int pid;                                        /* of loved one */
        uint32_t time[3];                       /* of loved one and descendants */
index 1dc20c9..ec2a883 100644 (file)
@@ -314,6 +314,7 @@ devdirread(struct chan *c, char *d, long n,
                                                error(Eshort);
                                        return m;
                                }
+                               assert(dsz >= MIN_M_BUF_SZ);
                                m += dsz;
                                d += dsz;
                                break;
index c77f877..db8fe4f 100644 (file)
@@ -716,7 +716,6 @@ static long rread(int fd, void *va, long n, int64_t * offp)
        int64_t off;
 
        /* dirty dirent hack */
-#define MIN_M_BUF_SZ 58        /* TODO: 59 is the smallest i've seen */
        void *real_va = va;
        void *buf_for_M = 0;
        size_t buf_sz = 0;