9os

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | README | LICENSE

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:
Mdrivers/dev.c | 35+++++++++++++++++++++++++++++++++++
Mdrivers/dev.h | 5+++++
Mdrivers/devar.c | 1+
Mdrivers/devcons.c | 1+
Mdrivers/devfip.c | 1+
Mdrivers/devroot.c | 1+
Mdrivers/devuart.c | 1+
Minclude/rcode/io.h | 2++
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;