diff --git a/examples/sleep.c b/examples/sleep.c index 8ce7ff9..520a3e0 100644 --- a/examples/sleep.c +++ b/examples/sleep.c @@ -92,12 +92,18 @@ static DECLARE_WAIT_QUEUE_HEAD(waitq); /* Called when the /proc file is opened */ static int module_open(struct inode *inode, struct file *file) { + /* Try to get without blocking */ + if (!atomic_cmpxchg(&already_open, 0, 1)) { + /* Success without blocking, allow the access */ + try_module_get(THIS_MODULE); + return 0; + } /* If the file's flags include O_NONBLOCK, it means the process does not - * want to wait for the file. In this case, if the file is already open, + * want to wait for the file. In this case, because the file is already open, * we should fail with -EAGAIN, meaning "you will have to try again", * instead of blocking a process which would rather stay awake. */ - if ((file->f_flags & O_NONBLOCK) && atomic_read(&already_open)) + if (file->f_flags & O_NONBLOCK) return -EAGAIN; /* This is the correct place for try_module_get(THIS_MODULE) because if