Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
fork

Configure Feed

Select the types of activity you want to include in your feed.

at v4.14-rc2 103 lines 2.6 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 && fl->stripe_unit == 0 && 38 fl->stripe_count == 0 && fl->object_size == 0) 39 fl->pool_id = -1; 40} 41EXPORT_SYMBOL(ceph_file_layout_from_legacy); 42 43void ceph_file_layout_to_legacy(struct ceph_file_layout *fl, 44 struct ceph_file_layout_legacy *legacy) 45{ 46 legacy->fl_stripe_unit = cpu_to_le32(fl->stripe_unit); 47 legacy->fl_stripe_count = cpu_to_le32(fl->stripe_count); 48 legacy->fl_object_size = cpu_to_le32(fl->object_size); 49 if (fl->pool_id >= 0) 50 legacy->fl_pg_pool = cpu_to_le32(fl->pool_id); 51 else 52 legacy->fl_pg_pool = 0; 53} 54EXPORT_SYMBOL(ceph_file_layout_to_legacy); 55 56int ceph_flags_to_mode(int flags) 57{ 58 int mode; 59 60#ifdef O_DIRECTORY /* fixme */ 61 if ((flags & O_DIRECTORY) == O_DIRECTORY) 62 return CEPH_FILE_MODE_PIN; 63#endif 64 65 switch (flags & O_ACCMODE) { 66 case O_WRONLY: 67 mode = CEPH_FILE_MODE_WR; 68 break; 69 case O_RDONLY: 70 mode = CEPH_FILE_MODE_RD; 71 break; 72 case O_RDWR: 73 case O_ACCMODE: /* this is what the VFS does */ 74 mode = CEPH_FILE_MODE_RDWR; 75 break; 76 } 77#ifdef O_LAZY 78 if (flags & O_LAZY) 79 mode |= CEPH_FILE_MODE_LAZY; 80#endif 81 82 return mode; 83} 84EXPORT_SYMBOL(ceph_flags_to_mode); 85 86int ceph_caps_for_mode(int mode) 87{ 88 int caps = CEPH_CAP_PIN; 89 90 if (mode & CEPH_FILE_MODE_RD) 91 caps |= CEPH_CAP_FILE_SHARED | 92 CEPH_CAP_FILE_RD | CEPH_CAP_FILE_CACHE; 93 if (mode & CEPH_FILE_MODE_WR) 94 caps |= CEPH_CAP_FILE_EXCL | 95 CEPH_CAP_FILE_WR | CEPH_CAP_FILE_BUFFER | 96 CEPH_CAP_AUTH_SHARED | CEPH_CAP_AUTH_EXCL | 97 CEPH_CAP_XATTR_SHARED | CEPH_CAP_XATTR_EXCL; 98 if (mode & CEPH_FILE_MODE_LAZY) 99 caps |= CEPH_CAP_FILE_LAZYIO; 100 101 return caps; 102} 103EXPORT_SYMBOL(ceph_caps_for_mode);