1 // SPDX-License-Identifier: GPL-2.0
3 * Some non-inline ceph helpers
5 #include <linux/module.h>
6 #include <linux/ceph/types.h>
9 * return true if @layout appears to be valid
11 int ceph_file_layout_is_valid(const struct ceph_file_layout
*layout
)
13 __u32 su
= layout
->stripe_unit
;
14 __u32 sc
= layout
->stripe_count
;
15 __u32 os
= layout
->object_size
;
17 /* stripe unit, object size must be non-zero, 64k increment */
18 if (!su
|| (su
& (CEPH_MIN_STRIPE_UNIT
-1)))
20 if (!os
|| (os
& (CEPH_MIN_STRIPE_UNIT
-1)))
22 /* object size must be a multiple of stripe unit */
23 if (os
< su
|| os
% su
)
25 /* stripe count must be non-zero */
31 void ceph_file_layout_from_legacy(struct ceph_file_layout
*fl
,
32 struct ceph_file_layout_legacy
*legacy
)
34 fl
->stripe_unit
= le32_to_cpu(legacy
->fl_stripe_unit
);
35 fl
->stripe_count
= le32_to_cpu(legacy
->fl_stripe_count
);
36 fl
->object_size
= le32_to_cpu(legacy
->fl_object_size
);
37 fl
->pool_id
= le32_to_cpu(legacy
->fl_pg_pool
);
38 if (fl
->pool_id
== 0 && fl
->stripe_unit
== 0 &&
39 fl
->stripe_count
== 0 && fl
->object_size
== 0)
42 EXPORT_SYMBOL(ceph_file_layout_from_legacy
);
44 void ceph_file_layout_to_legacy(struct ceph_file_layout
*fl
,
45 struct ceph_file_layout_legacy
*legacy
)
47 legacy
->fl_stripe_unit
= cpu_to_le32(fl
->stripe_unit
);
48 legacy
->fl_stripe_count
= cpu_to_le32(fl
->stripe_count
);
49 legacy
->fl_object_size
= cpu_to_le32(fl
->object_size
);
51 legacy
->fl_pg_pool
= cpu_to_le32(fl
->pool_id
);
53 legacy
->fl_pg_pool
= 0;
55 EXPORT_SYMBOL(ceph_file_layout_to_legacy
);
57 int ceph_flags_to_mode(int flags
)
61 #ifdef O_DIRECTORY /* fixme */
62 if ((flags
& O_DIRECTORY
) == O_DIRECTORY
)
63 return CEPH_FILE_MODE_PIN
;
66 switch (flags
& O_ACCMODE
) {
68 mode
= CEPH_FILE_MODE_WR
;
71 mode
= CEPH_FILE_MODE_RD
;
74 case O_ACCMODE
: /* this is what the VFS does */
75 mode
= CEPH_FILE_MODE_RDWR
;
80 mode
|= CEPH_FILE_MODE_LAZY
;
85 EXPORT_SYMBOL(ceph_flags_to_mode
);
87 int ceph_caps_for_mode(int mode
)
89 int caps
= CEPH_CAP_PIN
;
91 if (mode
& CEPH_FILE_MODE_RD
)
92 caps
|= CEPH_CAP_FILE_SHARED
|
93 CEPH_CAP_FILE_RD
| CEPH_CAP_FILE_CACHE
;
94 if (mode
& CEPH_FILE_MODE_WR
)
95 caps
|= CEPH_CAP_FILE_EXCL
|
96 CEPH_CAP_FILE_WR
| CEPH_CAP_FILE_BUFFER
|
97 CEPH_CAP_AUTH_SHARED
| CEPH_CAP_AUTH_EXCL
|
98 CEPH_CAP_XATTR_SHARED
| CEPH_CAP_XATTR_EXCL
;
99 if (mode
& CEPH_FILE_MODE_LAZY
)
100 caps
|= CEPH_CAP_FILE_LAZYIO
;
104 EXPORT_SYMBOL(ceph_caps_for_mode
);