summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--cmd/btrfs-rec/inspect_mount.go10
-rw-r--r--lib/btrfs/io4_fs.go40
-rw-r--r--lib/btrfsprogs/btrfsinspect/mount.go12
3 files changed, 35 insertions, 27 deletions
diff --git a/cmd/btrfs-rec/inspect_mount.go b/cmd/btrfs-rec/inspect_mount.go
index 5aae54a..cff33b6 100644
--- a/cmd/btrfs-rec/inspect_mount.go
+++ b/cmd/btrfs-rec/inspect_mount.go
@@ -13,14 +13,18 @@ import (
)
func init() {
- inspectors = append(inspectors, subcommand{
+ var skipFileSums bool
+ cmd := subcommand{
Command: cobra.Command{
Use: "mount MOUNTPOINT",
Short: "Mount the filesystem read-only",
Args: cliutil.WrapPositionalArgs(cobra.ExactArgs(1)),
},
RunE: func(fs *btrfs.FS, cmd *cobra.Command, args []string) error {
- return btrfsinspect.MountRO(cmd.Context(), fs, args[0])
+ return btrfsinspect.MountRO(cmd.Context(), fs, args[0], skipFileSums)
},
- })
+ }
+ cmd.Command.Flags().BoolVar(&skipFileSums, "skip-filesums", false,
+ "ignore checksum failures on file contents; allow such files to be read")
+ inspectors = append(inspectors, cmd)
}
diff --git a/lib/btrfs/io4_fs.go b/lib/btrfs/io4_fs.go
index 9391820..ea81bc2 100644
--- a/lib/btrfs/io4_fs.go
+++ b/lib/btrfs/io4_fs.go
@@ -66,7 +66,8 @@ type Subvolume struct {
Superblock() (*btrfstree.Superblock, error)
ReadAt(p []byte, off btrfsvol.LogicalAddr) (int, error)
}
- TreeID btrfsprim.ObjID
+ TreeID btrfsprim.ObjID
+ NoChecksums bool
rootOnce sync.Once
rootVal btrfsitem.Root
@@ -414,26 +415,27 @@ func (file *File) maybeShortReadAt(dat []byte, off int64) (int, error) {
if err != nil {
return 0, err
}
+ if !file.SV.NoChecksums {
+ sumRun, err := LookupCSum(file.SV.FS, sb.ChecksumType, blockBeg)
+ if err != nil {
+ return 0, fmt.Errorf("checksum@%v: %w", blockBeg, err)
+ }
+ _expSum, ok := sumRun.SumForAddr(blockBeg)
+ if !ok {
+ panic(fmt.Errorf("run from LookupCSum(fs, typ, %v) did not contain %v: %#v",
+ blockBeg, blockBeg, sumRun))
+ }
+ expSum := _expSum.ToFullSum()
- sumRun, err := LookupCSum(file.SV.FS, sb.ChecksumType, blockBeg)
- if err != nil {
- return 0, fmt.Errorf("checksum@%v: %w", blockBeg, err)
- }
- _expSum, ok := sumRun.SumForAddr(blockBeg)
- if !ok {
- panic(fmt.Errorf("run from LookupCSum(fs, typ, %v) did not contain %v: %#v",
- blockBeg, blockBeg, sumRun))
- }
- expSum := _expSum.ToFullSum()
-
- actSum, err := sb.ChecksumType.Sum(block[:])
- if err != nil {
- return 0, fmt.Errorf("checksum@%v: %w", blockBeg, err)
- }
+ actSum, err := sb.ChecksumType.Sum(block[:])
+ if err != nil {
+ return 0, fmt.Errorf("checksum@%v: %w", blockBeg, err)
+ }
- if actSum != expSum {
- return 0, fmt.Errorf("checksum@%v: actual sum %v != expected sum %v",
- blockBeg, actSum, expSum)
+ if actSum != expSum {
+ return 0, fmt.Errorf("checksum@%v: actual sum %v != expected sum %v",
+ blockBeg, actSum, expSum)
+ }
}
return n, nil
}
diff --git a/lib/btrfsprogs/btrfsinspect/mount.go b/lib/btrfsprogs/btrfsinspect/mount.go
index 6cf6317..2a0b232 100644
--- a/lib/btrfsprogs/btrfsinspect/mount.go
+++ b/lib/btrfsprogs/btrfsinspect/mount.go
@@ -30,7 +30,7 @@ import (
"git.lukeshu.com/btrfs-progs-ng/lib/slices"
)
-func MountRO(ctx context.Context, fs *btrfs.FS, mountpoint string) error {
+func MountRO(ctx context.Context, fs *btrfs.FS, mountpoint string, noChecksums bool) error {
pvs := fs.LV.PhysicalVolumes()
if len(pvs) < 1 {
return errors.New("no devices")
@@ -43,8 +43,9 @@ func MountRO(ctx context.Context, fs *btrfs.FS, mountpoint string) error {
rootSubvol := &subvolume{
Subvolume: btrfs.Subvolume{
- FS: btrfsutil.NewBrokenTrees(ctx, fs),
- TreeID: btrfsprim.FS_TREE_OBJECTID,
+ FS: btrfsutil.NewBrokenTrees(ctx, fs),
+ TreeID: btrfsprim.FS_TREE_OBJECTID,
+ NoChecksums: noChecksums,
},
DeviceName: deviceName,
Mountpoint: mountpoint,
@@ -185,8 +186,9 @@ func (sv *subvolume) LoadDir(inode btrfsprim.ObjID) (val *btrfs.Dir, err error)
sv.grp.Go(workerName, func(ctx context.Context) error {
subSv := &subvolume{
Subvolume: btrfs.Subvolume{
- FS: sv.FS,
- TreeID: entry.Location.ObjectID,
+ FS: sv.FS,
+ TreeID: entry.Location.ObjectID,
+ NoChecksums: sv.NoChecksums,
},
DeviceName: sv.DeviceName,
Mountpoint: filepath.Join(sv.Mountpoint, subMountpoint[1:]),