ceph: add ino32 mount option
The ino32 mount option forces the ceph fs to report 32 bit ino values. This is useful for 64 bit kernels with 32 bit userspace. Signed-off-by: Yehuda Sadeh <yehuda@hq.newdream.net>
This commit is contained in:

zatwierdzone przez
Sage Weil

rodzic
483fac7148
commit
ad1fee96cb
@@ -27,6 +27,7 @@
|
||||
#define CEPH_MOUNT_OPT_DIRSTAT (1<<4) /* `cat dirname` for stats */
|
||||
#define CEPH_MOUNT_OPT_RBYTES (1<<5) /* dir st_bytes = rbytes */
|
||||
#define CEPH_MOUNT_OPT_NOASYNCREADDIR (1<<7) /* no dcache readdir */
|
||||
#define CEPH_MOUNT_OPT_INO32 (1<<8) /* 32 bit inos */
|
||||
|
||||
#define CEPH_MOUNT_OPT_DEFAULT (CEPH_MOUNT_OPT_RBYTES)
|
||||
|
||||
@@ -319,6 +320,16 @@ static inline struct ceph_inode_info *ceph_inode(struct inode *inode)
|
||||
return container_of(inode, struct ceph_inode_info, vfs_inode);
|
||||
}
|
||||
|
||||
static inline struct ceph_fs_client *ceph_inode_to_client(struct inode *inode)
|
||||
{
|
||||
return (struct ceph_fs_client *)inode->i_sb->s_fs_info;
|
||||
}
|
||||
|
||||
static inline struct ceph_fs_client *ceph_sb_to_client(struct super_block *sb)
|
||||
{
|
||||
return (struct ceph_fs_client *)sb->s_fs_info;
|
||||
}
|
||||
|
||||
static inline struct ceph_vino ceph_vino(struct inode *inode)
|
||||
{
|
||||
return ceph_inode(inode)->i_vino;
|
||||
@@ -327,19 +338,49 @@ static inline struct ceph_vino ceph_vino(struct inode *inode)
|
||||
/*
|
||||
* ino_t is <64 bits on many architectures, blech.
|
||||
*
|
||||
* don't include snap in ino hash, at least for now.
|
||||
* i_ino (kernel inode) st_ino (userspace)
|
||||
* i386 32 32
|
||||
* x86_64+ino32 64 32
|
||||
* x86_64 64 64
|
||||
*/
|
||||
static inline u32 ceph_ino_to_ino32(ino_t ino)
|
||||
{
|
||||
ino ^= ino >> (sizeof(ino) * 8 - 32);
|
||||
if (!ino)
|
||||
ino = 1;
|
||||
return ino;
|
||||
}
|
||||
|
||||
/*
|
||||
* kernel i_ino value
|
||||
*/
|
||||
static inline ino_t ceph_vino_to_ino(struct ceph_vino vino)
|
||||
{
|
||||
ino_t ino = (ino_t)vino.ino; /* ^ (vino.snap << 20); */
|
||||
#if BITS_PER_LONG == 32
|
||||
ino ^= vino.ino >> (sizeof(u64)-sizeof(ino_t)) * 8;
|
||||
if (!ino)
|
||||
ino = 1;
|
||||
ino = ceph_ino_to_ino32(ino);
|
||||
#endif
|
||||
return ino;
|
||||
}
|
||||
|
||||
/*
|
||||
* user-visible ino (stat, filldir)
|
||||
*/
|
||||
#if BITS_PER_LONG == 32
|
||||
static inline ino_t ceph_translate_ino(struct super_block *sb, ino_t ino)
|
||||
{
|
||||
return ino;
|
||||
}
|
||||
#else
|
||||
static inline ino_t ceph_translate_ino(struct super_block *sb, ino_t ino)
|
||||
{
|
||||
if (ceph_test_mount_opt(ceph_sb_to_client(sb), INO32))
|
||||
ino = ceph_ino_to_ino32(ino);
|
||||
return ino;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
/* for printf-style formatting */
|
||||
#define ceph_vinop(i) ceph_inode(i)->i_vino.ino, ceph_inode(i)->i_vino.snap
|
||||
|
||||
@@ -428,13 +469,6 @@ static inline loff_t ceph_make_fpos(unsigned frag, unsigned off)
|
||||
return ((loff_t)frag << 32) | (loff_t)off;
|
||||
}
|
||||
|
||||
static inline int ceph_set_ino_cb(struct inode *inode, void *data)
|
||||
{
|
||||
ceph_inode(inode)->i_vino = *(struct ceph_vino *)data;
|
||||
inode->i_ino = ceph_vino_to_ino(*(struct ceph_vino *)data);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* caps helpers
|
||||
*/
|
||||
@@ -503,15 +537,6 @@ extern void ceph_reservation_status(struct ceph_fs_client *client,
|
||||
int *total, int *avail, int *used,
|
||||
int *reserved, int *min);
|
||||
|
||||
static inline struct ceph_fs_client *ceph_inode_to_client(struct inode *inode)
|
||||
{
|
||||
return (struct ceph_fs_client *)inode->i_sb->s_fs_info;
|
||||
}
|
||||
|
||||
static inline struct ceph_fs_client *ceph_sb_to_client(struct super_block *sb)
|
||||
{
|
||||
return (struct ceph_fs_client *)sb->s_fs_info;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
|
Reference in New Issue
Block a user