Browse Source

Update quota support to treat permission error as not supported

When initializing graphdrivers without root a permission warning
log is given due to lack of permission to create a device. This
error should be treated the same as quota not supported.

Signed-off-by: Derek McGowan <derek@mcgstyle.net>
Derek McGowan 6 years ago
parent
commit
1217819f07
1 changed files with 11 additions and 10 deletions
  1. 11 10
      daemon/graphdriver/quota/projectquota.go

+ 11 - 10
daemon/graphdriver/quota/projectquota.go

@@ -59,6 +59,7 @@ import (
 	"unsafe"
 	"unsafe"
 
 
 	rsystem "github.com/opencontainers/runc/libcontainer/system"
 	rsystem "github.com/opencontainers/runc/libcontainer/system"
+	"github.com/pkg/errors"
 	"github.com/sirupsen/logrus"
 	"github.com/sirupsen/logrus"
 	"golang.org/x/sys/unix"
 	"golang.org/x/sys/unix"
 )
 )
@@ -208,8 +209,8 @@ func setProjectQuota(backingFsBlockDev string, projectID uint32, quota Quota) er
 		uintptr(unsafe.Pointer(cs)), uintptr(d.d_id),
 		uintptr(unsafe.Pointer(cs)), uintptr(d.d_id),
 		uintptr(unsafe.Pointer(&d)), 0, 0)
 		uintptr(unsafe.Pointer(&d)), 0, 0)
 	if errno != 0 {
 	if errno != 0 {
-		return fmt.Errorf("Failed to set quota limit for projid %d on %s: %v",
-			projectID, backingFsBlockDev, errno.Error())
+		return errors.Wrapf(errno, "failed to set quota limit for projid %d on %s",
+			projectID, backingFsBlockDev)
 	}
 	}
 
 
 	return nil
 	return nil
@@ -235,8 +236,8 @@ func (q *Control) GetQuota(targetPath string, quota *Quota) error {
 		uintptr(unsafe.Pointer(cs)), uintptr(C.__u32(projectID)),
 		uintptr(unsafe.Pointer(cs)), uintptr(C.__u32(projectID)),
 		uintptr(unsafe.Pointer(&d)), 0, 0)
 		uintptr(unsafe.Pointer(&d)), 0, 0)
 	if errno != 0 {
 	if errno != 0 {
-		return fmt.Errorf("Failed to get quota limit for projid %d on %s: %v",
-			projectID, q.backingFsBlockDev, errno.Error())
+		return errors.Wrapf(errno, "Failed to get quota limit for projid %d on %s",
+			projectID, q.backingFsBlockDev)
 	}
 	}
 	quota.Size = uint64(d.d_blk_hardlimit) * 512
 	quota.Size = uint64(d.d_blk_hardlimit) * 512
 
 
@@ -255,7 +256,7 @@ func getProjectID(targetPath string) (uint32, error) {
 	_, _, errno := unix.Syscall(unix.SYS_IOCTL, getDirFd(dir), C.FS_IOC_FSGETXATTR,
 	_, _, errno := unix.Syscall(unix.SYS_IOCTL, getDirFd(dir), C.FS_IOC_FSGETXATTR,
 		uintptr(unsafe.Pointer(&fsx)))
 		uintptr(unsafe.Pointer(&fsx)))
 	if errno != 0 {
 	if errno != 0 {
-		return 0, fmt.Errorf("Failed to get projid for %s: %v", targetPath, errno.Error())
+		return 0, errors.Wrapf(errno, "failed to get projid for %s", targetPath)
 	}
 	}
 
 
 	return uint32(fsx.fsx_projid), nil
 	return uint32(fsx.fsx_projid), nil
@@ -273,14 +274,14 @@ func setProjectID(targetPath string, projectID uint32) error {
 	_, _, errno := unix.Syscall(unix.SYS_IOCTL, getDirFd(dir), C.FS_IOC_FSGETXATTR,
 	_, _, errno := unix.Syscall(unix.SYS_IOCTL, getDirFd(dir), C.FS_IOC_FSGETXATTR,
 		uintptr(unsafe.Pointer(&fsx)))
 		uintptr(unsafe.Pointer(&fsx)))
 	if errno != 0 {
 	if errno != 0 {
-		return fmt.Errorf("Failed to get projid for %s: %v", targetPath, errno.Error())
+		return errors.Wrapf(errno, "failed to get projid for %s", targetPath)
 	}
 	}
 	fsx.fsx_projid = C.__u32(projectID)
 	fsx.fsx_projid = C.__u32(projectID)
 	fsx.fsx_xflags |= C.FS_XFLAG_PROJINHERIT
 	fsx.fsx_xflags |= C.FS_XFLAG_PROJINHERIT
 	_, _, errno = unix.Syscall(unix.SYS_IOCTL, getDirFd(dir), C.FS_IOC_FSSETXATTR,
 	_, _, errno = unix.Syscall(unix.SYS_IOCTL, getDirFd(dir), C.FS_IOC_FSSETXATTR,
 		uintptr(unsafe.Pointer(&fsx)))
 		uintptr(unsafe.Pointer(&fsx)))
 	if errno != 0 {
 	if errno != 0 {
-		return fmt.Errorf("Failed to set projid for %s: %v", targetPath, errno.Error())
+		return errors.Wrapf(errno, "failed to set projid for %s", targetPath)
 	}
 	}
 
 
 	return nil
 	return nil
@@ -323,7 +324,7 @@ func openDir(path string) (*C.DIR, error) {
 
 
 	dir := C.opendir(Cpath)
 	dir := C.opendir(Cpath)
 	if dir == nil {
 	if dir == nil {
-		return nil, fmt.Errorf("Can't open dir")
+		return nil, fmt.Errorf("failed to open dir")
 	}
 	}
 	return dir, nil
 	return dir, nil
 }
 }
@@ -355,11 +356,11 @@ func makeBackingFsDev(home string) (string, error) {
 	case nil:
 	case nil:
 		return backingFsBlockDev, nil
 		return backingFsBlockDev, nil
 
 
-	case unix.ENOSYS:
+	case unix.ENOSYS, unix.EPERM:
 		return "", ErrQuotaNotSupported
 		return "", ErrQuotaNotSupported
 
 
 	default:
 	default:
-		return "", fmt.Errorf("Failed to mknod %s: %v", backingFsBlockDev, err)
+		return "", errors.Wrapf(err, "failed to mknod %s", backingFsBlockDev)
 	}
 	}
 }
 }