diff --git a/libcontainer/configs/validate/validator.go b/libcontainer/configs/validate/validator.go index 37ece0aebbd..3fef3c9fb9f 100644 --- a/libcontainer/configs/validate/validator.go +++ b/libcontainer/configs/validate/validator.go @@ -406,5 +406,13 @@ func ioPriority(config *configs.Config) error { if priority < 0 || priority > 7 { return fmt.Errorf("invalid ioPriority.Priority: %d", priority) } + + switch config.IOPriority.Class { + case specs.IOPRIO_CLASS_RT, specs.IOPRIO_CLASS_BE, specs.IOPRIO_CLASS_IDLE: + // do nothing + default: + return fmt.Errorf("invalid ioPriority.Class: %q", config.IOPriority.Class) + } + return nil } diff --git a/libcontainer/configs/validate/validator_test.go b/libcontainer/configs/validate/validator_test.go index b0b740a122d..d157feea5bc 100644 --- a/libcontainer/configs/validate/validator_test.go +++ b/libcontainer/configs/validate/validator_test.go @@ -847,15 +847,21 @@ func TestValidateIOPriority(t *testing.T) { testCases := []struct { isErr bool priority int + class specs.IOPriorityClass }{ - {isErr: false, priority: 0}, - {isErr: false, priority: 7}, - {isErr: true, priority: -1}, + {isErr: false, priority: 0, class: specs.IOPRIO_CLASS_IDLE}, + {isErr: false, priority: 7, class: specs.IOPRIO_CLASS_RT}, + {isErr: false, priority: 3, class: specs.IOPRIO_CLASS_BE}, + // Invalid priority. + {isErr: true, priority: -1, class: specs.IOPRIO_CLASS_BE}, + // Invalid class. + {isErr: true, priority: 3, class: specs.IOPriorityClass("IOPRIO_CLASS_WOW")}, } for _, tc := range testCases { ioPriroty := configs.IOPriority{ Priority: tc.priority, + Class: tc.class, } config := &configs.Config{ Rootfs: "/var",