[PATCH] Add generic file support to sysfs ...

From: Perez-Gonzalez, Inaky (inaky.perez-gonzalez@intel.com)
Date: Thu Apr 24 2003 - 23:20:27 EST


Hi Patrick

How opposed would you be to something like this? [see inlined patch below]

Basically I am adding the ability to create short of an "attribute"
that has specific file_operations and a private pointer. The struct
generic_file contains that. Once any of the fops is called, from
the file->f_dentry->d_fsdata it is possible to get to the 'struct
generic_file', from where the 'private' pointer can be obtained
for whatever purpose.

[as a matter of fact, I could just put the 'generic_file->private'
ptr in f_dentry->d_fsdata and things would be the same].

Usage for this: I am working in this 'kue' silly thing for event
delivery, and I wanted to be able to have a /sysfs/events/ directory,
and then, on there, different files for different message queues.

Some other people around here also voiced that it'd be interesting
to have it.

Only issue I see right now is that it is left to the fops to
do kobject_{get,put}() management of the parent. Maybe they could be
wrapped in tin foil, do the get(), call the actual method, do the put()
and return the obtained value ... but I am not sure this is really
needed.

Need to clean up this patch, though, this is just a draft. If
you are ok, I want to add some doc in Documentation/ and whatever
else you/anyone else might need/want.

If not ok ... why? :)

Thanks,

PS: Patch is vs. 2.5.66 ... should patch fine in others as long
as the bin support is there already.

diff -u -r1.1.1.2 -r1.1.1.2.4.1
--- fs/sysfs/Makefile 8 Mar 2003 01:31:15 -0000 1.1.1.2
+++ fs/sysfs/Makefile 25 Apr 2003 04:03:27 -0000 1.1.1.2.4.1
@@ -2,4 +2,5 @@
 # Makefile for the sysfs virtual filesystem
 #
 
-obj-y := inode.o file.o dir.o symlink.o mount.o bin.o
+obj-y := inode.o file.o dir.o symlink.o mount.o bin.o gfile.o
+
diff -N fs/sysfs/gfile.c
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ fs/sysfs/gfile.c 25 Apr 2003 04:03:52 -0000 1.1.2.1
@@ -0,0 +1,62 @@
+/*
+ * gfile.c - general file operations for sysfs.
+ */
+
+#include <linux/fs.h>
+#include <linux/kobject.h>
+
+#include "sysfs.h"
+
+
+/**
+ * sysfs_create_generic_file - create generic file for object.
+ * @kobj: object.
+ * @gfile: generic file descriptor.
+ *
+ */
+
+int sysfs_create_generic_file(struct kobject * kobj, struct generic_file *
gfile)
+{
+ struct dentry * dentry;
+ struct dentry * parent;
+ int error = 0;
+
+ if (!kobj || !gfile)
+ return -EINVAL;
+
+ parent = kobj->dentry;
+
+ down(&parent->d_inode->i_sem);
+ dentry = sysfs_get_dentry(parent,gfile->attr.name);
+ if (!IS_ERR(dentry)) {
+ dentry->d_fsdata = (void *)gfile;
+ error = sysfs_create(dentry,
+ (gfile->attr.mode & S_IALLUGO) |
S_IFREG,
+ NULL);
+ if (!error) {
+ dentry->d_inode->i_size = 0;
+ dentry->d_inode->i_fop = &gfile->fops;
+ }
+ } else
+ error = PTR_ERR(dentry);
+ up(&parent->d_inode->i_sem);
+ return error;
+}
+
+
+/**
+ * sysfs_remove_generic_file - remove generic file for object.
+ * @kobj: object.
+ * @gfile: generic file descriptor.
+ *
+ */
+
+int sysfs_remove_generic_file (struct kobject * kobj,
+ struct generic_file *gfile)
+{
+ sysfs_hash_and_remove(kobj->dentry,gfile->attr.name);
+ return 0;
+}
+
+EXPORT_SYMBOL(sysfs_create_generic_file);
+EXPORT_SYMBOL(sysfs_remove_generic_file);
diff -u -r1.1.1.2 -r1.1.1.2.4.1
--- include/linux/sysfs.h 8 Mar 2003 01:31:18 -0000 1.1.1.2
+++ include/linux/sysfs.h 25 Apr 2003 04:04:42 -0000 1.1.1.2.4.1
@@ -30,6 +30,12 @@
         ssize_t (*write)(struct kobject *, struct sysfs_bin_buffer *);
 };
 
+struct generic_file {
+ struct attribute attr;
+ struct file_operations * fops;
+ void * private;
+};
+
 struct sysfs_ops {
         ssize_t (*show)(struct kobject *, struct attribute *,char *);
         ssize_t (*store)(struct kobject *,struct attribute *,const char *,
size_t);
@@ -55,5 +61,13 @@
 
 extern void
 sysfs_remove_link(struct kobject *, char * name);
+
+extern int
+sysfs_create_generic_file (struct kobject *,
+ struct generic_file *);
+
+extern int
+sysfs_remove_generic_file (struct kobject *,
+ struct generic_file *);
 
 #endif /* _SYSFS_H_ */

Iñaky Pérez-González -- Not speaking for Intel -- all opinions are my own
(and my fault)



-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/



This archive was generated by hypermail 2b29 : Wed Apr 30 2003 - 22:00:20 EST