This is a note to let you know that I've just added the patch titled

    Subject: sysfs: Introduce sysfs_sd_setattr and fix sysfs_chmod

to my gregkh-2.6 tree.  Its filename is

    sysfs-introduce-sysfs_sd_setattr-and-fix-sysfs_chmod.patch

This tree can be found at 
    http://www.kernel.org/pub/linux/kernel/people/gregkh/gregkh-2.6/patches/


>From [EMAIL PROTECTED] Thu Jul  3 18:21:56 2008
From: Eric W. Biederman <[EMAIL PROTECTED]>
Date: Thu, 03 Jul 2008 18:11:40 -0700
Subject: sysfs: Introduce sysfs_sd_setattr and fix sysfs_chmod
To: Greg Kroah-Hartman <[EMAIL PROTECTED]>, Andrew Morton <[EMAIL PROTECTED]>
Cc: Tejun Heo <[EMAIL PROTECTED]>, Daniel Lezcano <[EMAIL PROTECTED]>, [EMAIL 
PROTECTED], Al Viro <[EMAIL PROTECTED]>, Linux Containers <[EMAIL PROTECTED]>, 
Benjamin Thery <[EMAIL PROTECTED]>, <[EMAIL PROTECTED]>
Message-ID: <[EMAIL PROTECTED]>

From: Eric W. Biederman <[EMAIL PROTECTED]>


Currently sysfs_chmod calls sys_setattr which in turn calls
inode_change_ok which checks to see if it is ok for the current user
space process to change tha attributes. Since sysfs_chmod_file has
only kernel mode clients denying them permission if user space is the
problem is completely inappropriate.

Therefore factor out sysfs_sd_setattr which does not call
inode_change_ok and modify sysfs_chmod_file to call it.

In addition setting victim_sd->s_mode explicitly in sysfs_chmod_file
is redundant so remove that as well.

Thanks to Tejun Heo <[EMAIL PROTECTED]>, and
Daniel Lezcano <[EMAIL PROTECTED]> for working on this
and spotting this case.

Signed-off-by: Eric W. Biederman <[EMAIL PROTECTED]>
Acked-by: Tejun Heo <[EMAIL PROTECTED]>
Signed-off-by: Greg Kroah-Hartman <[EMAIL PROTECTED]>

---
 fs/sysfs/file.c  |    5 +----
 fs/sysfs/inode.c |   23 ++++++++++++++++-------
 fs/sysfs/sysfs.h |    1 +
 3 files changed, 18 insertions(+), 11 deletions(-)

--- a/fs/sysfs/file.c
+++ b/fs/sysfs/file.c
@@ -604,13 +604,10 @@ int sysfs_chmod_file(struct kobject *kob
        newattrs.ia_mode = (mode & S_IALLUGO) | (inode->i_mode & ~S_IALLUGO);
        newattrs.ia_valid = ATTR_MODE | ATTR_CTIME;
        newattrs.ia_ctime = current_fs_time(inode->i_sb);
-       rc = sysfs_setattr(victim, &newattrs);
+       rc = sysfs_sd_setattr(victim_sd, inode, &newattrs);
 
        if (rc == 0) {
                fsnotify_change(victim, newattrs.ia_valid);
-               mutex_lock(&sysfs_mutex);
-               victim_sd->s_mode = newattrs.ia_mode;
-               mutex_unlock(&sysfs_mutex);
        }
 
        mutex_unlock(&inode->i_mutex);
--- a/fs/sysfs/inode.c
+++ b/fs/sysfs/inode.c
@@ -42,10 +42,9 @@ int __init sysfs_inode_init(void)
        return bdi_init(&sysfs_backing_dev_info);
 }
 
-int sysfs_setattr(struct dentry * dentry, struct iattr * iattr)
+int sysfs_sd_setattr(struct sysfs_dirent *sd, struct inode *inode,
+                       struct iattr * iattr)
 {
-       struct inode * inode = dentry->d_inode;
-       struct sysfs_dirent * sd = dentry->d_fsdata;
        struct iattr * sd_iattr;
        unsigned int ia_valid = iattr->ia_valid;
        int error;
@@ -55,10 +54,6 @@ int sysfs_setattr(struct dentry * dentry
 
        sd_iattr = sd->s_iattr;
 
-       error = inode_change_ok(inode, iattr);
-       if (error)
-               return error;
-
        iattr->ia_valid &= ~ATTR_SIZE; /* ignore size changes */
 
        error = inode_setattr(inode, iattr);
@@ -104,6 +99,20 @@ int sysfs_setattr(struct dentry * dentry
        return error;
 }
 
+int sysfs_setattr(struct dentry *dentry, struct iattr *iattr)
+{
+       struct inode * inode = dentry->d_inode;
+       struct sysfs_dirent * sd = dentry->d_fsdata;
+       int error;
+
+       error = inode_change_ok(inode, iattr);
+       if (error)
+               return error;
+
+       return sysfs_sd_setattr(sd, inode, iattr);
+}
+
+
 static inline void set_default_inode_attr(struct inode * inode, mode_t mode)
 {
        inode->i_mode = mode;
--- a/fs/sysfs/sysfs.h
+++ b/fs/sysfs/sysfs.h
@@ -156,6 +156,7 @@ static inline void __sysfs_put(struct sy
  * inode.c
  */
 struct inode *sysfs_get_inode(struct sysfs_dirent *sd);
+int sysfs_sd_setattr(struct sysfs_dirent *sd, struct inode *inode, struct 
iattr *iattr);
 int sysfs_setattr(struct dentry *dentry, struct iattr *iattr);
 int sysfs_hash_and_remove(struct sysfs_dirent *dir_sd, const char *name);
 int sysfs_inode_init(void);


Patches currently in gregkh-2.6 which might be from [EMAIL PROTECTED] are

driver-core/kobject-fix-kobject_rename-and-config_sysfs.patch
driver-core/kobject-cleanup-kobject_rename-and-config_sysfs.patch
driver-core/sysfs-implement-__sysfs_get_dentry.patch
driver-core/sysfs-introduce-sysfs_sd_setattr-and-fix-sysfs_chmod.patch
driver-core/sysfs-sysfs_get_dentry-add-a-sb-parameter.patch
driver-core/sysfs-rename-support-multiple-superblocks.patch
driver-core/sysfs-support-for-preventing-unmounts.patch
driver-core/sysfs-sysfs_chmod_file-handle-multiple-superblocks.patch
_______________________________________________
Containers mailing list
[EMAIL PROTECTED]
https://lists.linux-foundation.org/mailman/listinfo/containers

_______________________________________________
Devel mailing list
Devel@openvz.org
https://openvz.org/mailman/listinfo/devel

Reply via email to