gtfs: Fix has_children()
authorBarret Rhoden <brho@cs.berkeley.edu>
Tue, 26 Jun 2018 22:36:56 +0000 (18:36 -0400)
committerBarret Rhoden <brho@cs.berkeley.edu>
Tue, 26 Jun 2018 22:36:56 +0000 (18:36 -0400)
Two problems: the assert was clearly backwards, and we were using the
locked gtfs_read().  As mentioned in tree_file.h, all ops that take a
parent TF have the file qlocked.  gtfs uses that qlock for its backend
operations.  When we called gtfs_read(), we would deadlock.

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

index 1983a57..5962975 100644 (file)
@@ -522,10 +522,13 @@ static bool gtfs_tf_has_children(struct tree_file *parent)
 {
        struct dir dir[1];
 
-       assert(!tree_file_is_dir(parent));      /* TF bug */
-       /* any read should work, but there might be issues asking for something
-        * smaller than a dir. */
-       return gtfs_fsf_read(&parent->file, dir, sizeof(struct dir), 0) > 0;
+       assert(tree_file_is_dir(parent));       /* TF bug */
+       /* Any read should work, but there might be issues asking for something
+        * smaller than a dir.
+        *
+        * Note we use the unlocked read here.  The fs_file's qlock is held by our
+        * caller, and we reuse that qlock for the sync for reading/writing. */
+       return __gtfs_fsf_read(&parent->file, dir, sizeof(struct dir), 0) > 0;
 }
 
 struct tree_file_ops gtfs_tf_ops = {