- msgr layer
- callbacks for 'remote reset'
- idle state, to keep connect_seq around after a disconnect
+ - make sure the radix_tree to list_head thing works right with __remove_connection..
- audit locking
- audit use of kmalloc vs spinlocks
- convert most everything in ceph_fs.h to le32/le64 notation, cleaning up userspace appropriately
- getattr should do an lstat?
- d_revalidate?
- test truncate
+- is ino_t really still 32 bits on i386?? hrm!
- mds client
/ - handle file caps, ack back to mds, etc.
- actually flush dirty data, too
dout(3) << "_utimes(" << path << ", " << mtime << ", " << atime << ")" << dendl;
MClientRequest *req = new MClientRequest(CEPH_MDS_OP_UTIME, messenger->get_myinst());
req->set_path(path);
- req->head.args.utime.mtime = mtime.tv_ref();
- req->head.args.utime.atime = atime.tv_ref();
+ mtime.encode_timeval(&req->head.args.utime.mtime);
+ atime.encode_timeval(&req->head.args.utime.atime);
// FIXME where does FUSE maintain user information
req->set_caller_uid(getuid());
return n;
}
unsigned _page_size = sysconf(_SC_PAGESIZE);
-unsigned _page_mask = ~(_page_size - 1);
-unsigned long _page_shift = _get_bits_of(_page_size);
+unsigned long _page_mask = ~(_page_size - 1);
+unsigned _page_shift = _get_bits_of(_page_size);
// file layouts
struct ceph_file_layout g_OSD_FileLayout = {
// some basic types
// NOTE: these must match ceph_fs.h typedefs
-typedef uint64_t tid_t; // transaction id
-typedef uint64_t version_t;
-typedef uint32_t epoch_t; // map epoch (32bits -> 13 epochs/second for 10 years)
+typedef __u64 tid_t; // transaction id
+typedef __u64 version_t;
+typedef __u32 epoch_t; // map epoch (32bits -> 13 epochs/second for 10 years)
#define O_LAZY 01000000
// --------------------------------------
// inode
-typedef __uint64_t _inodeno_t;
+typedef __u64 _inodeno_t;
struct inodeno_t {
_inodeno_t val;
#include <time.h>
#include "ceph_fs.h"
+#include "buffer.h"
+#include "encodable.h"
+
// --------
// utime_t
class utime_t {
- struct ceph_timeval tv;
+ struct {
+ __u32 tv_sec, tv_usec;
+ } tv;
friend class Clock;
utime_t() { tv.tv_sec = 0; tv.tv_usec = 0; normalize(); }
//utime_t(time_t s) { tv.tv_sec = s; tv.tv_usec = 0; }
utime_t(time_t s, int u) { tv.tv_sec = s; tv.tv_usec = u; normalize(); }
- utime_t(const struct ceph_timeval &v) : tv(v) {}
+ utime_t(const struct ceph_timeval &v) {
+ decode_timeval(&v);
+ }
utime_t(const struct timeval &v) {
set_from_timeval(&v);
}
tv.tv_sec = v->tv_sec;
tv.tv_usec = v->tv_usec;
}
- //struct timeval& timeval() { return tv; }
- //struct timeval& tv_ref() { return tv; }
- struct ceph_timeval& tv_ref() { return tv; }
+ void encode_timeval(struct ceph_timeval *t) const {
+ t->tv_sec = cpu_to_le32(tv.tv_sec);
+ t->tv_usec = cpu_to_le32(tv.tv_usec);
+ }
+ void decode_timeval(const struct ceph_timeval *t) {
+ tv.tv_sec = le32_to_cpu(t->tv_sec);
+ tv.tv_usec = le32_to_cpu(t->tv_usec);
+ }
+ void _encode(bufferlist &bl) {
+ ::_encode_simple(tv.tv_sec, bl);
+ ::_encode_simple(tv.tv_usec, bl);
+ }
+ void _decode(bufferlist &bl, int& off) {
+ ::_decode(tv.tv_sec, bl, off);
+ ::_decode(tv.tv_usec, bl, off);
+ }
// cast to double
operator double() {
const struct address_space_operations ceph_aops = {
.readpage = ceph_readpage,
// .readpages = ceph_readpages
+ .writepage = ceph_writepage,
};
*/
};
+
+/*
+ * totally naive write. just to get things sort of working.
+ */
+int ceph_silly_write(struct file *filp, const char __user * data,
+ size_t count, loff_t * offset)
+{
+ struct inode *inode = filp->f_path.dentry->d_inode;
+ struct ceph_inode_info *ci = ceph_inode(inode);
+ struct ceph_file_info *cf = file->private_data;
+ int ret = 0;
+
+ dout(10, "silly_write on file %p %lld~%u\n", filp, offset, count);
+
+ /* ignore caps, for now. */
+
+ if (ret > 0)
+ *offset += ret;
+
+ if (*offset > inode->i_size) {
+ inode->i_size = *offset;
+ inode->i_blocks = (inode->i_size + 512 - 1) >> 9;
+ }
+ invalidate_inode_pages2(inode->i_mapping);
+ return ret;
+}
+
const struct file_operations ceph_file_fops = {
.open = ceph_open,
.release = ceph_release,
void set_op(int o) { h.op = cpu_to_le32(o); }
void set_size(loff_t s) { h.size = cpu_to_le64(s); }
- void set_mtime(utime_t t) { h.mtime = t.tv_ref(); }
- void set_atime(utime_t t) { h.atime = t.tv_ref(); }
+ void set_mtime(const utime_t &t) { t.encode_timeval(&h.mtime); }
+ void set_atime(const utime_t &t) { t.encode_timeval(&h.atime); }
MClientFileCaps() {}
MClientFileCaps(int op,
h.size = cpu_to_le64(inode.size);
h.migrate_mds = cpu_to_le32(mmds);
h.migrate_seq = cpu_to_le32(mseq);
- h.mtime = inode.mtime.tv_ref();
- h.atime = inode.atime.tv_ref();
+ inode.mtime.encode_timeval(&h.mtime);
+ inode.atime.encode_timeval(&h.atime);
}
const char *get_type_name() { return "Cfcap";}
::_decode_simple(e, p);
inode.ino = e.ino;
inode.layout = e.layout;
- inode.ctime.tv_ref() = e.ctime;
- inode.mtime.tv_ref() = e.mtime;
- inode.atime.tv_ref() = e.atime;
+ inode.ctime.decode_timeval(&e.ctime);
+ inode.mtime.decode_timeval(&e.mtime);
+ inode.atime.decode_timeval(&e.atime);
inode.mode = e.mode;
inode.uid = e.uid;
inode.gid = e.gid;
memset(&e, 0, sizeof(e));
e.ino = in->inode.ino;
e.layout = in->inode.layout;
- e.ctime = in->inode.ctime.tv_ref();
- e.mtime = in->inode.mtime.tv_ref();
- e.atime = in->inode.atime.tv_ref();
+ in->inode.ctime.encode_timeval(&e.ctime);
+ in->inode.mtime.encode_timeval(&e.mtime);
+ in->inode.atime.encode_timeval(&e.atime);
e.mode = in->inode.mode;
e.uid = in->inode.uid;
e.gid = in->inode.gid;
if (now - my_stat.stamp > g_conf.osd_stat_refresh_interval ||
pending_ops > 2*my_stat.qlen) {
- my_stat.stamp = now.tv_ref();
+ now.encode_timeval(&my_stat.stamp);
my_stat.oprate = stat_oprate.get(now);
//read_latency_calc.set_size( 20 ); // hrm.
::_encode(fsid, bl);
::_encode(epoch, bl);
::_encode(mon_epoch, bl);
- ::_encode(ctime, bl);
+ ctime._encode(bl);
::_encode(fullmap, bl);
::_encode(crush, bl);
::_encode(new_max_osd, bl);
::_decode(fsid, bl, off);
::_decode(epoch, bl, off);
::_decode(mon_epoch, bl, off);
- ::_decode(ctime, bl, off);
+ ctime._decode(bl, off);
::_decode(fullmap, bl, off);
::_decode(crush, bl, off);
::_decode(new_max_osd, bl, off);