mutex_unlock(&dir->d_inode->i_mutex);
        dput(nd->path.dentry);
        nd->path.dentry = path->dentry;
-
-       if (error)
-               return error;
-       /* Don't check for write permission, don't truncate */
-       return may_open(&nd->path, 0, open_flag & ~O_TRUNC);
+       return error;
 }
 
 /*
                        mnt_drop_write(nd->path.mnt);
                        goto exit;
                }
+               /* Don't check for write permission, don't truncate */
+               error = may_open(&nd->path, 0, op->open_flag & ~O_TRUNC);
+               if (error) {
+                       mnt_drop_write(nd->path.mnt);
+                       goto exit;
+               }
                filp = nameidata_to_filp(nd);
                mnt_drop_write(nd->path.mnt);
                path_put(&nd->path);