}
}
// dir lease?
- if ((dir->caps_issued() & CEPH_CAP_FILE_SHARED) &&
+ if (dir->caps_issued_mask(CEPH_CAP_FILE_SHARED) &&
dn->cap_shared_gen == dir->shared_gen) {
*target = dn->inode;
goto done;
int Client::_getattr(Inode *in, int mask, int uid, int gid)
{
- int issued = in->caps_issued();
+ bool yes = in->caps_issued_mask(mask);
- dout(10) << "_getattr mask " << ccap_string(mask) << " issued " << ccap_string(issued) << dendl;
- if ((issued & mask) == mask) {
+ dout(10) << "_getattr mask " << ccap_string(mask) << " issued=" << yes << dendl;
+ if (yes)
return 0;
- }
MClientRequest *req = new MClientRequest(CEPH_MDS_OP_GETATTR);
filepath path;
dout(10) << "_setattr mask " << mask << " issued " << ccap_string(issued) << dendl;
// make the change locally?
- if (issued & CEPH_CAP_AUTH_EXCL) {
+ if (in->caps_issued_mask(CEPH_CAP_AUTH_EXCL)) {
if (mask & CEPH_SETATTR_MODE) {
in->inode.mode = attr->st_mode;
mark_caps_dirty(in, CEPH_CAP_AUTH_EXCL);
mask &= ~CEPH_SETATTR_GID;
}
}
- if (issued & CEPH_CAP_FILE_EXCL) {
+ 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->get_open_ref(cmode); // make note of pending open, since it effects _wanted_ caps.
- if ((in->caps_issued() & want) == want) {
+ if (in->caps_issued_mask(want)) {
// update wanted?
check_caps(in, true);
} else {
}
} else {
// wait for RD cap?
- while ((issued & CEPH_CAP_FILE_RD) == 0) {
+ while (!in->caps_issued_mask(CEPH_CAP_FILE_RD)) {
dout(7) << " don't have read cap, waiting" << dendl;
goto wait;
}
int r = 0;
if (g_conf.client_oc) {
- if (issued & CEPH_CAP_FILE_CACHE) {
+ if (in->caps_issued_mask(CEPH_CAP_FILE_CACHE)) {
// we will populate the cache here
if (in->cap_refs[CEPH_CAP_FILE_CACHE] == 0)
in->get_cap_ref(CEPH_CAP_FILE_CACHE);
// wait for caps, max_size
while ((lazy && (in->caps_issued() & CEPH_CAP_FILE_LAZYIO) == 0) ||
- (!lazy && (in->caps_issued() & CEPH_CAP_FILE_WR) == 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) {
dout(7) << "missing wr|lazy cap OR endoff " << endoff
dout(10) << " snaprealm " << *in->snaprealm << dendl;
if (g_conf.client_oc) {
- if (in->caps_issued() & CEPH_CAP_FILE_BUFFER) {
+ if (in->caps_issued_mask(CEPH_CAP_FILE_BUFFER)) {
// do buffered write
if (in->cap_refs[CEPH_CAP_FILE_BUFFER] == 0)
in->get_cap_ref(CEPH_CAP_FILE_BUFFER);
c |= it->second->issued;
return c;
}
+ void touch_cap(InodeCap *cap) {
+ // move to back of LRU
+ cap->session->caps.push_back(&cap->cap_item);
+ }
+ bool caps_issued_mask(unsigned mask) {
+ int c = exporting_issued | snap_caps;
+ if ((c & mask) == mask)
+ return true;
+ for (map<int,InodeCap*>::iterator it = caps.begin();
+ it != caps.end();
+ it++) {
+ if (cap_is_valid(it->second)) {
+ if ((it->second->issued & mask) == mask) {
+ touch_cap(it->second);
+ return true;
+ }
+ c |= it->second->issued;
+ }
+ }
+ if ((c & mask) == mask) {
+ // bah.. touch them all
+ for (map<int,InodeCap*>::iterator it = caps.begin();
+ it != caps.end();
+ it++)
+ touch_cap(it->second);
+ return true;
+ }
+ return false;
+ }
int caps_used() {
int w = 0;