Skip to content

Commit

Permalink
pass parent attr from emptyDir
Browse files Browse the repository at this point in the history
  • Loading branch information
anysql committed Feb 7, 2025
1 parent a85b867 commit bffb17f
Show file tree
Hide file tree
Showing 5 changed files with 41 additions and 35 deletions.
8 changes: 4 additions & 4 deletions pkg/meta/base.go
Original file line number Diff line number Diff line change
Expand Up @@ -103,7 +103,7 @@ type engine interface {
doLookup(ctx Context, parent Ino, name string, inode *Ino, attr *Attr) syscall.Errno
doMknod(ctx Context, parent Ino, name string, _type uint8, mode, cumask uint16, path string, inode *Ino, attr *Attr) syscall.Errno
doLink(ctx Context, inode, parent Ino, name string, attr *Attr) syscall.Errno
doUnlink(ctx Context, parent Ino, name string, attr *Attr, entry *Entry, skipCheckTrash ...bool) syscall.Errno
doUnlink(ctx Context, parent Ino, name string, attr *Attr, entry *Entry, pattr *Attr, skipCheckTrash ...bool) syscall.Errno
doRmdir(ctx Context, parent Ino, name string, inode *Ino, skipCheckTrash ...bool) syscall.Errno
doReadlink(ctx Context, inode Ino, noatime bool) (int64, []byte, error)
doReaddir(ctx Context, inode Ino, plus uint8, entries *[]*Entry, limit int) syscall.Errno
Expand Down Expand Up @@ -1344,7 +1344,7 @@ func (m *baseMeta) ReadLink(ctx Context, inode Ino, path *[]byte) syscall.Errno
return 0
}

