| ... | ... |
@@ -12,10 +12,10 @@ import ( |
| 12 | 12 |
"github.com/docker/docker/pkg/system" |
| 13 | 13 |
) |
| 14 | 14 |
|
| 15 |
-type CopyFlags int |
|
| 15 |
+type copyFlags int |
|
| 16 | 16 |
|
| 17 | 17 |
const ( |
| 18 |
- CopyHardlink CopyFlags = 1 << iota |
|
| 18 |
+ copyHardlink copyFlags = 1 << iota |
|
| 19 | 19 |
) |
| 20 | 20 |
|
| 21 | 21 |
func copyRegular(srcPath, dstPath string, mode os.FileMode) error {
|
| ... | ... |
@@ -49,7 +49,7 @@ func copyXattr(srcPath, dstPath, attr string) error {
|
| 49 | 49 |
return nil |
| 50 | 50 |
} |
| 51 | 51 |
|
| 52 |
-func copyDir(srcDir, dstDir string, flags CopyFlags) error {
|
|
| 52 |
+func copyDir(srcDir, dstDir string, flags copyFlags) error {
|
|
| 53 | 53 |
err := filepath.Walk(srcDir, func(srcPath string, f os.FileInfo, err error) error {
|
| 54 | 54 |
if err != nil {
|
| 55 | 55 |
return err |
| ... | ... |
@@ -75,7 +75,7 @@ func copyDir(srcDir, dstDir string, flags CopyFlags) error {
|
| 75 | 75 |
|
| 76 | 76 |
switch f.Mode() & os.ModeType {
|
| 77 | 77 |
case 0: // Regular file |
| 78 |
- if flags&CopyHardlink != 0 {
|
|
| 78 |
+ if flags©Hardlink != 0 {
|
|
| 79 | 79 |
isHardlink = true |
| 80 | 80 |
if err := os.Link(srcPath, dstPath); err != nil {
|
| 81 | 81 |
return err |
| ... | ... |
@@ -23,11 +23,15 @@ import ( |
| 23 | 23 |
// implementation of ApplyDiff() |
| 24 | 24 |
|
| 25 | 25 |
var ( |
| 26 |
+ // ErrApplyDiffFallback is returned to indicate that a normal ApplyDiff is applied as a fallback from Naive diff writer. |
|
| 26 | 27 |
ErrApplyDiffFallback = fmt.Errorf("Fall back to normal ApplyDiff")
|
| 27 | 28 |
) |
| 28 | 29 |
|
| 30 |
+// ApplyDiffProtoDriver wraps the ProtoDriver by extending the inteface with ApplyDiff method. |
|
| 29 | 31 |
type ApplyDiffProtoDriver interface {
|
| 30 | 32 |
graphdriver.ProtoDriver |
| 33 |
+ // ApplyDiff writes the diff to the archive for the given id and parent id. |
|
| 34 |
+ // It returns the size in bytes written if successful, an error ErrApplyDiffFallback is returned otherwise. |
|
| 31 | 35 |
ApplyDiff(id, parent string, diff archive.Reader) (size int64, err error) |
| 32 | 36 |
} |
| 33 | 37 |
|
| ... | ... |
@@ -36,6 +40,7 @@ type naiveDiffDriverWithApply struct {
|
| 36 | 36 |
applyDiff ApplyDiffProtoDriver |
| 37 | 37 |
} |
| 38 | 38 |
|
| 39 |
+// NaiveDiffDriverWithApply returns a NaiveDiff driver with custom ApplyDiff. |
|
| 39 | 40 |
func NaiveDiffDriverWithApply(driver ApplyDiffProtoDriver) graphdriver.Driver {
|
| 40 | 41 |
return &naiveDiffDriverWithApply{
|
| 41 | 42 |
Driver: graphdriver.NaiveDiffDriver(driver), |
| ... | ... |
@@ -43,6 +48,7 @@ func NaiveDiffDriverWithApply(driver ApplyDiffProtoDriver) graphdriver.Driver {
|
| 43 | 43 |
} |
| 44 | 44 |
} |
| 45 | 45 |
|
| 46 |
+// ApplyDiff creates a diff layer with either the NaiveDiffDriver or with a fallback. |
|
| 46 | 47 |
func (d *naiveDiffDriverWithApply) ApplyDiff(id, parent string, diff archive.Reader) (int64, error) {
|
| 47 | 48 |
b, err := d.applyDiff.ApplyDiff(id, parent, diff) |
| 48 | 49 |
if err == ErrApplyDiffFallback {
|
| ... | ... |
@@ -79,11 +85,15 @@ func (d *naiveDiffDriverWithApply) ApplyDiff(id, parent string, diff archive.Rea |
| 79 | 79 |
// of that. This means all child images share file (but not directory) |
| 80 | 80 |
// data with the parent. |
| 81 | 81 |
|
| 82 |
+// ActiveMount contains information about the count, path and whether is mounted or not. |
|
| 83 |
+// This information is part of the Driver, that contains list of active mounts taht are part of this overlay. |
|
| 82 | 84 |
type ActiveMount struct {
|
| 83 | 85 |
count int |
| 84 | 86 |
path string |
| 85 | 87 |
mounted bool |
| 86 | 88 |
} |
| 89 |
+ |
|
| 90 |
+// Driver contains information about the home directory and the list of active mounts that are created using this driver. |
|
| 87 | 91 |
type Driver struct {
|
| 88 | 92 |
home string |
| 89 | 93 |
sync.Mutex // Protects concurrent modification to active |
| ... | ... |
@@ -96,6 +106,9 @@ func init() {
|
| 96 | 96 |
graphdriver.Register("overlay", Init)
|
| 97 | 97 |
} |
| 98 | 98 |
|
| 99 |
+// Init returns the NaiveDiffDriver, a native diff driver for overlay filesystem. |
|
| 100 |
+// If overlay filesystem is not supported on the host, graphdriver.ErrNotSupported is returned as error. |
|
| 101 |
+// If a overlay filesystem is not supported over a existing filesystem then error graphdriver.ErrIncompatibleFS is returned. |
|
| 99 | 102 |
func Init(home string, options []string) (graphdriver.Driver, error) {
|
| 100 | 103 |
|
| 101 | 104 |
if err := supportsOverlay(); err != nil {
|
| ... | ... |
@@ -161,12 +174,15 @@ func (d *Driver) String() string {
|
| 161 | 161 |
return "overlay" |
| 162 | 162 |
} |
| 163 | 163 |
|
| 164 |
+// Status returns current driver information in a two dimensional string array. |
|
| 165 |
+// Output contains "Backing Filesystem" used in this implementation. |
|
| 164 | 166 |
func (d *Driver) Status() [][2]string {
|
| 165 | 167 |
return [][2]string{
|
| 166 | 168 |
{"Backing Filesystem", backingFs},
|
| 167 | 169 |
} |
| 168 | 170 |
} |
| 169 | 171 |
|
| 172 |
+// GetMetadata returns meta data about the overlay driver such as root, LowerDir, UpperDir, WorkDir and MergeDir used to store data. |
|
| 170 | 173 |
func (d *Driver) GetMetadata(id string) (map[string]string, error) {
|
| 171 | 174 |
dir := d.dir(id) |
| 172 | 175 |
if _, err := os.Stat(dir); err != nil {
|
| ... | ... |
@@ -182,12 +198,12 @@ func (d *Driver) GetMetadata(id string) (map[string]string, error) {
|
| 182 | 182 |
return metadata, nil |
| 183 | 183 |
} |
| 184 | 184 |
|
| 185 |
- lowerId, err := ioutil.ReadFile(path.Join(dir, "lower-id")) |
|
| 185 |
+ lowerID, err := ioutil.ReadFile(path.Join(dir, "lower-id")) |
|
| 186 | 186 |
if err != nil {
|
| 187 | 187 |
return nil, err |
| 188 | 188 |
} |
| 189 | 189 |
|
| 190 |
- metadata["LowerDir"] = path.Join(d.dir(string(lowerId)), "root") |
|
| 190 |
+ metadata["LowerDir"] = path.Join(d.dir(string(lowerID)), "root") |
|
| 191 | 191 |
metadata["UpperDir"] = path.Join(dir, "upper") |
| 192 | 192 |
metadata["WorkDir"] = path.Join(dir, "work") |
| 193 | 193 |
metadata["MergedDir"] = path.Join(dir, "merged") |
| ... | ... |
@@ -195,10 +211,14 @@ func (d *Driver) GetMetadata(id string) (map[string]string, error) {
|
| 195 | 195 |
return metadata, nil |
| 196 | 196 |
} |
| 197 | 197 |
|
| 198 |
+// Cleanup simply returns nil and do not change the existing filesystem. |
|
| 199 |
+// This is required to satisfy the graphdriver.Driver interface. |
|
| 198 | 200 |
func (d *Driver) Cleanup() error {
|
| 199 | 201 |
return nil |
| 200 | 202 |
} |
| 201 | 203 |
|
| 204 |
+// Create is used to create the upper, lower, and merge directories required for overlay fs for a given id. |
|
| 205 |
+// The parent filesystem is used to configure these directories for the overlay. |
|
| 202 | 206 |
func (d *Driver) Create(id string, parent string) (retErr error) {
|
| 203 | 207 |
dir := d.dir(id) |
| 204 | 208 |
if err := os.MkdirAll(path.Dir(dir), 0700); err != nil {
|
| ... | ... |
@@ -251,12 +271,12 @@ func (d *Driver) Create(id string, parent string) (retErr error) {
|
| 251 | 251 |
|
| 252 | 252 |
// Otherwise, copy the upper and the lower-id from the parent |
| 253 | 253 |
|
| 254 |
- lowerId, err := ioutil.ReadFile(path.Join(parentDir, "lower-id")) |
|
| 254 |
+ lowerID, err := ioutil.ReadFile(path.Join(parentDir, "lower-id")) |
|
| 255 | 255 |
if err != nil {
|
| 256 | 256 |
return err |
| 257 | 257 |
} |
| 258 | 258 |
|
| 259 |
- if err := ioutil.WriteFile(path.Join(dir, "lower-id"), lowerId, 0666); err != nil {
|
|
| 259 |
+ if err := ioutil.WriteFile(path.Join(dir, "lower-id"), lowerID, 0666); err != nil {
|
|
| 260 | 260 |
return err |
| 261 | 261 |
} |
| 262 | 262 |
|
| ... | ... |
@@ -284,6 +304,7 @@ func (d *Driver) dir(id string) string {
|
| 284 | 284 |
return path.Join(d.home, id) |
| 285 | 285 |
} |
| 286 | 286 |
|
| 287 |
+// Remove cleans the directories that are created for this id. |
|
| 287 | 288 |
func (d *Driver) Remove(id string) error {
|
| 288 | 289 |
dir := d.dir(id) |
| 289 | 290 |
if _, err := os.Stat(dir); err != nil {
|
| ... | ... |
@@ -292,6 +313,7 @@ func (d *Driver) Remove(id string) error {
|
| 292 | 292 |
return os.RemoveAll(dir) |
| 293 | 293 |
} |
| 294 | 294 |
|
| 295 |
+// Get creates and mounts the required file system for the given id and returns the mount path. |
|
| 295 | 296 |
func (d *Driver) Get(id string, mountLabel string) (string, error) {
|
| 296 | 297 |
// Protect the d.active from concurrent access |
| 297 | 298 |
d.Lock() |
| ... | ... |
@@ -318,11 +340,11 @@ func (d *Driver) Get(id string, mountLabel string) (string, error) {
|
| 318 | 318 |
return mount.path, nil |
| 319 | 319 |
} |
| 320 | 320 |
|
| 321 |
- lowerId, err := ioutil.ReadFile(path.Join(dir, "lower-id")) |
|
| 321 |
+ lowerID, err := ioutil.ReadFile(path.Join(dir, "lower-id")) |
|
| 322 | 322 |
if err != nil {
|
| 323 | 323 |
return "", err |
| 324 | 324 |
} |
| 325 |
- lowerDir := path.Join(d.dir(string(lowerId)), "root") |
|
| 325 |
+ lowerDir := path.Join(d.dir(string(lowerID)), "root") |
|
| 326 | 326 |
upperDir := path.Join(dir, "upper") |
| 327 | 327 |
workDir := path.Join(dir, "work") |
| 328 | 328 |
mergedDir := path.Join(dir, "merged") |
| ... | ... |
@@ -338,6 +360,7 @@ func (d *Driver) Get(id string, mountLabel string) (string, error) {
|
| 338 | 338 |
return mount.path, nil |
| 339 | 339 |
} |
| 340 | 340 |
|
| 341 |
+// Put unmounts the mount path created for the give id. |
|
| 341 | 342 |
func (d *Driver) Put(id string) error {
|
| 342 | 343 |
// Protect the d.active from concurrent access |
| 343 | 344 |
d.Lock() |
| ... | ... |
@@ -373,6 +396,7 @@ func (d *Driver) Put(id string) error {
|
| 373 | 373 |
return nil |
| 374 | 374 |
} |
| 375 | 375 |
|
| 376 |
+// ApplyDiff applies the new layer on top of the root, if parent does not exist with will return a ErrApplyDiffFallback error. |
|
| 376 | 377 |
func (d *Driver) ApplyDiff(id string, parent string, diff archive.Reader) (size int64, err error) {
|
| 377 | 378 |
dir := d.dir(id) |
| 378 | 379 |
|
| ... | ... |
@@ -407,7 +431,7 @@ func (d *Driver) ApplyDiff(id string, parent string, diff archive.Reader) (size |
| 407 | 407 |
} |
| 408 | 408 |
}() |
| 409 | 409 |
|
| 410 |
- if err = copyDir(parentRootDir, tmpRootDir, CopyHardlink); err != nil {
|
|
| 410 |
+ if err = copyDir(parentRootDir, tmpRootDir, copyHardlink); err != nil {
|
|
| 411 | 411 |
return 0, err |
| 412 | 412 |
} |
| 413 | 413 |
|
| ... | ... |
@@ -423,6 +447,7 @@ func (d *Driver) ApplyDiff(id string, parent string, diff archive.Reader) (size |
| 423 | 423 |
return |
| 424 | 424 |
} |
| 425 | 425 |
|
| 426 |
+// Exists checks to see if the id is already mounted. |
|
| 426 | 427 |
func (d *Driver) Exists(id string) bool {
|
| 427 | 428 |
_, err := os.Stat(d.dir(id)) |
| 428 | 429 |
return err == nil |