[virtio-9p] Add datasync to server side TFSYNC/RFSYNC for dotl
SYNOPSIS size[4] Tfsync tag[2] fid[4] datasync[4] size[4] Rfsync tag[2] DESCRIPTION The Tfsync transaction transfers ("flushes") all modified in-core data of file identified by fid to the disk device (or other permanent storage device) where that file resides. If datasync flag is specified data will be fleshed but does not flush modified metadata unless that metadata is needed in order to allow a subsequent data retrieval to be correctly handled. Signed-off-by: Venkateswararao Jujjuri <jvrao@linux.vnet.ibm.com>
This commit is contained in:
parent
6a8657528d
commit
49594973fb
@ -86,7 +86,7 @@ typedef struct FileOperations
|
||||
int (*fstat)(FsContext *, int, struct stat *);
|
||||
int (*rename)(FsContext *, const char *, const char *);
|
||||
int (*truncate)(FsContext *, const char *, off_t);
|
||||
int (*fsync)(FsContext *, int);
|
||||
int (*fsync)(FsContext *, int, int);
|
||||
int (*statfs)(FsContext *s, const char *path, struct statfs *stbuf);
|
||||
ssize_t (*lgetxattr)(FsContext *, const char *,
|
||||
const char *, void *, size_t);
|
||||
|
@ -490,9 +490,13 @@ static int local_remove(FsContext *ctx, const char *path)
|
||||
return remove(rpath(ctx, path));
|
||||
}
|
||||
|
||||
static int local_fsync(FsContext *ctx, int fd)
|
||||
static int local_fsync(FsContext *ctx, int fd, int datasync)
|
||||
{
|
||||
return fsync(fd);
|
||||
if (datasync) {
|
||||
return qemu_fdatasync(fd);
|
||||
} else {
|
||||
return fsync(fd);
|
||||
}
|
||||
}
|
||||
|
||||
static int local_statfs(FsContext *s, const char *path, struct statfs *stbuf)
|
||||
|
@ -248,9 +248,9 @@ static int v9fs_do_remove(V9fsState *s, V9fsString *path)
|
||||
return s->ops->remove(&s->ctx, path->data);
|
||||
}
|
||||
|
||||
static int v9fs_do_fsync(V9fsState *s, int fd)
|
||||
static int v9fs_do_fsync(V9fsState *s, int fd, int datasync)
|
||||
{
|
||||
return s->ops->fsync(&s->ctx, fd);
|
||||
return s->ops->fsync(&s->ctx, fd, datasync);
|
||||
}
|
||||
|
||||
static int v9fs_do_statfs(V9fsState *s, V9fsString *path, struct statfs *stbuf)
|
||||
@ -1868,16 +1868,17 @@ static void v9fs_fsync(V9fsState *s, V9fsPDU *pdu)
|
||||
int32_t fid;
|
||||
size_t offset = 7;
|
||||
V9fsFidState *fidp;
|
||||
int datasync;
|
||||
int err;
|
||||
|
||||
pdu_unmarshal(pdu, offset, "d", &fid);
|
||||
pdu_unmarshal(pdu, offset, "dd", &fid, &datasync);
|
||||
fidp = lookup_fid(s, fid);
|
||||
if (fidp == NULL) {
|
||||
err = -ENOENT;
|
||||
v9fs_post_do_fsync(s, pdu, err);
|
||||
return;
|
||||
}
|
||||
err = v9fs_do_fsync(s, fidp->fs.fd);
|
||||
err = v9fs_do_fsync(s, fidp->fs.fd, datasync);
|
||||
v9fs_post_do_fsync(s, pdu, err);
|
||||
}
|
||||
|
||||
@ -3001,7 +3002,7 @@ static void v9fs_wstat(V9fsState *s, V9fsPDU *pdu)
|
||||
|
||||
/* do we need to sync the file? */
|
||||
if (donttouch_stat(&vs->v9stat)) {
|
||||
err = v9fs_do_fsync(s, vs->fidp->fs.fd);
|
||||
err = v9fs_do_fsync(s, vs->fidp->fs.fd, 0);
|
||||
v9fs_wstat_post_fsync(s, vs, err);
|
||||
return;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user