Skip to content

Commit b300237

Browse files
committed
Implement basic subvolume and snapshot commands. Exec-based send and receive.
* better code generator * regenerate btrfs_tree.h constants * implement subvolume create, delete and snapshot create commands * exec-based snapshot send and receive
1 parent 2d0abe4 commit b300237

14 files changed

Lines changed: 953 additions & 47 deletions

btrfs.go

Lines changed: 45 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
package btrfs
22

33
import (
4+
"fmt"
45
"github.com/dennwc/btrfs/ioctl"
6+
"io"
57
"os"
8+
"path/filepath"
69
)
710

8-
//go:generate go run cmd/hgen.go -p btrfs -o btrfs_tree_hc.go btrfs_tree.h
9-
//go:generate go fmt -w btrfs_tree_hc.go
10-
1111
const SuperMagic = 0x9123683E
1212

1313
func Open(path string) (*FS, error) {
@@ -19,6 +19,12 @@ func Open(path string) (*FS, error) {
1919
dir, err := os.Open(path)
2020
if err != nil {
2121
return nil, err
22+
} else if st, err := dir.Stat(); err != nil {
23+
dir.Close()
24+
return nil, err
25+
} else if !st.IsDir() {
26+
dir.Close()
27+
return nil, fmt.Errorf("not a directory: %s", path)
2228
}
2329
return &FS{f: dir}, nil
2430
}
@@ -139,3 +145,39 @@ func (f *FS) Sync() (err error) {
139145
}
140146
return ioctl.Do(f.f, _BTRFS_IOC_WAIT_SYNC, nil)
141147
}
148+
149+
func (f *FS) CreateSubVolume(name string) error {
150+
return CreateSubVolume(filepath.Join(f.f.Name(), name))
151+
}
152+
153+
func (f *FS) DeleteSubVolume(name string) error {
154+
return DeleteSubVolume(filepath.Join(f.f.Name(), name))
155+
}
156+
157+
func (f *FS) Snapshot(dst string, ro bool) error {
158+
return SnapshotSubVolume(f.f.Name(), filepath.Join(f.f.Name(), dst), ro)
159+
}
160+
161+
func (f *FS) SnapshotSubVolume(name string, dst string, ro bool) error {
162+
return SnapshotSubVolume(filepath.Join(f.f.Name(), name),
163+
filepath.Join(f.f.Name(), dst), ro)
164+
}
165+
166+
func (f *FS) Send(w io.Writer, parent string, subvols ...string) error {
167+
if parent != "" {
168+
parent = filepath.Join(f.f.Name(), parent)
169+
}
170+
sub := make([]string, 0, len(subvols))
171+
for _, s := range subvols {
172+
sub = append(sub, filepath.Join(f.f.Name(), s))
173+
}
174+
return Send(w, parent, sub...)
175+
}
176+
177+
func (f *FS) Receive(r io.Reader) error {
178+
return Receive(r, f.f.Name())
179+
}
180+
181+
func (f *FS) ReceiveTo(r io.Reader, mount string) error {
182+
return Receive(r, filepath.Join(f.f.Name(), mount))
183+
}

btrfs_list.go

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package btrfs
2+
3+
import "os"
4+
5+
func getPathRootID(file *os.File) (uint64, error) {
6+
args := btrfs_ioctl_ino_lookup_args{
7+
objectid: firstFreeObjectid,
8+
}
9+
if err := iocInoLookup(file, &args); err != nil {
10+
return 0, err
11+
}
12+
return args.treeid, nil
13+
}

btrfs_tree_h.go

Lines changed: 0 additions & 23 deletions
This file was deleted.

0 commit comments

Comments
 (0)