[PATCH 4/8 v2] staging: unisys: move chipsetready to sysfs

Greg KH gregkh at linuxfoundation.org
Tue Jul 22 23:15:37 UTC 2014


On Tue, Jul 22, 2014 at 09:56:28AM -0400, Benjamin Romer wrote:
> Move the chipsetready proc entry to sysfs under a new directory guest. This
> entry is used by Unisys application software on the guest to acknowledge
> completion of specific events for integration purposes, but these
> acknowledgements are not required for the guest to operate correctly.
> 
> The store function is simplified as well, to use scanf() instead of copying
> the buffer and using strsep().
> 
> Signed-off-by: Benjamin Romer <benjamin.romer at unisys.com>
> ---
> v2: attribute creation was fixed and checks for controlvm_channel pointer were
> removed. The off-by-one error in the sscanf() was fixed. Error -1 that was 
> being returned was changed to -EINVAL.
> 
>  .../unisys/visorchipset/visorchipset_main.c        | 88 ++++++++--------------
>  1 file changed, 33 insertions(+), 55 deletions(-)
> 
> diff --git a/drivers/staging/unisys/visorchipset/visorchipset_main.c b/drivers/staging/unisys/visorchipset/visorchipset_main.c
> index a20e21b..74ab15b 100644
> --- a/drivers/staging/unisys/visorchipset/visorchipset_main.c
> +++ b/drivers/staging/unisys/visorchipset/visorchipset_main.c
> @@ -129,9 +129,6 @@ static MYPROCTYPE *PartitionType;
>  #define VISORCHIPSET_DIAG_PROC_ENTRY_FN "diagdump"
>  static struct proc_dir_entry *diag_proc_dir;
>  
> -#define VISORCHIPSET_CHIPSET_PROC_ENTRY_FN "chipsetready"
> -static struct proc_dir_entry *chipset_proc_dir;
> -
>  #define VISORCHIPSET_PARAHOTPLUG_PROC_ENTRY_FN "parahotplug"
>  static struct proc_dir_entry *parahotplug_proc_dir;
>  
> @@ -323,6 +320,10 @@ static ssize_t remaining_steps_store(struct device *dev,
>  	struct device_attribute *attr, const char *buf, size_t count);
>  static DEVICE_ATTR_RW(remaining_steps);
>  
> +static ssize_t chipsetready_store(struct device *dev,
> +		struct device_attribute *attr, const char *buf, size_t count);
> +static DEVICE_ATTR_WO(chipsetready);
> +
>  static struct attribute *visorchipset_install_attrs[] = {
>  	&dev_attr_toolaction.attr,
>  	&dev_attr_boottotool.attr,
> @@ -337,8 +338,19 @@ static struct attribute_group visorchipset_install_group = {
>  	.attrs = visorchipset_install_attrs
>  };
>  
> +static struct attribute *visorchipset_guest_attrs[] = {
> +	&dev_attr_chipsetready.attr,
> +	NULL
> +};
> +
> +static struct attribute_group visorchipset_guest_group = {
> +	.name = "guest",
> +	.attrs = visorchipset_guest_attrs
> +};
> +
>  static const struct attribute_group *visorchipset_dev_groups[] = {
>  	&visorchipset_install_group,
> +	&visorchipset_guest_group,
>  	NULL
>  };
>  
> @@ -2369,49 +2381,27 @@ visorchipset_cache_free(struct kmem_cache *pool, void *p, char *fn, int ln)
>  	kmem_cache_free(pool, p);
>  }
>  
> -#define gettoken(bufp) strsep(bufp, " -\t\n")
> -
> -static ssize_t
> -chipset_proc_write(struct file *file, const char __user *buffer,
> -		   size_t count, loff_t *ppos)
> +ssize_t chipsetready_store(struct device *dev, struct device_attribute *attr,
> +		const char *buf, size_t count)
>  {
> -	char buf[512];
> -	char *token, *p;
> -
> -	if (count > sizeof(buf) - 1) {
> -		LOGERR("chipset_proc_write: count (%d) exceeds size of buffer (%d)",
> -		     (int) count, (int) sizeof(buffer));
> -		return -EINVAL;
> -	}
> -	if (copy_from_user(buf, buffer, count)) {
> -		LOGERR("chipset_proc_write: copy_from_user failed");
> -		return -EFAULT;
> -	}
> -	buf[count] = '\0';
> -
> -	p = buf;
> -	token = gettoken(&p);
> -
> -	if (strcmp(token, "CALLHOMEDISK_MOUNTED") == 0) {
> -		token = gettoken(&p);
> -		/* The Call Home Disk has been mounted */
> -		if (strcmp(token, "0") == 0)
> -			chipset_events[0] = 1;
> -	} else if (strcmp(token, "MODULES_LOADED") == 0) {
> -		token = gettoken(&p);
> -		/* All modules for the partition have been loaded */
> -		if (strcmp(token, "0") == 0)
> -			chipset_events[1] = 1;
> -	} else if (token == NULL) {
> -		/* No event specified */
> -		LOGERR("No event was specified to send CHIPSET_READY response");
> -		return -1;
> +	char msgtype[64];
> +	int msgparam;
> +
> +	if (sscanf(buf, "%63s %d", msgtype, &msgparam) == 2) {

2 values in one sysfs file?  Not good :(

Why?



More information about the devel mailing list