From 63408f6a0db1a4230e644d15094bbfe576741e09 Mon Sep 17 00:00:00 2001 From: Aaron Jacobs Date: Tue, 3 Mar 2015 11:25:50 +1100 Subject: [PATCH] Added an RmDir method. --- file_system.go | 30 +++++++++++++++++++++++++ fuseutil/not_implemented_file_system.go | 6 +++++ server.go | 27 ++++++++++++++++++++++ 3 files changed, 63 insertions(+) diff --git a/file_system.go b/file_system.go index cf6276c..e6c04fd 100644 --- a/file_system.go +++ b/file_system.go @@ -62,6 +62,24 @@ type FileSystem interface { ctx context.Context, req *MkDirRequest) (*MkDirResponse, error) + /////////////////////////////////// + // Inode destruction + /////////////////////////////////// + + // Unlink a directory from its parent. Because directories cannot have a link + // count above one, this means the directory inode should be deleted as well + // once the kernel calls ForgetInode. + // + // The file system is responsible for checking that the directory is empty. + // + // Sample implementation in ext2: ext2_rmdir (http://goo.gl/B9QmFf) + // + // TODO(jacobsa): Add tests for the assertion about directory link counts + // above (on a real file system and on memfs). + RmDir( + ctx context.Context, + req *RmDirRequest) (*RmDirResponse, error) + /////////////////////////////////// // Directory handles /////////////////////////////////// @@ -360,6 +378,18 @@ type MkDirResponse struct { Entry ChildInodeEntry } +type RmDirRequest struct { + Header RequestHeader + + // The ID of parent directory inode, and the name of the directory being + // removed within it. + Parent InodeID + Name string +} + +type RmDirResponse struct { +} + type OpenDirRequest struct { Header RequestHeader diff --git a/fuseutil/not_implemented_file_system.go b/fuseutil/not_implemented_file_system.go index 8453d97..e48d449 100644 --- a/fuseutil/not_implemented_file_system.go +++ b/fuseutil/not_implemented_file_system.go @@ -46,6 +46,12 @@ func (fs *NotImplementedFileSystem) MkDir( return nil, fuse.ENOSYS } +func (fs *NotImplementedFileSystem) RmDir( + ctx context.Context, + req *fuse.RmDirRequest) (*fuse.RmDirResponse, error) { + return nil, fuse.ENOSYS +} + func (fs *NotImplementedFileSystem) OpenDir( ctx context.Context, req *fuse.OpenDirRequest) (*fuse.OpenDirResponse, error) { diff --git a/server.go b/server.go index 762795e..c79ff6d 100644 --- a/server.go +++ b/server.go @@ -184,6 +184,33 @@ func (s *server) handleFuseRequest(fuseReq bazilfuse.Request) { s.logger.Println("Responding:", fuseResp) typed.Respond(fuseResp) + case *bazilfuse.RemoveRequest: + // We don't yet support files. + if !typed.Dir { + s.logger.Println("Not supported for files. Returning ENOSYS.") + typed.RespondError(ENOSYS) + return + } + + // Convert the request. + req := &RmDirRequest{ + Header: convertHeader(typed.Header), + Parent: InodeID(typed.Header.Node), + Name: typed.Name, + } + + // Call the file system. + _, err := s.fs.RmDir(ctx, req) + if err != nil { + s.logger.Println("Responding:", err) + typed.RespondError(err) + return + } + + // Respond successfully. + s.logger.Println("Responding OK.") + typed.Respond() + case *bazilfuse.OpenRequest: // Directory or file? if typed.Dir {