--- fs/sysfs/bin.c | 14 ++++++++++++++ include/linux/sysfs.h | 2 ++ 2 files changed, 16 insertions(+) Index: linux/fs/sysfs/bin.c =================================================================== --- linux.orig/fs/sysfs/bin.c +++ linux/fs/sysfs/bin.c @@ -163,6 +163,19 @@ static int release(struct inode * inode, return 0; } +static int ioctl(struct inode *i, struct file *f, unsigned cmd, + unsigned long arg) +{ + struct dentry *dentry = f->f_dentry; + struct bin_attribute *attr = to_bin_attr(dentry); + struct kobject *kobj = to_kobj(dentry->d_parent); + + if (!attr->ioctl) + return -EINVAL; + + return attr->ioctl(kobj, attr, cmd, arg); +} + const struct file_operations bin_fops = { .read = read, .write = write, @@ -170,6 +183,7 @@ const struct file_operations bin_fops = .llseek = generic_file_llseek, .open = open, .release = release, + .ioctl = ioctl, }; /** Index: linux/include/linux/sysfs.h =================================================================== --- linux.orig/include/linux/sysfs.h +++ linux/include/linux/sysfs.h @@ -58,6 +58,8 @@ struct bin_attribute { ssize_t (*write)(struct kobject *, char *, loff_t, size_t); int (*mmap)(struct kobject *, struct bin_attribute *attr, struct vm_area_struct *vma); + int (*ioctl)(struct kobject *, struct bin_attribute *attr, + unsigned cmd, unsigned long arg); }; struct sysfs_ops {