Use readstr() for #device text buffers
[akaros.git] / kern / drivers / dev / gtfs.c
index bd375a0..9f82c77 100644 (file)
@@ -190,9 +190,9 @@ static void purge_cb(struct tree_file *tf)
        poperror();
 }
 
-static void __gtfs_destroy(uint32_t srcid, long a0, long a1, long a2)
+static void gtfs_release(struct kref *kref)
 {
-       struct gtfs *gtfs = (struct gtfs*)a0;
+       struct gtfs *gtfs = container_of(kref, struct gtfs, users);
 
        tfs_frontend_purge(&gtfs->tfs, purge_cb);
        /* this is the ref from attach */
@@ -204,18 +204,6 @@ static void __gtfs_destroy(uint32_t srcid, long a0, long a1, long a2)
        kfree(gtfs);
 }
 
-static void gtfs_release(struct kref *kref)
-{
-       struct gtfs *gtfs = container_of(kref, struct gtfs, users);
-
-       /* We can't use RCU within an RCU callback, and release methods are often
-        * called from within callbacks.  We can use a kernel message, which can
-        * block and do whatever else it wants.  In essence, we break the connection
-        * to our current context (the rcu_mgmt_ktask) by using a kmsg. */
-       send_kernel_message(core_id(), __gtfs_destroy, (long)gtfs, 0, 0,
-                           KMSG_ROUTINE);
-}
-
 static struct gtfs *chan_to_gtfs(struct chan *c)
 {
        struct tree_file *tf = chan_to_tree_file(c);
@@ -829,7 +817,6 @@ static void gtfs_sync_gtfs(struct gtfs *gtfs)
        tfs_frontend_for_each(&gtfs->tfs, gtfs_sync_tf);
 }
 
-/* chan_ctl or something can hook into these functions */
 static void gtfs_sync_chan(struct chan *c)
 {
        gtfs_sync_tf(chan_to_tree_file(c));
@@ -852,7 +839,7 @@ static unsigned long gtfs_chan_ctl(struct chan *c, int op, unsigned long a1,
                        gtfs_sync_chan(c);
                return 0;
        default:
-               error(EINVAL, "%s does not support %d", __func__, op);
+               return tree_chan_ctl(c, op, a1, a2, a3, a4);
        }
 }