ceph: fix file mode calculation
open(2) must always include one of O_RDONLY, O_WRONLY, or O_RDWR. No need for any O_APPEND special case. Passing O_WRONLY|O_RDWR is undefined according to the man page, but the Linux VFS interprets this as O_RDWR, so we'll do the same. This fixes open(2) with flags O_RDWR|O_APPEND, which was incorrectly being translated to readonly. Reported-by: Fyodor Ustinov <ufm@ufm.su> Signed-off-by: Sage Weil <sage@newdream.net>
This commit is contained in:
parent
d7f124f129
commit
38be7a79f7
1 changed files with 10 additions and 7 deletions
|
@ -36,16 +36,19 @@ int ceph_flags_to_mode(int flags)
|
|||
if ((flags & O_DIRECTORY) == O_DIRECTORY)
|
||||
return CEPH_FILE_MODE_PIN;
|
||||
#endif
|
||||
if ((flags & O_APPEND) == O_APPEND)
|
||||
flags |= O_WRONLY;
|
||||
|
||||
if ((flags & O_ACCMODE) == O_RDWR)
|
||||
mode = CEPH_FILE_MODE_RDWR;
|
||||
else if ((flags & O_ACCMODE) == O_WRONLY)
|
||||
switch (flags & O_ACCMODE) {
|
||||
case O_WRONLY:
|
||||
mode = CEPH_FILE_MODE_WR;
|
||||
else
|
||||
break;
|
||||
case O_RDONLY:
|
||||
mode = CEPH_FILE_MODE_RD;
|
||||
|
||||
break;
|
||||
case O_RDWR:
|
||||
case O_ACCMODE: /* this is what the VFS does */
|
||||
mode = CEPH_FILE_MODE_RDWR;
|
||||
break;
|
||||
}
|
||||
#ifdef O_LAZY
|
||||
if (flags & O_LAZY)
|
||||
mode |= CEPH_FILE_MODE_LAZY;
|
||||
|
|
Loading…
Reference in a new issue