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