[PATCH 2/3] driver: core: add security labels to devtmpfs

From: Namjae Jeon
Date: Fri Jun 05 2015 - 06:10:38 EST


Add support for setting security labels(e.g. smack or selinux labels) to
devtmpfs device nodes. In this manner, drivers can specify desired security
label in their device_type->devnode or class->devnode method.

Signed-off-by: Namjae Jeon <namjae.jeon@xxxxxxxxxxx>
Signed-off-by: Vivek Trivedi <t.vivek@xxxxxxxxxxx>
---
arch/x86/kernel/cpuid.c | 2 +-
arch/x86/kernel/msr.c | 2 +-
block/bsg.c | 2 +-
block/genhd.c | 2 +-
drivers/base/core.c | 9 +++++----
drivers/base/devtmpfs.c | 23 +++++++++++++++++------
drivers/block/aoe/aoechr.c | 2 +-
drivers/block/pktcdvd.c | 2 +-
drivers/char/mem.c | 2 +-
drivers/char/misc.c | 2 +-
drivers/char/raw.c | 2 +-
drivers/char/tile-srom.c | 2 +-
drivers/gpu/drm/drm_sysfs.c | 2 +-
drivers/hid/usbhid/hiddev.c | 2 +-
drivers/infiniband/core/cm.c | 2 +-
drivers/infiniband/core/user_mad.c | 2 +-
drivers/infiniband/core/uverbs_main.c | 2 +-
drivers/input/input.c | 2 +-
drivers/media/dvb-core/dvbdev.c | 2 +-
drivers/media/pci/ddbridge/ddbridge-core.c | 2 +-
drivers/misc/cxl/file.c | 2 +-
drivers/s390/char/hmcdrv_dev.c | 2 +-
drivers/tty/tty_io.c | 2 +-
drivers/usb/class/usblp.c | 2 +-
drivers/usb/core/file.c | 4 ++--
drivers/usb/core/usb.c | 3 ++-
drivers/usb/misc/iowarrior.c | 2 +-
drivers/usb/misc/legousbtower.c | 2 +-
drivers/vfio/vfio.c | 2 +-
fs/pstore/pmsg.c | 2 +-
include/linux/device.h | 7 ++++---
include/linux/usb.h | 2 +-
sound/sound_core.c | 2 +-
33 files changed, 58 insertions(+), 44 deletions(-)

diff --git a/arch/x86/kernel/cpuid.c b/arch/x86/kernel/cpuid.c
index 7153cb7..1623e4c 100644
--- a/arch/x86/kernel/cpuid.c
+++ b/arch/x86/kernel/cpuid.c
@@ -176,7 +176,7 @@ static struct notifier_block __refdata cpuid_class_cpu_notifier =
};

static char *cpuid_devnode(struct device *dev, umode_t *mode,
- kuid_t *uid, kgid_t *gid)
+ kuid_t *uid, kgid_t *gid, struct xattr *xattr)
{
return kasprintf(GFP_KERNEL, "cpu/%u/cpuid", MINOR(dev->devt));
}
diff --git a/arch/x86/kernel/msr.c b/arch/x86/kernel/msr.c
index fcbd718..29b143b 100644
--- a/arch/x86/kernel/msr.c
+++ b/arch/x86/kernel/msr.c
@@ -240,7 +240,7 @@ static struct notifier_block __refdata msr_class_cpu_notifier = {
};

static char *msr_devnode(struct device *dev, umode_t *mode,
- kuid_t *uid, kgid_t *gid)
+ kuid_t *uid, kgid_t *gid, struct xattr *xattr)
{
return kasprintf(GFP_KERNEL, "cpu/%u/msr", MINOR(dev->devt));
}
diff --git a/block/bsg.c b/block/bsg.c
index 6eef206..ee383b2 100644
--- a/block/bsg.c
+++ b/block/bsg.c
@@ -1041,7 +1041,7 @@ EXPORT_SYMBOL_GPL(bsg_register_queue);
static struct cdev bsg_cdev;

