0001
0002
0003
0004
0005 #include <linux/module.h>
0006 #include <linux/ceph/types.h>
0007
0008
0009
0010
0011 int ceph_file_layout_is_valid(const struct ceph_file_layout *layout)
0012 {
0013 __u32 su = layout->stripe_unit;
0014 __u32 sc = layout->stripe_count;
0015 __u32 os = layout->object_size;
0016
0017
0018 if (!su || (su & (CEPH_MIN_STRIPE_UNIT-1)))
0019 return 0;
0020 if (!os || (os & (CEPH_MIN_STRIPE_UNIT-1)))
0021 return 0;
0022
0023 if (os < su || os % su)
0024 return 0;
0025
0026 if (!sc)
0027 return 0;
0028 return 1;
0029 }
0030
0031 void ceph_file_layout_from_legacy(struct ceph_file_layout *fl,
0032 struct ceph_file_layout_legacy *legacy)
0033 {
0034 fl->stripe_unit = le32_to_cpu(legacy->fl_stripe_unit);
0035 fl->stripe_count = le32_to_cpu(legacy->fl_stripe_count);
0036 fl->object_size = le32_to_cpu(legacy->fl_object_size);
0037 fl->pool_id = le32_to_cpu(legacy->fl_pg_pool);
0038 if (fl->pool_id == 0 && fl->stripe_unit == 0 &&
0039 fl->stripe_count == 0 && fl->object_size == 0)
0040 fl->pool_id = -1;
0041 }
0042
0043 void ceph_file_layout_to_legacy(struct ceph_file_layout *fl,
0044 struct ceph_file_layout_legacy *legacy)
0045 {
0046 legacy->fl_stripe_unit = cpu_to_le32(fl->stripe_unit);
0047 legacy->fl_stripe_count = cpu_to_le32(fl->stripe_count);
0048 legacy->fl_object_size = cpu_to_le32(fl->object_size);
0049 if (fl->pool_id >= 0)
0050 legacy->fl_pg_pool = cpu_to_le32(fl->pool_id);
0051 else
0052 legacy->fl_pg_pool = 0;
0053 }
0054
0055 int ceph_flags_to_mode(int flags)
0056 {
0057 int mode;
0058
0059 #ifdef O_DIRECTORY
0060 if ((flags & O_DIRECTORY) == O_DIRECTORY)
0061 return CEPH_FILE_MODE_PIN;
0062 #endif
0063
0064 switch (flags & O_ACCMODE) {
0065 case O_WRONLY:
0066 mode = CEPH_FILE_MODE_WR;
0067 break;
0068 case O_RDONLY:
0069 mode = CEPH_FILE_MODE_RD;
0070 break;
0071 case O_RDWR:
0072 case O_ACCMODE:
0073 mode = CEPH_FILE_MODE_RDWR;
0074 break;
0075 }
0076 #ifdef O_LAZY
0077 if (flags & O_LAZY)
0078 mode |= CEPH_FILE_MODE_LAZY;
0079 #endif
0080
0081 return mode;
0082 }
0083
0084 int ceph_caps_for_mode(int mode)
0085 {
0086 int caps = CEPH_CAP_PIN;
0087
0088 if (mode & CEPH_FILE_MODE_RD)
0089 caps |= CEPH_CAP_FILE_SHARED |
0090 CEPH_CAP_FILE_RD | CEPH_CAP_FILE_CACHE;
0091 if (mode & CEPH_FILE_MODE_WR)
0092 caps |= CEPH_CAP_FILE_EXCL |
0093 CEPH_CAP_FILE_WR | CEPH_CAP_FILE_BUFFER |
0094 CEPH_CAP_AUTH_SHARED | CEPH_CAP_AUTH_EXCL |
0095 CEPH_CAP_XATTR_SHARED | CEPH_CAP_XATTR_EXCL;
0096 if (mode & CEPH_FILE_MODE_LAZY)
0097 caps |= CEPH_CAP_FILE_LAZYIO;
0098
0099 return caps;
0100 }