Graphdriver/btrfs: Avoid using single d.Get()

For btrfs driver, in d.Create(), Get() of parentDir is called but not followed
by Put().

If we apply SElinux mount label, we need to mount btrfs subvolumes in d.Get(),
without a Put() would end up with a later Remove() failure on
"Device resourse is busy".

This calls the subvolume helper function directly in d.Create().

Signed-off-by: Liu Bo <bo.li.liu@oracle.com>
Upstream-commit: b2e27fee53c269f9659bdab66852eaba4ffbe9c7
Component: engine
This commit is contained in:
Liu Bo
2016-02-04 10:25:24 -08:00
parent 15e0185e69
commit f06d92067d
@@ -256,10 +256,14 @@ func (d *Driver) Create(id, parent, mountLabel string) error {
return err
}
} else {
parentDir, err := d.Get(parent, "")
parentDir := d.subvolumesDirID(parent)
st, err := os.Stat(parentDir)
if err != nil {
return err
}
if !st.IsDir() {
return fmt.Errorf("%s: not a direcotory", parentDir)
}
if err := subvolSnapshot(parentDir, subvolumes, id); err != nil {
return err
}