static char *bsg_devnode(struct device *dev, umode_t *mode,
- kuid_t *uid, kgid_t *gid)
+ kuid_t *uid, kgid_t *gid, struct xattr *xattr)
{
return kasprintf(GFP_KERNEL, "bsg/%s", dev_name(dev));
}
diff --git a/block/genhd.c b/block/genhd.c
index 59d18b6..7cff560 100644
--- a/block/genhd.c
+++ b/block/genhd.c
@@ -1121,7 +1121,7 @@ struct class block_class = {
};

static char *block_devnode(struct device *dev, umode_t *mode,
- kuid_t *uid, kgid_t *gid)
+ kuid_t *uid, kgid_t *gid, struct xattr *xattr)
{
struct gendisk *disk = dev_to_disk(dev);

diff --git a/drivers/base/core.c b/drivers/base/core.c
index 4e7546d..0007bc3 100644
--- a/drivers/base/core.c
+++ b/drivers/base/core.c
@@ -311,7 +311,7 @@ static int dev_uevent(struct kset *kset, struct kobject *kobj,

add_uevent_var(env, "MAJOR=%u", MAJOR(dev->devt));
add_uevent_var(env, "MINOR=%u", MINOR(dev->devt));
- name = device_get_devnode(dev, &mode, &uid, &gid, &tmp);
+ name = device_get_devnode(dev, &mode, &uid, &gid, NULL, &tmp);
if (name) {
add_uevent_var(env, "DEVNAME=%s", name);
if (mode)
@@ -1271,6 +1271,7 @@ static struct device *next_device(struct klist_iter *i)
* @mode: returned file access mode
* @uid: returned file owner
* @gid: returned file group
+ * @xattr: returned file xattr
* @tmp: possibly allocated string
*
* Return the relative path of a possible device node.
@@ -1280,7 +1281,7 @@ static struct device *next_device(struct klist_iter *i)
*/
const char *device_get_devnode(struct device *dev,
umode_t *mode, kuid_t *uid, kgid_t *gid,
- const char **tmp)
+ struct xattr *xattr, const char **tmp)
{
char *s;

@@ -1288,13 +1289,13 @@ const char *device_get_devnode(struct device *dev,

/* the device type may provide a specific name */
if (dev->type && dev->type->devnode)
- *tmp = dev->type->devnode(dev, mode, uid, gid);
+ *tmp = dev->type->devnode(dev, mode, uid, gid, xattr);
if (*tmp)
return *tmp;

/* the class may provide a specific name */
if (dev->class && dev->class->devnode)
- *tmp = dev->class->devnode(dev, mode, uid, gid);
+ *tmp = dev->class->devnode(dev, mode, uid, gid, xattr);
if (*tmp)
return *tmp;

diff --git a/drivers/base/devtmpfs.c b/drivers/base/devtmpfs.c
index 68f0314..c628afb 100644
--- a/drivers/base/devtmpfs.c
+++ b/drivers/base/devtmpfs.c
@@ -44,6 +44,7 @@ static struct req {
umode_t mode; /* 0 => delete */
kuid_t uid;
kgid_t gid;
+ struct xattr xattr;
struct device *dev;
} *requests;

@@ -90,7 +91,12 @@ int devtmpfs_create_node(struct device *dev)
req.mode = 0;
req.uid = GLOBAL_ROOT_UID;
req.gid = GLOBAL_ROOT_GID;
- req.name = device_get_devnode(dev, &req.mode, &req.uid, &req.gid, &tmp);
+ req.xattr.value = kmalloc(XATTR_SIZE_MAX, GFP_KERNEL);
+ if (!req.xattr.value)
+ return -ENOMEM;
+ req.xattr.value_len = 0;
+ req.name = device_get_devnode(dev, &req.mode, &req.uid, &req.gid,
+ &req.xattr, &tmp);
if (!req.name)
return -ENOMEM;

@@ -113,6 +119,7 @@ int devtmpfs_create_node(struct device *dev)
wake_up_process(thread);
wait_for_completion(&req.done);

+ kfree(req.xattr.value);
kfree(tmp);

return req.err;
@@ -126,7 +133,7 @@ int devtmpfs_delete_node(struct device *dev)
if (!thread)
return 0;

- req.name = device_get_devnode(dev, NULL, NULL, NULL, &tmp);
+ req.name = device_get_devnode(dev, NULL, NULL, NULL, NULL, &tmp);
if (!req.name)
return -ENOMEM;

@@ -193,7 +200,7 @@ static int create_path(const char *nodepath)
}

static int handle_create(const char *nodename, umode_t mode, kuid_t uid,
- kgid_t gid, struct device *dev)
+ kgid_t gid, struct xattr xattr, struct device *dev)
{
struct dentry *dentry;
struct path path;
@@ -221,6 +228,9 @@ static int handle_create(const char *nodename, umode_t mode, kuid_t uid,

/* mark as kernel-created inode */
d_inode(dentry)->i_private = &thread;
+ if (xattr.value_len > 0)
+ vfs_setxattr(dentry, xattr.name, xattr.value,
+ xattr.value_len, 0);
}
done_path_create(&path, dentry);
return err;
@@ -365,10 +375,10 @@ int devtmpfs_mount(const char *mntdir)
static DECLARE_COMPLETION(setup_done);

static int handle(const char *name, umode_t mode, kuid_t uid, kgid_t gid,
- struct device *dev)
+ struct xattr xattr, struct device *dev)
{
if (mode)
- return handle_create(name, mode, uid, gid, dev);
+ return handle_create(name, mode, uid, gid, xattr, dev);
else
return handle_remove(name, dev);
}
@@ -395,7 +405,8 @@ static int devtmpfsd(void *p)
while (req) {
struct req *next = req->next;
req->err = handle(req->name, req->mode,
- req->uid, req->gid, req->dev);
+ req->uid, req->gid,
+ req->xattr, req->dev);
complete(&req->done);
req = next;
}
diff --git a/drivers/block/aoe/aoechr.c b/drivers/block/aoe/aoechr.c
index a71332f..41612e4 100644
--- a/drivers/block/aoe/aoechr.c
+++ b/drivers/block/aoe/aoechr.c
@@ -276,7 +276,7 @@ static const struct file_operations aoe_fops = {
};

static char *aoe_devnode(struct device *dev, umode_t *mode,
- kuid_t *uid, kgid_t *gid)
+ kuid_t *uid, kgid_t *gid, struct xattr *xattr)
{
return kasprintf(GFP_KERNEL, "etherd/%s", dev_name(dev));
}
diff --git a/drivers/block/pktcdvd.c b/drivers/block/pktcdvd.c
index 5f5c462..3fd2251 100644
--- a/drivers/block/pktcdvd.c
+++ b/drivers/block/pktcdvd.c
@@ -2732,7 +2732,7 @@ static const struct block_device_operations pktcdvd_ops = {
};

