From: Christian Brauner <christian.brauner@ubuntu.com>
To: "David S. Miller" <davem@davemloft.net>,
Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
linux-kernel@vger.kernel.org, netdev@vger.kernel.org
Cc: "Rafael J. Wysocki" <rafael@kernel.org>,
Pavel Machek <pavel@ucw.cz>, Jakub Kicinski <kuba@kernel.org>,
Eric Dumazet <edumazet@google.com>,
Stephen Hemminger <stephen@networkplumber.org>,
linux-pm@vger.kernel.org,
Christian Brauner <christian.brauner@ubuntu.com>
Subject: [PATCH v4 1/9] sysfs: add sysfs_file_change_owner_by_name()
Date: Mon, 24 Feb 2020 18:21:02 +0100 [thread overview]
Message-ID: <20200224172110.4121492-2-christian.brauner@ubuntu.com> (raw)
In-Reply-To: <20200224172110.4121492-1-christian.brauner@ubuntu.com>
Add helpers to change the owner of a sysfs files.
This function will be used to correctly account for kobject ownership
changes, e.g. when moving network devices between network namespaces.
Signed-off-by: Christian Brauner <christian.brauner@ubuntu.com>
---
/* v2 */
- Greg Kroah-Hartman <gregkh@linuxfoundation.org>:
- Better naming for sysfs_file_change_owner() to reflect the fact that it
can be used to change the owner of the kobject itself by passing NULL as
argument.
- Christian Brauner <christian.brauner@ubuntu.com>:
- Split sysfs_file_change_owner() into two helpers sysfs_change_owner() and
sysfs_change_owner_by_name(). The former changes the owner of the kobject
itself, the latter the owner of the kobject looked up via the name
argument.
/* v3 */
- Greg Kroah-Hartman <gregkh@linuxfoundation.org>:
- Add explicit uid/gid parameters.
/* v4 */
- Greg Kroah-Hartman <gregkh@linuxfoundation.org>:
- Remove the second helper which changes the ownership of the kobject itself
and do it in-place instead later on in the series. A separate helper is
not needed for that.
- Christian Brauner <christian.brauner@ubuntu.com>:
- Add more documentation.
---
fs/sysfs/file.c | 47 +++++++++++++++++++++++++++++++++++++++++++
include/linux/sysfs.h | 10 +++++++++
2 files changed, 57 insertions(+)
diff --git a/fs/sysfs/file.c b/fs/sysfs/file.c
index 130fc6fbcc03..4ca936ca3ba4 100644
--- a/fs/sysfs/file.c
+++ b/fs/sysfs/file.c
@@ -558,3 +558,50 @@ void sysfs_remove_bin_file(struct kobject *kobj,
kernfs_remove_by_name(kobj->sd, attr->attr.name);
}
EXPORT_SYMBOL_GPL(sysfs_remove_bin_file);
+
+static int internal_change_owner(struct kernfs_node *kn, kuid_t kuid,
+ kgid_t kgid)
+{
+ struct iattr newattrs = {
+ .ia_valid = ATTR_UID | ATTR_GID,
+ .ia_uid = kuid,
+ .ia_gid = kgid,
+ };
+ return kernfs_setattr(kn, &newattrs);
+}
+
+/**
+ * sysfs_file_change_owner - change owner of a sysfs file.
+ * @kobj: object.
+ * @name: name of the file to change.
+ * @kuid: new owner's kuid
+ * @kgid: new owner's kgid
+ *
+ * This function looks up the sysfs entry @name under @kobj and changes the
+ * ownership to @kuid/@kgid.
+ *
+ * Returns 0 on success or error code on failure.
+ */
+int sysfs_file_change_owner(struct kobject *kobj, const char *name, kuid_t kuid,
+ kgid_t kgid)
+{
+ struct kernfs_node *kn;
+ int error;
+
+ if (!name)
+ return -EINVAL;
+
+ if (!kobj->state_in_sysfs)
+ return -EINVAL;
+
+ kn = kernfs_find_and_get(kobj->sd, name);
+ if (!kn)
+ return -ENOENT;
+
+ error = internal_change_owner(kn, kuid, kgid);
+
+ kernfs_put(kn);
+
+ return error;
+}
+EXPORT_SYMBOL_GPL(sysfs_file_change_owner);
diff --git a/include/linux/sysfs.h b/include/linux/sysfs.h
index fa7ee503fb76..a7884024a911 100644
--- a/include/linux/sysfs.h
+++ b/include/linux/sysfs.h
@@ -310,6 +310,9 @@ static inline void sysfs_enable_ns(struct kernfs_node *kn)
return kernfs_enable_ns(kn);
}
+int sysfs_file_change_owner(struct kobject *kobj, const char *name, kuid_t kuid,
+ kgid_t kgid);
+
#else /* CONFIG_SYSFS */
static inline int sysfs_create_dir_ns(struct kobject *kobj, const void *ns)
@@ -522,6 +525,13 @@ static inline void sysfs_enable_ns(struct kernfs_node *kn)
{
}
+static inline int sysfs_file_change_owner(struct kobject *kobj,
+ const char *name, kuid_t kuid,
+ kgid_t kgid)
+{
+ return 0;
+}
+
#endif /* CONFIG_SYSFS */
static inline int __must_check sysfs_create_file(struct kobject *kobj,
--
2.25.1
next prev parent reply other threads:[~2020-02-24 17:22 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-02-24 17:21 [PATCH v4 0/9] net: fix sysfs permssions when device changes network Christian Brauner
2020-02-24 17:21 ` Christian Brauner [this message]
2020-02-24 17:21 ` [PATCH v4 2/9] sysfs: add sysfs_link_change_owner() Christian Brauner
2020-02-24 17:21 ` [PATCH v4 3/9] sysfs: add sysfs_group{s}_change_owner() Christian Brauner
2020-02-24 17:21 ` [PATCH v4 4/9] sysfs: add sysfs_change_owner() Christian Brauner
2020-02-24 17:21 ` [PATCH v4 5/9] device: add device_change_owner() Christian Brauner
2020-02-24 17:21 ` [PATCH v4 6/9] drivers/base/power: add dpm_sysfs_change_owner() Christian Brauner
2020-02-24 17:56 ` Rafael J. Wysocki
2020-02-24 18:00 ` Christian Brauner
2020-02-24 17:21 ` [PATCH v4 7/9] net-sysfs: add netdev_change_owner() Christian Brauner
2020-02-24 17:21 ` [PATCH v4 8/9] net-sysfs: add queue_change_owner() Christian Brauner
2020-02-24 17:21 ` [PATCH v4 9/9] net: fix sysfs permssions when device changes network namespace Christian Brauner
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=20200224172110.4121492-2-christian.brauner@ubuntu.com \
--to=christian.brauner@ubuntu.com \
--cc=davem@davemloft.net \
--cc=edumazet@google.com \
--cc=gregkh@linuxfoundation.org \
--cc=kuba@kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-pm@vger.kernel.org \
--cc=netdev@vger.kernel.org \
--cc=pavel@ucw.cz \
--cc=rafael@kernel.org \
--cc=stephen@networkplumber.org \
/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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.