summaryrefslogtreecommitdiff
path: root/sys
diff options
context:
space:
mode:
authorIan Moffett <ian@osmora.org>2025-07-01 21:20:06 -0400
committerIan Moffett <ian@osmora.org>2025-07-01 21:20:06 -0400
commit380d1a07c59929b664ddc541055d8014fea9f1c8 (patch)
tree283e2107974f0c4cfa3f9379484c10ad6898e938 /sys
parenta03ee844910a348c905de484ee0a0bac24b21a3d (diff)
kernel: ctlfs: Implement ctlfs write() operations
Signed-off-by: Ian Moffett <ian@osmora.org>
Diffstat (limited to 'sys')
-rw-r--r--sys/fs/ctlfs.c32
1 files changed, 31 insertions, 1 deletions
diff --git a/sys/fs/ctlfs.c b/sys/fs/ctlfs.c
index 18a0275..b86fa0a 100644
--- a/sys/fs/ctlfs.c
+++ b/sys/fs/ctlfs.c
@@ -389,6 +389,36 @@ ctlfs_read(struct vnode *vp, struct sio_txn *sio)
return iop->read(&dev, sio);
}
+/*
+ * Write a control file
+ *
+ * Args passed to driver:
+ * - ctlfs_dev.ctlname
+ * - ctlfs_dev.iop
+ * - ctlfs_dev.mode
+ */
+static int
+ctlfs_write(struct vnode *vp, struct sio_txn *sio)
+{
+ const struct ctlops *iop;
+ struct ctlfs_entry *enp;
+ struct ctlfs_dev dev;
+ int error;
+
+ if ((error = ctlfs_get_ops(vp, &enp, &iop)) < 0) {
+ return error;
+ }
+ if (iop->write == NULL) {
+ pr_trace("no write op for ctlfs entry\n");
+ return -EIO;
+ }
+
+ dev.ctlname = enp->name;
+ dev.ops = iop;
+ dev.mode = enp->mode;
+ return iop->write(&dev, sio);
+}
+
static int
ctlfs_reclaim(struct vnode *vp)
{
@@ -400,7 +430,7 @@ static const struct vops ctlfs_vops = {
.lookup = ctlfs_lookup,
.read = ctlfs_read,
.getattr = NULL,
- .write = NULL,
+ .write = ctlfs_write,
.reclaim = ctlfs_reclaim,
.create = NULL
};