typedef __u32 ceph_epoch_t;
-/**
+/*
* fs id
*/
struct ceph_fsid {
__u32 tv_usec;
};
+/*
+ * dir fragments
+ */
typedef __u32 ceph_frag_t;
+static inline __u32 frag_make(__u32 b, __u32 v) { return (b << 24) | (v & (0xffffffffull >> (32-b))); }
+static inline __u32 frag_bits(__u32 f) { return f >> 24; }
+static inline __u32 frag_value(__u32 f) { return f & 0xffffffu; }
+static inline __u32 frag_mask(__u32 f) { return 0xffffffffull >> (32-frag_bits(f)); }
+static inline __u32 frag_next(__u32 f) { return (frag_bits(f) << 24) | (frag_value(f)+1); }
+
/*
* object layout - how objects are mapped into PGs
struct ceph_inode_cap *ceph_open(struct inode *inode, struct file *file, int flags)
{
- struct ceph_inode_info *ci = ceph_inode(inode);
struct ceph_mds_client *mdsc = &ceph_inode_to_client(inode)->mdsc;
ceph_ino_t pathbase;
char path[PATH_MAX];
filp->f_pos++;
}
- // next frag? FIXME ***
+ /* more frags? */
+ if (frag_value(frag) != frag_mask(frag)) {
+ frag = frag_next(frag);
+ off = 0;
+ filp->f_pos = make_fpos(frag, off);
+ dout(10, "dir_readdir next frag is %u\n", frag);
+ goto nextfrag;
+ }
dout(20, "dir_readdir done.\n");
return 0;