浏览代码

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>
Liu Bo 9 年之前
父节点
当前提交
b2e27fee53
共有 1 个文件被更改,包括 5 次插入1 次删除
  1. 5 1
      daemon/graphdriver/btrfs/btrfs.go

+ 5 - 1
daemon/graphdriver/btrfs/btrfs.go

@@ -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
 		}