func (m *baseMeta) Unlink2(ctx Context, parent Ino, name string, entry *Entry, skipCheckTrash ...bool) syscall.Errno {
func (m *baseMeta) Unlink2(ctx Context, parent Ino, name string, entry *Entry, pattr *Attr, skipCheckTrash ...bool) syscall.Errno {
if parent == RootInode && name == TrashName || isTrash(parent) && ctx.Uid() != 0 {
return syscall.EPERM
}
Expand All @@ -1355,7 +1355,7 @@ func (m *baseMeta) Unlink2(ctx Context, parent Ino, name string, entry *Entry, s
defer m.timeit("Unlink", time.Now())
parent = m.checkRoot(parent)
var attr Attr
err := m.en.doUnlink(ctx, parent, name, &attr, entry, skipCheckTrash...)
err := m.en.doUnlink(ctx, parent, name, &attr, entry, pattr, skipCheckTrash...)
if entry == nil && err == 0 {
var diffLength uint64
if attr.Typ == TypeFile {
Expand All @@ -1368,7 +1368,7 @@ func (m *baseMeta) Unlink2(ctx Context, parent Ino, name string, entry *Entry, s
}

func (m *baseMeta) Unlink(ctx Context, parent Ino, name string, skipCheckTrash ...bool) syscall.Errno {
return m.Unlink2(ctx, parent, name, nil, skipCheckTrash...)
return m.Unlink2(ctx, parent, name, nil, nil, skipCheckTrash...)
}

func (m *baseMeta) Rmdir(ctx Context, parent Ino, name string, skipCheckTrash ...bool) syscall.Errno {
Expand Down
20 changes: 11 additions & 9 deletions pkg/meta/redis.go
Original file line number Diff line number Diff line change
Expand Up @@ -1427,7 +1427,7 @@ func (m *redisMeta) doMknod(ctx Context, parent Ino, name string, _type uint8, m
}, m.inodeKey(parent), m.entryKey(parent)))
}

func (m *redisMeta) doUnlink(ctx Context, parent Ino, name string, attr *Attr, entry *Entry, skipCheckTrash ...bool) syscall.Errno {
func (m *redisMeta) doUnlink(ctx Context, parent Ino, name string, attr *Attr, entry *Entry, pattr *Attr, skipCheckTrash ...bool) syscall.Errno {
var trash, inode Ino
if !(len(skipCheckTrash) == 1 && skipCheckTrash[0]) {
if st := m.checkTrash(parent, &trash); st != 0 {
Expand Down Expand Up @@ -1469,13 +1469,15 @@ func (m *redisMeta) doUnlink(ctx Context, parent Ino, name string, attr *Attr, e
if rs[0] == nil {
return redis.Nil
}
var pattr Attr
m.parseAttr([]byte(rs[0].(string)), &pattr)
if pattr.Typ != TypeDirectory {
return syscall.ENOTDIR
}
if st := m.Access(ctx, parent, MODE_MASK_W|MODE_MASK_X, &pattr); st != 0 {
return st
if pattr == nil {
pattr = &Attr{}
m.parseAttr([]byte(rs[0].(string)), pattr)
if pattr.Typ != TypeDirectory {
return syscall.ENOTDIR
}
if st := m.Access(ctx, parent, MODE_MASK_W|MODE_MASK_X, pattr); st != 0 {
return st
}
}
if (pattr.Flags&FlagAppend) != 0 || (pattr.Flags&FlagImmutable) != 0 {
return syscall.EPERM
Expand Down Expand Up @@ -1519,7 +1521,7 @@ func (m *redisMeta) doUnlink(ctx Context, parent Ino, name string, attr *Attr, e
_, err = tx.TxPipelined(ctx, func(pipe redis.Pipeliner) error {
pipe.HDel(ctx, m.entryKey(parent), name)
if updateParent {
pipe.Set(ctx, m.inodeKey(parent), m.marshal(&pattr), 0)
pipe.Set(ctx, m.inodeKey(parent), m.marshal(pattr), 0)
}
if attr.Nlink > 0 {
pipe.Set(ctx, m.inodeKey(inode), m.marshal(attr), 0)
Expand Down
22 changes: 10 additions & 12 deletions pkg/meta/sql.go
Original file line number Diff line number Diff line change
Expand Up @@ -1608,7 +1608,7 @@ func (m *dbMeta) doMknod(ctx Context, parent Ino, name string, _type uint8, mode
}))
}

func (m *dbMeta) doUnlink(ctx Context, parent Ino, name string, attr *Attr, entry *Entry, skipCheckTrash ...bool) syscall.Errno {
func (m *dbMeta) doUnlink(ctx Context, parent Ino, name string, attr *Attr, entry *Entry, pattr *Attr, skipCheckTrash ...bool) syscall.Errno {
var trash Ino
if !(len(skipCheckTrash) == 1 && skipCheckTrash[0]) {
if st := m.checkTrash(parent, &trash); st != 0 {
Expand All @@ -1622,27 +1622,25 @@ func (m *dbMeta) doUnlink(ctx Context, parent Ino, name string, attr *Attr, entr
opened = false
newSpace, newInode = 0, 0
var pn = node{Inode: parent}
if entry == nil {
if pattr == nil {
ok, err := s.Get(&pn)
if err != nil {
return err
}
if !ok {
return syscall.ENOENT
}
if pn.Type != TypeDirectory {
pattr = &Attr{}
m.parseAttr(&pn, pattr)
if pattr.Typ != TypeDirectory {
return syscall.ENOTDIR
}
var pattr Attr
m.parseAttr(&pn, &pattr)

// Access is already checked in emptyDir call
if st := m.Access(ctx, parent, MODE_MASK_W|MODE_MASK_X, &pattr); st != 0 {
if st := m.Access(ctx, parent, MODE_MASK_W|MODE_MASK_X, pattr); st != 0 {
return st
}
if (pn.Flags&FlagAppend) != 0 || (pn.Flags&FlagImmutable) != 0 {
return syscall.EPERM
}
}
if (pattr.Flags&FlagAppend) != 0 || (pattr.Flags&FlagImmutable) != 0 {
return syscall.EPERM
}
var e = edge{Parent: parent, Name: []byte(name)}
if entry == nil {
Expand Down Expand Up @@ -1677,7 +1675,7 @@ func (m *dbMeta) doUnlink(ctx Context, parent Ino, name string, attr *Attr, entr
now := time.Now().UnixNano()
if ok {
if entry == nil {
if ctx.Uid() != 0 && pn.Mode&01000 != 0 && ctx.Uid() != pn.Uid && ctx.Uid() != n.Uid {
if ctx.Uid() != 0 && pattr.Mode&01000 != 0 && ctx.Uid() != pattr.Uid && ctx.Uid() != n.Uid {
return syscall.EACCES
}
}
Expand Down
20 changes: 11 additions & 9 deletions pkg/meta/tkv.go
Original file line number Diff line number Diff line change
Expand Up @@ -1246,7 +1246,7 @@ func (m *kvMeta) doMknod(ctx Context, parent Ino, name string, _type uint8, mode
}, parent))
}

func (m *kvMeta) doUnlink(ctx Context, parent Ino, name string, attr *Attr, entry *Entry, skipCheckTrash ...bool) syscall.Errno {
func (m *kvMeta) doUnlink(ctx Context, parent Ino, name string, attr *Attr, entry *Entry, pattr *Attr, skipCheckTrash ...bool) syscall.Errno {
var trash Ino
if !(len(skipCheckTrash) == 1 && skipCheckTrash[0]) {
if st := m.checkTrash(parent, &trash); st != 0 {
Expand Down Expand Up @@ -1287,13 +1287,15 @@ func (m *kvMeta) doUnlink(ctx Context, parent Ino, name string, attr *Attr, entr
if rs[0] == nil {
return syscall.ENOENT
}
var pattr Attr
m.parseAttr(rs[0], &pattr)
if pattr.Typ != TypeDirectory {
return syscall.ENOTDIR
}
if st := m.Access(ctx, parent, MODE_MASK_W|MODE_MASK_X, &pattr); st != 0 {
return st
if pattr == nil {
pattr = &Attr{}
m.parseAttr(rs[0], pattr)
if pattr.Typ != TypeDirectory {
return syscall.ENOTDIR
}
if st := m.Access(ctx, parent, MODE_MASK_W|MODE_MASK_X, pattr); st != 0 {
return st
}
}
if (pattr.Flags&FlagAppend) != 0 || (pattr.Flags&FlagImmutable) != 0 {
return syscall.EPERM
Expand Down Expand Up @@ -1338,7 +1340,7 @@ func (m *kvMeta) doUnlink(ctx Context, parent Ino, name string, attr *Attr, entr

tx.delete(m.entryKey(parent, name))
if updateParent {
tx.set(m.inodeKey(parent), m.marshal(&pattr))
tx.set(m.inodeKey(parent), m.marshal(pattr))
}
if attr.Nlink > 0 {
tx.set(m.inodeKey(inode), m.marshal(attr))
Expand Down
6 changes: 5 additions & 1 deletion pkg/meta/utils.go
Original file line number Diff line number Diff line change
Expand Up @@ -259,6 +259,10 @@ func updateLocks(ls []plockRecord, nl plockRecord) []plockRecord {
}

func (m *baseMeta) emptyDir(ctx Context, inode Ino, skipCheckTrash bool, count *uint64, concurrent chan int) syscall.Errno {
var pattr Attr
if st := m.en.doGetAttr(ctx, inode, &pattr); st != 0 {
return st
}
for {
var entries []*Entry
if st := m.en.doReaddir(ctx, inode, 0, &entries, 10000); st != 0 && st != syscall.ENOENT {
Expand Down Expand Up @@ -303,7 +307,7 @@ func (m *baseMeta) emptyDir(ctx Context, inode Ino, skipCheckTrash bool, count *
if count != nil {
atomic.AddUint64(count, 1)
}
if st := m.Unlink2(ctx, inode, string(e.Name), e, skipCheckTrash); st != 0 && st != syscall.ENOENT {
if st := m.Unlink2(ctx, inode, string(e.Name), e, &pattr, skipCheckTrash); st != 0 && st != syscall.ENOENT {
ctx.Cancel()
return st
}
Expand Down

0 comments on commit bffb17f

Please sign in to comment.