diff --git a/daemon/graphdriver/zfs/zfs.go b/daemon/graphdriver/zfs/zfs.go index ffde8a545f..8bfe0584fc 100644 --- a/daemon/graphdriver/zfs/zfs.go +++ b/daemon/graphdriver/zfs/zfs.go @@ -250,11 +250,7 @@ func (d *Driver) CreateReadWrite(id, parent, mountLabel string, storageOpt map[s // Create prepares the dataset and filesystem for the ZFS driver for the given id under the parent. func (d *Driver) Create(id string, parent string, mountLabel string, storageOpt map[string]string) error { - if len(storageOpt) != 0 { - return fmt.Errorf("--storage-opt is not supported for zfs") - } - - err := d.create(id, parent) + err := d.create(id, parent, storageOpt) if err == nil { return nil } @@ -273,22 +269,55 @@ func (d *Driver) Create(id string, parent string, mountLabel string, storageOpt } // retry - return d.create(id, parent) + return d.create(id, parent, storageOpt) } -func (d *Driver) create(id, parent string) error { +func (d *Driver) create(id, parent string, storageOpt map[string]string) error { name := d.zfsPath(id) + quota, err := parseStorageOpt(storageOpt) if parent == "" { mountoptions := map[string]string{"mountpoint": "legacy"} fs, err := zfs.CreateFilesystem(name, mountoptions) if err == nil { - d.Lock() - d.filesystemsCache[fs.Name] = true - d.Unlock() + err = setQuota(name, quota) + if err == nil { + d.Lock() + d.filesystemsCache[fs.Name] = true + d.Unlock() + } } return err } - return d.cloneFilesystem(name, d.zfsPath(parent)) + err = d.cloneFilesystem(name, d.zfsPath(parent)) + if err == nil { + err = setQuota(name, quota) + } + return err +} + +func parseStorageOpt(storageOpt map[string]string) (string, error) { + // Read size to change the disk quota per container + for k, v := range storageOpt { + key := strings.ToLower(k) + switch key { + case "size": + return v, nil + default: + return "0", fmt.Errorf("Unknown option %s", key) + } + } + return "0", nil +} + +func setQuota(name string, quota string) error { + if quota == "0" { + return nil + } + fs, err := zfs.GetDataset(name) + if err != nil { + return err + } + return fs.SetProperty("quota", quota) } // Remove deletes the dataset, filesystem and the cache for the given id.