Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
at v4.9-rc4 102 lines 2.5 kB view raw
1/* 2 * Some non-inline ceph helpers 3 */ 4#include <linux/module.h> 5#include <linux/ceph/types.h> 6 7/* 8 * return true if @layout appears to be valid 9 */ 10int ceph_file_layout_is_valid(const struct ceph_file_layout *layout) 11{ 12 __u32 su = layout->stripe_unit; 13 __u32 sc = layout->stripe_count; 14 __u32 os = layout->object_size; 15 16 /* stripe unit, object size must be non-zero, 64k increment */ 17 if (!su || (su & (CEPH_MIN_STRIPE_UNIT-1))) 18 return 0; 19 if (!os || (os & (CEPH_MIN_STRIPE_UNIT-1))) 20 return 0; 21 /* object size must be a multiple of stripe unit */ 22 if (os < su || os % su) 23 return 0; 24 /* stripe count must be non-zero */ 25 if (!sc) 26 return 0; 27 return 1; 28} 29 30void ceph_file_layout_from_legacy(struct ceph_file_layout *fl, 31 struct ceph_file_layout_legacy *legacy) 32{ 33 fl->stripe_unit = le32_to_cpu(legacy->fl_stripe_unit); 34 fl->stripe_count = le32_to_cpu(legacy->fl_stripe_count); 35 fl->object_size = le32_to_cpu(legacy->fl_object_size); 36 fl->pool_id = le32_to_cpu(legacy->fl_pg_pool); 37 if (fl->pool_id == 0) 38 fl->pool_id = -1; 39} 40EXPORT_SYMBOL(ceph_file_layout_from_legacy); 41 42void ceph_file_layout_to_legacy(struct ceph_file_layout *fl, 43 struct ceph_file_layout_legacy *legacy) 44{ 45 legacy->fl_stripe_unit = cpu_to_le32(fl->stripe_unit); 46 legacy->fl_stripe_count = cpu_to_le32(fl->stripe_count); 47 legacy->fl_object_size = cpu_to_le32(fl->object_size); 48 if (fl->pool_id >= 0) 49 legacy->fl_pg_pool = cpu_to_le32(fl->pool_id); 50 else 51 legacy->fl_pg_pool = 0; 52} 53EXPORT_SYMBOL(ceph_file_layout_to_legacy); 54 55int ceph_flags_to_mode(int flags) 56{ 57 int mode; 58 59#ifdef O_DIRECTORY /* fixme */ 60 if ((flags & O_DIRECTORY) == O_DIRECTORY) 61 return CEPH_FILE_MODE_PIN; 62#endif 63 64 switch (flags & O_ACCMODE) { 65 case O_WRONLY: 66 mode = CEPH_FILE_MODE_WR; 67 break; 68 case O_RDONLY: 69 mode = CEPH_FILE_MODE_RD; 70 break; 71 case O_RDWR: 72 case O_ACCMODE: /* this is what the VFS does */ 73 mode = CEPH_FILE_MODE_RDWR; 74 break; 75 } 76#ifdef O_LAZY 77 if (flags & O_LAZY) 78 mode |= CEPH_FILE_MODE_LAZY; 79#endif 80 81 return mode; 82} 83EXPORT_SYMBOL(ceph_flags_to_mode); 84 85int ceph_caps_for_mode(int mode) 86{ 87 int caps = CEPH_CAP_PIN; 88 89 if (mode & CEPH_FILE_MODE_RD) 90 caps |= CEPH_CAP_FILE_SHARED | 91 CEPH_CAP_FILE_RD | CEPH_CAP_FILE_CACHE; 92 if (mode & CEPH_FILE_MODE_WR) 93 caps |= CEPH_CAP_FILE_EXCL | 94 CEPH_CAP_FILE_WR | CEPH_CAP_FILE_BUFFER | 95 CEPH_CAP_AUTH_SHARED | CEPH_CAP_AUTH_EXCL | 96 CEPH_CAP_XATTR_SHARED | CEPH_CAP_XATTR_EXCL; 97 if (mode & CEPH_FILE_MODE_LAZY) 98 caps |= CEPH_CAP_FILE_LAZYIO; 99 100 return caps; 101} 102EXPORT_SYMBOL(ceph_caps_for_mode);