All of lore.kernel.org
 help / color / mirror / Atom feed
From: "J. Bruce Fields" <bfields@fieldses.org>
To: Andrey Vagin <avagin@openvz.org>
Cc: linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org,
	linux-doc@vger.kernel.org, Jonathan Corbet <corbet@lwn.net>,
	Alexander Viro <viro@zeniv.linux.org.uk>,
	Jeff Layton <jlayton@poochiereds.net>,
	Andrew Morton <akpm@linux-foundation.org>,
	Cyrill Gorcunov <gorcunov@openvz.org>,
	Pavel Emelyanov <xemul@parallels.com>
Subject: Re: [PATCH] proc: show locks in /proc/pid/fdinfo/X
Date: Fri, 6 Mar 2015 09:41:00 -0500	[thread overview]
Message-ID: <20150306144100.GA24137@fieldses.org> (raw)
In-Reply-To: <1425569838-20416-1-git-send-email-avagin@openvz.org>

On Thu, Mar 05, 2015 at 06:37:18PM +0300, Andrey Vagin wrote:
> Let's show locks which are associated with a file descriptor in
> its fdinfo file.
> 
> Currently we don't have a reliable way to determine who holds a lock.
> We can find some information in /proc/locks, but PID which is reported
> there can be wrong. For example, a process takes a lock, then forks a
> child and dies. In this case /proc/locks contains the parent pid, which
> can be reused by another process.
> 
> $ cat /proc/locks
> ...
> 6: FLOCK  ADVISORY  WRITE 324 00:13:13431 0 EOF
> ...
> 
> $ ps -C rpcbind
>   PID TTY          TIME CMD
>   332 ?        00:00:00 rpcbind
> 
> $ cat /proc/332/fdinfo/4
> pos:	0
> flags:	0100000
> mnt_id:	22
> lock:	1: FLOCK  ADVISORY  WRITE 324 00:13:13431 0 EOF

The major:minor part is redundant as long as you have the mnt_id, right?

But I think it makes sense to leave it as you have it, with the same
format as /proc/locks.  We get to share the kernel code, maybe userland
gets to reuse a little code too.

And we should really remove that "ifdef WE_CAN_BREAK_LSLK_NOW" from
fs/locks.c, clearly that's not going to happen.  (And add a comment that
the better solution may be to get the mntid from fdinfo, if that's
true?)

Anyway, that's a digression, ACK to the patch.

--b.

