Merge tag 'scsi-misc' of git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi
[linux-2.6-block.git] / fs / sysfs / file.c
index 118fa197a35fff97f93dd365ca764695624efa49..0a7252aecfa534fea4bcb9a570dc4db2b134b44f 100644 (file)
@@ -245,7 +245,7 @@ static const struct kernfs_ops sysfs_bin_kfops_mmap = {
 
 int sysfs_add_file_mode_ns(struct kernfs_node *parent,
                           const struct attribute *attr, bool is_bin,
-                          umode_t mode, const void *ns)
+                          umode_t mode, kuid_t uid, kgid_t gid, const void *ns)
 {
        struct lock_class_key *key = NULL;
        const struct kernfs_ops *ops;
@@ -302,8 +302,9 @@ int sysfs_add_file_mode_ns(struct kernfs_node *parent,
        if (!attr->ignore_lockdep)
                key = attr->key ?: (struct lock_class_key *)&attr->skey;
 #endif
-       kn = __kernfs_create_file(parent, attr->name, mode & 0777, size, ops,
-                                 (void *)attr, ns, key);
+
+       kn = __kernfs_create_file(parent, attr->name, mode & 0777, uid, gid,
+                                 size, ops, (void *)attr, ns, key);
        if (IS_ERR(kn)) {
                if (PTR_ERR(kn) == -EEXIST)
                        sysfs_warn_dup(parent, attr->name);
@@ -312,12 +313,6 @@ int sysfs_add_file_mode_ns(struct kernfs_node *parent,
        return 0;
 }
 
-int sysfs_add_file(struct kernfs_node *parent, const struct attribute *attr,
-                  bool is_bin)
-{
-       return sysfs_add_file_mode_ns(parent, attr, is_bin, attr->mode, NULL);
-}
-
 /**
  * sysfs_create_file_ns - create an attribute file for an object with custom ns
  * @kobj: object we're creating for
@@ -327,9 +322,14 @@ int sysfs_add_file(struct kernfs_node *parent, const struct attribute *attr,
 int sysfs_create_file_ns(struct kobject *kobj, const struct attribute *attr,
                         const void *ns)
 {
+       kuid_t uid;
+       kgid_t gid;
+
        BUG_ON(!kobj || !kobj->sd || !attr);
 
-       return sysfs_add_file_mode_ns(kobj->sd, attr, false, attr->mode, ns);
+       kobject_get_ownership(kobj, &uid, &gid);
+       return sysfs_add_file_mode_ns(kobj->sd, attr, false, attr->mode,
+                                     uid, gid, ns);
 
 }
 EXPORT_SYMBOL_GPL(sysfs_create_file_ns);
@@ -358,6 +358,8 @@ int sysfs_add_file_to_group(struct kobject *kobj,
                const struct attribute *attr, const char *group)
 {
        struct kernfs_node *parent;
+       kuid_t uid;
+       kgid_t gid;
        int error;
 
        if (group) {
@@ -370,7 +372,9 @@ int sysfs_add_file_to_group(struct kobject *kobj,
        if (!parent)
                return -ENOENT;
 
-       error = sysfs_add_file(parent, attr, false);
+       kobject_get_ownership(kobj, &uid, &gid);
+       error = sysfs_add_file_mode_ns(parent, attr, false,
+                                      attr->mode, uid, gid, NULL);
        kernfs_put(parent);
 
        return error;
@@ -530,9 +534,14 @@ EXPORT_SYMBOL_GPL(sysfs_remove_file_from_group);
 int sysfs_create_bin_file(struct kobject *kobj,
                          const struct bin_attribute *attr)
 {
+       kuid_t uid;
+       kgid_t gid;
+
        BUG_ON(!kobj || !kobj->sd || !attr);
 
-       return sysfs_add_file(kobj->sd, &attr->attr, true);
+       kobject_get_ownership(kobj, &uid, &gid);
+       return sysfs_add_file_mode_ns(kobj->sd, &attr->attr, true,
+                                     attr->attr.mode, uid, gid, NULL);
 }
 EXPORT_SYMBOL_GPL(sysfs_create_bin_file);