From 38767ab5278f6fe62dcf70fc151e8a56cfffcfe4 Mon Sep 17 00:00:00 2001 From: Jakob Unterwurzacher Date: Sun, 26 Jun 2016 18:35:19 +0200 Subject: fuserfrontend: support truncate(2) by wrapping ftruncate(2) Support truncate(2) by opening the file and calling ftruncate(2) While the glibc "truncate" wrapper seems to always use ftruncate, fsstress from xfstests uses this a lot by calling "truncate64" directly. --- internal/fusefrontend/fs.go | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) (limited to 'internal/fusefrontend/fs.go') diff --git a/internal/fusefrontend/fs.go b/internal/fusefrontend/fs.go index 20079b2..640c45d 100644 --- a/internal/fusefrontend/fs.go +++ b/internal/fusefrontend/fs.go @@ -207,14 +207,17 @@ func (fs *FS) Mknod(path string, mode uint32, dev uint32, context *fuse.Context) return fs.FileSystem.Mknod(cPath, mode, dev, context) } -// Only warn once -var truncateWarnOnce sync.Once - +// Support truncate(2) by opening the file and calling ftruncate(2) +// While the glibc "truncate" wrapper seems to always use ftruncate, fsstress from +// xfstests uses this a lot by calling "truncate64" directly. func (fs *FS) Truncate(path string, offset uint64, context *fuse.Context) (code fuse.Status) { - truncateWarnOnce.Do(func() { - tlog.Warn.Printf("truncate(2) is not supported, returning ENOSYS - use ftruncate(2)") - }) - return fuse.ENOSYS + file, code := fs.Open(path, uint32(os.O_RDWR), context) + if code != fuse.OK { + return code + } + code = file.Truncate(offset) + file.Release() + return code } func (fs *FS) Utimens(path string, Atime *time.Time, Mtime *time.Time, context *fuse.Context) (code fuse.Status) { -- cgit v1.2.3