mirror of
https://github.com/torvalds/linux
synced 2024-10-08 12:22:38 +00:00
staging: unisys: unify devmajorminor attributes into visorbus_main.c
The code in devmajorminor_attr.[ch] only creates sysfs files and is called only in visorbus_main.c. This code should be unified into visorbus_main.c. The only changes are a forward declaration issue with register_devmajorminor_attributes() and making the functions static. Signed-off-by: Prarit Bhargava <prarit@redhat.com> Signed-off-by: Benjamin Romer <benjamin.romer@unisys.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
826b6a0f86
commit
32710457c8
|
@ -4,7 +4,7 @@
|
||||||
|
|
||||||
obj-$(CONFIG_UNISYS_VISORBUS) += visorbus.o
|
obj-$(CONFIG_UNISYS_VISORBUS) += visorbus.o
|
||||||
|
|
||||||
visorbus-y := visorbus_main.o devmajorminor_attr.o
|
visorbus-y := visorbus_main.o
|
||||||
visorbus-y += visorchannel_funcs.o
|
visorbus-y += visorchannel_funcs.o
|
||||||
|
|
||||||
ccflags-y += -Idrivers/staging/unisys/include
|
ccflags-y += -Idrivers/staging/unisys/include
|
||||||
|
|
|
@ -1,192 +0,0 @@
|
||||||
/* devmajorminor_attr.c
|
|
||||||
*
|
|
||||||
* Copyright (C) 2010 - 2013 UNISYS CORPORATION
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* This program is free software; you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation; either version 2 of the License, or (at
|
|
||||||
* your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful, but
|
|
||||||
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
|
|
||||||
* NON INFRINGEMENT. See the GNU General Public License for more
|
|
||||||
* details.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Implement publishing of device node attributes under:
|
|
||||||
*
|
|
||||||
* /sys/bus/visorbus<x>/dev<y>/devmajorminor
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "devmajorminor_attr.h"
|
|
||||||
#define CURRENT_FILE_PC VISOR_BUS_PC_devmajorminor_attr_c
|
|
||||||
|
|
||||||
#define to_devmajorminor_attr(_attr) \
|
|
||||||
container_of(_attr, struct devmajorminor_attribute, attr)
|
|
||||||
#define to_visor_device_from_kobjdevmajorminor(obj) \
|
|
||||||
container_of(obj, struct visor_device, kobjdevmajorminor)
|
|
||||||
|
|
||||||
struct devmajorminor_attribute {
|
|
||||||
struct attribute attr;
|
|
||||||
int slot;
|
|
||||||
ssize_t (*show)(struct visor_device *, int slot, char *buf);
|
|
||||||
ssize_t (*store)(struct visor_device *, int slot, const char *buf,
|
|
||||||
size_t count);
|
|
||||||
};
|
|
||||||
|
|
||||||
static ssize_t DEVMAJORMINOR_ATTR(struct visor_device *dev, int slot, char *buf)
|
|
||||||
{
|
|
||||||
int maxdevnodes = ARRAY_SIZE(dev->devnodes) / sizeof(dev->devnodes[0]);
|
|
||||||
|
|
||||||
if (slot < 0 || slot >= maxdevnodes)
|
|
||||||
return 0;
|
|
||||||
return snprintf(buf, PAGE_SIZE, "%d:%d\n",
|
|
||||||
dev->devnodes[slot].major, dev->devnodes[slot].minor);
|
|
||||||
}
|
|
||||||
|
|
||||||
static ssize_t
|
|
||||||
devmajorminor_attr_show(struct kobject *kobj, struct attribute *attr, char *buf)
|
|
||||||
{
|
|
||||||
struct devmajorminor_attribute *devmajorminor_attr =
|
|
||||||
to_devmajorminor_attr(attr);
|
|
||||||
struct visor_device *dev = to_visor_device_from_kobjdevmajorminor(kobj);
|
|
||||||
ssize_t ret = 0;
|
|
||||||
|
|
||||||
if (devmajorminor_attr->show)
|
|
||||||
ret = devmajorminor_attr->show(dev,
|
|
||||||
devmajorminor_attr->slot, buf);
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
static ssize_t
|
|
||||||
devmajorminor_attr_store(struct kobject *kobj,
|
|
||||||
struct attribute *attr, const char *buf, size_t count)
|
|
||||||
{
|
|
||||||
struct devmajorminor_attribute *devmajorminor_attr =
|
|
||||||
to_devmajorminor_attr(attr);
|
|
||||||
struct visor_device *dev = to_visor_device_from_kobjdevmajorminor(kobj);
|
|
||||||
ssize_t ret = 0;
|
|
||||||
|
|
||||||
if (devmajorminor_attr->store)
|
|
||||||
ret = devmajorminor_attr->store(dev,
|
|
||||||
devmajorminor_attr->slot,
|
|
||||||
buf, count);
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
|
||||||
devmajorminor_create_file(struct visor_device *dev, const char *name,
|
|
||||||
int major, int minor)
|
|
||||||
{
|
|
||||||
int maxdevnodes = ARRAY_SIZE(dev->devnodes) / sizeof(dev->devnodes[0]);
|
|
||||||
struct devmajorminor_attribute *myattr = NULL;
|
|
||||||
int x = -1, rc = 0, slot = -1;
|
|
||||||
|
|
||||||
register_devmajorminor_attributes(dev);
|
|
||||||
for (slot = 0; slot < maxdevnodes; slot++)
|
|
||||||
if (!dev->devnodes[slot].attr)
|
|
||||||
break;
|
|
||||||
if (slot == maxdevnodes) {
|
|
||||||
rc = -ENOMEM;
|
|
||||||
goto away;
|
|
||||||
}
|
|
||||||
myattr = kmalloc(sizeof(*myattr), GFP_KERNEL);
|
|
||||||
if (!myattr) {
|
|
||||||
rc = -ENOMEM;
|
|
||||||
goto away;
|
|
||||||
}
|
|
||||||
memset(myattr, 0, sizeof(struct devmajorminor_attribute));
|
|
||||||
myattr->show = DEVMAJORMINOR_ATTR;
|
|
||||||
myattr->store = NULL;
|
|
||||||
myattr->slot = slot;
|
|
||||||
myattr->attr.name = name;
|
|
||||||
myattr->attr.mode = S_IRUGO;
|
|
||||||
dev->devnodes[slot].attr = myattr;
|
|
||||||
dev->devnodes[slot].major = major;
|
|
||||||
dev->devnodes[slot].minor = minor;
|
|
||||||
x = sysfs_create_file(&dev->kobjdevmajorminor, &myattr->attr);
|
|
||||||
if (x < 0) {
|
|
||||||
rc = x;
|
|
||||||
goto away;
|
|
||||||
}
|
|
||||||
kobject_uevent(&dev->device.kobj, KOBJ_ONLINE);
|
|
||||||
away:
|
|
||||||
if (rc < 0) {
|
|
||||||
kfree(myattr);
|
|
||||||
myattr = NULL;
|
|
||||||
dev->devnodes[slot].attr = NULL;
|
|
||||||
}
|
|
||||||
return rc;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
devmajorminor_remove_file(struct visor_device *dev, int slot)
|
|
||||||
{
|
|
||||||
int maxdevnodes = ARRAY_SIZE(dev->devnodes) / sizeof(dev->devnodes[0]);
|
|
||||||
struct devmajorminor_attribute *myattr = NULL;
|
|
||||||
|
|
||||||
if (slot < 0 || slot >= maxdevnodes)
|
|
||||||
return;
|
|
||||||
myattr = (struct devmajorminor_attribute *)(dev->devnodes[slot].attr);
|
|
||||||
if (myattr)
|
|
||||||
return;
|
|
||||||
sysfs_remove_file(&dev->kobjdevmajorminor, &myattr->attr);
|
|
||||||
kobject_uevent(&dev->device.kobj, KOBJ_OFFLINE);
|
|
||||||
dev->devnodes[slot].attr = NULL;
|
|
||||||
kfree(myattr);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
devmajorminor_remove_all_files(struct visor_device *dev)
|
|
||||||
{
|
|
||||||
int i = 0;
|
|
||||||
int maxdevnodes = ARRAY_SIZE(dev->devnodes) / sizeof(dev->devnodes[0]);
|
|
||||||
|
|
||||||
for (i = 0; i < maxdevnodes; i++)
|
|
||||||
devmajorminor_remove_file(dev, i);
|
|
||||||
}
|
|
||||||
|
|
||||||
static const struct sysfs_ops devmajorminor_sysfs_ops = {
|
|
||||||
.show = devmajorminor_attr_show,
|
|
||||||
.store = devmajorminor_attr_store,
|
|
||||||
};
|
|
||||||
|
|
||||||
static struct kobj_type devmajorminor_kobj_type = {
|
|
||||||
.sysfs_ops = &devmajorminor_sysfs_ops
|
|
||||||
};
|
|
||||||
|
|
||||||
int
|
|
||||||
register_devmajorminor_attributes(struct visor_device *dev)
|
|
||||||
{
|
|
||||||
int rc = 0, x = 0;
|
|
||||||
|
|
||||||
if (dev->kobjdevmajorminor.parent)
|
|
||||||
goto away; /* already registered */
|
|
||||||
x = kobject_init_and_add(&dev->kobjdevmajorminor,
|
|
||||||
&devmajorminor_kobj_type, &dev->device.kobj,
|
|
||||||
"devmajorminor");
|
|
||||||
if (x < 0) {
|
|
||||||
rc = x;
|
|
||||||
goto away;
|
|
||||||
}
|
|
||||||
|
|
||||||
kobject_uevent(&dev->kobjdevmajorminor, KOBJ_ADD);
|
|
||||||
|
|
||||||
away:
|
|
||||||
return rc;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
unregister_devmajorminor_attributes(struct visor_device *dev)
|
|
||||||
{
|
|
||||||
if (!dev->kobjdevmajorminor.parent)
|
|
||||||
return; /* already unregistered */
|
|
||||||
devmajorminor_remove_all_files(dev);
|
|
||||||
|
|
||||||
kobject_del(&dev->kobjdevmajorminor);
|
|
||||||
kobject_put(&dev->kobjdevmajorminor);
|
|
||||||
dev->kobjdevmajorminor.parent = NULL;
|
|
||||||
}
|
|
|
@ -1,31 +0,0 @@
|
||||||
/* devmajorminor_attr.h
|
|
||||||
*
|
|
||||||
* Copyright (C) 2010 - 2013 UNISYS CORPORATION
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* This program is free software; you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation; either version 2 of the License, or (at
|
|
||||||
* your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful, but
|
|
||||||
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
|
|
||||||
* NON INFRINGEMENT. See the GNU General Public License for more
|
|
||||||
* details.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef __DEVMAJORMINOR_ATTR_H__
|
|
||||||
#define __DEVMAJORMINOR_ATTR_H__
|
|
||||||
|
|
||||||
#include "visorbus.h" /* just to get visor_device declaration */
|
|
||||||
#include "timskmod.h"
|
|
||||||
|
|
||||||
int register_devmajorminor_attributes(struct visor_device *dev);
|
|
||||||
void unregister_devmajorminor_attributes(struct visor_device *dev);
|
|
||||||
int devmajorminor_create_file(struct visor_device *dev, const char *nam,
|
|
||||||
int major, int minor);
|
|
||||||
void devmajorminor_remove_file(struct visor_device *dev, int slot);
|
|
||||||
void devmajorminor_remove_all_files(struct visor_device *dev);
|
|
||||||
|
|
||||||
#endif
|
|
|
@ -19,7 +19,6 @@
|
||||||
|
|
||||||
#include "visorbus_private.h"
|
#include "visorbus_private.h"
|
||||||
#include "timskmod.h"
|
#include "timskmod.h"
|
||||||
#include "devmajorminor_attr.h"
|
|
||||||
#include "periodic_work.h"
|
#include "periodic_work.h"
|
||||||
#include "vbuschannel.h"
|
#include "vbuschannel.h"
|
||||||
#include "guestlinuxdebug.h"
|
#include "guestlinuxdebug.h"
|
||||||
|
@ -199,6 +198,181 @@ visorbus_release_device(struct device *xdev)
|
||||||
kfree(dev);
|
kfree(dev);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Implement publishing of device node attributes under:
|
||||||
|
*
|
||||||
|
* /sys/bus/visorbus<x>/dev<y>/devmajorminor
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define to_devmajorminor_attr(_attr) \
|
||||||
|
container_of(_attr, struct devmajorminor_attribute, attr)
|
||||||
|
#define to_visor_device_from_kobjdevmajorminor(obj) \
|
||||||
|
container_of(obj, struct visor_device, kobjdevmajorminor)
|
||||||
|
|
||||||
|
struct devmajorminor_attribute {
|
||||||
|
struct attribute attr;
|
||||||
|
int slot;
|
||||||
|
ssize_t (*show)(struct visor_device *, int slot, char *buf);
|
||||||
|
ssize_t (*store)(struct visor_device *, int slot, const char *buf,
|
||||||
|
size_t count);
|
||||||
|
};
|
||||||
|
|
||||||
|
static ssize_t DEVMAJORMINOR_ATTR(struct visor_device *dev, int slot, char *buf)
|
||||||
|
{
|
||||||
|
int maxdevnodes = ARRAY_SIZE(dev->devnodes) / sizeof(dev->devnodes[0]);
|
||||||
|
|
||||||
|
if (slot < 0 || slot >= maxdevnodes)
|
||||||
|
return 0;
|
||||||
|
return snprintf(buf, PAGE_SIZE, "%d:%d\n",
|
||||||
|
dev->devnodes[slot].major, dev->devnodes[slot].minor);
|
||||||
|
}
|
||||||
|
|
||||||
|
static ssize_t
|
||||||
|
devmajorminor_attr_show(struct kobject *kobj, struct attribute *attr, char *buf)
|
||||||
|
{
|
||||||
|
struct devmajorminor_attribute *devmajorminor_attr =
|
||||||
|
to_devmajorminor_attr(attr);
|
||||||
|
struct visor_device *dev = to_visor_device_from_kobjdevmajorminor(kobj);
|
||||||
|
ssize_t ret = 0;
|
||||||
|
|
||||||
|
if (devmajorminor_attr->show)
|
||||||
|
ret = devmajorminor_attr->show(dev,
|
||||||
|
devmajorminor_attr->slot, buf);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
static ssize_t
|
||||||
|
devmajorminor_attr_store(struct kobject *kobj,
|
||||||
|
struct attribute *attr, const char *buf, size_t count)
|
||||||
|
{
|
||||||
|
struct devmajorminor_attribute *devmajorminor_attr =
|
||||||
|
to_devmajorminor_attr(attr);
|
||||||
|
struct visor_device *dev = to_visor_device_from_kobjdevmajorminor(kobj);
|
||||||
|
ssize_t ret = 0;
|
||||||
|
|
||||||
|
if (devmajorminor_attr->store)
|
||||||
|
ret = devmajorminor_attr->store(dev,
|
||||||
|
devmajorminor_attr->slot,
|
||||||
|
buf, count);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int register_devmajorminor_attributes(struct visor_device *dev);
|
||||||
|
|
||||||
|
int
|
||||||
|
devmajorminor_create_file(struct visor_device *dev, const char *name,
|
||||||
|
int major, int minor)
|
||||||
|
{
|
||||||
|
int maxdevnodes = ARRAY_SIZE(dev->devnodes) / sizeof(dev->devnodes[0]);
|
||||||
|
struct devmajorminor_attribute *myattr = NULL;
|
||||||
|
int x = -1, rc = 0, slot = -1;
|
||||||
|
|
||||||
|
register_devmajorminor_attributes(dev);
|
||||||
|
for (slot = 0; slot < maxdevnodes; slot++)
|
||||||
|
if (!dev->devnodes[slot].attr)
|
||||||
|
break;
|
||||||
|
if (slot == maxdevnodes) {
|
||||||
|
rc = -ENOMEM;
|
||||||
|
goto away;
|
||||||
|
}
|
||||||
|
myattr = kmalloc(sizeof(*myattr), GFP_KERNEL);
|
||||||
|
if (!myattr) {
|
||||||
|
rc = -ENOMEM;
|
||||||
|
goto away;
|
||||||
|
}
|
||||||
|
memset(myattr, 0, sizeof(struct devmajorminor_attribute));
|
||||||
|
myattr->show = DEVMAJORMINOR_ATTR;
|
||||||
|
myattr->store = NULL;
|
||||||
|
myattr->slot = slot;
|
||||||
|
myattr->attr.name = name;
|
||||||
|
myattr->attr.mode = S_IRUGO;
|
||||||
|
dev->devnodes[slot].attr = myattr;
|
||||||
|
dev->devnodes[slot].major = major;
|
||||||
|
dev->devnodes[slot].minor = minor;
|
||||||
|
x = sysfs_create_file(&dev->kobjdevmajorminor, &myattr->attr);
|
||||||
|
if (x < 0) {
|
||||||
|
rc = x;
|
||||||
|
goto away;
|
||||||
|
}
|
||||||
|
kobject_uevent(&dev->device.kobj, KOBJ_ONLINE);
|
||||||
|
away:
|
||||||
|
if (rc < 0) {
|
||||||
|
kfree(myattr);
|
||||||
|
myattr = NULL;
|
||||||
|
dev->devnodes[slot].attr = NULL;
|
||||||
|
}
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
devmajorminor_remove_file(struct visor_device *dev, int slot)
|
||||||
|
{
|
||||||
|
int maxdevnodes = ARRAY_SIZE(dev->devnodes) / sizeof(dev->devnodes[0]);
|
||||||
|
struct devmajorminor_attribute *myattr = NULL;
|
||||||
|
|
||||||
|
if (slot < 0 || slot >= maxdevnodes)
|
||||||
|
return;
|
||||||
|
myattr = (struct devmajorminor_attribute *)(dev->devnodes[slot].attr);
|
||||||
|
if (myattr)
|
||||||
|
return;
|
||||||
|
sysfs_remove_file(&dev->kobjdevmajorminor, &myattr->attr);
|
||||||
|
kobject_uevent(&dev->device.kobj, KOBJ_OFFLINE);
|
||||||
|
dev->devnodes[slot].attr = NULL;
|
||||||
|
kfree(myattr);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
devmajorminor_remove_all_files(struct visor_device *dev)
|
||||||
|
{
|
||||||
|
int i = 0;
|
||||||
|
int maxdevnodes = ARRAY_SIZE(dev->devnodes) / sizeof(dev->devnodes[0]);
|
||||||
|
|
||||||
|
for (i = 0; i < maxdevnodes; i++)
|
||||||
|
devmajorminor_remove_file(dev, i);
|
||||||
|
}
|
||||||
|
|
||||||
|
static const struct sysfs_ops devmajorminor_sysfs_ops = {
|
||||||
|
.show = devmajorminor_attr_show,
|
||||||
|
.store = devmajorminor_attr_store,
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct kobj_type devmajorminor_kobj_type = {
|
||||||
|
.sysfs_ops = &devmajorminor_sysfs_ops
|
||||||
|
};
|
||||||
|
|
||||||
|
static int
|
||||||
|
register_devmajorminor_attributes(struct visor_device *dev)
|
||||||
|
{
|
||||||
|
int rc = 0, x = 0;
|
||||||
|
|
||||||
|
if (dev->kobjdevmajorminor.parent)
|
||||||
|
goto away; /* already registered */
|
||||||
|
x = kobject_init_and_add(&dev->kobjdevmajorminor,
|
||||||
|
&devmajorminor_kobj_type, &dev->device.kobj,
|
||||||
|
"devmajorminor");
|
||||||
|
if (x < 0) {
|
||||||
|
rc = x;
|
||||||
|
goto away;
|
||||||
|
}
|
||||||
|
|
||||||
|
kobject_uevent(&dev->kobjdevmajorminor, KOBJ_ADD);
|
||||||
|
|
||||||
|
away:
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
unregister_devmajorminor_attributes(struct visor_device *dev)
|
||||||
|
{
|
||||||
|
if (!dev->kobjdevmajorminor.parent)
|
||||||
|
return; /* already unregistered */
|
||||||
|
devmajorminor_remove_all_files(dev);
|
||||||
|
|
||||||
|
kobject_del(&dev->kobjdevmajorminor);
|
||||||
|
kobject_put(&dev->kobjdevmajorminor);
|
||||||
|
dev->kobjdevmajorminor.parent = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
/* Implement publishing of channel attributes under:
|
/* Implement publishing of channel attributes under:
|
||||||
*
|
*
|
||||||
* /sys/bus/visorbus<x>/dev<y>/channel
|
* /sys/bus/visorbus<x>/dev<y>/channel
|
||||||
|
|
Loading…
Reference in a new issue