The gpiommc configfs context structure needs locking, as configfs does not lock access between files. Index: linux-2.6.25.17/drivers/mmc/host/gpiommc.c =================================================================== --- linux-2.6.25.17.orig/drivers/mmc/host/gpiommc.c 2008-10-18 23:33:54.000000000 +0200 +++ linux-2.6.25.17/drivers/mmc/host/gpiommc.c 2008-10-18 23:34:33.000000000 +0200 @@ -140,6 +140,8 @@ struct gpiommc_configfs_device { struct platform_device *pdev; /* The configuration */ struct gpiommc_platform_data pdata; + /* Mutex to protect this structure */ + struct mutex mutex; }; #define GPIO_INVALID -1 @@ -230,6 +232,8 @@ static ssize_t gpiommc_config_attr_show( unsigned int gpio; int err = 0; + mutex_lock(&dev->mutex); + if (attr == &gpiommc_attr_DI) { gpio = dev->pdata.pins.gpio_di; if (gpio == GPIO_INVALID) @@ -290,6 +294,8 @@ static ssize_t gpiommc_config_attr_show( WARN_ON(1); err = -ENOSYS; out: + mutex_unlock(&dev->mutex); + return err ? err : count; } @@ -349,6 +355,8 @@ static ssize_t gpiommc_config_attr_store int err = -EINVAL; unsigned long data; + mutex_lock(&dev->mutex); + if (attr == &gpiommc_attr_register) { err = strict_strtoul(page, 10, &data); if (err) @@ -474,6 +482,8 @@ static ssize_t gpiommc_config_attr_store WARN_ON(1); err = -ENOSYS; out: + mutex_unlock(&dev->mutex); + return err ? err : count; } @@ -510,6 +520,7 @@ static struct config_item *gpiommc_make_ if (!dev) return NULL; + mutex_init(&dev->mutex); config_item_init_type_name(&dev->item, name, &gpiommc_dev_ci_type);