Skip to content

Commit

Permalink
staging: most: destroy cdev when channel gets disconnected
Browse files Browse the repository at this point in the history
When a channel is being removed while an application holds the
corresponding character device, this device is going to be destroyed only
after the application closes the file descriptor and releases character
device. In case the channel appears again before the application closes the
file descriptor it holds, the channel cannot be linked.

This patch changes the described behavior and destroys the character
device at the time the channel get disconnected from the AIM.

Signed-off-by: Andrey Shvetsov <andrey.shvetsov@k2l.de>
Signed-off-by: Christian Gromm <christian.gromm@microchip.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
  • Loading branch information
Andrey Shvetsov authored and Greg Kroah-Hartman committed Apr 8, 2017
1 parent 5f78862 commit 2c4aaa1
Showing 1 changed file with 10 additions and 6 deletions.
16 changes: 10 additions & 6 deletions drivers/staging/most/aim-cdev/cdev.c
Original file line number Diff line number Diff line change
Expand Up @@ -99,11 +99,16 @@ static void destroy_cdev(struct aim_channel *c)

device_destroy(aim_class, c->devno);
cdev_del(&c->cdev);
kfifo_free(&c->fifo);
spin_lock_irqsave(&ch_list_lock, flags);
list_del(&c->list);
spin_unlock_irqrestore(&ch_list_lock, flags);
}

static void destroy_channel(struct aim_channel *c)
{
ida_simple_remove(&minor_id, MINOR(c->devno));
kfifo_free(&c->fifo);
kfree(c);
}

/**
Expand Down Expand Up @@ -170,9 +175,8 @@ static int aim_close(struct inode *inode, struct file *filp)
stop_channel(c);
mutex_unlock(&c->io_mutex);
} else {
destroy_cdev(c);
mutex_unlock(&c->io_mutex);
kfree(c);
destroy_channel(c);
}
return 0;
}
Expand Down Expand Up @@ -337,14 +341,14 @@ static int aim_disconnect_channel(struct most_interface *iface, int channel_id)
spin_lock(&c->unlink);
c->dev = NULL;
spin_unlock(&c->unlink);
destroy_cdev(c);
if (c->access_ref) {
stop_channel(c);
wake_up_interruptible(&c->wq);
mutex_unlock(&c->io_mutex);
} else {
destroy_cdev(c);
mutex_unlock(&c->io_mutex);
kfree(c);
destroy_channel(c);
}
return 0;
}
Expand Down Expand Up @@ -546,7 +550,7 @@ static void __exit mod_exit(void)

list_for_each_entry_safe(c, tmp, &channel_list, list) {
destroy_cdev(c);
kfree(c);
destroy_channel(c);
}
class_destroy(aim_class);
unregister_chrdev_region(aim_devno, 1);
Expand Down

0 comments on commit 2c4aaa1

Please sign in to comment.