proc: Add proc_mkdir_data()
authorDavid Howells <dhowells@redhat.com>
Fri, 12 Apr 2013 01:48:30 +0000 (02:48 +0100)
committerAl Viro <viro@zeniv.linux.org.uk>
Wed, 1 May 2013 21:29:41 +0000 (17:29 -0400)
Add proc_mkdir_data() to allow procfs directories to be created that are
annotated at the time of creation with private data rather than doing this
post-creation.  This means no access is then required to the proc_dir_entry
struct to set this.

Signed-off-by: David Howells <dhowells@redhat.com>
Acked-by: Mauro Carvalho Chehab <mchehab@redhat.com>
Acked-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
cc: Neela Syam Kolli <megaraidlinux@lsi.com>
cc: Jerry Chuang <jerry-chuang@realtek.com>
cc: linux-scsi@vger.kernel.org
cc: devel@driverdev.osuosl.org
cc: linux-wireless@vger.kernel.org
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
drivers/message/i2o/i2o_proc.c
drivers/scsi/megaraid.c
drivers/staging/rtl8192u/r8192U_core.c
fs/proc/generic.c
fs/reiserfs/procfs.c
include/linux/proc_fs.h

index 70a840f9b2832982e27587f2a509cf610e872d0a..b7d87cd227a902b4de1c405dcf726419217b1adc 100644 (file)
@@ -1913,14 +1913,12 @@ static void i2o_proc_device_add(struct proc_dir_entry *dir,
 
        osm_debug("adding device /proc/i2o/%s/%s\n", dev->iop->name, buff);
 
-       devdir = proc_mkdir(buff, dir);
+       devdir = proc_mkdir_data(buff, 0, dir, dev);
        if (!devdir) {
                osm_warn("Could not allocate procdir!\n");
                return;
        }
 
-       devdir->data = dev;
-
        i2o_proc_create_entries(devdir, generic_dev_entries, dev);
 
        /* Inform core that we want updates about this device's status */
@@ -1954,12 +1952,10 @@ static int i2o_proc_iop_add(struct proc_dir_entry *dir,
 
        osm_debug("adding IOP /proc/i2o/%s\n", c->name);
 
-       iopdir = proc_mkdir(c->name, dir);
+       iopdir = proc_mkdir_data(c->name, 0, dir, c);
        if (!iopdir)
                return -1;
 
-       iopdir->data = c;
-
        i2o_proc_create_entries(iopdir, i2o_proc_generic_iop_entries, c);
 
        list_for_each_entry(dev, &c->devices, list)
index a1c90bd34e78fd162bf7b82804f6ffd97c63051e..ef3384d39e11ad38318e194f9ff73fce270d339f 100644 (file)
@@ -2818,12 +2818,12 @@ mega_create_proc_entry(int index, struct proc_dir_entry *parent)
 
        sprintf(string, "hba%d", adapter->host->host_no);
 
-       dir = adapter->controller_proc_dir_entry = proc_mkdir(string, parent);
+       dir = adapter->controller_proc_dir_entry =
+               proc_mkdir_data(string, 0, parent, adapter);
        if(!dir) {
                printk(KERN_WARNING "\nmegaraid: proc_mkdir failed\n");
                return;
        }
-       dir->data = adapter;
 
        for (f = mega_proc_files; f->name; f++) {
                de = proc_create_data(f->name, S_IRUSR, dir, &mega_proc_fops,
index 433c3df95de029ea5afeee1d5409eb1a653ea47b..d81d7d55f25e1edd85a0893364f7795d8c4f37e5 100644 (file)
@@ -672,13 +672,12 @@ void rtl8192_proc_init_one(struct net_device *dev)
        struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
 
        if (rtl8192_proc) {
-               priv->dir_dev = proc_mkdir(dev->name, rtl8192_proc);
+               priv->dir_dev = proc_mkdir_data(dev->name, 0, rtl8192_proc, dev);
                if (!priv->dir_dev) {
                        RT_TRACE(COMP_ERR, "Unable to initialize /proc/net/rtl8192/%s\n",
                                 dev->name);
                        return;
                }
-               priv->dir_dev->data = dev;
 
                for (f = rtl8192_proc_files; f->name[0]; f++) {
                        if (!proc_create_data(f->name, S_IFREG | S_IRUGO,
index 5f6f6c38701f1333d71f30c4aef8ef89cf07963a..4074da57c99e99541d96d206cc9ba687082f6710 100644 (file)
@@ -428,13 +428,17 @@ struct proc_dir_entry *proc_symlink(const char *name,
 }
 EXPORT_SYMBOL(proc_symlink);
 
-struct proc_dir_entry *proc_mkdir_mode(const char *name, umode_t mode,
-               struct proc_dir_entry *parent)
+struct proc_dir_entry *proc_mkdir_data(const char *name, umode_t mode,
+               struct proc_dir_entry *parent, void *data)
 {
        struct proc_dir_entry *ent;
 
+       if (mode == 0)
+               mode = S_IRUGO | S_IXUGO;
+
        ent = __proc_create(&parent, name, S_IFDIR | mode, 2);
        if (ent) {
+               ent->data = data;
                if (proc_register(parent, ent) < 0) {
                        kfree(ent);
                        ent = NULL;
@@ -442,29 +446,19 @@ struct proc_dir_entry *proc_mkdir_mode(const char *name, umode_t mode,
        }
        return ent;
 }
-EXPORT_SYMBOL(proc_mkdir_mode);
+EXPORT_SYMBOL_GPL(proc_mkdir_data);
 
-struct proc_dir_entry *proc_net_mkdir(struct net *net, const char *name,
-               struct proc_dir_entry *parent)
+struct proc_dir_entry *proc_mkdir_mode(const char *name, umode_t mode,
+                                      struct proc_dir_entry *parent)
 {
-       struct proc_dir_entry *ent;
-
-       ent = __proc_create(&parent, name, S_IFDIR | S_IRUGO | S_IXUGO, 2);
-       if (ent) {
-               ent->data = net;
-               if (proc_register(parent, ent) < 0) {
-                       kfree(ent);
-                       ent = NULL;
-               }
-       }
-       return ent;
+       return proc_mkdir_data(name, mode, parent, NULL);
 }
-EXPORT_SYMBOL_GPL(proc_net_mkdir);
+EXPORT_SYMBOL(proc_mkdir_mode);
 
 struct proc_dir_entry *proc_mkdir(const char *name,
                struct proc_dir_entry *parent)
 {
-       return proc_mkdir_mode(name, S_IRUGO | S_IXUGO, parent);
+       return proc_mkdir_data(name, 0, parent, NULL);
 }
 EXPORT_SYMBOL(proc_mkdir);
 
index 274adea363ff3411f21cc0e209e3c7b018715387..07c2162ef556466c14f3e3bcadddd2dc0350e978 100644 (file)
@@ -479,9 +479,8 @@ int reiserfs_proc_info_init(struct super_block *sb)
                *s = '!';
 
        spin_lock_init(&__PINFO(sb).lock);
-       REISERFS_SB(sb)->procdir = proc_mkdir(b, proc_info_root);
+       REISERFS_SB(sb)->procdir = proc_mkdir_data(b, 0, proc_info_root, sb);
        if (REISERFS_SB(sb)->procdir) {
-               REISERFS_SB(sb)->procdir->data = sb;
                add_file(sb, "version", show_version);
                add_file(sb, "super", show_super);
                add_file(sb, "per-level", show_per_level);
index 80d9e24a79ac875b09b58c21e5a6d18b3e9eaf6a..a0fb1c2f1d8e68a5d9029923292903caeff557e4 100644 (file)
@@ -73,6 +73,8 @@ extern int remove_proc_subtree(const char *name, struct proc_dir_entry *parent);
 extern struct proc_dir_entry *proc_symlink(const char *,
                struct proc_dir_entry *, const char *);
 extern struct proc_dir_entry *proc_mkdir(const char *,struct proc_dir_entry *);
+extern struct proc_dir_entry *proc_mkdir_data(const char *, umode_t,
+                                             struct proc_dir_entry *, void *);
 extern struct proc_dir_entry *proc_mkdir_mode(const char *name, umode_t mode,
                        struct proc_dir_entry *parent);
 
@@ -82,9 +84,6 @@ static inline struct proc_dir_entry *proc_create(const char *name, umode_t mode,
        return proc_create_data(name, mode, parent, proc_fops, NULL);
 }
  
-extern struct proc_dir_entry *proc_net_mkdir(struct net *net, const char *name,
-       struct proc_dir_entry *parent);
-
 extern void proc_set_size(struct proc_dir_entry *, loff_t);
 extern void proc_set_user(struct proc_dir_entry *, kuid_t, kgid_t);
 #else
@@ -108,6 +107,8 @@ static inline struct proc_dir_entry *proc_symlink(const char *name,
                struct proc_dir_entry *parent,const char *dest) {return NULL;}
 static inline struct proc_dir_entry *proc_mkdir(const char *name,
        struct proc_dir_entry *parent) {return NULL;}
+static inline struct proc_dir_entry *proc_mkdir_data(const char *name,
+       umode_t mode, struct proc_dir_entry *parent, void *data) { return NULL; }
 static inline struct proc_dir_entry *proc_mkdir_mode(const char *name,
        umode_t mode, struct proc_dir_entry *parent) { return NULL; }
 static inline void proc_set_size(struct proc_dir_entry *de, loff_t size) {}
@@ -153,4 +154,10 @@ static inline void *PDE_DATA(const struct inode *inode)
        return PROC_I(inode)->pde->data;
 }
 
+static inline struct proc_dir_entry *proc_net_mkdir(
+       struct net *net, const char *name, struct proc_dir_entry *parent)
+{
+       return proc_mkdir_data(name, 0, parent, net);
+}
+
 #endif /* _LINUX_PROC_FS_H */