summaryrefslogtreecommitdiff
path: root/cmd
diff options
context:
space:
mode:
authorLuke Shumaker <lukeshu@lukeshu.com>2022-07-02 22:50:02 -0600
committerLuke Shumaker <lukeshu@lukeshu.com>2022-07-02 22:50:02 -0600
commit48019a4884b8936424a74c0a53798494c5c0cfc1 (patch)
treef905cec948b2af0333256dc41f4b7a1321e0e812 /cmd
parent6b3974fe1c4616d8b9872d88d737623cc48c4368 (diff)
better
Diffstat (limited to 'cmd')
-rw-r--r--cmd/btrfs-ls-files/main.go34
1 files changed, 25 insertions, 9 deletions
diff --git a/cmd/btrfs-ls-files/main.go b/cmd/btrfs-ls-files/main.go
index 9f5b85d..22eefcb 100644
--- a/cmd/btrfs-ls-files/main.go
+++ b/cmd/btrfs-ls-files/main.go
@@ -86,7 +86,9 @@ func printDir(fs *btrfs.FS, fsTree btrfsvol.LogicalAddr, prefix0, prefix1, dirNa
switch item.Head.Key.ItemType {
case btrfsitem.INODE_ITEM_KEY:
if dirInodeDatOK {
- errs = append(errs, fmt.Errorf("read dir: multiple inodes"))
+ if !reflect.DeepEqual(dirInodeDat, item.Body.(btrfsitem.Inode)) {
+ errs = append(errs, fmt.Errorf("read dir: multiple inodes"))
+ }
continue
}
dirInodeDat = item.Body.(btrfsitem.Inode)
@@ -96,7 +98,7 @@ func printDir(fs *btrfs.FS, fsTree btrfsvol.LogicalAddr, prefix0, prefix1, dirNa
case btrfsitem.DIR_ITEM_KEY:
body := item.Body.(btrfsitem.DirEntries)
if len(body) != 1 {
- errs = append(errs, fmt.Errorf("read dir: multiple direntries in single dir_item?"))
+ errs = append(errs, fmt.Errorf("read dir: multiple direntries in single DIR_ITEM?"))
continue
}
for _, entry := range body {
@@ -107,24 +109,38 @@ func printDir(fs *btrfs.FS, fsTree btrfsvol.LogicalAddr, prefix0, prefix1, dirNa
continue
}
if other, exists := membersByNameHash[namehash]; exists {
- errs = append(errs, fmt.Errorf("read dir: multiple instances of direntry crc32c(%q|%q)=%#x",
- other.Name, entry.Name, namehash))
+ if !reflect.DeepEqual(entry, other) {
+ if string(entry.Name) == string(other.Name) {
+ errs = append(errs, fmt.Errorf("read dir: multiple instances of direntry crc32c(%q)=%#x",
+ entry.Name, namehash))
+ } else {
+ errs = append(errs, fmt.Errorf("read dir: multiple instances of direntry crc32c(%q|%q)=%#x",
+ other.Name, entry.Name, namehash))
+ }
+ }
continue
}
membersByNameHash[btrfsitem.NameHash(entry.Name)] = entry
}
case btrfsitem.DIR_INDEX_KEY:
- for i, entry := range item.Body.(btrfsitem.DirEntries) {
- index := item.Head.Key.Offset + uint64(i)
- if _, exists := membersByIndex[index]; exists {
- errs = append(errs, fmt.Errorf("read dir: multiple instances of direntry index %v", index))
+ index := item.Head.Key.Offset
+ body := item.Body.(btrfsitem.DirEntries)
+ if len(body) != 1 {
+ errs = append(errs, fmt.Errorf("read dir: multiple direntries in single DIR_INDEX?"))
+ continue
+ }
+ for _, entry := range body {
+ if other, exists := membersByIndex[index]; exists {
+ if !reflect.DeepEqual(entry, other) {
+ errs = append(errs, fmt.Errorf("read dir: multiple instances of direntry index %v", index))
+ }
continue
}
membersByIndex[index] = entry
}
//case btrfsitem.XATTR_ITEM_KEY:
default:
- panic(fmt.Errorf("TODO: handle item type %v", item.Head.Key.ItemType))
+ errs = append(errs, fmt.Errorf("TODO: handle item type %v", item.Head.Key.ItemType))
}
}
fmt.Printf("%s%q\t[ino=%d",