mirror of
https://github.com/moby/moby.git
synced 2022-11-09 12:21:53 -05:00
aufs: add lock around mount
Apparently there is some kind of race in aufs kernel module code, which leads to the errors like: [98221.158606] aufs au_xino_create2:186:dockerd[25801]: aufs.xino create err -17 [98221.162128] aufs au_xino_set:1229:dockerd[25801]: I/O Error, failed creating xino(-17). [98362.239085] aufs au_xino_create2:186:dockerd[6348]: aufs.xino create err -17 [98362.243860] aufs au_xino_set:1229:dockerd[6348]: I/O Error, failed creating xino(-17). [98373.775380] aufs au_xino_create:767:dockerd[27435]: open /dev/shm/aufs.xino(-17) [98389.015640] aufs au_xino_create2:186:dockerd[26753]: aufs.xino create err -17 [98389.018776] aufs au_xino_set:1229:dockerd[26753]: I/O Error, failed creating xino(-17). [98424.117584] aufs au_xino_create:767:dockerd[27105]: open /dev/shm/aufs.xino(-17) So, we have to have a lock around mount syscall. While at it, don't call the whole Unmount() on an error path, as it leads to bogus error from auplink flush. Signed-off-by: Kir Kolyshkin <kolyshkin@gmail.com>
This commit is contained in:
parent
5873768dbe
commit
5cd62852fa
1 changed files with 10 additions and 3 deletions
|
@ -80,6 +80,7 @@ type Driver struct {
|
||||||
pathCache map[string]string
|
pathCache map[string]string
|
||||||
naiveDiff graphdriver.DiffDriver
|
naiveDiff graphdriver.DiffDriver
|
||||||
locker *locker.Locker
|
locker *locker.Locker
|
||||||
|
mntL sync.Mutex
|
||||||
}
|
}
|
||||||
|
|
||||||
// Init returns a new AUFS driver.
|
// Init returns a new AUFS driver.
|
||||||
|
@ -597,7 +598,7 @@ func (a *Driver) Cleanup() error {
|
||||||
func (a *Driver) aufsMount(ro []string, rw, target, mountLabel string) (err error) {
|
func (a *Driver) aufsMount(ro []string, rw, target, mountLabel string) (err error) {
|
||||||
defer func() {
|
defer func() {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
Unmount(target)
|
mount.Unmount(target)
|
||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
|
|
||||||
|
@ -625,7 +626,10 @@ func (a *Driver) aufsMount(ro []string, rw, target, mountLabel string) (err erro
|
||||||
opts += ",dirperm1"
|
opts += ",dirperm1"
|
||||||
}
|
}
|
||||||
data := label.FormatMountLabel(fmt.Sprintf("%s,%s", string(b[:bp]), opts), mountLabel)
|
data := label.FormatMountLabel(fmt.Sprintf("%s,%s", string(b[:bp]), opts), mountLabel)
|
||||||
if err = unix.Mount("none", target, "aufs", 0, data); err != nil {
|
a.mntL.Lock()
|
||||||
|
err = unix.Mount("none", target, "aufs", 0, data)
|
||||||
|
a.mntL.Unlock()
|
||||||
|
if err != nil {
|
||||||
err = errors.Wrap(err, "mount target="+target+" data="+data)
|
err = errors.Wrap(err, "mount target="+target+" data="+data)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
@ -633,7 +637,10 @@ func (a *Driver) aufsMount(ro []string, rw, target, mountLabel string) (err erro
|
||||||
for ; index < len(ro); index++ {
|
for ; index < len(ro); index++ {
|
||||||
layer := fmt.Sprintf(":%s=ro+wh", ro[index])
|
layer := fmt.Sprintf(":%s=ro+wh", ro[index])
|
||||||
data := label.FormatMountLabel(fmt.Sprintf("append%s", layer), mountLabel)
|
data := label.FormatMountLabel(fmt.Sprintf("append%s", layer), mountLabel)
|
||||||
if err = unix.Mount("none", target, "aufs", unix.MS_REMOUNT, data); err != nil {
|
a.mntL.Lock()
|
||||||
|
err = unix.Mount("none", target, "aufs", unix.MS_REMOUNT, data)
|
||||||
|
a.mntL.Unlock()
|
||||||
|
if err != nil {
|
||||||
err = errors.Wrap(err, "mount target="+target+" flags=MS_REMOUNT data="+data)
|
err = errors.Wrap(err, "mount target="+target+" flags=MS_REMOUNT data="+data)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue