Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0
0002 /*
0003  * Some non-inline ceph helpers
0004  */
0005 #include <linux/module.h>
0006 #include <linux/ceph/types.h>
0007 
0008 /*
0009  * return true if @layout appears to be valid
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     /* stripe unit, object size must be non-zero, 64k increment */
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     /* object size must be a multiple of stripe unit */
0023     if (os < su || os % su)
0024         return 0;
0025     /* stripe count must be non-zero */
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  /* fixme */
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: /* this is what the VFS does */
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 }