ceph_fs.c 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. /*
  2. * Some non-inline ceph helpers
  3. */
  4. #include <linux/module.h>
  5. #include <linux/ceph/types.h>
  6. /*
  7. * return true if @layout appears to be valid
  8. */
  9. int ceph_file_layout_is_valid(const struct ceph_file_layout *layout)
  10. {
  11. __u32 su = le32_to_cpu(layout->fl_stripe_unit);
  12. __u32 sc = le32_to_cpu(layout->fl_stripe_count);
  13. __u32 os = le32_to_cpu(layout->fl_object_size);
  14. /* stripe unit, object size must be non-zero, 64k increment */
  15. if (!su || (su & (CEPH_MIN_STRIPE_UNIT-1)))
  16. return 0;
  17. if (!os || (os & (CEPH_MIN_STRIPE_UNIT-1)))
  18. return 0;
  19. /* object size must be a multiple of stripe unit */
  20. if (os < su || os % su)
  21. return 0;
  22. /* stripe count must be non-zero */
  23. if (!sc)
  24. return 0;
  25. return 1;
  26. }
  27. int ceph_flags_to_mode(int flags)
  28. {
  29. int mode;
  30. #ifdef O_DIRECTORY /* fixme */
  31. if ((flags & O_DIRECTORY) == O_DIRECTORY)
  32. return CEPH_FILE_MODE_PIN;
  33. #endif
  34. if ((flags & O_APPEND) == O_APPEND)
  35. flags |= O_WRONLY;
  36. if ((flags & O_ACCMODE) == O_RDWR)
  37. mode = CEPH_FILE_MODE_RDWR;
  38. else if ((flags & O_ACCMODE) == O_WRONLY)
  39. mode = CEPH_FILE_MODE_WR;
  40. else
  41. mode = CEPH_FILE_MODE_RD;
  42. #ifdef O_LAZY
  43. if (flags & O_LAZY)
  44. mode |= CEPH_FILE_MODE_LAZY;
  45. #endif
  46. return mode;
  47. }
  48. EXPORT_SYMBOL(ceph_flags_to_mode);
  49. int ceph_caps_for_mode(int mode)
  50. {
  51. int caps = CEPH_CAP_PIN;
  52. if (mode & CEPH_FILE_MODE_RD)
  53. caps |= CEPH_CAP_FILE_SHARED |
  54. CEPH_CAP_FILE_RD | CEPH_CAP_FILE_CACHE;
  55. if (mode & CEPH_FILE_MODE_WR)
  56. caps |= CEPH_CAP_FILE_EXCL |
  57. CEPH_CAP_FILE_WR | CEPH_CAP_FILE_BUFFER |
  58. CEPH_CAP_AUTH_SHARED | CEPH_CAP_AUTH_EXCL |
  59. CEPH_CAP_XATTR_SHARED | CEPH_CAP_XATTR_EXCL;
  60. if (mode & CEPH_FILE_MODE_LAZY)
  61. caps |= CEPH_CAP_FILE_LAZYIO;
  62. return caps;
  63. }
  64. EXPORT_SYMBOL(ceph_caps_for_mode);