image: Handle systems that don't support O_PATH when updating timestamp
Older kernel can't handle O_PATH in open() so this will fail on dirs and symlinks. For dirs wa can fallback to the normal Utimes, but for symlinks there is not much to do but ignore their timestamps. Upstream-commit: 2c71710b74829787a0c78f7e02f45d31935a996f Component: engine
This commit is contained in:
committed by
Tianon Gravi
parent
2af8abef3d
commit
6101a0a475
@ -336,11 +336,21 @@ func (image *Image) applyLayer(layer, target string) error {
|
||||
|
||||
O_PATH := 010000000 // Not in syscall yet
|
||||
fd, err := syscall.Open(update.path, syscall.O_RDWR | O_PATH | syscall.O_NOFOLLOW, 0600)
|
||||
if err != nil {
|
||||
return err
|
||||
if err == syscall.EISDIR || err == syscall.ELOOP {
|
||||
// O_PATH not supported, use Utimes except on symlinks where Utimes doesn't work
|
||||
if err != syscall.ELOOP {
|
||||
err = syscall.Utimes(update.path, update.time)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
syscall.Futimes(fd, update.time)
|
||||
_ = syscall.Close(fd)
|
||||
}
|
||||
syscall.Futimes(fd, update.time)
|
||||
_ = syscall.Close(fd)
|
||||
}
|
||||
|
||||
return nil
|
||||
|
||||
Reference in New Issue
Block a user