volume/volume_linux.go
18768fdc
 // +build linux
 
 package volume
 
 import (
 	"fmt"
 	"strings"
 
 	mounttypes "github.com/docker/docker/api/types/mount"
 )
 
 // ConvertTmpfsOptions converts *mounttypes.TmpfsOptions to the raw option string
 // for mount(2).
3e3d3c80
 func ConvertTmpfsOptions(opt *mounttypes.TmpfsOptions, readOnly bool) (string, error) {
18768fdc
 	var rawOpts []string
3e3d3c80
 	if readOnly {
 		rawOpts = append(rawOpts, "ro")
 	}
 
 	if opt != nil && opt.Mode != 0 {
18768fdc
 		rawOpts = append(rawOpts, fmt.Sprintf("mode=%o", opt.Mode))
 	}
 
3e3d3c80
 	if opt != nil && opt.SizeBytes != 0 {
18768fdc
 		// calculate suffix here, making this linux specific, but that is
 		// okay, since API is that way anyways.
 
 		// we do this by finding the suffix that divides evenly into the
 		// value, returing the value itself, with no suffix, if it fails.
 		//
 		// For the most part, we don't enforce any semantic to this values.
 		// The operating system will usually align this and enforce minimum
 		// and maximums.
 		var (
 			size   = opt.SizeBytes
 			suffix string
 		)
 		for _, r := range []struct {
 			suffix  string
 			divisor int64
 		}{
 			{"g", 1 << 30},
 			{"m", 1 << 20},
 			{"k", 1 << 10},
 		} {
 			if size%r.divisor == 0 {
 				size = size / r.divisor
 				suffix = r.suffix
 				break
 			}
 		}
 
 		rawOpts = append(rawOpts, fmt.Sprintf("size=%d%s", size, suffix))
 	}
 	return strings.Join(rawOpts, ","), nil
 }