From mboxrd@z Thu Jan 1 00:00:00 1970 From: "Eric W. Biederman" Subject: [PATCH 17/23] proc: Teach /proc//fd to use file_hotplug_lock Date: Mon, 1 Jun 2009 14:50:42 -0700 Message-ID: <1243893048-17031-17-git-send-email-ebiederm@xmission.com> References: Cc: , , , , Hugh Dickins , Tejun Heo , Alexey Dobriyan , Linus Torvalds , Alan Cox , Greg Kroah-Hartman , Nick Piggin , Andrew Morton , Christoph Hellwig , "Eric W. Biederman" , "Eric W. Biederman" To: Al Viro Return-path: Received: from out02.mta.xmission.com ([166.70.13.232]:35900 "EHLO out02.mta.xmission.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754873AbZFAVvA (ORCPT ); Mon, 1 Jun 2009 17:51:00 -0400 In-Reply-To: Sender: linux-fsdevel-owner@vger.kernel.org List-ID: From: Eric W. Biederman I have taken the opportunity to modify proc_fd_info to have a single exit point. Signed-off-by: Eric W. Biederman --- fs/proc/base.c | 29 ++++++++++++++++------------- 1 files changed, 16 insertions(+), 13 deletions(-) diff --git a/fs/proc/base.c b/fs/proc/base.c index fb45615..ee4cdc2 100644 --- a/fs/proc/base.c +++ b/fs/proc/base.c @@ -1626,6 +1626,7 @@ static int proc_fd_info(struct inode *inode, struct path *path, char *info) struct files_struct *files = NULL; struct file *file; int fd = proc_fd(inode); + int retval = -ENOENT; if (task) { files = get_files_struct(task); @@ -1639,24 +1640,26 @@ static int proc_fd_info(struct inode *inode, struct path *path, char *info) spin_lock(&files->file_lock); file = fcheck_files(files, fd); if (file) { - if (path) { - *path = file->f_path; - path_get(&file->f_path); + retval = -EIO; + if (file_hotplug_read_trylock(file)) { + retval = 0; + if (path) { + *path = file->f_path; + path_get(&file->f_path); + } + if (info) + snprintf(info, PROC_FDINFO_MAX, + "pos:\t%lli\n" + "flags:\t0%o\n", + (long long) file->f_pos, + file->f_flags); + file_hotplug_read_unlock(file); } - if (info) - snprintf(info, PROC_FDINFO_MAX, - "pos:\t%lli\n" - "flags:\t0%o\n", - (long long) file->f_pos, - file->f_flags); - spin_unlock(&files->file_lock); - put_files_struct(files); - return 0; } spin_unlock(&files->file_lock); put_files_struct(files); } - return -ENOENT; + return retval; } static int proc_fd_link(struct inode *inode, struct path *path) -- 1.6.3.1.54.g99dd.dirty