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>
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)
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. */