From patchwork Mon Feb 1 05:34:44 2010 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Aneesh Kumar K.V" X-Patchwork-Id: 44133 Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id CB1DCB7DA2 for ; Mon, 1 Feb 2010 16:35:31 +1100 (EST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752419Ab0BAFfY (ORCPT ); Mon, 1 Feb 2010 00:35:24 -0500 Received: from e28smtp07.in.ibm.com ([122.248.162.7]:56038 "EHLO e28smtp07.in.ibm.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751054Ab0BAFfW (ORCPT ); Mon, 1 Feb 2010 00:35:22 -0500 Received: from d28relay05.in.ibm.com (d28relay05.in.ibm.com [9.184.220.62]) by e28smtp07.in.ibm.com (8.14.3/8.13.1) with ESMTP id o115ZIVh005217; Mon, 1 Feb 2010 11:05:18 +0530 Received: from d28av05.in.ibm.com (d28av05.in.ibm.com [9.184.220.67]) by d28relay05.in.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id o115ZItH2629832; Mon, 1 Feb 2010 11:05:18 +0530 Received: from d28av05.in.ibm.com (loopback [127.0.0.1]) by d28av05.in.ibm.com (8.14.3/8.13.1/NCO v10.0 AVout) with ESMTP id o115ZGPG031617; Mon, 1 Feb 2010 16:35:18 +1100 Received: from localhost.localdomain (K50wks273947wss.in.ibm.com [9.124.35.109]) by d28av05.in.ibm.com (8.14.3/8.13.1/NCO v10.0 AVin) with ESMTP id o115ZGmU031606; Mon, 1 Feb 2010 16:35:16 +1100 From: "Aneesh Kumar K.V" To: sfrench@us.ibm.com, ffilz@us.ibm.com, agruen@suse.de, adilger@sun.com, sandeen@redhat.com, tytso@mit.edu, staubach@redhat.com, bfields@citi.umich.edu, jlayton@redhat.com Cc: aneesh.kumar@linux.vnet.ibm.com, linux-fsdevel@vger.kernel.org, nfsv4@linux-nfs.org, linux-ext4@vger.kernel.org Subject: [PATCH 02/23] vfs: Check for create permission during rename Date: Mon, 1 Feb 2010 11:04:44 +0530 Message-Id: <1265002505-8387-3-git-send-email-aneesh.kumar@linux.vnet.ibm.com> X-Mailer: git-send-email 1.7.0.rc0.48.gdace5 In-Reply-To: <1265002505-8387-1-git-send-email-aneesh.kumar@linux.vnet.ibm.com> References: <1265002505-8387-1-git-send-email-aneesh.kumar@linux.vnet.ibm.com> Sender: linux-ext4-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-ext4@vger.kernel.org If the new dentry is already present we were just checking for the delete permission. We also need to check after deletion whether we are allowed to create new name. This is needed in case of a acl model that differentiate between delete and create permission like NFSv4acl Signed-off-by: Aneesh Kumar K.V --- fs/namei.c | 18 ++++++++++++++---- 1 files changed, 14 insertions(+), 4 deletions(-) diff --git a/fs/namei.c b/fs/namei.c index 3e842ac..2a1a1d6 100644 --- a/fs/namei.c +++ b/fs/namei.c @@ -1380,12 +1380,11 @@ static int may_delete(struct inode *dir,struct dentry *victim,int isdir) * 3. We should have write and exec permissions on dir * 4. We can't do it if dir is immutable (done in permission()) */ -static inline int may_create(struct inode *dir, struct dentry *child, int isdir) +static inline int _do_may_create(struct inode *dir, + struct dentry *child, int isdir) { int error; - if (child->d_inode) - return -EEXIST; if (IS_DEADDIR(dir)) return -ENOENT; if (dir->i_op->may_create) { @@ -1403,6 +1402,13 @@ static inline int may_create(struct inode *dir, struct dentry *child, int isdir) return error; } +static inline int may_create(struct inode *dir, struct dentry *child, int isdir) +{ + if (child->d_inode) + return -EEXIST; + return _do_may_create(dir, child, isdir); +} + /* * O_DIRECTORY translates into forcing a directory lookup. */ @@ -2673,8 +2679,12 @@ int vfs_rename(struct inode *old_dir, struct dentry *old_dentry, if (!new_dentry->d_inode) error = may_create(new_dir, new_dentry, is_dir); - else + else { error = may_delete(new_dir, new_dentry, is_dir); + if (error) + return error; + error = _do_may_create(new_dir, new_dentry, is_dir); + } if (error) return error;