linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Miklos Szeredi <miklos@szeredi.hu>
To: akpm@linux-foundation.org
Cc: hch@infradead.org, viro@ZenIV.linux.org.uk,
	linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org
Subject: [patch 09/15] vfs: immutable inode checking cleanup
Date: Mon, 05 May 2008 11:54:50 +0200	[thread overview]
Message-ID: <20080505095520.685137048@szeredi.hu> (raw)
In-Reply-To: 20080505095440.820370974@szeredi.hu

[-- Attachment #1: immutable_cleanup.patch --]
[-- Type: text/plain, Size: 3912 bytes --]

From: Miklos Szeredi <mszeredi@suse.cz>

Move the immutable and append-only checks from chmod, chown and utimes
into notify_change().  Checks for immutable and append-only files are
always performed by the VFS and not by the filesystem (see
permission() and may_...() in namei.c), so these belong in
notify_change(), and not in inode_change_ok().

Signed-off-by: Miklos Szeredi <mszeredi@suse.cz>
---
 fs/attr.c   |    6 ++++++
 fs/open.c   |   24 ++----------------------
 fs/utimes.c |    4 ----
 3 files changed, 8 insertions(+), 26 deletions(-)

Index: linux-2.6/fs/open.c
===================================================================
--- linux-2.6.orig/fs/open.c	2008-05-05 11:29:20.000000000 +0200
+++ linux-2.6/fs/open.c	2008-05-05 11:29:26.000000000 +0200
@@ -582,9 +582,6 @@ asmlinkage long sys_fchmod(unsigned int 
 	err = mnt_want_write(file->f_path.mnt);
 	if (err)
 		goto out_putf;
-	err = -EPERM;
-	if (IS_IMMUTABLE(inode) || IS_APPEND(inode))
-		goto out_drop_write;
 	mutex_lock(&inode->i_mutex);
 	if (mode == (mode_t) -1)
 		mode = inode->i_mode;
@@ -592,8 +589,6 @@ asmlinkage long sys_fchmod(unsigned int 
 	newattrs.ia_valid = ATTR_MODE | ATTR_CTIME;
 	err = notify_change(dentry, &newattrs);
 	mutex_unlock(&inode->i_mutex);
-
-out_drop_write:
 	mnt_drop_write(file->f_path.mnt);
 out_putf:
 	fput(file);
@@ -617,11 +612,6 @@ asmlinkage long sys_fchmodat(int dfd, co
 	error = mnt_want_write(nd.path.mnt);
 	if (error)
 		goto dput_and_out;
-
-	error = -EPERM;
-	if (IS_IMMUTABLE(inode) || IS_APPEND(inode))
-		goto out_drop_write;
-
 	mutex_lock(&inode->i_mutex);
 	if (mode == (mode_t) -1)
 		mode = inode->i_mode;
@@ -629,8 +619,6 @@ asmlinkage long sys_fchmodat(int dfd, co
 	newattrs.ia_valid = ATTR_MODE | ATTR_CTIME;
 	error = notify_change(nd.path.dentry, &newattrs);
 	mutex_unlock(&inode->i_mutex);
-
-out_drop_write:
 	mnt_drop_write(nd.path.mnt);
 dput_and_out:
 	path_put(&nd.path);
@@ -645,18 +633,10 @@ asmlinkage long sys_chmod(const char __u
 
 static int chown_common(struct dentry * dentry, uid_t user, gid_t group)
 {
-	struct inode * inode;
+	struct inode *inode = dentry->d_inode;
 	int error;
 	struct iattr newattrs;
 
-	error = -ENOENT;
-	if (!(inode = dentry->d_inode)) {
-		printk(KERN_ERR "chown_common: NULL inode\n");
-		goto out;
-	}
-	error = -EPERM;
-	if (IS_IMMUTABLE(inode) || IS_APPEND(inode))
-		goto out;
 	newattrs.ia_valid =  ATTR_CTIME;
 	if (user != (uid_t) -1) {
 		newattrs.ia_valid |= ATTR_UID;
@@ -672,7 +652,7 @@ static int chown_common(struct dentry * 
 	mutex_lock(&inode->i_mutex);
 	error = notify_change(dentry, &newattrs);
 	mutex_unlock(&inode->i_mutex);
-out:
+
 	return error;
 }
 
Index: linux-2.6/fs/attr.c
===================================================================
--- linux-2.6.orig/fs/attr.c	2008-05-05 11:29:20.000000000 +0200
+++ linux-2.6/fs/attr.c	2008-05-05 11:29:26.000000000 +0200
@@ -108,6 +108,12 @@ int notify_change(struct dentry * dentry
 	struct timespec now;
 	unsigned int ia_valid = attr->ia_valid;
 
+	if (ia_valid & (ATTR_MODE | ATTR_UID | ATTR_GID |
+			ATTR_ATIME_SET | ATTR_MTIME_SET)) {
+		if (IS_IMMUTABLE(inode) || IS_APPEND(inode))
+			return -EPERM;
+	}
+
 	now = current_fs_time(inode->i_sb);
 
 	attr->ia_ctime = now;
Index: linux-2.6/fs/utimes.c
===================================================================
--- linux-2.6.orig/fs/utimes.c	2008-05-05 11:29:20.000000000 +0200
+++ linux-2.6/fs/utimes.c	2008-05-05 11:29:26.000000000 +0200
@@ -105,10 +105,6 @@ long do_utimes(int dfd, char __user *fil
 	/* Don't worry, the checks are done in inode_change_ok() */
 	newattrs.ia_valid = ATTR_CTIME | ATTR_MTIME | ATTR_ATIME;
 	if (times) {
-		error = -EPERM;
-                if (IS_APPEND(inode) || IS_IMMUTABLE(inode))
-			goto mnt_drop_write_and_out;
-
 		if (times[0].tv_nsec == UTIME_OMIT)
 			newattrs.ia_valid &= ~ATTR_ATIME;
 		else if (times[0].tv_nsec != UTIME_NOW) {

--

  parent reply	other threads:[~2008-05-05  9:57 UTC|newest]

Thread overview: 45+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2008-05-05  9:54 [patch 00/15] VFS fixes and cleanups Miklos Szeredi
2008-05-05  9:54 ` [patch 01/15] ecryptfs: clean up (un)lock_parent Miklos Szeredi
2008-05-05 10:59   ` Christoph Hellwig
2008-05-05  9:54 ` [patch 02/15] nfsd: clean up mnt_want_write calls Miklos Szeredi
2008-05-05 10:59   ` Christoph Hellwig
2008-05-05  9:54 ` [patch 03/15] cgroup: dont call vfs_mkdir Miklos Szeredi
2008-05-05 11:00   ` Christoph Hellwig
2008-05-05 12:32     ` Miklos Szeredi
2008-05-05 13:08       ` Christoph Hellwig
2008-05-05 13:29         ` Miklos Szeredi
2008-05-05 13:33           ` Christoph Hellwig
2008-05-05 13:43             ` Miklos Szeredi
2008-05-05 13:46               ` Christoph Hellwig
2008-05-05 13:57                 ` Miklos Szeredi
2008-05-05 17:22   ` Paul Menage
2008-05-05  9:54 ` [patch 04/15] reiserfs: dont call vfs_rmdir Miklos Szeredi
2008-05-05  9:54 ` [patch 05/15] reiserfs: dont call notify_change Miklos Szeredi
2008-05-05  9:54 ` [patch 06/15] sysfs: " Miklos Szeredi
2008-05-06  4:15   ` Greg KH
2008-05-06  6:28     ` Miklos Szeredi
2008-05-06  6:48       ` Greg KH
2008-05-05  9:54 ` [patch 07/15] hpfs: " Miklos Szeredi
2008-05-08  0:42   ` Mikulas Patocka
2008-05-05  9:54 ` [patch 08/15] fat: " Miklos Szeredi
2008-05-05 19:45   ` OGAWA Hirofumi
2008-05-06  8:49     ` Miklos Szeredi
2008-05-06  9:27       ` OGAWA Hirofumi
2008-05-05  9:54 ` Miklos Szeredi [this message]
2008-05-05 11:01   ` [patch 09/15] vfs: immutable inode checking cleanup Christoph Hellwig
2008-05-05  9:54 ` [patch 10/15] vfs: truncate: dont check immutable twice Miklos Szeredi
2008-05-05 11:04   ` Christoph Hellwig
2008-05-05  9:54 ` [patch 11/15] vfs: truncate: append-only checking cleanup Miklos Szeredi
2008-05-05 11:12   ` Christoph Hellwig
2008-05-05  9:54 ` [patch 12/15] vfs: create file_truncate() helper Miklos Szeredi
2008-05-05 11:06   ` Christoph Hellwig
2008-05-05 12:35     ` Miklos Szeredi
2008-05-05  9:54 ` [patch 13/15] vfs: utimes cleanup Miklos Szeredi
2008-05-05 11:30   ` Christoph Hellwig
2008-05-05 12:39     ` Miklos Szeredi
2008-05-05 13:04       ` Christoph Hellwig
2008-05-05  9:54 ` [patch 14/15] vfs: utimes immutable fix Miklos Szeredi
2008-05-05 11:14   ` Christoph Hellwig
2008-05-05  9:54 ` [patch 15/15] vfs: splice remove_suid() cleanup Miklos Szeredi
2008-05-05 11:11   ` Christoph Hellwig
2008-05-07  7:20   ` Jens Axboe

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=20080505095520.685137048@szeredi.hu \
    --to=miklos@szeredi.hu \
    --cc=akpm@linux-foundation.org \
    --cc=hch@infradead.org \
    --cc=linux-fsdevel@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=viro@ZenIV.linux.org.uk \
    /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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).