[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-Id: <1190275539774-git-send-email-htejun@gmail.com>
Date: Thu, 20 Sep 2007 17:05:39 +0900
From: Tejun Heo <htejun@...il.com>
To: ebiederm@...ssion.com, cornelia.huck@...ibm.com, greg@...ah.com,
stern@...land.harvard.edu, kay.sievers@...y.org,
linux-kernel@...r.kernel.org, htejun@...il.com
Cc: Tejun Heo <htejun@...il.com>
Subject: [PATCH 03/22] sysfs: make sysfs_new_dirent() normalize @mode and determine file type
Currently sysfs_new_dirent() takes @mode and @type. @mode contains
S_IF* mask which is also duplicately indicated by @type. This patch
sysfs_new_dirent() determine S_IF* mask and normalize @mode such that
only bits from S_IALLUGO is taken as @mode.
This is to allow later use of unused @mode bits as special flags.
Signed-off-by: Tejun Heo <htejun@...il.com>
---
fs/sysfs/dir.c | 36 +++++++++++++++++++++++++++++++++++-
fs/sysfs/file.c | 2 +-
fs/sysfs/symlink.c | 2 +-
3 files changed, 37 insertions(+), 3 deletions(-)
diff --git a/fs/sysfs/dir.c b/fs/sysfs/dir.c
index ba631eb..02918d3 100644
--- a/fs/sysfs/dir.c
+++ b/fs/sysfs/dir.c
@@ -298,17 +298,51 @@ static struct dentry_operations sysfs_dentry_ops = {
.d_iput = sysfs_d_iput,
};
+/**
+ * sysfs_new_dirent - allocate and initialize sysfs_dirent
+ * @name: name for the new sysfs_dirent
+ * @mode: mask of bits from S_IRWXUGO
+ * @type: one of SYSFS_{DIR|FILE|BIN|LINK}
+ *
+ * Allocate and initialize a sysfs_dirent with the specified
+ * parameters.
+ *
+ * LOCKING:
+ * Kernel thread context (may sleep).
+ *
+ * RETURNS:
+ * Pointer to the new sysfs_dirent on success, NULL on allocation
+ * failure.
+ */
struct sysfs_dirent *sysfs_new_dirent(const char *name, umode_t mode, int type)
{
char *dup_name = NULL;
struct sysfs_dirent *sd;
+ /* need to copy name? */
if (type & SYSFS_COPY_NAME) {
name = dup_name = kstrdup(name, GFP_KERNEL);
if (!name)
return NULL;
}
+ /* normalize mode */
+ mode &= S_IALLUGO;
+
+ switch (type) {
+ case SYSFS_DIR:
+ mode |= S_IFDIR;
+ break;
+ case SYSFS_KOBJ_ATTR:
+ case SYSFS_KOBJ_BIN_ATTR:
+ mode |= S_IFREG;
+ break;
+ case SYSFS_KOBJ_LINK:
+ mode |= S_IFLNK;
+ break;
+ }
+
+ /* allocate and initialize */
sd = kmem_cache_zalloc(sysfs_dir_cachep, GFP_KERNEL);
if (!sd)
goto err_out1;
@@ -607,7 +641,7 @@ struct sysfs_dirent *sysfs_get_dirent(struct sysfs_dirent *parent_sd,
static int create_dir(struct kobject *kobj, struct sysfs_dirent *parent_sd,
const char *name, struct sysfs_dirent **p_sd)
{
- umode_t mode = S_IFDIR| S_IRWXU | S_IRUGO | S_IXUGO;
+ umode_t mode = S_IRWXU | S_IRUGO | S_IXUGO;
struct sysfs_addrm_cxt acxt;
struct sysfs_dirent *sd;
int rc;
diff --git a/fs/sysfs/file.c b/fs/sysfs/file.c
index 5d708ff..8d8e1ee 100644
--- a/fs/sysfs/file.c
+++ b/fs/sysfs/file.c
@@ -571,7 +571,7 @@ const struct file_operations sysfs_file_operations = {
int sysfs_add_file(struct sysfs_dirent *dir_sd, const struct attribute *attr,
int type)
{
- umode_t mode = (attr->mode & S_IALLUGO) | S_IFREG;
+ umode_t mode = attr->mode & S_IALLUGO;
struct sysfs_addrm_cxt acxt;
struct sysfs_dirent *sd;
int rc;
diff --git a/fs/sysfs/symlink.c b/fs/sysfs/symlink.c
index 6b3358e..bf96bcd 100644
--- a/fs/sysfs/symlink.c
+++ b/fs/sysfs/symlink.c
@@ -82,7 +82,7 @@ int sysfs_create_link(struct kobject * kobj, struct kobject * target, const char
goto out_put;
error = -ENOMEM;
- sd = sysfs_new_dirent(name, S_IFLNK|S_IRWXUGO, SYSFS_KOBJ_LINK);
+ sd = sysfs_new_dirent(name, S_IRWXUGO, SYSFS_KOBJ_LINK);
if (!sd)
goto out_put;
--
1.5.0.3
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
Powered by blists - more mailing lists