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 = le32_to_cpu(layout->fl_stripe_unit); 13 __u32 sc = le32_to_cpu(layout->fl_stripe_count); 14 __u32 os = le32_to_cpu(layout->fl_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 30 31int ceph_flags_to_mode(int flags) 32{ 33 int mode; 34 35#ifdef O_DIRECTORY /* fixme */ 36 if ((flags & O_DIRECTORY) == O_DIRECTORY) 37 return CEPH_FILE_MODE_PIN; 38#endif 39 40 switch (flags & O_ACCMODE) { 41 case O_WRONLY: 42 mode = CEPH_FILE_MODE_WR; 43 break; 44 case O_RDONLY: 45 mode = CEPH_FILE_MODE_RD; 46 break; 47 case O_RDWR: 48 case O_ACCMODE: /* this is what the VFS does */ 49 mode = CEPH_FILE_MODE_RDWR; 50 break; 51 } 52#ifdef O_LAZY 53 if (flags & O_LAZY) 54 mode |= CEPH_FILE_MODE_LAZY; 55#endif 56 57 return mode; 58} 59EXPORT_SYMBOL(ceph_flags_to_mode); 60 61int ceph_caps_for_mode(int mode) 62{ 63 int caps = CEPH_CAP_PIN; 64 65 if (mode & CEPH_FILE_MODE_RD) 66 caps |= CEPH_CAP_FILE_SHARED | 67 CEPH_CAP_FILE_RD | CEPH_CAP_FILE_CACHE; 68 if (mode & CEPH_FILE_MODE_WR) 69 caps |= CEPH_CAP_FILE_EXCL | 70 CEPH_CAP_FILE_WR | CEPH_CAP_FILE_BUFFER | 71 CEPH_CAP_AUTH_SHARED | CEPH_CAP_AUTH_EXCL | 72 CEPH_CAP_XATTR_SHARED | CEPH_CAP_XATTR_EXCL; 73 if (mode & CEPH_FILE_MODE_LAZY) 74 caps |= CEPH_CAP_FILE_LAZYIO; 75 76 return caps; 77} 78EXPORT_SYMBOL(ceph_caps_for_mode); 79