From 23f8dea18209377b8863e73720a4e13ee12478ee Mon Sep 17 00:00:00 2001 From: Saleh Dindar Date: Thu, 31 Aug 2023 06:28:10 -0700 Subject: [PATCH] vfs: [bugfix] Implement Name() method in WriteFileHandle and ReadFileHandle Name() method was originally left out and defaulted to the base class which always returns empty. This trigerred incorrect behavior in serve nfs where it relied on the Name() of the interafce to figure out what file it was modifying. This method is copied from RWFileHandle struct. Added extra assert in the tests. --- vfs/read.go | 5 +++++ vfs/read_test.go | 3 +++ vfs/read_write_test.go | 3 +++ vfs/write.go | 5 +++++ vfs/write_test.go | 3 +++ 5 files changed, 19 insertions(+) diff --git a/vfs/read.go b/vfs/read.go index 17e74ec13..8bedeae91 100644 --- a/vfs/read.go +++ b/vfs/read.go @@ -484,6 +484,11 @@ func (fh *ReadFileHandle) Release() error { return err } +// Name returns the name of the file from the underlying Object. +func (fh *ReadFileHandle) Name() string { + return fh.file.String() +} + // Size returns the size of the underlying file func (fh *ReadFileHandle) Size() int64 { fh.mu.Lock() diff --git a/vfs/read_test.go b/vfs/read_test.go index db8d0f841..6b7d55c4e 100644 --- a/vfs/read_test.go +++ b/vfs/read_test.go @@ -44,6 +44,9 @@ func TestReadFileHandleMethods(t *testing.T) { assert.Equal(t, "", (*ReadFileHandle)(nil).String()) assert.Equal(t, "", new(ReadFileHandle).String()) + // Name + assert.Equal(t, "dir/file1", fh.Name()) + // Node node := fh.Node() assert.Equal(t, "file1", node.Name()) diff --git a/vfs/read_write_test.go b/vfs/read_write_test.go index 75b930f73..7a49c9ab5 100644 --- a/vfs/read_write_test.go +++ b/vfs/read_write_test.go @@ -346,6 +346,9 @@ func TestRWFileHandleWriteAt(t *testing.T) { return n } + // Name + assert.Equal(t, "file1", fh.Name()) + // Preconditions assert.Equal(t, int64(0), offset()) assert.True(t, fh.opened) diff --git a/vfs/write.go b/vfs/write.go index b820d8172..2a263af67 100644 --- a/vfs/write.go +++ b/vfs/write.go @@ -322,3 +322,8 @@ func (fh *WriteFileHandle) ReadAt(p []byte, off int64) (n int, err error) { func (fh *WriteFileHandle) Sync() error { return nil } + +// Name returns the name of the file from the underlying Object. +func (fh *WriteFileHandle) Name() string { + return fh.file.String() +} diff --git a/vfs/write_test.go b/vfs/write_test.go index 629628555..77173bdf5 100644 --- a/vfs/write_test.go +++ b/vfs/write_test.go @@ -39,6 +39,9 @@ func TestWriteFileHandleReadonly(t *testing.T) { } r, vfs, fh := writeHandleCreate(t) + // Name + assert.Equal(t, "file1", fh.Name()) + // Write a file, so underlying remote will be created _, err := fh.Write([]byte("hello")) assert.NoError(t, err)