From: Al Viro Date: Mon, 30 Jul 2012 07:50:30 +0000 (+0400) Subject: fix O_EXCL handling for devices X-Git-Tag: v3.6-rc1~18^2~30 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=f8310c59201b183ebee2e3fe0c7242f5729be0af;p=profile%2Fivi%2Fkernel-adaptation-intel-automotive.git fix O_EXCL handling for devices O_EXCL without O_CREAT has different semantics; it's "fail if already opened", not "fail if already exists". commit 71574865 broke that... Signed-off-by: Al Viro --- diff --git a/fs/namei.c b/fs/namei.c index 618d353..e133bf3 100644 --- a/fs/namei.c +++ b/fs/namei.c @@ -2418,7 +2418,7 @@ static int atomic_open(struct nameidata *nd, struct dentry *dentry, if ((open_flag & O_CREAT) && !IS_POSIXACL(dir)) mode &= ~current_umask(); - if (open_flag & O_EXCL) { + if ((open_flag & (O_EXCL | O_CREAT)) == (O_EXCL | O_CREAT)) { open_flag &= ~O_TRUNC; *opened |= FILE_CREATED; } @@ -2742,7 +2742,7 @@ retry_lookup: } error = -EEXIST; - if (open_flag & O_EXCL) + if ((open_flag & (O_EXCL | O_CREAT)) == (O_EXCL | O_CREAT)) goto exit_dput; error = follow_managed(path, nd->flags);