static char *pktcdvd_devnode(struct gendisk *gd, umode_t *mode,
- kuid_t *uid, kgid_t *gid)
+ kuid_t *uid, kgid_t *gid, struct xattr *xattr)
{
return kasprintf(GFP_KERNEL, "pktcdvd/%s", gd->disk_name);
}
diff --git a/drivers/char/mem.c b/drivers/char/mem.c
index f16b511..57ffee6 100644
--- a/drivers/char/mem.c
+++ b/drivers/char/mem.c
@@ -832,7 +832,7 @@ static const struct file_operations memory_fops = {
};

static char *mem_devnode(struct device *dev, umode_t *mode,
- kuid_t *uid, kgid_t *gid)
+ kuid_t *uid, kgid_t *gid, struct xattr *xattr)
{
if (mode && devlist[MINOR(dev->devt)].mode)
*mode = devlist[MINOR(dev->devt)].mode;
diff --git a/drivers/char/misc.c b/drivers/char/misc.c
index 9a960ab..63fb739 100644
--- a/drivers/char/misc.c
+++ b/drivers/char/misc.c
@@ -268,7 +268,7 @@ EXPORT_SYMBOL(misc_register);
EXPORT_SYMBOL(misc_deregister);

static char *misc_devnode(struct device *dev, umode_t *mode,
- kuid_t *uid, kgid_t *gid)
+ kuid_t *uid, kgid_t *gid, struct xattr *xattr)
{
struct miscdevice *c = dev_get_drvdata(dev);

diff --git a/drivers/char/raw.c b/drivers/char/raw.c
index d6714ee..ba8566e 100644
--- a/drivers/char/raw.c
+++ b/drivers/char/raw.c
@@ -306,7 +306,7 @@ static const struct file_operations raw_ctl_fops = {
static struct cdev raw_cdev;

static char *raw_devnode(struct device *dev, umode_t *mode,
- kuid_t *uid, kgid_t *gid)
+ kuid_t *uid, kgid_t *gid, struct xattr *xattr)
{
return kasprintf(GFP_KERNEL, "raw/%s", dev_name(dev));
}
diff --git a/drivers/char/tile-srom.c b/drivers/char/tile-srom.c
index 1b6f655..fae0008 100644
--- a/drivers/char/tile-srom.c
+++ b/drivers/char/tile-srom.c
@@ -311,7 +311,7 @@ static struct attribute *srom_dev_attrs[] = {
ATTRIBUTE_GROUPS(srom_dev);

static char *srom_devnode(struct device *dev, umode_t *mode,
- kuid_t *uid, kgid_t *gid)
+ kuid_t *uid, kgid_t *gid, struct xattr *xattr)
{
*mode = S_IRUGO | S_IWUSR;
return kasprintf(GFP_KERNEL, "srom/%s", dev_name(dev));
diff --git a/drivers/gpu/drm/drm_sysfs.c b/drivers/gpu/drm/drm_sysfs.c
index 48ec1b6..6afd5cbd 100644
--- a/drivers/gpu/drm/drm_sysfs.c
+++ b/drivers/gpu/drm/drm_sysfs.c
@@ -100,7 +100,7 @@ static const struct dev_pm_ops drm_class_dev_pm_ops = {
};

static char *drm_devnode(struct device *dev, umode_t *mode,
- kuid_t *uid, kgid_t *gid)
+ kuid_t *uid, kgid_t *gid, struct xattr *xattr)
{
return kasprintf(GFP_KERNEL, "dri/%s", dev_name(dev));
}
diff --git a/drivers/hid/usbhid/hiddev.c b/drivers/hid/usbhid/hiddev.c
index a40204b..b5176cc 100644
--- a/drivers/hid/usbhid/hiddev.c
+++ b/drivers/hid/usbhid/hiddev.c
@@ -861,7 +861,7 @@ static const struct file_operations hiddev_fops = {
};

static char *hiddev_devnode(struct device *dev, umode_t *mode,
- kuid_t *uid, kgid_t *gid)
+ kuid_t *uid, kgid_t *gid, struct xattr *xattr)
{
return kasprintf(GFP_KERNEL, "usb/%s", dev_name(dev));
}
diff --git a/drivers/infiniband/core/cm.c b/drivers/infiniband/core/cm.c
index 13621fd4..551d990 100644
--- a/drivers/infiniband/core/cm.c
+++ b/drivers/infiniband/core/cm.c
@@ -3692,7 +3692,7 @@ static struct kobj_type cm_port_obj_type = {
};

