diff --git a/conversions.go b/conversions.go index b30a643..755cdbe 100644 --- a/conversions.go +++ b/conversions.go @@ -420,6 +420,19 @@ func convertInMessage( Flags: fusekernel.InitFlags(in.Flags), } + case fusekernel.OpRemovexattr: + buf := inMsg.ConsumeBytes(inMsg.Len()) + n := len(buf) + if n == 0 || buf[n-1] != '\x00' { + err = errors.New("Corrupt OpRemovexattr") + return + } + + o = &fuseops.RemoveXattrOp{ + Inode: fuseops.InodeID(inMsg.Header().Nodeid), + Name: string(buf[:n-1]), + } + default: o = &unknownOp{ OpCode: inMsg.Header().Opcode, @@ -623,6 +636,9 @@ func (c *Connection) kernelResponseForOp( out.St.Bsize = o.IoSize out.St.Frsize = o.BlockSize + case *fuseops.RemoveXattrOp: + // Empty response + case *initOp: out := (*fusekernel.InitOut)(m.Grow(int(unsafe.Sizeof(fusekernel.InitOut{})))) diff --git a/fuseops/ops.go b/fuseops/ops.go index f8fa739..f4bc89d 100644 --- a/fuseops/ops.go +++ b/fuseops/ops.go @@ -767,3 +767,16 @@ type ReadSymlinkOp struct { // Set by the file system: the target of the symlink. Target string } + +//////////////////////////////////////////////////////////////////////// +// eXtended attributes +//////////////////////////////////////////////////////////////////////// + +// Remove an extended attribute +type RemoveXattrOp struct { + // The inode that we are reading + Inode InodeID + + // The name of the extended attribute + Name string +} diff --git a/fuseutil/file_system.go b/fuseutil/file_system.go index 2921c1d..88f529c 100644 --- a/fuseutil/file_system.go +++ b/fuseutil/file_system.go @@ -57,6 +57,7 @@ type FileSystem interface { FlushFile(context.Context, *fuseops.FlushFileOp) error ReleaseFileHandle(context.Context, *fuseops.ReleaseFileHandleOp) error ReadSymlink(context.Context, *fuseops.ReadSymlinkOp) error + RemoveXattr(context.Context, *fuseops.RemoveXattrOp) error // Regard all inodes (including the root inode) as having their lookup counts // decremented to zero, and clean up any resources associated with the file @@ -186,6 +187,9 @@ func (s *fileSystemServer) handleOp( case *fuseops.ReadSymlinkOp: err = s.fs.ReadSymlink(ctx, typed) + + case *fuseops.RemoveXattrOp: + err = s.fs.RemoveXattr(ctx, typed) } c.Reply(ctx, err) diff --git a/fuseutil/not_implemented_file_system.go b/fuseutil/not_implemented_file_system.go index fc082d2..5df1fb3 100644 --- a/fuseutil/not_implemented_file_system.go +++ b/fuseutil/not_implemented_file_system.go @@ -183,5 +183,12 @@ func (fs *NotImplementedFileSystem) ReadSymlink( return } +func (fs *NotImplementedFileSystem) RemoveXattr( + ctx context.Context, + op *fuseops.RemoveXattrOp) (err error) { + err = fuse.ENOSYS + return +} + func (fs *NotImplementedFileSystem) Destroy() { }