Re: [PATCH 0/2] fs/lock: show locks info owned by dead/invisible processes

2018-08-09 Thread Konstantin Khorenko

On 08/09/2018 10:16 AM, Murphy Zhou wrote:

Hi,

Looks like this missed v4.18 ?


Hi Murphy,

yes, Jeff planned to push those patches into 4.19 and they are in "linux-next" 
now,
but not in 4.18 "master" currently.

On 06/14/2018 01:41 PM, Jeff Layton wrote:
> These look fine to me. I'll plan to pick them up for v4.19 unless anyone
> has objections.

linux-next:
1cf8e5de4055 ("fs/lock: show locks taken by processes from another pidns")
826d7bc9f013 ("fs/lock: skip lock owner pid translation in case we are in 
init_pid_ns")

--
Best regards,

Konstantin Khorenko,
Virtuozzo Linux Kernel Team


On Fri, Jun 8, 2018 at 10:27 PM, Konstantin Khorenko
 wrote:

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:  0212
mnt_id: 257
lock:   (root@vz7)/:

After the patch:
===
(root@vz7)/:cat /proc/${PID_A2}/fdinfo/3
pos:4
flags:  0212
mnt_id: 295
lock:   1: FLOCK  ADVISORY  WRITE ${PID_A1} b6:f8a61:529946 0 EOF

===
# cat flock1.c

#include 
#include 
#include 
#include 
#include 
#include 
#include 

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(1);

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


.



Re: [PATCH 0/2] fs/lock: show locks info owned by dead/invisible processes

2018-08-09 Thread Konstantin Khorenko

On 08/09/2018 10:16 AM, Murphy Zhou wrote:

Hi,

Looks like this missed v4.18 ?


Hi Murphy,

yes, Jeff planned to push those patches into 4.19 and they are in "linux-next" 
now,
but not in 4.18 "master" currently.

On 06/14/2018 01:41 PM, Jeff Layton wrote:
> These look fine to me. I'll plan to pick them up for v4.19 unless anyone
> has objections.

linux-next:
1cf8e5de4055 ("fs/lock: show locks taken by processes from another pidns")
826d7bc9f013 ("fs/lock: skip lock owner pid translation in case we are in 
init_pid_ns")

--
Best regards,

Konstantin Khorenko,
Virtuozzo Linux Kernel Team


On Fri, Jun 8, 2018 at 10:27 PM, Konstantin Khorenko
 wrote:

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:  0212
mnt_id: 257
lock:   (root@vz7)/:

After the patch:
===
(root@vz7)/:cat /proc/${PID_A2}/fdinfo/3
pos:4
flags:  0212
mnt_id: 295
lock:   1: FLOCK  ADVISORY  WRITE ${PID_A1} b6:f8a61:529946 0 EOF

===
# cat flock1.c

#include 
#include 
#include 
#include 
#include 
#include 
#include 

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(1);

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


.



Re: [PATCH 0/2] fs/lock: show locks info owned by dead/invisible processes

2018-08-09 Thread Murphy Zhou
Hi,

Looks like this missed v4.18 ?

Thanks,
Murphy

On Fri, Jun 8, 2018 at 10:27 PM, Konstantin Khorenko
 wrote:
> 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:  0212
> mnt_id: 257
> lock:   (root@vz7)/:
>
> After the patch:
> ===
> (root@vz7)/:cat /proc/${PID_A2}/fdinfo/3
> pos:4
> flags:  0212
> mnt_id: 295
> lock:   1: FLOCK  ADVISORY  WRITE ${PID_A1} b6:f8a61:529946 0 EOF
>
> ===
> # cat flock1.c
>
> #include 
> #include 
> #include 
> #include 
> #include 
> #include 
> #include 
>
> 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(1);
>
> 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
>


Re: [PATCH 0/2] fs/lock: show locks info owned by dead/invisible processes

2018-08-09 Thread Murphy Zhou
Hi,

Looks like this missed v4.18 ?

Thanks,
Murphy

On Fri, Jun 8, 2018 at 10:27 PM, Konstantin Khorenko
 wrote:
> 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:  0212
> mnt_id: 257
> lock:   (root@vz7)/:
>
> After the patch:
> ===
> (root@vz7)/:cat /proc/${PID_A2}/fdinfo/3
> pos:4
> flags:  0212
> mnt_id: 295
> lock:   1: FLOCK  ADVISORY  WRITE ${PID_A1} b6:f8a61:529946 0 EOF
>
> ===
> # cat flock1.c
>
> #include 
> #include 
> #include 
> #include 
> #include 
> #include 
> #include 
>
> 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(1);
>
> 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
>


Re: [PATCH 0/2] fs/lock: show locks info owned by dead/invisible processes

2018-06-14 Thread Benjamin Coddington




On 8 Jun 2018, at 10:27, Konstantin Khorenko wrote:

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:  0212
mnt_id: 257
lock:   (root@vz7)/:

After the patch:
===
(root@vz7)/:cat /proc/${PID_A2}/fdinfo/3
pos:4
flags:  0212
mnt_id: 295
lock:   1: FLOCK  ADVISORY  WRITE ${PID_A1} b6:f8a61:529946 0 EOF

===
# cat flock1.c

#include 
#include 
#include 
#include 
#include 
#include 
#include 

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(1);

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



These look good to me too.  It makes sense that we treat pid numbers out 
of
our namespace in the same way we'd treat remote pids, by returning 0 
instead

of skipping their display altogether.  You can add my

Reviewed-by: Benjamin Coddington 

to these two.

Ben


Re: [PATCH 0/2] fs/lock: show locks info owned by dead/invisible processes

2018-06-14 Thread Benjamin Coddington




On 8 Jun 2018, at 10:27, Konstantin Khorenko wrote:

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:  0212
mnt_id: 257
lock:   (root@vz7)/:

After the patch:
===
(root@vz7)/:cat /proc/${PID_A2}/fdinfo/3
pos:4
flags:  0212
mnt_id: 295
lock:   1: FLOCK  ADVISORY  WRITE ${PID_A1} b6:f8a61:529946 0 EOF

===
# cat flock1.c

#include 
#include 
#include 
#include 
#include 
#include 
#include 

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(1);

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



These look good to me too.  It makes sense that we treat pid numbers out 
of
our namespace in the same way we'd treat remote pids, by returning 0 
instead

of skipping their display altogether.  You can add my

Reviewed-by: Benjamin Coddington 

to these two.

Ben


Re: [PATCH 0/2] fs/lock: show locks info owned by dead/invisible processes

2018-06-14 Thread Jeff Layton
On Fri, 2018-06-08 at 17:27 +0300, Konstantin Khorenko wrote:
> 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:  0212
> mnt_id: 257
> lock:   (root@vz7)/:
> 
> After the patch:
> ===
> (root@vz7)/:cat /proc/${PID_A2}/fdinfo/3
> pos:4
> flags:  0212
> mnt_id: 295
> lock:   1: FLOCK  ADVISORY  WRITE ${PID_A1} b6:f8a61:529946 0 EOF
> 
> ===
> # cat flock1.c
> 
> #include 
> #include 
> #include 
> #include 
> #include 
> #include 
> #include 
> 
> 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(1);
> 
> 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(-)
> 

These look fine to me. I'll plan to pick them up for v4.19 unless anyone
has objections.

Thanks!
-- 
Jeff Layton 


Re: [PATCH 0/2] fs/lock: show locks info owned by dead/invisible processes

2018-06-14 Thread Jeff Layton
On Fri, 2018-06-08 at 17:27 +0300, Konstantin Khorenko wrote:
> 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:  0212
> mnt_id: 257
> lock:   (root@vz7)/:
> 
> After the patch:
> ===
> (root@vz7)/:cat /proc/${PID_A2}/fdinfo/3
> pos:4
> flags:  0212
> mnt_id: 295
> lock:   1: FLOCK  ADVISORY  WRITE ${PID_A1} b6:f8a61:529946 0 EOF
> 
> ===
> # cat flock1.c
> 
> #include 
> #include 
> #include 
> #include 
> #include 
> #include 
> #include 
> 
> 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(1);
> 
> 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(-)
> 

These look fine to me. I'll plan to pick them up for v4.19 unless anyone
has objections.

Thanks!
-- 
Jeff Layton 


Re: [PATCH 0/2] fs/lock: show locks info owned by dead/invisible processes

2018-06-08 Thread Cyrill Gorcunov
On Fri, Jun 08, 2018 at 05:27:10PM +0300, Konstantin Khorenko wrote:
> 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.

Indeed, it should cause problems with procfs parsing. We should add a test
for such scenarions, and since we're running tests by linux-next all the time
we would have this issue catched already.

The series looks ok to me, but I'm not flock expert so better wait for more
trustworthy opinion.

> 
> 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.


Re: [PATCH 0/2] fs/lock: show locks info owned by dead/invisible processes

2018-06-08 Thread Cyrill Gorcunov
On Fri, Jun 08, 2018 at 05:27:10PM +0300, Konstantin Khorenko wrote:
> 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.

Indeed, it should cause problems with procfs parsing. We should add a test
for such scenarions, and since we're running tests by linux-next all the time
we would have this issue catched already.

The series looks ok to me, but I'm not flock expert so better wait for more
trustworthy opinion.

> 
> 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.


[PATCH 0/2] fs/lock: show locks info owned by dead/invisible processes

2018-06-08 Thread Konstantin Khorenko
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:  0212
mnt_id: 257
lock:   (root@vz7)/:

After the patch:
===
(root@vz7)/:cat /proc/${PID_A2}/fdinfo/3
pos:4
flags:  0212
mnt_id: 295
lock:   1: FLOCK  ADVISORY  WRITE ${PID_A1} b6:f8a61:529946 0 EOF

===
# cat flock1.c

#include 
#include 
#include 
#include 
#include 
#include 
#include 

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(1);

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



[PATCH 0/2] fs/lock: show locks info owned by dead/invisible processes

2018-06-08 Thread Konstantin Khorenko
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:  0212
mnt_id: 257
lock:   (root@vz7)/:

After the patch:
===
(root@vz7)/:cat /proc/${PID_A2}/fdinfo/3
pos:4
flags:  0212
mnt_id: 295
lock:   1: FLOCK  ADVISORY  WRITE ${PID_A1} b6:f8a61:529946 0 EOF

===
# cat flock1.c

#include 
#include 
#include 
#include 
#include 
#include 
#include 

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(1);

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