static char *cm_devnode(struct device *dev, umode_t *mode,
- kuid_t *uid, kgid_t *gid)
+ kuid_t *uid, kgid_t *gid, struct xattr *xattr)
{
if (mode)
*mode = 0666;
diff --git a/drivers/infiniband/core/user_mad.c b/drivers/infiniband/core/user_mad.c
index dc34a45..a51c93f 100644
--- a/drivers/infiniband/core/user_mad.c
+++ b/drivers/infiniband/core/user_mad.c
@@ -1333,7 +1333,7 @@ static void ib_umad_remove_one(struct ib_device *device)
}

static char *umad_devnode(struct device *dev, umode_t *mode,
- kuid_t *uid, kgid_t *gid)
+ kuid_t *uid, kgid_t *gid, struct xattr *xattr)
{
return kasprintf(GFP_KERNEL, "infiniband/%s", dev_name(dev));
}
diff --git a/drivers/infiniband/core/uverbs_main.c b/drivers/infiniband/core/uverbs_main.c
index 86c0311..95b0d37 100644
--- a/drivers/infiniband/core/uverbs_main.c
+++ b/drivers/infiniband/core/uverbs_main.c
@@ -969,7 +969,7 @@ static void ib_uverbs_remove_one(struct ib_device *device)
}

