Commit 63408f6a authored by Aaron Jacobs's avatar Aaron Jacobs

Added an RmDir method.

parent 9f984e1a
...@@ -62,6 +62,24 @@ type FileSystem interface { ...@@ -62,6 +62,24 @@ type FileSystem interface {
ctx context.Context, ctx context.Context,
req *MkDirRequest) (*MkDirResponse, error) 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 // Directory handles
/////////////////////////////////// ///////////////////////////////////
...@@ -360,6 +378,18 @@ type MkDirResponse struct { ...@@ -360,6 +378,18 @@ type MkDirResponse struct {
Entry ChildInodeEntry 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 { type OpenDirRequest struct {
Header RequestHeader Header RequestHeader
......
...@@ -46,6 +46,12 @@ func (fs *NotImplementedFileSystem) MkDir( ...@@ -46,6 +46,12 @@ func (fs *NotImplementedFileSystem) MkDir(
return nil, fuse.ENOSYS 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( func (fs *NotImplementedFileSystem) OpenDir(
ctx context.Context, ctx context.Context,
req *fuse.OpenDirRequest) (*fuse.OpenDirResponse, error) { req *fuse.OpenDirRequest) (*fuse.OpenDirResponse, error) {
......
...@@ -184,6 +184,33 @@ func (s *server) handleFuseRequest(fuseReq bazilfuse.Request) { ...@@ -184,6 +184,33 @@ func (s *server) handleFuseRequest(fuseReq bazilfuse.Request) {
s.logger.Println("Responding:", fuseResp) s.logger.Println("Responding:", fuseResp)
typed.Respond(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: case *bazilfuse.OpenRequest:
// Directory or file? // Directory or file?
if typed.Dir { if typed.Dir {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment