Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752239Ab0HTBxv (ORCPT ); Thu, 19 Aug 2010 21:53:51 -0400 Received: from e23smtp01.au.ibm.com ([202.81.31.143]:43420 "EHLO e23smtp01.au.ibm.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752037Ab0HTBwN (ORCPT ); Thu, 19 Aug 2010 21:52:13 -0400 From: "Aneesh Kumar K.V" To: hch@infradead.org, viro@zeniv.linux.org.uk, adilger@sun.com, corbet@lwn.net, neilb@suse.de, npiggin@suse.de, hooanon05@yahoo.co.jp, bfields@fieldses.org, miklos@szeredi.hu Cc: linux-fsdevel@vger.kernel.org, sfrench@us.ibm.com, philippe.deniel@CEA.FR, linux-kernel@vger.kernel.org, "Aneesh Kumar K.V" Subject: [PATCH -V18 06/13] vfs: Support null pathname in faccessat Date: Fri, 20 Aug 2010 07:21:30 +0530 Message-Id: <1282269097-26166-7-git-send-email-aneesh.kumar@linux.vnet.ibm.com> X-Mailer: git-send-email 1.7.0.4 In-Reply-To: <1282269097-26166-1-git-send-email-aneesh.kumar@linux.vnet.ibm.com> References: <1282269097-26166-1-git-send-email-aneesh.kumar@linux.vnet.ibm.com> Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 2435 Lines: 85 This enables to use faccessat to get the access check details from a file descriptor pointing to the file. This can be used with open_by_handle syscall that returns a file descriptor. Signed-off-by: Aneesh Kumar K.V --- fs/open.c | 29 +++++++++++++++++++++-------- 1 files changed, 21 insertions(+), 8 deletions(-) diff --git a/fs/open.c b/fs/open.c index 7abdcba..f907b50 100644 --- a/fs/open.c +++ b/fs/open.c @@ -288,9 +288,10 @@ SYSCALL_DEFINE3(faccessat, int, dfd, const char __user *, filename, int, mode) { const struct cred *old_cred; struct cred *override_cred; - struct path path; + struct file *file = NULL; + struct path path, *pp; struct inode *inode; - int res; + int res, fput_needed; if (mode & ~S_IRWXO) /* where's F_OK, X_OK, W_OK, R_OK? */ return -EINVAL; @@ -312,12 +313,21 @@ SYSCALL_DEFINE3(faccessat, int, dfd, const char __user *, filename, int, mode) } old_cred = override_creds(override_cred); - - res = user_path_at(dfd, filename, LOOKUP_FOLLOW, &path); + if (filename == NULL && dfd != AT_FDCWD) { + file = fget_light(dfd, &fput_needed); + if (file) { + pp = &file->f_path; + res = 0; + } else + res = -EBADF; + } else { + res = user_path_at(dfd, filename, LOOKUP_FOLLOW, &path); + pp = &path; + } if (res) goto out; - inode = path.dentry->d_inode; + inode = pp->dentry->d_inode; if ((mode & MAY_EXEC) && S_ISREG(inode->i_mode)) { /* @@ -325,7 +335,7 @@ SYSCALL_DEFINE3(faccessat, int, dfd, const char __user *, filename, int, mode) * with the "noexec" flag. */ res = -EACCES; - if (path.mnt->mnt_flags & MNT_NOEXEC) + if (pp->mnt->mnt_flags & MNT_NOEXEC) goto out_path_release; } @@ -343,11 +353,14 @@ SYSCALL_DEFINE3(faccessat, int, dfd, const char __user *, filename, int, mode) * inherently racy and know that the fs may change * state before we even see this result. */ - if (__mnt_is_readonly(path.mnt)) + if (__mnt_is_readonly(pp->mnt)) res = -EROFS; out_path_release: - path_put(&path); + if (file) + fput_light(file, fput_needed); + else + path_put(&path); out: revert_creds(old_cred); put_cred(override_cred); -- 1.7.0.4 -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/