static char *uverbs_devnode(struct device *dev, umode_t *mode,
- kuid_t *uid, kgid_t *gid)
+ kuid_t *uid, kgid_t *gid, struct xattr *xattr)
{
if (mode)
*mode = 0666;
diff --git a/drivers/input/input.c b/drivers/input/input.c
index f4825b7..630c78b 100644
--- a/drivers/input/input.c
+++ b/drivers/input/input.c
@@ -1760,7 +1760,7 @@ static struct device_type input_dev_type = {
};

static char *input_devnode(struct device *dev, umode_t *mode,
- kuid_t *uid, kgid_t *gid)
+ kuid_t *uid, kgid_t *gid, struct xattr *xattr)
{
return kasprintf(GFP_KERNEL, "input/%s", dev_name(dev));
}
diff --git a/drivers/media/dvb-core/dvbdev.c b/drivers/media/dvb-core/dvbdev.c
index 5ec225e..4c450d3 100644
--- a/drivers/media/dvb-core/dvbdev.c
+++ b/drivers/media/dvb-core/dvbdev.c
@@ -585,7 +585,7 @@ static int dvb_uevent(struct device *dev, struct kobj_uevent_env *env)
}

static char *dvb_devnode(struct device *dev, umode_t *mode,
- kuid_t *uid, kgid_t *gid)
+ kuid_t *uid, kgid_t *gid, struct xattr *xattr)
{
struct dvb_device *dvbdev = dev_get_drvdata(dev);

diff --git a/drivers/media/pci/ddbridge/ddbridge-core.c b/drivers/media/pci/ddbridge/ddbridge-core.c
index 44d9bc6..215550d 100644
--- a/drivers/media/pci/ddbridge/ddbridge-core.c
+++ b/drivers/media/pci/ddbridge/ddbridge-core.c
@@ -1477,7 +1477,7 @@ static const struct file_operations ddb_fops = {
};

static char *ddb_devnode(struct device *device, umode_t *mode,
- kuid_t *uid, kgid_t *gid)
+ kuid_t *uid, kgid_t *gid, struct xattr *xattr)
{
struct ddb *dev = dev_get_drvdata(device);

diff --git a/drivers/misc/cxl/file.c b/drivers/misc/cxl/file.c
index f570d50..7dd8c39 100644
--- a/drivers/misc/cxl/file.c
+++ b/drivers/misc/cxl/file.c
@@ -409,7 +409,7 @@ const struct file_operations afu_master_fops = {


static char *cxl_devnode(struct device *dev, umode_t *mode,
- kuid_t *uid, kgid_t *gid)
+ kuid_t *uid, kgid_t *gid, struct xattr *xattr)
{
if (CXL_DEVT_IS_CARD(dev->devt)) {
/*
diff --git a/drivers/s390/char/hmcdrv_dev.c b/drivers/s390/char/hmcdrv_dev.c
index ffa582a..1baa752 100644
--- a/drivers/s390/char/hmcdrv_dev.c
+++ b/drivers/s390/char/hmcdrv_dev.c
@@ -90,7 +90,7 @@ static dev_t hmcdrv_dev_no; /* device number (major/minor) */
* Return: recommended device file name in /dev
*/
static char *hmcdrv_dev_name(struct device *dev, umode_t *mode,
- kuid_t *uid, kgid_t *gid)
+ kuid_t *uid, kgid_t *gid, struct xattr *xattr)
{
char *nodename = NULL;
const char *devname = dev_name(dev); /* kernel device name */
diff --git a/drivers/tty/tty_io.c b/drivers/tty/tty_io.c
index a47650a..1333290 100644
--- a/drivers/tty/tty_io.c
+++ b/drivers/tty/tty_io.c
@@ -3529,7 +3529,7 @@ void __init console_init(void)
}

static char *tty_devnode(struct device *dev, umode_t *mode,
- kuid_t *uid, kgid_t *gid)
+ kuid_t *uid, kgid_t *gid, struct xattr *xattr)
{
if (!mode)
return NULL;
diff --git a/drivers/usb/class/usblp.c b/drivers/usb/class/usblp.c
index d672115..312e084 100644
--- a/drivers/usb/class/usblp.c
+++ b/drivers/usb/class/usblp.c
@@ -1059,7 +1059,7 @@ static const struct file_operations usblp_fops = {
};

static char *usblp_devnode(struct device *dev, umode_t *mode,
- kuid_t *uid, kgid_t *gid)
+ kuid_t *uid, kgid_t *gid, struct xattr *xattr)
{
return kasprintf(GFP_KERNEL, "usb/%s", dev_name(dev));
}
diff --git a/drivers/usb/core/file.c b/drivers/usb/core/file.c
index e990b8d..6754de9 100644
--- a/drivers/usb/core/file.c
+++ b/drivers/usb/core/file.c
@@ -59,14 +59,14 @@ static struct usb_class {
} *usb_class;

static char *usb_devnode(struct device *dev, umode_t *mode,
- kuid_t *uid, kgid_t *gid)
+ kuid_t *uid, kgid_t *gid, struct xattr *xattr)
{
struct usb_class_driver *drv;

drv = dev_get_drvdata(dev);
if (!drv || !drv->devnode)
return NULL;
- return drv->devnode(dev, mode, uid, gid);
+ return drv->devnode(dev, mode, uid, gid, xattr);
}

