Linux Audio

Check our new training course

In-person Linux kernel drivers training

Jun 16-20, 2025
Register
Loading...
Note: File does not exist in v6.2.
  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);