summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorLuke Shumaker <lukeshu@lukeshu.com>2022-10-08 16:25:54 -0600
committerLuke Shumaker <lukeshu@lukeshu.com>2022-10-08 19:51:37 -0600
commitb9c96ea703dcc84fcd8e3c051617c25579c4e4e1 (patch)
tree736630cc6f69d70d5f959cca32fb1a2b39b5315e /lib
parentceff7fa1fce0d6810c42ef6d57dcc2316e63c84b (diff)
mount: Allow ignoring file checksum errors
Diffstat (limited to 'lib')
-rw-r--r--lib/btrfs/io4_fs.go40
-rw-r--r--lib/btrfsprogs/btrfsinspect/mount.go12
2 files changed, 28 insertions, 24 deletions
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:]),