[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