Check for empty in rmdir.
parent
98f868c319
commit
01371975df
13
errors.go
13
errors.go
|
@ -3,12 +3,17 @@
|
||||||
|
|
||||||
package fuse
|
package fuse
|
||||||
|
|
||||||
import bazilfuse "bazil.org/fuse"
|
import (
|
||||||
|
"syscall"
|
||||||
|
|
||||||
|
bazilfuse "bazil.org/fuse"
|
||||||
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
// Errors corresponding to kernel error numbers. These may be treated
|
// Errors corresponding to kernel error numbers. These may be treated
|
||||||
// specially when returned by a FileSystem method.
|
// specially when returned by a FileSystem method.
|
||||||
ENOSYS = bazilfuse.ENOSYS
|
EIO = bazilfuse.EIO
|
||||||
ENOENT = bazilfuse.ENOENT
|
ENOENT = bazilfuse.ENOENT
|
||||||
EIO = bazilfuse.EIO
|
ENOSYS = bazilfuse.ENOSYS
|
||||||
|
ENOTEMPTY = bazilfuse.Errno(syscall.ENOTEMPTY)
|
||||||
)
|
)
|
||||||
|
|
|
@ -306,7 +306,22 @@ func (fs *memFS) RmDir(
|
||||||
parent := fs.getInodeForModifyingOrDie(req.Parent)
|
parent := fs.getInodeForModifyingOrDie(req.Parent)
|
||||||
defer parent.mu.Unlock()
|
defer parent.mu.Unlock()
|
||||||
|
|
||||||
// TODO(jacobsa): Check for empty. (Make sure we have a failing test first.)
|
// Find the child within the parent.
|
||||||
|
childID, ok := parent.LookUpChild(req.Name)
|
||||||
|
if !ok {
|
||||||
|
err = fuse.ENOENT
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// Grab the child.
|
||||||
|
child := fs.getInodeForModifyingOrDie(childID)
|
||||||
|
defer child.mu.Unlock()
|
||||||
|
|
||||||
|
// Make sure the child is empty.
|
||||||
|
if child.Len() != 0 {
|
||||||
|
err = fuse.ENOTEMPTY
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
// Remove the entry within the parent.
|
// Remove the entry within the parent.
|
||||||
parent.RemoveChild(req.Name)
|
parent.RemoveChild(req.Name)
|
||||||
|
|
|
@ -143,6 +143,20 @@ func (inode *inode) findChild(name string) (i int, ok bool) {
|
||||||
// Public methods
|
// Public methods
|
||||||
////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
// Return the number of children of the directory.
|
||||||
|
//
|
||||||
|
// REQUIRES: inode.dir
|
||||||
|
// SHARED_LOCKS_REQUIRED(inode.mu)
|
||||||
|
func (inode *inode) Len() (n int) {
|
||||||
|
for _, e := range inode.entries {
|
||||||
|
if e.Type != fuseutil.DT_Unknown {
|
||||||
|
n++
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
// Find an entry for the given child name and return its inode ID.
|
// Find an entry for the given child name and return its inode ID.
|
||||||
//
|
//
|
||||||
// REQUIRES: inode.dir
|
// REQUIRES: inode.dir
|
||||||
|
|
|
@ -334,7 +334,7 @@ func (t *MemFSTest) Rmdir_NonEmpty() {
|
||||||
err = os.Remove(path.Join(t.mfs.Dir(), "foo"))
|
err = os.Remove(path.Join(t.mfs.Dir(), "foo"))
|
||||||
|
|
||||||
AssertNe(nil, err)
|
AssertNe(nil, err)
|
||||||
ExpectThat(err, Error(HasSubstr("non-empty")))
|
ExpectThat(err, Error(HasSubstr("not empty")))
|
||||||
}
|
}
|
||||||
|
|
||||||
func (t *MemFSTest) Rmdir_Empty() {
|
func (t *MemFSTest) Rmdir_Empty() {
|
||||||
|
|
Loading…
Reference in New Issue