static int init_usb_class(void)
diff --git a/drivers/usb/core/usb.c b/drivers/usb/core/usb.c
index 8d5b2f4..1f1f5cf 100644
--- a/drivers/usb/core/usb.c
+++ b/drivers/usb/core/usb.c
@@ -373,7 +373,8 @@ static const struct dev_pm_ops usb_device_pm_ops = {


static char *usb_devnode(struct device *dev,
- umode_t *mode, kuid_t *uid, kgid_t *gid)
+ umode_t *mode, kuid_t *uid, kgid_t *gid,
+ struct xattr *xattr)
{
struct usb_device *usb_dev;

diff --git a/drivers/usb/misc/iowarrior.c b/drivers/usb/misc/iowarrior.c
index f9d6887..4764d79 100644
--- a/drivers/usb/misc/iowarrior.c
+++ b/drivers/usb/misc/iowarrior.c
@@ -730,7 +730,7 @@ static const struct file_operations iowarrior_fops = {
};

static char *iowarrior_devnode(struct device *dev, umode_t *mode,
- kuid_t *uid, kgid_t *gid)
+ kuid_t *uid, kgid_t *gid, struct xattr *xattr)
{
return kasprintf(GFP_KERNEL, "usb/%s", dev_name(dev));
}
diff --git a/drivers/usb/misc/legousbtower.c b/drivers/usb/misc/legousbtower.c
index d41c1b8..0830f48 100644
--- a/drivers/usb/misc/legousbtower.c
+++ b/drivers/usb/misc/legousbtower.c
@@ -254,7 +254,7 @@ static const struct file_operations tower_fops = {
};

