@@ -608,7 +608,25 @@ static int local_truncate(FsContext *ctx, V9fsPath *fs_path, off_t size)
char buffer[PATH_MAX];
char *path = fs_path->data;
- return truncate(rpath(ctx, path, buffer), size);
+ if (ctx->fs_sm == SM_PASSTHROUGH) {
+ int fd, retval, serrno;
+ fd = passthrough_request(ctx, NULL, path, O_RDWR, NULL, T_OPEN);
+ if (fd < 0) {
+ errno = -fd;
+ return -1;
+ }
+ retval = ftruncate(fd, size);
+ if (retval < 0) {
+ serrno = errno;
+ }
+ close(fd);
+ if (retval < 0) {
+ errno = serrno;
+ }
+ return retval;
+ } else {
+ return truncate(rpath(ctx, path, buffer), size);
+ }
}
static int local_rename(FsContext *ctx, const char *oldpath,
@@ -648,8 +666,27 @@ static int local_utimensat(FsContext *s, V9fsPath *fs_path,
char buffer[PATH_MAX];
char *path = fs_path->data;
- return qemu_utimensat(AT_FDCWD, rpath(s, path, buffer), buf,
+ if (s->fs_sm == SM_PASSTHROUGH) {
+ int fd, retval, serrno = 0;
+ fd = passthrough_request(s, NULL, path,
+ O_RDONLY | O_NONBLOCK | O_NOFOLLOW, NULL, T_OPEN);
+ if (fd < 0) {
+ errno = -fd;
+ return -1;
+ }
+ retval = futimens(fd, buf);
+ if (retval < 0) {
+ serrno = errno;
+ }
+ close(fd);
+ if (retval < 0) {
+ errno = serrno;
+ }
+ return retval;
+ } else {
+ return qemu_utimensat(AT_FDCWD, rpath(s, path, buffer), buf,
AT_SYMLINK_NOFOLLOW);
+ }
}
static int local_remove(FsContext *ctx, const char *path)