mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-26 21:54:11 +08:00
0dee3c28af
These headers describe the types used to exchange messages between the Ceph client and various servers. All types are little-endian and packed. These headers are shared between the kernel and userspace, so all types are in terms of e.g. __u32. Additionally, we define a few magic values to identify the current version of the protocol(s) in use, so that discrepancies to be detected on mount. Signed-off-by: Sage Weil <sage@newdream.net>
81 lines
2.0 KiB
C
81 lines
2.0 KiB
C
/*
|
|
* Some non-inline ceph helpers
|
|
*/
|
|
#include "types.h"
|
|
|
|
int ceph_flags_to_mode(int flags)
|
|
{
|
|
#ifdef O_DIRECTORY /* fixme */
|
|
if ((flags & O_DIRECTORY) == O_DIRECTORY)
|
|
return CEPH_FILE_MODE_PIN;
|
|
#endif
|
|
#ifdef O_LAZY
|
|
if (flags & O_LAZY)
|
|
return CEPH_FILE_MODE_LAZY;
|
|
#endif
|
|
if ((flags & O_APPEND) == O_APPEND)
|
|
flags |= O_WRONLY;
|
|
|
|
flags &= O_ACCMODE;
|
|
if ((flags & O_RDWR) == O_RDWR)
|
|
return CEPH_FILE_MODE_RDWR;
|
|
if ((flags & O_WRONLY) == O_WRONLY)
|
|
return CEPH_FILE_MODE_WR;
|
|
return CEPH_FILE_MODE_RD;
|
|
}
|
|
|
|
int ceph_caps_for_mode(int mode)
|
|
{
|
|
switch (mode) {
|
|
case CEPH_FILE_MODE_PIN:
|
|
return CEPH_CAP_PIN;
|
|
case CEPH_FILE_MODE_RD:
|
|
return CEPH_CAP_PIN | CEPH_CAP_FILE_SHARED |
|
|
CEPH_CAP_FILE_RD | CEPH_CAP_FILE_CACHE;
|
|
case CEPH_FILE_MODE_RDWR:
|
|
return CEPH_CAP_PIN | CEPH_CAP_FILE_SHARED |
|
|
CEPH_CAP_FILE_EXCL |
|
|
CEPH_CAP_FILE_RD | CEPH_CAP_FILE_CACHE |
|
|
CEPH_CAP_FILE_WR | CEPH_CAP_FILE_BUFFER |
|
|
CEPH_CAP_AUTH_SHARED | CEPH_CAP_AUTH_EXCL |
|
|
CEPH_CAP_XATTR_SHARED | CEPH_CAP_XATTR_EXCL;
|
|
case CEPH_FILE_MODE_WR:
|
|
return CEPH_CAP_PIN | CEPH_CAP_FILE_SHARED |
|
|
CEPH_CAP_FILE_EXCL |
|
|
CEPH_CAP_FILE_WR | CEPH_CAP_FILE_BUFFER |
|
|
CEPH_CAP_AUTH_SHARED | CEPH_CAP_AUTH_EXCL |
|
|
CEPH_CAP_XATTR_SHARED | CEPH_CAP_XATTR_EXCL;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
/* Name hashing routines. Initial hash value */
|
|
/* Hash courtesy of the R5 hash in reiserfs modulo sign bits */
|
|
#define ceph_init_name_hash() 0
|
|
|
|
/* partial hash update function. Assume roughly 4 bits per character */
|
|
static unsigned long ceph_partial_name_hash(unsigned long c,
|
|
unsigned long prevhash)
|
|
{
|
|
return (prevhash + (c << 4) + (c >> 4)) * 11;
|
|
}
|
|
|
|
/*
|
|
* Finally: cut down the number of bits to a int value (and try to avoid
|
|
* losing bits)
|
|
*/
|
|
static unsigned long ceph_end_name_hash(unsigned long hash)
|
|
{
|
|
return hash & 0xffffffff;
|
|
}
|
|
|
|
/* Compute the hash for a name string. */
|
|
unsigned int ceph_full_name_hash(const char *name, unsigned int len)
|
|
{
|
|
unsigned long hash = ceph_init_name_hash();
|
|
while (len--)
|
|
hash = ceph_partial_name_hash(*name++, hash);
|
|
return ceph_end_name_hash(hash);
|
|
}
|
|
|