summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorOleg Drokin2016-08-20 23:34:25 +0200
committerGreg Kroah-Hartman2016-08-21 16:03:38 +0200
commit3a77df1180acf1cbe2276a0cbe91e5d07fbf3c47 (patch)
tree6fe98aed23ca479e2b8358e2e19d21f1b302fa2b
parentlustre: introduce lnet_copy_{k, }iov2iter(), kill lnet_copy_{k, }iov2{k, }iov() (diff)
downloadkernel-qcow2-linux-3a77df1180acf1cbe2276a0cbe91e5d07fbf3c47.tar.gz
kernel-qcow2-linux-3a77df1180acf1cbe2276a0cbe91e5d07fbf3c47.tar.xz
kernel-qcow2-linux-3a77df1180acf1cbe2276a0cbe91e5d07fbf3c47.zip
staging/lustre: Always return EEXIST on mkdir for existing names
if the name already exists, but we don't have write permissions in the parent, force talking to the MDS to determine what more sensical error code to return. This also happens to fix matlab and other such programs that assume that EEXIST is the only valid error code for mkdir of an existing directory. Signed-off-by: Oleg Drokin <green@linuxhacker.ru> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
-rw-r--r--drivers/staging/lustre/lustre/llite/namei.c8
1 files changed, 6 insertions, 2 deletions
diff --git a/drivers/staging/lustre/lustre/llite/namei.c b/drivers/staging/lustre/lustre/llite/namei.c
index ee5a42e5e95d..d13debbb08b2 100644
--- a/drivers/staging/lustre/lustre/llite/namei.c
+++ b/drivers/staging/lustre/lustre/llite/namei.c
@@ -606,8 +606,12 @@ static struct dentry *ll_lookup_nd(struct inode *parent, struct dentry *dentry,
CDEBUG(D_VFSTRACE, "VFS Op:name=%pd, dir="DFID"(%p),flags=%u\n",
dentry, PFID(ll_inode2fid(parent)), parent, flags);
- /* Optimize away (CREATE && !OPEN). Let .create handle the race. */
- if ((flags & LOOKUP_CREATE) && !(flags & LOOKUP_OPEN))
+ /* Optimize away (CREATE && !OPEN). Let .create handle the race.
+ * but only if we have write permissions there, otherwise we need
+ * to proceed with lookup. LU-4185
+ */
+ if ((flags & LOOKUP_CREATE) && !(flags & LOOKUP_OPEN) &&
+ (inode_permission(parent, MAY_WRITE | MAY_EXEC) == 0))
return NULL;
if (flags & (LOOKUP_PARENT|LOOKUP_OPEN|LOOKUP_CREATE))