Hi! Close, but see below: > +static ssize_t ttyname_store(struct device *dev, > + struct device_attribute *attr, const char *buf, > + size_t size) > +{ > + struct ledtrig_tty_data *trigger_data = led_trigger_get_drvdata(dev); > + char *ttyname; > + ssize_t ret = size; > + bool running; > + > + if (size > 0 && buf[size - 1] == '\n') > + size -= 1; > + > + if (size) { > + ttyname = kmemdup_nul(buf, size, GFP_KERNEL); > + if (!ttyname) { > + ret = -ENOMEM; > + goto out_unlock; Unlock without a lock: > +out_unlock: > + mutex_unlock(&trigger_data->mutex); > + > + if (ttyname && !running) > + ledtrig_tty_restart(trigger_data); > + > + return ret; > +} > + > + tty = tty_kopen_shared(devno); > + if (IS_ERR(tty) || !tty) > + /* What to do? retry or abort */ > + goto out; Abort would make sense to me. > + if (icount.rx != trigger_data->rx || > + icount.tx != trigger_data->tx) { > + led_set_brightness(trigger_data->led_cdev, LED_ON); Please use _sync version. Best regards, Pavel -- http://www.livejournal.com/~pavelmachek