]>
Commit | Line | Data |
---|---|---|
7c673cae FG |
1 | /* |
2 | * ceph_fs.cc - Some Ceph functions that are shared between kernel space and | |
3 | * user space. | |
4 | * | |
5 | */ | |
6 | ||
7 | /* | |
8 | * Some non-inline ceph helpers | |
9 | */ | |
10 | #include "include/types.h" | |
11 | ||
12 | int ceph_flags_to_mode(int flags) | |
13 | { | |
14 | /* because CEPH_FILE_MODE_PIN is zero, so mode = -1 is error */ | |
15 | int mode = -1; | |
16 | ||
7c673cae FG |
17 | if ((flags & CEPH_O_DIRECTORY) == CEPH_O_DIRECTORY) |
18 | return CEPH_FILE_MODE_PIN; | |
7c673cae FG |
19 | |
20 | switch (flags & O_ACCMODE) { | |
21 | case CEPH_O_WRONLY: | |
22 | mode = CEPH_FILE_MODE_WR; | |
23 | break; | |
24 | case CEPH_O_RDONLY: | |
25 | mode = CEPH_FILE_MODE_RD; | |
26 | break; | |
27 | case CEPH_O_RDWR: | |
28 | case O_ACCMODE: /* this is what the VFS does */ | |
29 | mode = CEPH_FILE_MODE_RDWR; | |
30 | break; | |
31 | } | |
32 | ||
11fdf7f2 TL |
33 | if (flags & CEPH_O_LAZY) |
34 | mode |= CEPH_FILE_MODE_LAZY; | |
35 | ||
7c673cae FG |
36 | return mode; |
37 | } | |
38 | ||
39 | int ceph_caps_for_mode(int mode) | |
40 | { | |
41 | int caps = CEPH_CAP_PIN; | |
42 | ||
43 | if (mode & CEPH_FILE_MODE_RD) | |
44 | caps |= CEPH_CAP_FILE_SHARED | | |
45 | CEPH_CAP_FILE_RD | CEPH_CAP_FILE_CACHE; | |
46 | if (mode & CEPH_FILE_MODE_WR) | |
47 | caps |= CEPH_CAP_FILE_EXCL | | |
48 | CEPH_CAP_FILE_WR | CEPH_CAP_FILE_BUFFER | | |
49 | CEPH_CAP_AUTH_SHARED | CEPH_CAP_AUTH_EXCL | | |
50 | CEPH_CAP_XATTR_SHARED | CEPH_CAP_XATTR_EXCL; | |
51 | if (mode & CEPH_FILE_MODE_LAZY) | |
52 | caps |= CEPH_CAP_FILE_LAZYIO; | |
53 | ||
54 | return caps; | |
55 | } | |
56 | ||
57 | int ceph_flags_sys2wire(int flags) | |
58 | { | |
59 | int wire_flags = 0; | |
60 | ||
61 | switch (flags & O_ACCMODE) { | |
62 | case O_RDONLY: | |
63 | wire_flags |= CEPH_O_RDONLY; | |
64 | break; | |
65 | case O_WRONLY: | |
66 | wire_flags |= CEPH_O_WRONLY; | |
67 | break; | |
68 | case O_RDWR: | |
69 | wire_flags |= CEPH_O_RDWR; | |
70 | break; | |
71 | } | |
72 | flags &= ~O_ACCMODE; | |
73 | ||
74 | #define ceph_sys2wire(a) if (flags & a) { wire_flags |= CEPH_##a; flags &= ~a; } | |
75 | ||
76 | ceph_sys2wire(O_CREAT); | |
77 | ceph_sys2wire(O_EXCL); | |
78 | ceph_sys2wire(O_TRUNC); | |
f67539c2 TL |
79 | |
80 | #ifndef _WIN32 | |
7c673cae FG |
81 | ceph_sys2wire(O_DIRECTORY); |
82 | ceph_sys2wire(O_NOFOLLOW); | |
f67539c2 TL |
83 | // In some cases, FILE_FLAG_BACKUP_SEMANTICS may be used instead |
84 | // of O_DIRECTORY. We may need some workarounds in order to handle | |
85 | // the fact that those flags are not available on Windows. | |
86 | #endif | |
7c673cae FG |
87 | |
88 | #undef ceph_sys2wire | |
89 | ||
90 | return wire_flags; | |
91 | } |