mirror of
https://github.com/edk2-porting/linux-next.git
synced 2025-01-18 18:43:59 +08:00
atomic_open(): massage the create_error logics a bit
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
This commit is contained in:
parent
9d0728e16e
commit
55db2fd936
41
fs/namei.c
41
fs/namei.c
@ -2855,33 +2855,30 @@ static int atomic_open(struct nameidata *nd, struct dentry *dentry,
|
|||||||
* Another problem is returing the "right" error value (e.g. for an
|
* Another problem is returing the "right" error value (e.g. for an
|
||||||
* O_EXCL open we want to return EEXIST not EROFS).
|
* O_EXCL open we want to return EEXIST not EROFS).
|
||||||
*/
|
*/
|
||||||
if (((open_flag & (O_CREAT | O_TRUNC)) ||
|
if (open_flag & O_CREAT) {
|
||||||
(open_flag & O_ACCMODE) != O_RDONLY) && unlikely(!got_write)) {
|
if (unlikely(!got_write)) {
|
||||||
if (!(open_flag & O_CREAT)) {
|
create_error = -EROFS;
|
||||||
|
if (open_flag & (O_EXCL | O_TRUNC)) {
|
||||||
|
/* Fall back and fail with the right error */
|
||||||
|
goto no_open;
|
||||||
|
}
|
||||||
|
/* No side effects, safe to clear O_CREAT */
|
||||||
|
open_flag &= ~O_CREAT;
|
||||||
|
} else {
|
||||||
|
create_error = may_o_create(&nd->path, dentry, mode);
|
||||||
|
if (create_error) {
|
||||||
|
if (open_flag & O_EXCL)
|
||||||
|
goto no_open;
|
||||||
|
open_flag &= ~O_CREAT;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else if ((open_flag & (O_TRUNC|O_WRONLY|O_RDWR)) &&
|
||||||
|
unlikely(!got_write)) {
|
||||||
/*
|
/*
|
||||||
* No O_CREATE -> atomicity not a requirement -> fall
|
* No O_CREATE -> atomicity not a requirement -> fall
|
||||||
* back to lookup + open
|
* back to lookup + open
|
||||||
*/
|
*/
|
||||||
goto no_open;
|
goto no_open;
|
||||||
} else if (open_flag & (O_EXCL | O_TRUNC)) {
|
|
||||||
/* Fall back and fail with the right error */
|
|
||||||
create_error = -EROFS;
|
|
||||||
goto no_open;
|
|
||||||
} else {
|
|
||||||
/* No side effects, safe to clear O_CREAT */
|
|
||||||
create_error = -EROFS;
|
|
||||||
open_flag &= ~O_CREAT;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (open_flag & O_CREAT) {
|
|
||||||
error = may_o_create(&nd->path, dentry, mode);
|
|
||||||
if (error) {
|
|
||||||
create_error = error;
|
|
||||||
if (open_flag & O_EXCL)
|
|
||||||
goto no_open;
|
|
||||||
open_flag &= ~O_CREAT;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (nd->flags & LOOKUP_DIRECTORY)
|
if (nd->flags & LOOKUP_DIRECTORY)
|
||||||
|
Loading…
Reference in New Issue
Block a user