Revert "avoid not-allowable mutex lock condition"
authorMarek Szyprowski <m.szyprowski@samsung.com>
Wed, 25 Apr 2018 09:53:52 +0000 (11:53 +0200)
committerMarek Szyprowski <m.szyprowski@samsung.com>
Wed, 25 Apr 2018 09:53:52 +0000 (11:53 +0200)
This reverts commit 7e736066dd53d2e83d43d7baf284efcb6455ef88.

kernel/printk/printk.c

index fe70b2879b59252ed8e22e83f06bdf3311faee71..272ca69e375228e66fea172cf5091d78dae39457 100644 (file)
@@ -905,6 +905,7 @@ static ssize_t kmsg_read(struct log_buffer *log_b, struct file *file,
                        ret = wait_event_interruptible(log_b->wait,
                                                user->seq != log_b->next_seq);
                } else {
+                       rcu_read_unlock();
                        kref_get(&log_b->refcount);
                        ret = wait_event_interruptible(log_b->wait,
                                                user->seq != log_b->next_seq);
@@ -912,6 +913,7 @@ static ssize_t kmsg_read(struct log_buffer *log_b, struct file *file,
                                ret = -ENXIO;
                        if (kref_put(&log_b->refcount, log_buf_release))
                                ret = -ENXIO;
+                       rcu_read_lock();
                }
                if (ret)
                        goto out;
@@ -1016,7 +1018,6 @@ static ssize_t devkmsg_read(struct file *file, char __user *buf,
        ssize_t ret = -ENXIO;
        int minor = iminor(file->f_inode);
        struct log_buffer *log_b;
-       int found = 0;
 
        if (!user)
                return -EBADF;
@@ -1027,17 +1028,11 @@ static ssize_t devkmsg_read(struct file *file, char __user *buf,
        rcu_read_lock();
        list_for_each_entry_rcu(log_b, &log_buf.list, list) {
                if (log_b->minor == minor) {
-                       found = 1;
-                       kref_get(&log_b->refcount);
+                       ret = kmsg_read(log_b, file, buf, count, ppos);
                        break;
                }
        }
        rcu_read_unlock();
-
-       if(found){
-               ret = kmsg_read(log_b, file, buf, count, ppos);
-               kref_put(&log_b->refcount, log_buf_release);
-       }
        return ret;
 }
 
@@ -1181,7 +1176,6 @@ static int devkmsg_open(struct inode *inode, struct file *file)
        int ret = -ENXIO;
        int minor = iminor(file->f_inode);
        struct log_buffer *log_b;
-       int found = 0;
 
        /* write-only does not need any file context */
        if ((file->f_flags & O_ACCMODE) == O_WRONLY)
@@ -1199,17 +1193,11 @@ static int devkmsg_open(struct inode *inode, struct file *file)
        rcu_read_lock();
        list_for_each_entry_rcu(log_b, &log_buf.list, list) {
                if (log_b->minor == minor) {
-                       found = 1;
-                       kref_get(&log_b->refcount);
+                       ret = kmsg_open(log_b, file);
                        break;
                }
        }
        rcu_read_unlock();
-
-       if(found){
-               ret = kmsg_open(log_b, file);
-               kref_put(&log_b->refcount, log_buf_release);
-       }
        return ret;
 }