commit 19176444e19f44995419389945871864a8f3ed43
parent 8a925b295f53d5412f99972b8dc18c43455c52b7
Author: Roberto Vargas <roberto.vargas@arm.com>
Date: Thu, 16 May 2019 10:03:13 +0100
[dev] Add sync() and fsync()
These functions synchronize the buffered data in every driver.
At this moment all the drivers have a dummy sync function,
but some of them, like for example devuart, should have
a proper sync function.
Change-Id: I097c65d5b5a2fbd5166bdc41382ffd76632a7c4a
Diffstat:
8 files changed, 47 insertions(+), 0 deletions(-)
diff --git a/drivers/dev.c b/drivers/dev.c
@@ -485,6 +485,35 @@ seek(int fd, long off, int whence)
return devtab[c->type]->seek(c, off, whence);
}
+int
+fsync(int fd)
+{
+ Chan *c;
+
+ if ((c = fd2chan(fd)) == NULL)
+ return -1;
+
+ if (c->qid & CHDIR) {
+ errno = EISDIR;
+ return -1;
+ }
+
+ return devtab[c->type]->sync(c, SYNCDEV);
+}
+
+void
+sync(void)
+{
+ Chan *c;
+ Dev * const *dp;
+
+ for (dp = devtab; *dp; ++dp) {
+ c = attach((*dp)->id, 0);
+ devtab[c->type]->sync(c, SYNCALL);
+ chanclose(c);
+ }
+}
+
Chan *
deverrmount(Chan *c, char *spec)
{
@@ -523,6 +552,12 @@ devseek(Chan *c, long off, int whence)
return 0;
}
+int
+devsync(Chan *c, int what)
+{
+ return 0;
+}
+
static int
addmntpoint(Chan *c, char *new)
{
diff --git a/drivers/dev.h b/drivers/dev.h
@@ -7,6 +7,9 @@
#define NODEV 255
#define CHDIR (1 << 15)
+#define SYNCDEV 0
+#define SYNCALL 1
+
typedef struct dev Dev;
typedef struct chan Chan;
typedef struct dirtab Dirtab;
@@ -28,6 +31,7 @@ struct dev {
int (*read)(Chan *c, void *buf, int n);
int (*write)(Chan *c, void *buf, int n);
int (*seek)(Chan *c, long off, int whence);
+ int (*sync)(Chan *c, int what);
Chan *(*clone)(Chan *c, Chan *nc);
Chan *(*attach)(int id, int dev);
Chan *(*mount)(Chan *c, char *spec);
@@ -61,6 +65,7 @@ extern void devlink(void);
extern Chan *devattach(int id, int dev);
extern int devseek(Chan *c, long off, int whence);
+extern int devsync(Chan *c, int what);
extern Chan *devclone(Chan *c, Chan *nc);
extern int devgen(Chan *c,
const Dirtab *tab, int ntab,
diff --git a/drivers/devar.c b/drivers/devar.c
@@ -215,4 +215,5 @@ const Dev ardevtab = {
.write = deverrwrite,
.mount = armount,
.seek = devseek,
+ .sync = devsync,
};
diff --git a/drivers/devcons.c b/drivers/devcons.c
@@ -379,4 +379,5 @@ const Dev consdevtab = {
.read = consread,
.write = conswrite,
.seek = deverrseek,
+ .sync = devsync,
};
diff --git a/drivers/devfip.c b/drivers/devfip.c
@@ -298,4 +298,5 @@ const Dev fipdevtab = {
.write = deverrwrite,
.mount = fipmount,
.seek = devseek,
+ .sync = devsync,
};
diff --git a/drivers/devroot.c b/drivers/devroot.c
@@ -122,4 +122,5 @@ const Dev rootdevtab = {
.write = deverrwrite,
.mount = deverrmount,
.seek = devseek,
+ .sync = devsync,
};
diff --git a/drivers/devuart.c b/drivers/devuart.c
@@ -255,4 +255,5 @@ const Dev uartdevtab = {
.write = uartwrite,
.mount = deverrmount,
.seek = deverrseek,
+ .sync = devsync,
};
diff --git a/include/rcode/io.h b/include/rcode/io.h
@@ -60,6 +60,8 @@ extern int write(int fd, void *buf, int n);
extern int seek(int fd, long off, int whence);
extern int bind(char *path, char *where);
extern int stat(char *path, void *buf, int n);
+extern int fsync(int fd);
+extern void sync(void);
extern int kin, kout, kerr;