summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLuke Shumaker <lukeshu@lukeshu.com>2023-07-25 12:31:30 -0600
committerLuke Shumaker <lukeshu@lukeshu.com>2023-07-25 12:35:33 -0600
commita2e7457d7fc339caac4e1f55d0eeadd732af60b1 (patch)
tree5091d751422bf3668318721cc654e247dca3b451
parent17a9ea959d2f77b1ba55d45ac3feaf918f42f7dd (diff)
Don't try to read the chunk tree until all devices are added
-rw-r--r--lib/btrfs/io2_lv.go12
-rw-r--r--lib/btrfsutil/open.go3
2 files changed, 11 insertions, 4 deletions
diff --git a/lib/btrfs/io2_lv.go b/lib/btrfs/io2_lv.go
index e9de215..16c5987 100644
--- a/lib/btrfs/io2_lv.go
+++ b/lib/btrfs/io2_lv.go
@@ -43,7 +43,7 @@ func (fs *FS) AddDevice(ctx context.Context, dev *Device) error {
}
fs.cacheSuperblocks = nil
fs.cacheSuperblock = nil
- if err := fs.initDev(ctx, *sb); err != nil {
+ if err := fs.initDev(*sb); err != nil {
dlog.Errorf(ctx, "error: AddDevice: %q: %v", dev.Name(), err)
}
return nil
@@ -142,14 +142,14 @@ func (fs *FS) ReInit(ctx context.Context) error {
if err != nil {
return fmt.Errorf("file %q: %w", dev.Name(), err)
}
- if err := fs.initDev(ctx, *sb); err != nil {
+ if err := fs.initDev(*sb); err != nil {
return fmt.Errorf("file %q: %w", dev.Name(), err)
}
}
- return nil
+ return fs.InitChunks(ctx)
}
-func (fs *FS) initDev(ctx context.Context, sb btrfstree.Superblock) error {
+func (fs *FS) initDev(sb btrfstree.Superblock) error {
syschunks, err := sb.ParseSysChunkArray()
if err != nil {
return err
@@ -161,6 +161,10 @@ func (fs *FS) initDev(ctx context.Context, sb btrfstree.Superblock) error {
}
}
}
+ return nil
+}
+
+func (fs *FS) InitChunks(ctx context.Context) error {
chunkTree, err := fs.ForrestLookup(ctx, btrfsprim.CHUNK_TREE_OBJECTID)
if err != nil {
return err
diff --git a/lib/btrfsutil/open.go b/lib/btrfsutil/open.go
index abbd466..91bb943 100644
--- a/lib/btrfsutil/open.go
+++ b/lib/btrfsutil/open.go
@@ -43,5 +43,8 @@ func Open(ctx context.Context, flag int, filenames ...string) (*btrfs.FS, error)
return nil, fmt.Errorf("device file %q: %w", filename, err)
}
}
+ if err := fs.InitChunks(ctx); err != nil {
+ dlog.Errorf(ctx, "error: InitChunks: %v", err)
+ }
return fs, nil
}