gtfs: Remove the EOF optimization
authorBarret Rhoden <brho@cs.berkeley.edu>
Mon, 16 Jul 2018 23:47:34 +0000 (19:47 -0400)
committerBarret Rhoden <brho@cs.berkeley.edu>
Tue, 17 Jul 2018 14:55:22 +0000 (10:55 -0400)
Turns out this is wrong for directories (and often device files).  The
ufs server reports a directory size of 4096, which is what Linux tells
it.  We'd read 4096 bytes worth of records, and then stop.

The 9p man page says:

 The length records the number of bytes in the file. Directories
 and most files representing devices have a conventional length
 of 0.

Instead of mucking around, we'll just issue the RPC for whatever offset
we're asked for.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
kern/drivers/dev/gtfs.c

index a7284ba..bd375a0 100644 (file)
@@ -46,7 +46,10 @@ struct gtfs {
  * be_{length,mode,mtime} should be what the remote server thinks they are -
  * especially for length and mode.  The invariant is that e.g. the file's length
  * == be_length, and the qlock protects that invariant.  We don't care as much
- * about mtime, since some 9p servers just change that on their own. */
+ * about mtime, since some 9p servers just change that on their own.
+ *
+ * Also note that you can't trust be_length for directories.  You'll often get
+ * 4096 or 0, depending on the 9p server you're talking to. */
 struct gtfs_priv {
        struct chan                                     *be_walk;       /* never opened */
        struct chan                                     *be_read;
@@ -323,10 +326,6 @@ static size_t __gtfs_fsf_read(struct fs_file *f, void *ubuf, size_t n,
 {
        struct gtfs_priv *gp = fsf_to_gtfs_priv(f);
 
-       if (off >= gp->be_length) {
-               /* We can skip the RPC, since we know it will return zero (EOF). */
-               return 0;
-       }
        if (!gp->be_read)
                gp->be_read = cclone_and_open(gp->be_walk, O_READ);
        return devtab[gp->be_read->type].read(gp->be_read, ubuf, n, off);