[Devel] [PATCH rh7 0/2] fs/lock: show locks info owned by dead/invisible processes
Konstantin Khorenko
khorenko at virtuozzo.com
Fri Jun 8 12:41:44 MSK 2018
If the flock owner process is dead and its pid has been already freed
or
if the lock owner is not visible in current pidns
/proc/$PID/fdinfo/$FD does not show the info about the lock,
but CRIU uses this interface to store locks info in dump.
So let's show info about locks anyway in described cases (like it was before
9d5b86ac13c5 ("fs/locks: Remove fl_nspid and use fs-specific l_pid for remote
locks")), but show pid number saved in file_lock struct if we are in
init_pid_ns or just zero otherwise like we do with SID.
Reproducer:
process A process A1 process A2
fork()--------->
exit() open()
flock()
fork()--------->
exit() sleep()
Before the patch:
================
(root at vz7)/: cat /proc/${PID_A2}/fdinfo/3
pos: 4
flags: 02100002
mnt_id: 257
lock: (root at vz7)/:
After the patch:
===============
(root at vz7)/:cat /proc/${PID_A2}/fdinfo/3
pos: 4
flags: 02100002
mnt_id: 295
lock: 1: FLOCK ADVISORY WRITE ${PID_A1} b6:f8a61:529946 0 EOF
===============
# cat flock1.c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/file.h>
#include <fcntl.h>
int main(void)
{
int fd;
int err;
pid_t child_pid;
child_pid = fork();
if (child_pid == -1)
perror("fork failed");
if (child_pid) {
exit(0);
}
fd = open("/tmp/a", O_CREAT | O_RDWR);
if (fd == -1)
perror("Failed to open the file");
err = flock(fd, LOCK_EX);
if (err == -1)
perror("flock failed");
child_pid = fork();
if (child_pid == -1)
perror("fork failed");
if (child_pid)
exit(0);
sleep(10000);
return 0;
}
https://jira.sw.ru/browse/PSBM-85651
Konstantin Khorenko (2):
fs/lock: skip lock owner pid translation in case we are in init_pid_ns
fs/lock: show locks taken by processes from another pidns
fs/locks.c | 15 ++++++++++-----
1 file changed, 10 insertions(+), 5 deletions(-)
--
2.15.1
More information about the Devel
mailing list