mqueue: sys_mq_open: do not call mnt_drop_write() if read-only
[platform/adaptation/renesas_rcar/renesas_kernel.git] / ipc / mqueue.c
index 023c986..3953fda 100644 (file)
@@ -477,7 +477,7 @@ static int mqueue_unlink(struct inode *dir, struct dentry *dentry)
 static ssize_t mqueue_read_file(struct file *filp, char __user *u_data,
                                size_t count, loff_t *off)
 {
-       struct mqueue_inode_info *info = MQUEUE_I(filp->f_path.dentry->d_inode);
+       struct mqueue_inode_info *info = MQUEUE_I(file_inode(filp));
        char buffer[FILENT_SIZE];
        ssize_t ret;
 
@@ -498,13 +498,13 @@ static ssize_t mqueue_read_file(struct file *filp, char __user *u_data,
        if (ret <= 0)
                return ret;
 
-       filp->f_path.dentry->d_inode->i_atime = filp->f_path.dentry->d_inode->i_ctime = CURRENT_TIME;
+       file_inode(filp)->i_atime = file_inode(filp)->i_ctime = CURRENT_TIME;
        return ret;
 }
 
 static int mqueue_flush_file(struct file *filp, fl_owner_t id)
 {
-       struct mqueue_inode_info *info = MQUEUE_I(filp->f_path.dentry->d_inode);
+       struct mqueue_inode_info *info = MQUEUE_I(file_inode(filp));
 
        spin_lock(&info->lock);
        if (task_tgid(current) == info->notify_owner)
@@ -516,7 +516,7 @@ static int mqueue_flush_file(struct file *filp, fl_owner_t id)
 
 static unsigned int mqueue_poll_file(struct file *filp, struct poll_table_struct *poll_tab)
 {
-       struct mqueue_inode_info *info = MQUEUE_I(filp->f_path.dentry->d_inode);
+       struct mqueue_inode_info *info = MQUEUE_I(file_inode(filp));
        int retval = 0;
 
        poll_wait(filp, &info->wait_q, poll_tab);
@@ -840,7 +840,8 @@ out_putfd:
                fd = error;
        }
        mutex_unlock(&root->d_inode->i_mutex);
-       mnt_drop_write(mnt);
+       if (!ro)
+               mnt_drop_write(mnt);
 out_putname:
        putname(name);
        return fd;
@@ -973,7 +974,7 @@ SYSCALL_DEFINE5(mq_timedsend, mqd_t, mqdes, const char __user *, u_msg_ptr,
                goto out;
        }
 
-       inode = f.file->f_path.dentry->d_inode;
+       inode = file_inode(f.file);
        if (unlikely(f.file->f_op != &mqueue_file_operations)) {
                ret = -EBADF;
                goto out_fput;
@@ -1089,7 +1090,7 @@ SYSCALL_DEFINE5(mq_timedreceive, mqd_t, mqdes, char __user *, u_msg_ptr,
                goto out;
        }
 
-       inode = f.file->f_path.dentry->d_inode;
+       inode = file_inode(f.file);
        if (unlikely(f.file->f_op != &mqueue_file_operations)) {
                ret = -EBADF;
                goto out_fput;
@@ -1249,7 +1250,7 @@ retry:
                goto out;
        }
 
-       inode = f.file->f_path.dentry->d_inode;
+       inode = file_inode(f.file);
        if (unlikely(f.file->f_op != &mqueue_file_operations)) {
                ret = -EBADF;
                goto out_fput;
@@ -1323,7 +1324,7 @@ SYSCALL_DEFINE3(mq_getsetattr, mqd_t, mqdes,
                goto out;
        }
 
-       inode = f.file->f_path.dentry->d_inode;
+       inode = file_inode(f.file);
        if (unlikely(f.file->f_op != &mqueue_file_operations)) {
                ret = -EBADF;
                goto out_fput;