it != fd_map.end();
it++) {
Fh *fh = it->second;
- dout(1) << "tear_down_cache forcing close of fh " << it->first << " ino " << fh->inode->inode.ino << dendl;
+ dout(1) << "tear_down_cache forcing close of fh " << it->first << " ino " << fh->inode->ino << dendl;
put_inode(fh->inode);
delete fh;
}
void Client::dump_inode(Inode *in, set<Inode*>& did)
{
- dout(1) << "dump_inode: inode " << in->ino() << " ref " << in->ref << " dir " << in->dir << dendl;
+ dout(1) << "dump_inode: inode " << in->ino << " ref " << in->ref << " dir " << in->dir << dendl;
if (in->dir) {
dout(1) << " dir size " << in->dir->dentries.size() << dendl;
if (!dn) break; // done
dout(15) << "trim_cache unlinking dn " << dn->name
- << " in dir " << hex << dn->dir->parent_inode->inode.ino
+ << " in dir " << hex << dn->dir->parent_inode->ino
<< dendl;
unlink(dn);
}
{
bool warn = false;
- if (truncate_seq > in->inode.truncate_seq ||
- (truncate_seq == in->inode.truncate_seq && size > in->inode.size)) {
- dout(10) << "size " << in->inode.size << " -> " << size << dendl;
- in->inode.size = size;
+ if (truncate_seq > in->truncate_seq ||
+ (truncate_seq == in->truncate_seq && size > in->size)) {
+ dout(10) << "size " << in->size << " -> " << size << dendl;
+ in->size = size;
in->reported_size = size;
- in->inode.truncate_size = truncate_size;
+ in->truncate_size = truncate_size;
}
// be careful with size, mtime, atime
if (issued & CEPH_CAP_FILE_EXCL) {
- if (ctime > in->inode.ctime)
- in->inode.ctime = ctime;
- if (time_warp_seq > in->inode.time_warp_seq)
+ if (ctime > in->ctime)
+ in->ctime = ctime;
+ if (time_warp_seq > in->time_warp_seq)
dout(0) << "WARNING: " << *in << " mds time_warp_seq "
- << time_warp_seq << " > " << in->inode.time_warp_seq << dendl;
+ << time_warp_seq << " > " << in->time_warp_seq << dendl;
} else if (issued & (CEPH_CAP_FILE_WR|CEPH_CAP_FILE_BUFFER)) {
- if (time_warp_seq > in->inode.time_warp_seq) {
- in->inode.ctime = ctime;
- in->inode.mtime = mtime;
- in->inode.atime = atime;
- in->inode.time_warp_seq = time_warp_seq;
- } else if (time_warp_seq == in->inode.time_warp_seq) {
- if (ctime > in->inode.ctime)
- in->inode.ctime = ctime;
- if (mtime > in->inode.mtime)
- in->inode.mtime = mtime;
- if (atime > in->inode.atime)
- in->inode.atime = atime;
+ if (time_warp_seq > in->time_warp_seq) {
+ in->ctime = ctime;
+ in->mtime = mtime;
+ in->atime = atime;
+ in->time_warp_seq = time_warp_seq;
+ } else if (time_warp_seq == in->time_warp_seq) {
+ if (ctime > in->ctime)
+ in->ctime = ctime;
+ if (mtime > in->mtime)
+ in->mtime = mtime;
+ if (atime > in->atime)
+ in->atime = atime;
} else
warn = true;
} else {
- if (time_warp_seq >= in->inode.time_warp_seq) {
- in->inode.ctime = ctime;
- in->inode.mtime = mtime;
- in->inode.atime = atime;
- in->inode.time_warp_seq = time_warp_seq;
+ if (time_warp_seq >= in->time_warp_seq) {
+ in->ctime = ctime;
+ in->mtime = mtime;
+ in->atime = atime;
+ in->time_warp_seq = time_warp_seq;
} else
warn = true;
}
if (warn) {
dout(0) << *in << " mds time_warp_seq "
- << in->inode.time_warp_seq << " -> "
+ << in->time_warp_seq << " -> "
<< time_warp_seq
<< dendl;
}
else {
in = new Inode(st->vino, &st->layout);
inode_map[st->vino] = in;
- if (in->ino() == 1) {
+ if (in->ino == 1) {
root = in;
root->dir_auth = 0;
cwd = root;
}
if (st->cap.caps & CEPH_CAP_PIN) {
- in->inode.ino = st->vino.ino;
+ in->ino = st->vino.ino;
in->snapid = st->vino.snapid;
- in->inode.rdev = st->rdev;
+ in->rdev = st->rdev;
in->dirfragtree = st->dirfragtree; // FIXME look at the mask!
if ((issued & CEPH_CAP_AUTH_EXCL) == 0) {
- in->inode.mode = st->mode;
- in->inode.uid = st->uid;
- in->inode.gid = st->gid;
+ in->mode = st->mode;
+ in->uid = st->uid;
+ in->gid = st->gid;
}
if ((issued & CEPH_CAP_LINK_EXCL) == 0) {
- in->inode.nlink = st->nlink;
- in->inode.anchored = false; /* lie */
+ in->nlink = st->nlink;
}
if ((issued & CEPH_CAP_XATTR_EXCL) == 0 &&
st->xattrbl.length() &&
- st->xattr_version > in->inode.xattr_version) {
+ st->xattr_version > in->xattr_version) {
bufferlist::iterator p = st->xattrbl.begin();
::decode(in->xattrs, p);
- in->inode.xattr_version = st->xattr_version;
+ in->xattr_version = st->xattr_version;
}
- in->inode.dirstat = st->dirstat;
- in->inode.rstat = st->rstat;
+ in->dirstat = st->dirstat;
+ in->rstat = st->rstat;
- in->inode.layout = st->layout;
- in->inode.ctime = st->ctime;
- in->inode.max_size = st->max_size; // right?
+ in->layout = st->layout;
+ in->ctime = st->ctime;
+ in->max_size = st->max_size; // right?
update_inode_file_bits(in, st->truncate_seq, st->truncate_size, st->size,
st->time_warp_seq, st->ctime, st->mtime, st->atime,
}
// symlink?
- if (in->inode.is_symlink())
+ if (in->is_symlink())
in->symlink = st->symlink;
return in;
dn = dir->dentries[dname];
dout(12) << "insert_dentry_inode " << dname << " vino " << in->vino()
- << " in dir " << dir->parent_inode->inode.ino
+ << " in dir " << dir->parent_inode->ino
<< dendl;
if (dn) {
if (dst->frag == frag_t()) {
in->dir_auth = dst->auth;
} else {
- dout(20) << "got dirfrag map for " << in->inode.ino << " frag " << dst->frag << " to mds " << dst->auth << dendl;
+ dout(20) << "got dirfrag map for " << in->ino << " frag " << dst->frag << " to mds " << dst->auth << dendl;
in->fragmap[dst->frag] = dst->auth;
}
if (!st->dirfrag_dist.empty()) { // FIXME
set<int> dist = st->dirfrag_dist.begin()->second;
if (dist.empty() && !in->dir_contacts.empty())
- dout(9) << "lost dist spec for " << in->inode.ino
+ dout(9) << "lost dist spec for " << in->ino
<< " " << dist << dendl;
if (!dist.empty() && in->dir_contacts.empty())
- dout(9) << "got dist spec for " << in->inode.ino
+ dout(9) << "got dist spec for " << in->ino
<< " " << dist << dendl;
in->dir_contacts = dist;
}
if (reply->head.is_dentry) {
Inode *diri = add_update_inode(&dirst, from, mds);
- update_dir_dist(diri, &dst); // dir stat info is attached to inode...
+ update_dir_dist(diri, &dst); // dir stat info is attached to ..
if (in) {
Dir *dir = diri->open_dir();
unsigned i;
for (i=0; i<depth; i++) {
// dir?
- if (diri && diri->inode.is_dir() && diri->dir) {
+ if (diri && diri->is_dir() && diri->dir) {
Dir *dir = diri->dir;
// do we have the next dentry?
break;
}
- dout(7) << " have path seg " << i << " on " << diri->dir_auth << " ino " << diri->inode.ino << " " << req->get_filepath()[i] << dendl;
+ dout(7) << " have path seg " << i << " on " << diri->dir_auth << " ino " << diri->ino << " " << req->get_filepath()[i] << dendl;
if (i == depth-1) { // last one!
item = dir->dentries[ req->get_filepath()[i] ]->inode;
} else {
// balance our traffic!
mds = diri->pick_replica(mdsmap); // for the _inode_
- dout(20) << "for " << req->get_filepath() << " diri " << diri->inode.ino << " rep "
+ dout(20) << "for " << req->get_filepath() << " diri " << diri->ino << " rep "
<< diri->dir_contacts
<< " mds" << mds << dendl;
}
path.get_ino(), path.get_path(), // ino
in->caps_wanted(), // wanted
in->caps[mds]->issued, // issued
- in->inode.size, in->inode.mtime, in->inode.atime, in->snaprealm->ino);
+ in->size, in->mtime, in->atime, in->snaprealm->ino);
if (did_snaprealm.count(in->snaprealm->ino) == 0) {
dout(10) << " snaprealm " << *in->snaprealm << dendl;
// dentry?
if (dn->lease_mds >= 0 && now < dn->lease_ttl && mdsmap->is_up(dn->lease_mds)) {
dout(10) << "release_lease mds" << dn->lease_mds << " mask " << mask
- << " on " << in->ino() << " " << dn->name << dendl;
+ << " on " << in->ino << " " << dn->name << dendl;
messenger->send_message(new MClientLease(CEPH_MDS_LEASE_RELEASE, dn->lease_seq,
CEPH_LOCK_DN,
- in->ino(), in->snapid, in->snapid, dn->name),
+ in->ino, in->snapid, in->snapid, dn->name),
mdsmap->get_inst(dn->lease_mds));
}
}
void Client::put_inode(Inode *in, int n)
{
- //cout << "put_inode on " << in << " " << in->inode.ino << endl;
+ //cout << "put_inode on " << in << " " << in->ino << endl;
in->put(n);
if (in->ref == 0) {
// release any caps
remove_all_caps(in);
- //cout << "put_inode deleting " << in << " " << in->inode.ino << std::endl;
- objectcacher->release_set(in->ino());
+ //cout << "put_inode deleting " << in << " " << in->ino << std::endl;
+ objectcacher->release_set(in->ino);
if (in->snapdir_parent)
put_inode(in->snapdir_parent);
inode_map.erase(in->vino());
}
MClientCaps *m = new MClientCaps(op,
- in->ino(),
+ in->ino,
0,
cap->cap_id, cap->seq,
cap->issued,
m->head.issue_seq = cap->issue_seq;
m->head.client_tid = tid;
- m->head.uid = in->inode.uid;
- m->head.gid = in->inode.gid;
- m->head.mode = in->inode.mode;
+ m->head.uid = in->uid;
+ m->head.gid = in->gid;
+ m->head.mode = in->mode;
- m->head.nlink = in->inode.nlink;
+ m->head.nlink = in->nlink;
m->head.xattr_len = 0; // FIXME
- m->head.layout = in->inode.layout;
- m->head.size = in->inode.size;
- m->head.max_size = in->inode.max_size;
- m->head.truncate_seq = in->inode.truncate_seq;
- m->head.truncate_size = in->inode.truncate_size;
- in->inode.mtime.encode_timeval(&m->head.mtime);
- in->inode.atime.encode_timeval(&m->head.atime);
- in->inode.ctime.encode_timeval(&m->head.ctime);
- m->head.time_warp_seq = in->inode.time_warp_seq;
+ m->head.layout = in->layout;
+ m->head.size = in->size;
+ m->head.max_size = in->max_size;
+ m->head.truncate_seq = in->truncate_seq;
+ m->head.truncate_size = in->truncate_size;
+ in->mtime.encode_timeval(&m->head.mtime);
+ in->atime.encode_timeval(&m->head.atime);
+ in->ctime.encode_timeval(&m->head.ctime);
+ m->head.time_warp_seq = in->time_warp_seq;
- in->reported_size = in->inode.size;
+ in->reported_size = in->size;
m->set_max_size(in->wanted_max_size);
in->requested_max_size = in->wanted_max_size;
m->set_snap_follows(in->snaprealm->get_snap_context().seq);
<< " implemented " << ccap_string(cap->implemented)
<< " revoking " << ccap_string(revoking) << dendl;
- if (in->wanted_max_size > in->inode.max_size &&
+ if (in->wanted_max_size > in->max_size &&
in->wanted_max_size > in->requested_max_size)
goto ack;
/* approaching file_max? */
if ((cap->issued & CEPH_CAP_FILE_WR) &&
- (in->inode.size << 1) >= in->inode.max_size &&
- (in->reported_size << 1) < in->inode.max_size) {
+ (in->size << 1) >= in->max_size &&
+ (in->reported_size << 1) < in->max_size) {
dout(10) << "size approaching max_size" << dendl;
goto ack;
}
void Client::finish_cap_snap(Inode *in, CapSnap *capsnap, int used)
{
dout(10) << "finish_cap_snap " << *in << " capsnap " << (void*)capsnap << " used " << ccap_string(used) << dendl;
- capsnap->size = in->inode.size;
- capsnap->mtime = in->inode.mtime;
- capsnap->atime = in->inode.atime;
- capsnap->ctime = in->inode.ctime;
- capsnap->time_warp_seq = in->inode.time_warp_seq;
+ capsnap->size = in->size;
+ capsnap->mtime = in->mtime;
+ capsnap->atime = in->atime;
+ capsnap->ctime = in->ctime;
+ capsnap->time_warp_seq = in->time_warp_seq;
if (used & CEPH_CAP_FILE_BUFFER) {
dout(10) << "finish_cap_snap " << *in << " cap_snap " << capsnap << " used " << used
<< " WRBUFFER, delaying" << dendl;
if (p->second.dirty_data || p->second.writing)
continue;
p->second.flush_tid = ++last_flush_tid;
- MClientCaps *m = new MClientCaps(CEPH_CAP_OP_FLUSHSNAP, in->ino(), in->snaprealm->ino, 0, mseq);
+ MClientCaps *m = new MClientCaps(CEPH_CAP_OP_FLUSHSNAP, in->ino, in->snaprealm->ino, 0, mseq);
m->set_client_tid(p->second.flush_tid);
m->head.snap_follows = p->first;
m->head.size = p->second.size;
void Client::_release(Inode *in, bool checkafter)
{
if (in->cap_refs[CEPH_CAP_FILE_CACHE]) {
- objectcacher->release_set(in->inode.ino);
+ objectcacher->release_set(in->ino);
if (checkafter)
put_cap_ref(in, CEPH_CAP_FILE_CACHE);
else
dout(10) << "_flush " << *in << dendl;
if (!onfinish)
onfinish = new C_NoopContext;
- bool safe = objectcacher->commit_set(in->inode.ino, onfinish);
+ bool safe = objectcacher->commit_set(in->ino, onfinish);
if (safe && onfinish) {
onfinish->finish(0);
delete onfinish;
// release clean pages too, if we dont hold RDCACHE reference
if (in->cap_refs[CEPH_CAP_FILE_CACHE] == 0)
- objectcacher->release_set(in->inode.ino);
+ objectcacher->release_set(in->ino);
put_cap_ref(in, CEPH_CAP_FILE_BUFFER);
}
if (!session->release)
session->release = new MClientCapRelease;
ceph_mds_cap_item i;
- i.ino = in->ino();
+ i.ino = in->ino;
i.cap_id = cap->cap_id;
i.seq = cap->seq;
i.migrate_seq = cap->mseq;
assert(in->caps[mds]);
dout(10) << "handle_cap_trunc on ino " << *in
- << " size " << in->inode.size << " -> " << m->get_size()
+ << " size " << in->size << " -> " << m->get_size()
<< dendl;
// trim filecache?
if (g_conf.client_oc &&
- m->get_size() < in->inode.size) {
+ m->get_size() < in->size) {
// map range to objects
vector<ObjectExtent> ls;
- filer->file_to_extents(in->inode.ino, &in->inode.layout,
- m->get_size(), in->inode.size - m->get_size(),
+ filer->file_to_extents(in->ino, &in->layout,
+ m->get_size(), in->size - m->get_size(),
ls);
- objectcacher->truncate_set(in->inode.ino, ls);
+ objectcacher->truncate_set(in->ino, ls);
}
- in->reported_size = in->inode.size = m->get_size();
+ in->reported_size = in->size = m->get_size();
delete m;
}
cap->seq = m->get_seq();
- in->inode.layout = m->get_layout();
+ in->layout = m->get_layout();
// update inode
int issued = in->caps_issued();
if ((issued & CEPH_CAP_AUTH_EXCL) == 0) {
- in->inode.mode = m->head.mode;
- in->inode.uid = m->head.uid;
- in->inode.gid = m->head.gid;
+ in->mode = m->head.mode;
+ in->uid = m->head.uid;
+ in->gid = m->head.gid;
}
if ((issued & CEPH_CAP_LINK_EXCL) == 0) {
- in->inode.nlink = m->head.nlink;
- in->inode.anchored = false; /* lie */
+ in->nlink = m->head.nlink;
}
if ((issued & CEPH_CAP_XATTR_EXCL) == 0 &&
m->xattrbl.length() &&
- m->head.xattr_version > in->inode.xattr_version) {
+ m->head.xattr_version > in->xattr_version) {
bufferlist::iterator p = m->xattrbl.begin();
::decode(in->xattrs, p);
- in->inode.xattr_version = m->head.xattr_version;
+ in->xattr_version = m->head.xattr_version;
}
update_inode_file_bits(in, m->get_truncate_seq(), m->get_truncate_size(), m->get_size(),
m->get_time_warp_seq(), m->get_ctime(), m->get_mtime(), m->get_atime(), old_caps);
// max_size
bool kick_writers = false;
- if (m->get_max_size() != in->inode.max_size) {
- dout(10) << "max_size " << in->inode.max_size << " -> " << m->get_max_size() << dendl;
- in->inode.max_size = m->get_max_size();
- if (in->inode.max_size > in->wanted_max_size) {
+ if (m->get_max_size() != in->max_size) {
+ dout(10) << "max_size " << in->max_size << " -> " << m->get_max_size() << dendl;
+ in->max_size = m->get_max_size();
+ if (in->max_size > in->wanted_max_size) {
in->wanted_max_size = 0;
in->requested_max_size = 0;
}
{
int r = 0;
- if (!dir->inode.is_dir()) {
+ if (!dir->is_dir()) {
r = -ENOTDIR;
goto done;
}
return r;
cur = next;
if (i == path.depth() - 1 && followsym &&
- cur && cur->inode.is_symlink()) {
+ cur && cur->is_symlink()) {
// resolve symlink
if (cur->symlink[0] == '/') {
path = cur->symlink.c_str();
if (r < 0)
return r;
- if (!in->inode.is_symlink())
+ if (!in->is_symlink())
return -EINVAL;
// copy into buf (at most size bytes)
// make the change locally?
if (in->caps_issued_mask(CEPH_CAP_AUTH_EXCL)) {
if (mask & CEPH_SETATTR_MODE) {
- in->inode.mode = attr->st_mode;
+ in->mode = attr->st_mode;
mark_caps_dirty(in, CEPH_CAP_AUTH_EXCL);
mask &= ~CEPH_SETATTR_MODE;
}
if (mask & CEPH_SETATTR_UID) {
- in->inode.uid = attr->st_uid;
+ in->uid = attr->st_uid;
mark_caps_dirty(in, CEPH_CAP_AUTH_EXCL);
mask &= ~CEPH_SETATTR_UID;
}
if (mask & CEPH_SETATTR_GID) {
- in->inode.gid = attr->st_gid;
+ in->gid = attr->st_gid;
mark_caps_dirty(in, CEPH_CAP_AUTH_EXCL);
mask &= ~CEPH_SETATTR_GID;
}
if (in->caps_issued_mask(CEPH_CAP_FILE_EXCL)) {
if (mask & (CEPH_SETATTR_MTIME|CEPH_SETATTR_ATIME)) {
if (mask & CEPH_SETATTR_MTIME)
- in->inode.mtime = utime_t(attr->st_mtime, 0);
+ in->mtime = utime_t(attr->st_mtime, 0);
if (mask & CEPH_SETATTR_ATIME)
- in->inode.atime = utime_t(attr->st_atime, 0);
- in->inode.time_warp_seq++;
+ in->atime = utime_t(attr->st_atime, 0);
+ in->time_warp_seq++;
mark_caps_dirty(in, CEPH_CAP_FILE_EXCL);
mask &= ~(CEPH_SETATTR_MTIME|CEPH_SETATTR_ATIME);
}
int Client::fill_stat(Inode *in, struct stat *st, frag_info_t *dirstat, nest_info_t *rstat)
{
- dout(10) << "fill_stat on " << in->inode.ino << " snap/dev" << in->snapid
- << " mode 0" << oct << in->inode.mode << dec
- << " mtime " << in->inode.mtime << " ctime " << in->inode.ctime << dendl;
+ dout(10) << "fill_stat on " << in->ino << " snap/dev" << in->snapid
+ << " mode 0" << oct << in->mode << dec
+ << " mtime " << in->mtime << " ctime " << in->ctime << dendl;
memset(st, 0, sizeof(struct stat));
- st->st_ino = in->inode.ino;
+ st->st_ino = in->ino;
st->st_dev = in->snapid;
- st->st_mode = in->inode.mode;
- st->st_rdev = in->inode.rdev;
- st->st_nlink = in->inode.nlink;
- st->st_uid = in->inode.uid;
- st->st_gid = in->inode.gid;
- st->st_ctime = MAX(in->inode.ctime, in->inode.mtime);
- st->st_atime = in->inode.atime;
- st->st_mtime = in->inode.mtime;
- if (in->inode.is_dir()) {
- //st->st_size = in->inode.dirstat.size();
- st->st_size = in->inode.rstat.rbytes;
+ st->st_mode = in->mode;
+ st->st_rdev = in->rdev;
+ st->st_nlink = in->nlink;
+ st->st_uid = in->uid;
+ st->st_gid = in->gid;
+ st->st_ctime = MAX(in->ctime, in->mtime);
+ st->st_atime = in->atime;
+ st->st_mtime = in->mtime;
+ if (in->is_dir()) {
+ //st->st_size = in->dirstat.size();
+ st->st_size = in->rstat.rbytes;
st->st_blocks = 1;
} else {
- st->st_size = in->inode.size;
- st->st_blocks = (in->inode.size + 511) >> 9;
+ st->st_size = in->size;
+ st->st_blocks = (in->size + 511) >> 9;
}
- st->st_blksize = MAX(ceph_file_layout_su(in->inode.layout), 4096);
+ st->st_blksize = MAX(ceph_file_layout_su(in->layout), 4096);
if (dirstat)
- *dirstat = in->inode.dirstat;
+ *dirstat = in->dirstat;
if (rstat)
- *rstat = in->inode.rstat;
+ *rstat = in->rstat;
return in->caps_issued();
}
{
*dirpp = new DirResult(in);
(*dirpp)->set_frag(in->dirfragtree[0]);
- dout(10) << "_opendir " << in->ino() << ", our cache says the first dirfrag is " << (*dirpp)->frag() << dendl;
+ dout(10) << "_opendir " << in->ino << ", our cache says the first dirfrag is " << (*dirpp)->frag() << dendl;
// get the first frag
int r = _readdir_get_frag(*dirpp);
} else {
r = 0;
}
- dout(3) << "_opendir(" << in->ino() << ") = " << r << " (" << *dirpp << ")" << dendl;
+ dout(3) << "_opendir(" << in->ino << ") = " << r << " (" << *dirpp << ")" << dendl;
return r;
}
int stmask = fill_stat(in, &st);
frag_t fg = dirp->frag();
dirp->buffer[fg].push_back(DirEntry(name, st, stmask));
- dout(10) << "_readdir_add_dirent " << dirp << " added '" << name << "' -> " << in->inode.ino
+ dout(10) << "_readdir_add_dirent " << dirp << " added '" << name << "' -> " << in->ino
<< ", size now " << dirp->buffer[fg].size() << dendl;
}
frag_t fg = dirp->frag();
assert(dirp->buffer.count(fg) == 0);
- dout(10) << "_readdir_get_frag " << dirp << " on " << dirp->inode->ino() << " fg " << fg << dendl;
+ dout(10) << "_readdir_get_frag " << dirp << " on " << dirp->inode->ino << " fg " << fg << dendl;
int op = CEPH_MDS_OP_READDIR;
if (dirp->inode && dirp->inode->snapid == CEPH_SNAPDIR)
InodeStat ist(p);
Inode *in = _ll_get_inode(ist.vino);
- dout(15) << "_readdir_get_frag got " << dname << " to " << in->inode.ino << dendl;
+ dout(15) << "_readdir_get_frag got " << dname << " to " << in->ino << dendl;
_readdir_add_dirent(dirp, dname, in);
numdn--;
f->inode = in;
f->inode->get();
- dout(10) << in->inode.ino << " mode " << cmode << dendl;
+ dout(10) << in->ino << " mode " << cmode << dendl;
if (in->snapid != CEPH_NOSNAP) {
in->snap_cap_refs++;
break;
case SEEK_END:
- f->pos = in->inode.size + offset;
+ f->pos = in->size + offset;
break;
default:
goto wait;
}
- dout(10) << "file size: " << in->inode.size << dendl;
- if (offset > 0 && (__u64)offset >= in->inode.size) {
+ dout(10) << "file size: " << in->size << dendl;
+ if (offset > 0 && (__u64)offset >= in->size) {
if (movepos) unlock_fh_pos(f);
return 0;
}
- if ((__u64)(offset + size) > in->inode.size)
- size = in->inode.size - offset;
+ if ((__u64)(offset + size) > in->size)
+ size = in->size - offset;
if (size == 0) {
dout(10) << "read is size=0, returning 0" << dendl;
l = MAX(l, g_conf.client_readahead_min);
if (g_conf.client_readahead_max_bytes)
l = MIN(l, g_conf.client_readahead_max_bytes);
- loff_t p = ceph_file_layout_period(in->inode.layout);
+ loff_t p = ceph_file_layout_period(in->layout);
if (g_conf.client_readahead_max_periods)
l = MIN(l, g_conf.client_readahead_max_periods * p);
if (l >= 2*p)
// align with period
l -= (offset+l) % p;
// don't read past end of file
- if (offset+l > (loff_t)in->inode.size)
- l = in->inode.size - offset;
+ if (offset+l > (loff_t)in->size)
+ l = in->size - offset;
dout(10) << "readahead " << f->nr_consec_read << " reads "
<< f->consec_read_bytes << " bytes ... readahead " << offset << "~" << l
<< " (caller wants " << offset << "~" << size << ")" << dendl;
- objectcacher->file_read(in->inode.ino, &in->inode.layout, in->snapid,
+ objectcacher->file_read(in->ino, &in->layout, in->snapid,
offset, l, NULL, 0, 0);
dout(10) << "readahead initiated" << dendl;
}
// read (and possibly block)
if (in->snapid == CEPH_NOSNAP)
- r = objectcacher->file_read(in->inode.ino, &in->inode.layout, in->snapid,
+ r = objectcacher->file_read(in->ino, &in->layout, in->snapid,
offset, size, bl, 0, onfinish);
else
- r = objectcacher->file_read(in->inode.ino, &in->inode.layout, in->snapid,
+ r = objectcacher->file_read(in->ino, &in->layout, in->snapid,
offset, size, bl, 0, onfinish);
delete onfinish;
}
} else {
- r = objectcacher->file_atomic_sync_read(in->inode.ino, &in->inode.layout, in->snapid,
+ r = objectcacher->file_atomic_sync_read(in->ino, &in->layout, in->snapid,
offset, size, bl, 0, client_lock);
}
int flags = 0;
if (in->hack_balance_reads || g_conf.client_hack_balance_reads)
flags |= CEPH_OSD_FLAG_BALANCE_READS;
- filer->read(in->inode.ino, &in->inode.layout, in->snapid,
+ filer->read(in->ino, &in->layout, in->snapid,
offset, size, bl, flags, onfinish);
while (!done)
if (offset < 0) {
lock_fh_pos(f);
/*
- * FIXME: this is racy in that we may block _after_ this point waiting for caps, and inode.size may
+ * FIXME: this is racy in that we may block _after_ this point waiting for caps, and size may
* change out from under us.
*/
if (f->append)
- f->pos = in->inode.size; // O_APPEND.
+ f->pos = in->size; // O_APPEND.
offset = f->pos;
f->pos = offset+size;
unlock_fh_pos(f);
bool lazy = f->mode == CEPH_FILE_MODE_LAZY;
- dout(10) << "cur file size is " << in->inode.size << dendl;
+ dout(10) << "cur file size is " << in->size << dendl;
// time it.
utime_t start = g_clock.real_now();
// request larger max_size?
__u64 endoff = offset + size;
- if ((endoff >= in->inode.max_size ||
- endoff > (in->inode.size << 1)) &&
+ if ((endoff >= in->max_size ||
+ endoff > (in->size << 1)) &&
endoff > in->wanted_max_size) {
dout(10) << "wanted_max_size " << in->wanted_max_size << " -> " << endoff << dendl;
in->wanted_max_size = endoff;
while ((lazy && (in->caps_issued() & CEPH_CAP_FILE_LAZYIO) == 0) ||
(!lazy && in->caps_issued_mask(CEPH_CAP_FILE_WR) == false &&
(in->cap_snaps.empty() || !in->cap_snaps.rbegin()->second.writing)) ||
- endoff > in->inode.max_size) {
+ endoff > in->max_size) {
dout(7) << "missing wr|lazy cap OR endoff " << endoff
- << " > max_size " << in->inode.max_size
+ << " > max_size " << in->max_size
<< ", waiting" << dendl;
wait_on_list(in->waitfor_caps);
}
objectcacher->wait_for_write(size, client_lock);
// async, caching, non-blocking.
- objectcacher->file_write(in->inode.ino, &in->inode.layout, in->snaprealm->get_snap_context(),
+ objectcacher->file_write(in->ino, &in->layout, in->snaprealm->get_snap_context(),
offset, size, bl, g_clock.now(), 0);
} else {
// atomic, synchronous, blocking.
- objectcacher->file_atomic_sync_write(in->inode.ino, &in->inode.layout, in->snaprealm->get_snap_context(),
+ objectcacher->file_atomic_sync_write(in->ino, &in->layout, in->snaprealm->get_snap_context(),
offset, size, bl, g_clock.now(), 0, client_lock);
}
} else {
unsafe_sync_write++;
in->get_cap_ref(CEPH_CAP_FILE_BUFFER);
- filer->write(in->inode.ino, &in->inode.layout, in->snaprealm->get_snap_context(),
+ filer->write(in->ino, &in->layout, in->snaprealm->get_snap_context(),
offset, size, bl, g_clock.now(), 0, onfinish, onsafe);
while (!done)
__u64 totalwritten = size;
// extend file?
- if (totalwritten + offset > in->inode.size) {
- in->inode.size = totalwritten + offset;
+ if (totalwritten + offset > in->size) {
+ in->size = totalwritten + offset;
mark_caps_dirty(in, CEPH_CAP_FILE_WR);
- if ((in->inode.size << 1) >= in->inode.max_size &&
- (in->reported_size << 1) < in->inode.max_size)
+ if ((in->size << 1) >= in->max_size &&
+ (in->reported_size << 1) < in->max_size)
check_caps(in, false);
dout(7) << "wrote to " << totalwritten+offset << ", extending file size" << dendl;
} else {
- dout(7) << "wrote to " << totalwritten+offset << ", leaving file size at " << in->inode.size << dendl;
+ dout(7) << "wrote to " << totalwritten+offset << ", leaving file size at " << in->size << dendl;
}
// mtime
- in->inode.mtime = g_clock.real_now();
+ in->mtime = g_clock.real_now();
mark_caps_dirty(in, CEPH_CAP_FILE_WR);
put_cap_ref(in, CEPH_CAP_FILE_WR);
_flush(in);
while (in->cap_refs[CEPH_CAP_FILE_BUFFER] > 0) {
- dout(10) << "ino " << in->inode.ino << " has " << in->cap_refs[CEPH_CAP_FILE_BUFFER]
+ dout(10) << "ino " << in->ino << " has " << in->cap_refs[CEPH_CAP_FILE_BUFFER]
<< " uncommitted, waiting" << dendl;
wait_on_list(in->waitfor_commit);
}
- dout(10) << "ino " << in->inode.ino << " has no uncommitted writes" << dendl;
+ dout(10) << "ino " << in->ino << " has no uncommitted writes" << dendl;
return r;
}
put_inode(cwd);
cwd = in;
in->get();
- dout(3) << "chdir(" << relpath << ") cwd now " << cwd->ino() << dendl;
+ dout(3) << "chdir(" << relpath << ") cwd now " << cwd->ino << dendl;
return 0;
}
Inode *Client::open_snapdir(Inode *diri)
{
Inode *in;
- vinodeno_t vino(diri->ino(), CEPH_SNAPDIR);
+ vinodeno_t vino(diri->ino, CEPH_SNAPDIR);
if (!inode_map.count(vino)) {
- in = new Inode(vino, &diri->inode.layout);
- in->inode = diri->inode;
+ in = new Inode(vino, &diri->layout);
+
+ in->ino = diri->ino;
in->snapid = CEPH_SNAPDIR;
- in->inode.mode = S_IFDIR | 0600;
+ in->mode = diri->mode;
+ in->uid = diri->uid;
+ in->gid = diri->gid;
+ in->mtime = diri->mtime;
+ in->ctime = diri->ctime;
+ in->size = diri->size;
+
+ in->mode = S_IFDIR | 0600;
in->dirfragtree.clear();
inode_map[vino] = in;
in->snapdir_parent = diri;
goto out;
}
diri = inode_map[parent];
- if (!diri->inode.is_dir()) {
+ if (!diri->is_dir()) {
dout(1) << "ll_lookup " << parent << " " << name << " -> ENOTDIR (parent not a dir... WTF)" << dendl;
r = -ENOTDIR;
attr->st_ino = 0;
if (in->ll_ref == 0)
in->get();
in->ll_get();
- dout(20) << "_ll_get " << in << " " << in->inode.ino << " -> " << in->ll_ref << dendl;
+ dout(20) << "_ll_get " << in << " " << in->ino << " -> " << in->ll_ref << dendl;
}
int Client::_ll_put(Inode *in, int num)
{
in->ll_put(num);
- dout(20) << "_ll_put " << in << " " << in->inode.ino << " " << num << " -> " << in->ll_ref << dendl;
+ dout(20) << "_ll_put " << in << " " << in->ino << " " << num << " -> " << in->ll_ref << dendl;
if (in->ll_ref == 0) {
put_inode(in);
return 0;
}
}
}
- dout(3) << "_getxattr(" << in->ino() << ", \"" << name << "\", " << size << ") = " << r << dendl;
+ dout(3) << "_getxattr(" << in->ino << ", \"" << name << "\", " << size << ") = " << r << dendl;
return r;
}
r = -ERANGE;
}
}
- dout(3) << "_listxattr(" << in->ino() << ", " << size << ") = " << r << dendl;
+ dout(3) << "_listxattr(" << in->ino << ", " << size << ") = " << r << dendl;
return r;
}
int res = make_request(req, uid, gid);
trim_cache();
- dout(3) << "_setxattr(" << in->ino() << ", \"" << name << "\") = " << res << dendl;
+ dout(3) << "_setxattr(" << in->ino << ", \"" << name << "\") = " << res << dendl;
return res;
}
int res = make_request(req, uid, gid);
trim_cache();
- dout(3) << "_removexattr(" << in->ino() << ", \"" << name << "\") = " << res << dendl;
+ dout(3) << "_removexattr(" << in->ino << ", \"" << name << "\") = " << res << dendl;
return res;
}
if (in->dn) touch_dn(in->dn);
int r = 0;
- if (in->inode.is_symlink()) {
+ if (in->is_symlink()) {
*value = in->symlink.c_str();
} else {
*value = "";
int Client::_mknod(Inode *dir, const char *name, mode_t mode, dev_t rdev, int uid, int gid)
{
- dout(3) << "_mknod(" << dir->ino() << " " << name << ", 0" << oct << mode << dec << ", " << rdev << ")" << dendl;
+ dout(3) << "_mknod(" << dir->ino << " " << name << ", 0" << oct << mode << dec << ", " << rdev << ")" << dendl;
MClientRequest *req = new MClientRequest(CEPH_MDS_OP_MKNOD);
filepath path;
int Client::_link(Inode *in, Inode *dir, const char *newname, int uid, int gid)
{
MClientRequest *req = new MClientRequest(CEPH_MDS_OP_LINK);
- filepath path(newname, dir->ino());
+ filepath path(newname, dir->ino);
req->set_filepath(path);
- filepath existing(in->ino());
+ filepath existing(in->ino);
req->set_filepath2(existing);
int res = make_request(req, uid, gid);
Fh *f = fd_map[fd];
Inode *in = f->inode;
- *lp = in->inode.layout;
+ *lp = in->layout;
dout(3) << "describe_layout(" << fd << ") = 0" << dendl;
return 0;
Inode *in = f->inode;
// map to a list of extents
- filer->file_to_extents(in->inode.ino, &in->inode.layout, offset, length, result);
+ filer->file_to_extents(in->ino, &in->layout, offset, length, result);
dout(3) << "enumerate_layout(" << fd << ", " << length << ", " << offset << ") = 0" << dendl;
return 0;