> 
> $ ls -l /proc/332/fd/4
> lr-x------ 1 root root 64 Mar  5 14:43 /proc/332/fd/4 -> /run/rpcbind.lock
> 
> $ ls -l /proc/324/fd/
> total 0
> lrwx------ 1 root root 64 Feb 27 14:50 0 -> /dev/pts/0
> lrwx------ 1 root root 64 Feb 27 14:50 1 -> /dev/pts/0
> lrwx------ 1 root root 64 Feb 27 14:49 2 -> /dev/pts/0
> 
> You can see that the process with the 324 pid doesn't hold the lock.
> 
> This information is required for proper dumping and restoring file
> locks.
> 
> Cc: Jonathan Corbet <corbet@lwn.net>
> Cc: Alexander Viro <viro@zeniv.linux.org.uk>
> Cc: Jeff Layton <jlayton@poochiereds.net>
> Cc: "J. Bruce Fields" <bfields@fieldses.org>
> Cc: Andrew Morton <akpm@linux-foundation.org>
> Cc: Cyrill Gorcunov <gorcunov@openvz.org>
> Cc: Pavel Emelyanov <xemul@parallels.com>
> Signed-off-by: Andrey Vagin <avagin@openvz.org>
> ---
>  Documentation/filesystems/proc.txt |  4 ++++
>  fs/locks.c                         | 38 ++++++++++++++++++++++++++++++++++++++
>  fs/proc/fd.c                       | 27 ++++++++++++++++++---------
>  include/linux/fs.h                 |  7 +++++++
>  4 files changed, 67 insertions(+), 9 deletions(-)
> 
> diff --git a/Documentation/filesystems/proc.txt b/Documentation/filesystems/proc.txt
> index a07ba61..6331623 100644
> --- a/Documentation/filesystems/proc.txt
> +++ b/Documentation/filesystems/proc.txt
> @@ -1704,6 +1704,10 @@ A typical output is
>  	flags:	0100002
>  	mnt_id:	19
>  
> +All locks associated with a file descriptor are shown in its fdinfo too.
> +
> +lock:       1: FLOCK  ADVISORY  WRITE 359 00:13:11691 0 EOF
> +
>  The files such as eventfd, fsnotify, signalfd, epoll among the regular pos/flags
>  pair provide additional information particular to the objects they represent.
>  
> diff --git a/fs/locks.c b/fs/locks.c
> index 365c82e..815f832 100644
> --- a/fs/locks.c
> +++ b/fs/locks.c
> @@ -2592,6 +2592,44 @@ static int locks_show(struct seq_file *f, void *v)
>  	return 0;
>  }
>  
> +static void __show_fd_locks(struct seq_file *f,
> +			struct list_head *head, int *id,
> +			struct file *filp, struct files_struct *files)
> +{
> +	struct file_lock *fl;
> +
> +	list_for_each_entry(fl, head, fl_list) {
> +
> +		if (filp != fl->fl_file)
> +			continue;
> +		if (fl->fl_owner != files &&
> +		    fl->fl_owner != filp)
> +			continue;
> +
> +		(*id)++;
> +		seq_puts(f, "lock:\t");
> +		lock_get_status(f, fl, *id, "");
> +	}
> +}
> +
> +void show_fd_locks(struct seq_file *f,
> +		  struct file *filp, struct files_struct *files)
> +{
> +	struct inode *inode = file_inode(filp);
> +	struct file_lock_context *ctx;
> +	int id = 0;
> +
> +	ctx = inode->i_flctx;
> +	if (!ctx)
> +		return;
> +
> +	spin_lock(&ctx->flc_lock);
> +	__show_fd_locks(f, &ctx->flc_flock, &id, filp, files);
> +	__show_fd_locks(f, &ctx->flc_posix, &id, filp, files);
> +	__show_fd_locks(f, &ctx->flc_lease, &id, filp, files);
> +	spin_unlock(&ctx->flc_lock);
> +}
> +
>  static void *locks_start(struct seq_file *f, loff_t *pos)
>  	__acquires(&blocked_lock_lock)
>  {
> diff --git a/fs/proc/fd.c b/fs/proc/fd.c
> index 8e5ad83..f04e13d 100644
> --- a/fs/proc/fd.c
> +++ b/fs/proc/fd.c
> @@ -8,6 +8,7 @@
>  #include <linux/security.h>
>  #include <linux/file.h>
>  #include <linux/seq_file.h>
> +#include <linux/fs.h>
>  
>  #include <linux/proc_fs.h>
>  
> @@ -48,16 +49,24 @@ static int seq_show(struct seq_file *m, void *v)
>  		put_files_struct(files);
>  	}
>  
> -	if (!ret) {
> -		seq_printf(m, "pos:\t%lli\nflags:\t0%o\nmnt_id:\t%i\n",
> -			   (long long)file->f_pos, f_flags,
> -			   real_mount(file->f_path.mnt)->mnt_id);
> -		if (file->f_op->show_fdinfo)
> -			file->f_op->show_fdinfo(m, file);
> -		ret = seq_has_overflowed(m);
> -		fput(file);
> -	}
> +	if (ret)
> +		return ret;
> +
> +	seq_printf(m, "pos:\t%lli\nflags:\t0%o\nmnt_id:\t%i\n",
> +		   (long long)file->f_pos, f_flags,
> +		   real_mount(file->f_path.mnt)->mnt_id);
> +
> +	show_fd_locks(m, file, files);
> +	ret = seq_has_overflowed(m);
> +	if (ret)
> +		goto out;
> +
> +	if (file->f_op->show_fdinfo)
> +		file->f_op->show_fdinfo(m, file);
> +	ret = seq_has_overflowed(m);
>  
> +out:
> +	fput(file);
>  	return ret;
>  }
>  
> diff --git a/include/linux/fs.h b/include/linux/fs.h
> index b4d71b5..ba0bd2a 100644
> --- a/include/linux/fs.h
> +++ b/include/linux/fs.h
> @@ -1018,6 +1018,9 @@ extern void lease_get_mtime(struct inode *, struct timespec *time);
>  extern int generic_setlease(struct file *, long, struct file_lock **, void **priv);
>  extern int vfs_setlease(struct file *, long, struct file_lock **, void **);
>  extern int lease_modify(struct file_lock *, int, struct list_head *);
> +struct files_struct;
> +extern void show_fd_locks(struct seq_file *f,
> +			 struct file *filp, struct files_struct *files);
>  #else /* !CONFIG_FILE_LOCKING */
>  static inline int fcntl_getlk(struct file *file, unsigned int cmd,
>  			      struct flock __user *user)
> @@ -1154,6 +1157,10 @@ static inline int lease_modify(struct file_lock *fl, int arg,
>  {
>  	return -EINVAL;
>  }
> +
> +struct files_struct;
> +static inline void show_fd_locks(struct seq_file *f,
> +			struct file *filp, struct files_struct *files) {}
>  #endif /* !CONFIG_FILE_LOCKING */
>  
>  
> -- 
> 2.1.0

  parent reply	other threads:[~2015-03-06 14:41 UTC|newest]

Thread overview: 14+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-03-05 15:37 [PATCH] proc: show locks in /proc/pid/fdinfo/X Andrey Vagin
2015-03-05 19:11 ` Jeff Layton
2015-03-06 14:19   ` Andrew Vagin
2015-03-06  8:38 ` Cyrill Gorcunov
2015-03-06 14:41 ` J. Bruce Fields [this message]
2015-03-07 13:00   ` Jeff Layton
2015-03-11 22:08 ` Andrew Morton
2015-03-12 15:54   ` Andrew Vagin
2015-03-12 19:23     ` Andrew Morton
2015-03-12 21:31       ` Andrey Wagin
2015-03-12 16:30 ` [PATCH] selftest: add a test case to check how locks are shown in fdinfo Andrey Vagin
2015-03-12 20:43   ` Shuah Khan
2015-03-13  9:34     ` Andrew Vagin
2015-03-13 13:46       ` Shuah Khan

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20150306144100.GA24137@fieldses.org \
    --to=bfields@fieldses.org \
    --cc=akpm@linux-foundation.org \
    --cc=avagin@openvz.org \
    --cc=corbet@lwn.net \
    --cc=gorcunov@openvz.org \
    --cc=jlayton@poochiereds.net \
    --cc=linux-doc@vger.kernel.org \
    --cc=linux-fsdevel@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=viro@zeniv.linux.org.uk \
    --cc=xemul@parallels.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.