static char *legousbtower_devnode(struct device *dev, umode_t *mode,
- kuid_t *uid, kgid_t *gid)
+ kuid_t *uid, kgid_t *gid, struct xattr *xattr)
{
return kasprintf(GFP_KERNEL, "usb/%s", dev_name(dev));
}
diff --git a/drivers/vfio/vfio.c b/drivers/vfio/vfio.c
index 58e4e67..757a866 100644
--- a/drivers/vfio/vfio.c
+++ b/drivers/vfio/vfio.c
@@ -1520,7 +1520,7 @@ EXPORT_SYMBOL_GPL(vfio_external_check_extension);
* Module/class support
*/
static char *vfio_devnode(struct device *dev, umode_t *mode,
- kuid_t *uid, kgid_t *gid)
+ kuid_t *uid, kgid_t *gid, struct xattr *xattr)
{
return kasprintf(GFP_KERNEL, "vfio/%s", dev_name(dev));
}
diff --git a/fs/pstore/pmsg.c b/fs/pstore/pmsg.c
index 2d7db92..189675d 100644
--- a/fs/pstore/pmsg.c
+++ b/fs/pstore/pmsg.c
@@ -74,7 +74,7 @@ static int pmsg_major;
#define pr_fmt(fmt) PMSG_NAME ": " fmt

static char *pmsg_devnode(struct device *dev, umode_t *mode,
- kuid_t *uid, kgid_t *gid)
+ kuid_t *uid, kgid_t *gid, struct xattr *xattr)
{
if (mode)
*mode = 0220;
diff --git a/include/linux/device.h b/include/linux/device.h
index 220c0b1..135b12d 100644
--- a/include/linux/device.h
+++ b/include/linux/device.h
@@ -27,6 +27,7 @@
#include <linux/ratelimit.h>
#include <linux/uidgid.h>
#include <linux/gfp.h>
+#include <linux/xattr.h>
#include <asm/device.h>

struct device;
@@ -390,7 +391,7 @@ struct class {

int (*dev_uevent)(struct device *dev, struct kobj_uevent_env *env);
char *(*devnode)(struct device *dev, umode_t *mode,
- kuid_t *uid, kgid_t *gid);
+ kuid_t *uid, kgid_t *gid, struct xattr *xattr);

void (*class_release)(struct class *class);
void (*dev_release)(struct device *dev);
@@ -535,7 +536,7 @@ struct device_type {
const struct attribute_group **groups;
int (*uevent)(struct device *dev, struct kobj_uevent_env *env);
char *(*devnode)(struct device *dev, umode_t *mode,
- kuid_t *uid, kgid_t *gid);
+ kuid_t *uid, kgid_t *gid, struct xattr *xattr);
void (*release)(struct device *dev);

const struct dev_pm_ops *pm;
@@ -966,7 +967,7 @@ extern int device_move(struct device *dev, struct device *new_parent,
enum dpm_order dpm_order);
extern const char *device_get_devnode(struct device *dev,
umode_t *mode, kuid_t *uid, kgid_t *gid,
- const char **tmp);
+ struct xattr *xattr, const char **tmp);

static inline bool device_supports_offline(struct device *dev)
{
diff --git a/include/linux/usb.h b/include/linux/usb.h
index c396dde..4165606 100644
--- a/include/linux/usb.h
+++ b/include/linux/usb.h
@@ -1158,7 +1158,7 @@ extern struct bus_type usb_bus_type;
struct usb_class_driver {
char *name;
char *(*devnode)(struct device *dev, umode_t *mode,
- kuid_t *uid, kgid_t *gid);
+ kuid_t *uid, kgid_t *gid, struct xattr *xattr);
const struct file_operations *fops;
int minor_base;
};
diff --git a/sound/sound_core.c b/sound/sound_core.c
index 9c01786..b2145f8 100644
--- a/sound/sound_core.c
+++ b/sound/sound_core.c
@@ -30,7 +30,7 @@ MODULE_AUTHOR("Alan Cox");
MODULE_LICENSE("GPL");

static char *sound_devnode(struct device *dev, umode_t *mode,
- kuid_t *uid, kgid_t *gid)
+ kuid_t *uid, kgid_t *gid, struct xattr *xattr)
{
if (MAJOR(dev->devt) == SOUND_MAJOR)
return NULL;
--
1.8.5.5


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