From 47a4d33f24509ac9db6b924f84a7102cbe0f98c3 Mon Sep 17 00:00:00 2001 From: Jakob Unterwurzacher Date: Sun, 21 Mar 2021 09:02:50 +0100 Subject: [PATCH] fusefrontend: -sharedstorage: fix TestRmwRace failure The Open() and Create() paths used different inode numbers, which broke openfiletable locking against concurred readers. --- internal/fusefrontend/node.go | 7 ++++++- internal/fusefrontend/node_helpers.go | 3 ++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/internal/fusefrontend/node.go b/internal/fusefrontend/node.go index 87ba835..2e5d370 100644 --- a/internal/fusefrontend/node.go +++ b/internal/fusefrontend/node.go @@ -130,10 +130,15 @@ func (n *Node) Create(ctx context.Context, name string, flags uint32, mode uint3 errno = fs.ToErrno(err) return } + // Save original stat values before newChild() translates the inode number. + // For an open fd, we assume the inode number cannot change behind our back, + // even in `-sharedstorage` mode. + origSt := st + ch := n.newChild(ctx, &st, out) f := os.NewFile(uintptr(fd), cName) - return ch, NewFile(f, rn, &st), 0, 0 + return ch, NewFile(f, rn, &origSt), 0, 0 } // Unlink - FUSE call. Delete a file. diff --git a/internal/fusefrontend/node_helpers.go b/internal/fusefrontend/node_helpers.go index f99e6df..a8d1ebe 100644 --- a/internal/fusefrontend/node_helpers.go +++ b/internal/fusefrontend/node_helpers.go @@ -100,7 +100,8 @@ func (n *Node) prepareAtSyscall(child string) (dirfd int, cName string, errno sy } // newChild attaches a new child inode to n. -// The passed-in `st` will be modified to get a unique inode number. +// The passed-in `st` will be modified to get a unique inode number +// (or, in `-sharedstorage` mode, the inode number will be set to zero). func (n *Node) newChild(ctx context.Context, st *syscall.Stat_t, out *fuse.EntryOut) *fs.Inode { rn := n.rootNode() // Get stable inode number based on underlying (device,ino) pair