linux-fsdevel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 0/2] fs/lock: show locks info owned by dead/invisible processes
@ 2018-06-08 14:27 Konstantin Khorenko
  2018-06-08 14:27 ` [PATCH 1/2] fs/lock: skip lock owner pid translation in case we are in init_pid_ns Konstantin Khorenko
                   ` (5 more replies)
  0 siblings, 6 replies; 12+ messages in thread
From: Konstantin Khorenko @ 2018-06-08 14:27 UTC (permalink / raw)
  To: Kirill Gorkunov, Andrey Vagin, Benjamin Coddington, Jeff Layton,
	J. Bruce Fields, Alexander Viro
  Cc: Konstantin Khorenko, Vasily Averin, linux-fsdevel, linux-kernel

The behavior has been changed after 9d5b86ac13c5 ("fs/locks: Remove fl_nspid
and use fs-specific l_pid for remote locks")
and now /proc/$PID/fdinfo/$FD does not show the info about the lock
* 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.

CRIU uses this interface to store locks info during dump and thus can break
on v4.13 and newer.

So let's show info about locks anyway in described cases (like it was before
9d5b86ac13c5), but show pid number saved in file_lock struct if we are in
init_pid_ns (patch 1) or just zero otherwise (patch 2) like we do with SID.

Reproducer:
process A       process A1      process A2
fork()--------->
exit()          open()
                flock()
                fork()--------->
                exit()          sleep()

Before the patch:
================
(root@vz7)/: cat /proc/${PID_A2}/fdinfo/3
pos:    4
flags:  02100002
mnt_id: 257
lock:   (root@vz7)/:

After the patch:
===============
(root@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;
}

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

^ permalink raw reply	[flat|nested] 12+ messages in thread

end of thread, other threads:[~2018-08-09 10:43 UTC | newest]

Thread overview: 12+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-06-08 14:27 [PATCH 0/2] fs/lock: show locks info owned by dead/invisible processes Konstantin Khorenko
2018-06-08 14:27 ` [PATCH 1/2] fs/lock: skip lock owner pid translation in case we are in init_pid_ns Konstantin Khorenko
2018-06-12  4:35   ` Andrey Vagin
2018-06-08 14:27 ` [PATCH 2/2] fs/lock: show locks taken by processes from another pidns Konstantin Khorenko
2018-06-12  4:53   ` Andrey Vagin
2018-06-14 11:00   ` Jeff Layton
2018-06-19 20:25     ` Andrey Vagin
2018-06-08 16:02 ` [PATCH 0/2] fs/lock: show locks info owned by dead/invisible processes Cyrill Gorcunov
2018-06-14 10:41 ` Jeff Layton
2018-06-14 11:13 ` Benjamin Coddington
2018-08-09  7:16 ` Murphy Zhou
2018-08-09  8:20   ` Konstantin Khorenko

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).