@@ -115,7 +115,7 @@ type engine interface {
115115 doLink (ctx Context , inode , parent Ino , name string , attr * Attr ) syscall.Errno
116116 doUnlink (ctx Context , parent Ino , name string , attr * Attr , skipCheckTrash ... bool ) syscall.Errno
117117 doRmdir (ctx Context , parent Ino , name string , inode * Ino , attr * Attr , skipCheckTrash ... bool ) syscall.Errno
118- doEmptyDir (ctx Context , parent Ino , entries []* Entry , length * int64 , space * int64 , inodes * int64 , userGroupQuotas * []UserGroupQuotaDelta , skipCheckTrash ... bool ) (errno syscall.Errno )
118+ doBatchUnlink (ctx Context , parent Ino , entries []* Entry , length * int64 , space * int64 , inodes * int64 , userGroupQuotas * []UserGroupQuotaDelta , skipCheckTrash ... bool ) (errno syscall.Errno )
119119 doReadlink (ctx Context , inode Ino , noatime bool ) (int64 , []byte , error )
120120 doReaddir (ctx Context , inode Ino , plus uint8 , entries * []* Entry , limit int ) syscall.Errno
121121 doRename (ctx Context , parentSrc Ino , nameSrc string , parentDst Ino , nameDst string , flags uint32 , inode , tinode * Ino , attr , tattr * Attr ) syscall.Errno
@@ -1462,6 +1462,43 @@ func (m *baseMeta) Rmdir(ctx Context, parent Ino, name string, skipCheckTrash ..
14621462 return st
14631463}
14641464
1465+ func (m * baseMeta ) BatchUnlink (ctx Context , parent Ino , entries []Entry , count * uint64 , skipCheckTrash ... bool ) syscall.Errno {
1466+ var length int64
1467+ var space int64
1468+ var inodes int64
1469+ var userGroupQuotas []UserGroupQuotaDelta
1470+ st := m .en .doBatchUnlink (ctx , parent , entries , & length , & space , & inodes , & userGroupQuotas , skipCheckTrash )
1471+ if st == 0 {
1472+ m .updateDirStat (ctx , parent , - length , - space , - inodes )
1473+ if ! parent .IsTrash () {
1474+ m .updateDirQuota (ctx , parent , - space , - inodes )
1475+ for _ , quota := range userGroupQuotas {
1476+ m .updateUserGroupQuota (ctx , quota .Uid , quota .Gid , - quota .Space , - quota .Inodes )
1477+ }
1478+ }
1479+ if count != nil && len (entries ) > 0 {
1480+ atomic .AddUint64 (count , uint64 (len (entries )))
1481+ }
1482+ } else if st == syscall .ENOTSUP {
1483+ for _ , e := range entries {
1484+ if e .Attr .Typ == TypeDirectory {
1485+ continue
1486+ }
1487+ if ctx .Canceled () {
1488+ return syscall .EINTR
1489+ }
1490+ if st := m .Unlink (ctx , parent , string (e .Name ), skipCheckTrash ); st != 0 && st != syscall .ENOENT {
1491+ return st
1492+ }
1493+ if count != nil {
1494+ atomic .AddUint64 (count , 1 )
1495+ }
1496+ }
1497+ } else if st != 0 {
1498+ return st
1499+ }
1500+ }
1501+
14651502func (m * baseMeta ) Rename (ctx Context , parentSrc Ino , nameSrc string , parentDst Ino , nameDst string , flags uint32 , inode * Ino , attr * Attr ) syscall.Errno {
14661503 if parentSrc == RootInode && nameSrc == TrashName || parentDst == RootInode && nameDst == TrashName {
14671504 return syscall .EPERM
0 commit comments