-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathdir.go
57 lines (48 loc) · 1.15 KB
/
dir.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
package dir
import (
"github.com/goose-lang/primitive/disk"
"github.com/mit-pdos/perennial-examples/alloc"
"github.com/mit-pdos/perennial-examples/inode"
)
const NumInodes uint64 = 5
type Dir struct {
d disk.Disk
allocator *alloc.Allocator
inodes []*inode.Inode
}
func openInodes(d disk.Disk) []*inode.Inode {
var inodes []*inode.Inode
for addr := uint64(0); addr < NumInodes; addr++ {
inodes = append(inodes, inode.Open(d, addr))
}
return inodes
}
func inodeUsedBlocks(inodes []*inode.Inode) alloc.AddrSet {
used := make(alloc.AddrSet)
for _, i := range inodes {
alloc.SetAdd(used, i.UsedBlocks())
}
return used
}
func Open(d disk.Disk, sz uint64) *Dir {
inodes := openInodes(d)
used := inodeUsedBlocks(inodes)
allocator := alloc.New(NumInodes, sz-NumInodes, used)
return &Dir{
d: d,
allocator: allocator,
inodes: inodes,
}
}
func (d *Dir) Read(ino uint64, off uint64) disk.Block {
i := d.inodes[ino]
return i.Read(off)
}
func (d *Dir) Size(ino uint64) uint64 {
i := d.inodes[ino]
return i.Size()
}
func (d *Dir) Append(ino uint64, b disk.Block) bool {
i := d.inodes[ino]
return i.Append(b, d.allocator)
}