]> git.ipfire.org Git - thirdparty/lxc.git/commitdiff
lxccontainer: fix F_OFD_GETLK checks 2526/head
authorChristian Brauner <christian.brauner@ubuntu.com>
Tue, 14 Aug 2018 11:00:29 +0000 (13:00 +0200)
committerChristian Brauner <christian.brauner@ubuntu.com>
Tue, 14 Aug 2018 11:00:29 +0000 (13:00 +0200)
When we check whether an open file description lock has been taken on a file we
need to set the l_pid field to 0 otherwise the kernel will send back EINVAL.
Additionally, the kernel will not do pid translation and simply set the l_pid
value to -1.

Fixes https://discuss.linuxcontainers.org/t/container-deleted-or-stopped-when-lxc-ls-executed-concurrently/2439

Signed-off-by: Christian Brauner <christian.brauner@ubuntu.com>
src/lxc/lxccontainer.c

index 2e86747231b222bc0a2c329d3d55fcd46ed1881d..04c2f672b87245b74f9478b7aa277f33cfe80c14 100644 (file)
@@ -164,7 +164,10 @@ static int ongoing_create(struct lxc_container *c)
 
        lk.l_type = F_WRLCK;
        lk.l_whence = SEEK_SET;
-       lk.l_pid = -1;
+       /* F_OFD_GETLK requires that l_pid be set to 0 otherwise the kernel
+        * will EINVAL us.
+        */
+       lk.l_pid = 0;
 
        ret = fcntl(fd, F_OFD_GETLK, &lk);
        if (ret < 0 && errno == EINVAL)
@@ -172,8 +175,9 @@ static int ongoing_create(struct lxc_container *c)
 
        close(fd);
 
-       if (ret == 0 && lk.l_pid != -1)
-               /* create is still ongoing */
+       /* F_OFD_GETLK will not send us back a pid so don't check it. */
+       if (ret == 0)
+               /* Create is still ongoing. */
                return 1;
 
        /* Create completed but partial is still there. */