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)
|
if ((flags & O_DIRECTORY) == O_DIRECTORY)
|
||||||
return CEPH_FILE_MODE_PIN;
|
return CEPH_FILE_MODE_PIN;
|
||||||
#endif
|
#endif
|
||||||
if ((flags & O_APPEND) == O_APPEND)
|
|
||||||
flags |= O_WRONLY;
|
|
||||||
|
|
||||||
if ((flags & O_ACCMODE) == O_RDWR)
|
switch (flags & O_ACCMODE) {
|
||||||
mode = CEPH_FILE_MODE_RDWR;
|
case O_WRONLY:
|
||||||
else if ((flags & O_ACCMODE) == O_WRONLY)
|
|
||||||
mode = CEPH_FILE_MODE_WR;
|
mode = CEPH_FILE_MODE_WR;
|
||||||
else
|
break;
|
||||||
|
case O_RDONLY:
|
||||||
mode = CEPH_FILE_MODE_RD;
|
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
|
#ifdef O_LAZY
|
||||||
if (flags & O_LAZY)
|
if (flags & O_LAZY)
|
||||||
mode |= CEPH_FILE_MODE_LAZY;
|
mode |= CEPH_FILE_MODE_LAZY;
|
||||||
|
|
Loading…
Reference in a new issue