if (time_warp_seq > in->inode.time_warp_seq)
dout(0) << "WARNING: " << *in << " mds time_warp_seq "
<< time_warp_seq << " > " << in->inode.time_warp_seq << dendl;
- } else if (issued & (CEPH_CAP_FILE_WR|CEPH_CAP_FILE_WRBUFFER)) {
+ } 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;
dn->lease_seq = dlease->seq;
}
}
- dn->cap_rdcache_gen = dir->parent_inode->rdcache_gen;
+ dn->cap_shared_gen = dir->parent_inode->shared_gen;
}
finish_cap_snap(in, &in->cap_snaps.rbegin()->second, in->caps_used());
signal_cond_list(in->waitfor_caps); // wake up blocked sync writers
}
- if (cap & CEPH_CAP_FILE_WRBUFFER) {
+ if (cap & CEPH_CAP_FILE_BUFFER) {
for (map<snapid_t,CapSnap>::iterator p = in->cap_snaps.begin();
p != in->cap_snaps.end();
p++)
int retain = wanted;
if (!unmounting) {
- retain |= CEPH_CAP_PIN | CEPH_CAP_EXPIREABLE;
-
- /* keep any EXCL bits too, while we are holding caps anyway */
- if (wanted || in->inode.is_dir())
- retain |= CEPH_CAP_ANY_EXCL;
+ if (wanted)
+ retain |= CEPH_CAP_ANY;
+ else
+ retain |= CEPH_CAP_ANY_SHARED;
}
dout(10) << "check_caps on " << *in
capsnap->issued = in->caps_issued();
capsnap->dirty = in->caps_dirty(); // a bit conservative?
- capsnap->dirty_data = (used & CEPH_CAP_FILE_WRBUFFER);
+ capsnap->dirty_data = (used & CEPH_CAP_FILE_BUFFER);
if (used & CEPH_CAP_FILE_WR) {
dout(10) << "queue_cap_snap WR used on " << *in << dendl;
capsnap->atime = in->inode.atime;
capsnap->ctime = in->inode.ctime;
capsnap->time_warp_seq = in->inode.time_warp_seq;
- if (used & CEPH_CAP_FILE_WRBUFFER) {
+ if (used & CEPH_CAP_FILE_BUFFER) {
dout(10) << "finish_cap_snap " << *in << " cap_snap " << capsnap << " used " << used
<< " WRBUFFER, delaying" << dendl;
} else {
void Client::_release(Inode *in, bool checkafter)
{
- if (in->cap_refs[CEPH_CAP_FILE_RDCACHE]) {
+ if (in->cap_refs[CEPH_CAP_FILE_CACHE]) {
objectcacher->release_set(in->inode.ino);
if (checkafter)
- put_cap_ref(in, CEPH_CAP_FILE_RDCACHE);
+ put_cap_ref(in, CEPH_CAP_FILE_CACHE);
else
- in->put_cap_ref(CEPH_CAP_FILE_RDCACHE);
+ in->put_cap_ref(CEPH_CAP_FILE_CACHE);
}
}
void Client::_flushed(Inode *in)
{
dout(10) << "_flushed " << *in << dendl;
- assert(in->cap_refs[CEPH_CAP_FILE_WRBUFFER] == 1);
+ assert(in->cap_refs[CEPH_CAP_FILE_BUFFER] == 1);
// release clean pages too, if we dont hold RDCACHE reference
- if (in->cap_refs[CEPH_CAP_FILE_RDCACHE] == 0)
+ if (in->cap_refs[CEPH_CAP_FILE_CACHE] == 0)
objectcacher->release_set(in->inode.ino);
- put_cap_ref(in, CEPH_CAP_FILE_WRBUFFER);
+ put_cap_ref(in, CEPH_CAP_FILE_BUFFER);
}
if (flags & CEPH_CAP_FLAG_AUTH)
in->auth_cap = cap;
- if ((issued & CEPH_CAP_FILE_RDCACHE) &&
- !(cap->issued & CEPH_CAP_FILE_RDCACHE))
- in->rdcache_gen++;
+ if ((issued & CEPH_CAP_FILE_SHARED) &&
+ !(cap->issued & CEPH_CAP_FILE_SHARED))
+ in->shared_gen++;
+ if ((issued & CEPH_CAP_FILE_CACHE) &&
+ !(cap->issued & CEPH_CAP_FILE_CACHE))
+ in->cache_gen++;
unsigned old_caps = cap->issued;
cap->cap_id = cap_id;
kick_writers = true;
}
- if ((issued & CEPH_CAP_FILE_RDCACHE) &&
- !(cap->issued & CEPH_CAP_FILE_RDCACHE))
- in->rdcache_gen++;
+ if ((issued & CEPH_CAP_FILE_CACHE) &&
+ !(cap->issued & CEPH_CAP_FILE_CACHE))
+ in->cache_gen++;
+ if ((issued & CEPH_CAP_FILE_SHARED) &&
+ !(cap->issued & CEPH_CAP_FILE_SHARED))
+ in->shared_gen++;
// update caps
if (old_caps & ~new_caps) {
dout(10) << " revocation of " << ccap_string(~new_caps & old_caps) << dendl;
cap->issued = new_caps;
- if ((cap->issued & ~new_caps) & CEPH_CAP_FILE_RDCACHE)
+ if ((cap->issued & ~new_caps) & CEPH_CAP_FILE_CACHE)
_release(in, false);
- if ((used & ~new_caps) & CEPH_CAP_FILE_WRBUFFER)
+ if ((used & ~new_caps) & CEPH_CAP_FILE_BUFFER)
_flush(in);
else {
check_caps(in, false);
// is lease valid?
if ((dn->lease_mds >= 0 &&
dn->lease_ttl > g_clock.now()) ||
- ((dir->caps_issued() & CEPH_CAP_FILE_RDCACHE) &&
- dn->cap_rdcache_gen == dir->rdcache_gen)) {
+ ((dir->caps_issued() & CEPH_CAP_FILE_SHARED) &&
+ dn->cap_shared_gen == dir->shared_gen)) {
*target = dn->inode;
goto done;
}
if (in->snapid == CEPH_NOSNAP) {
if (in->put_open_ref(f->mode)) {
- if (in->caps_used() & (CEPH_CAP_FILE_WRBUFFER|CEPH_CAP_FILE_WR))
+ if (in->caps_used() & (CEPH_CAP_FILE_BUFFER|CEPH_CAP_FILE_WR))
_flush(in);
check_caps(in, false);
}
}
// async i/o?
- if ((issued & (CEPH_CAP_FILE_WRBUFFER|CEPH_CAP_FILE_RDCACHE))) {
+ if ((issued & (CEPH_CAP_FILE_BUFFER|CEPH_CAP_FILE_CACHE))) {
// FIXME: this logic needs to move info FileCache!
int r = 0;
if (g_conf.client_oc) {
- if (issued & CEPH_CAP_FILE_RDCACHE) {
+ if (issued & CEPH_CAP_FILE_CACHE) {
// we will populate the cache here
- if (in->cap_refs[CEPH_CAP_FILE_RDCACHE] == 0)
- in->get_cap_ref(CEPH_CAP_FILE_RDCACHE);
+ if (in->cap_refs[CEPH_CAP_FILE_CACHE] == 0)
+ in->get_cap_ref(CEPH_CAP_FILE_CACHE);
// readahead?
if (f->nr_consec_read &&
assert(unsafe_sync_write > 0);
unsafe_sync_write--;
- put_cap_ref(in, CEPH_CAP_FILE_WRBUFFER);
+ put_cap_ref(in, CEPH_CAP_FILE_BUFFER);
dout(15) << "sync_write_commit unsafe_sync_write = " << unsafe_sync_write << dendl;
if (unsafe_sync_write == 0 && unmounting) {
dout(10) << " snaprealm " << *in->snaprealm << dendl;
if (g_conf.client_oc) {
- if (in->caps_issued() & CEPH_CAP_FILE_WRBUFFER) {
+ if (in->caps_issued() & CEPH_CAP_FILE_BUFFER) {
// do buffered write
- if (in->cap_refs[CEPH_CAP_FILE_WRBUFFER] == 0)
- in->get_cap_ref(CEPH_CAP_FILE_WRBUFFER);
+ if (in->cap_refs[CEPH_CAP_FILE_BUFFER] == 0)
+ in->get_cap_ref(CEPH_CAP_FILE_BUFFER);
// wait? (this may block!)
objectcacher->wait_for_write(size, client_lock);
Context *onsafe = new C_Client_SyncCommit(this, in);
unsafe_sync_write++;
- in->get_cap_ref(CEPH_CAP_FILE_WRBUFFER);
+ in->get_cap_ref(CEPH_CAP_FILE_BUFFER);
filer->write(in->inode.ino, &in->inode.layout, in->snaprealm->get_snap_context(),
offset, size, bl, g_clock.now(), 0, onfinish, onsafe);
if (g_conf.client_oc)
_flush(in);
- while (in->cap_refs[CEPH_CAP_FILE_WRBUFFER] > 0) {
- dout(10) << "ino " << in->inode.ino << " has " << in->cap_refs[CEPH_CAP_FILE_WRBUFFER]
+ while (in->cap_refs[CEPH_CAP_FILE_BUFFER] > 0) {
+ dout(10) << "ino " << in->inode.ino << " has " << in->cap_refs[CEPH_CAP_FILE_BUFFER]
<< " uncommitted, waiting" << dendl;
wait_on_list(in->waitfor_commit);
}
int lease_mds;
utime_t lease_ttl;
ceph_seq_t lease_seq;
- int cap_rdcache_gen;
+ int cap_shared_gen;
void get() {
assert(ref == 0); ref++; lru_pin();
//cout << "dentry.put on " << this << " " << name << " now " << ref << std::endl;
}
- Dentry() : dir(0), inode(0), ref(0), lease_mds(-1), lease_seq(0), cap_rdcache_gen(0) { }
+ Dentry() : dir(0), inode(0), ref(0), lease_mds(-1), lease_seq(0), cap_shared_gen(0) { }
};
class Dir {
map<int,InodeCap*> caps; // mds -> InodeCap
InodeCap *auth_cap;
unsigned dirty_caps, flushing_caps;
- int rdcache_gen;
+ int shared_gen, cache_gen;
int snap_caps, snap_cap_refs;
unsigned exporting_issued;
int exporting_mds;
//inode(_inode),
snapid(vino.snapid),
dir_auth(-1), dir_hashed(false), dir_replicated(false),
- dirty_caps(0), flushing_caps(0), rdcache_gen(0),
+ dirty_caps(0), flushing_caps(0), shared_gen(0), cache_gen(0),
snap_caps(0), snap_cap_refs(0),
exporting_issued(0), exporting_mds(-1), exporting_mseq(0),
cap_item(this),
}
int caps_wanted() {
int want = caps_file_wanted() | caps_used();
- if (want & (CEPH_CAP_GWRBUFFER << CEPH_CAP_SFILE))
+ if (want & CEPH_CAP_FILE_BUFFER)
want |= CEPH_CAP_FILE_EXCL;
return want;
}
bool have_valid_size() {
// RD+RDCACHE or WR+WRBUFFER => valid size
- if ((caps_issued() & (CEPH_CAP_FILE_RD|CEPH_CAP_FILE_RDCACHE)) == (CEPH_CAP_FILE_RD|CEPH_CAP_FILE_RDCACHE))
- return true;
- if ((caps_issued() & (CEPH_CAP_FILE_WR|CEPH_CAP_FILE_WRBUFFER)) == (CEPH_CAP_FILE_WR|CEPH_CAP_FILE_WRBUFFER))
+ if (caps_issued() & (CEPH_CAP_FILE_SHARED | CEPH_CAP_FILE_EXCL))
return true;
return false;
}
#define CEPH_MDS_PROTOCOL 9 /* cluster internal */
#define CEPH_MON_PROTOCOL 4 /* cluster internal */
#define CEPH_OSDC_PROTOCOL 10 /* public/client */
-#define CEPH_MDSC_PROTOCOL 19 /* public/client */
+#define CEPH_MDSC_PROTOCOL 20 /* public/client */
#define CEPH_MONC_PROTOCOL 12 /* public/client */
#define CEPH_CAP_PIN 1 /* no specific capabilities beyond the pin */
/* generic cap bits */
-#define CEPH_CAP_GRDCACHE 1 /* client can cache reads */
-#define CEPH_CAP_GEXCL 2 /* client has exclusive access, can update */
-#define CEPH_CAP_GRD 4 /* (filelock) client can read */
-#define CEPH_CAP_GWR 8 /* (filelock) client can write */
-#define CEPH_CAP_GWRBUFFER 16 /* (filelock) client can buffer writes */
-#define CEPH_CAP_GWREXTEND 32 /* (filelock) client can extend EOF */
-#define CEPH_CAP_GLAZYIO 64 /* (filelock) client can perform lazy io */
+#define CEPH_CAP_GSHARED 1 /* client can reads */
+#define CEPH_CAP_GEXCL 2 /* client can read and update */
+#define CEPH_CAP_GCACHE 4 /* (file) client can cache reads */
+#define CEPH_CAP_GRD 8 /* (file) client can read */
+#define CEPH_CAP_GWR 16 /* (file) client can write */
+#define CEPH_CAP_GBUFFER 32 /* (file) client can buffer writes */
+#define CEPH_CAP_GWREXTEND 64 /* (file) client can extend EOF */
+#define CEPH_CAP_GLAZYIO 128 /* (file) client can perform lazy io */
/* per-lock shift */
#define CEPH_CAP_SAUTH 2
#define CEPH_CAP_SFILE 8 /* goes at the end (uses >2 cap bits) */
/* composed values */
-#define CEPH_CAP_AUTH_RDCACHE (CEPH_CAP_GRDCACHE << CEPH_CAP_SAUTH)
+#define CEPH_CAP_AUTH_SHARED (CEPH_CAP_GSHARED << CEPH_CAP_SAUTH)
#define CEPH_CAP_AUTH_EXCL (CEPH_CAP_GEXCL << CEPH_CAP_SAUTH)
-#define CEPH_CAP_LINK_RDCACHE (CEPH_CAP_GRDCACHE << CEPH_CAP_SLINK)
+#define CEPH_CAP_LINK_SHARED (CEPH_CAP_GSHARED << CEPH_CAP_SLINK)
#define CEPH_CAP_LINK_EXCL (CEPH_CAP_GEXCL << CEPH_CAP_SLINK)
-#define CEPH_CAP_XATTR_RDCACHE (CEPH_CAP_GRDCACHE << CEPH_CAP_SXATTR)
+#define CEPH_CAP_XATTR_SHARED (CEPH_CAP_GSHARED << CEPH_CAP_SXATTR)
#define CEPH_CAP_XATTR_EXCL (CEPH_CAP_GEXCL << CEPH_CAP_SXATTR)
#define CEPH_CAP_FILE(x) (x << CEPH_CAP_SFILE)
-#define CEPH_CAP_FILE_RDCACHE (CEPH_CAP_GRDCACHE << CEPH_CAP_SFILE)
+#define CEPH_CAP_FILE_SHARED (CEPH_CAP_GSHARED << CEPH_CAP_SFILE)
#define CEPH_CAP_FILE_EXCL (CEPH_CAP_GEXCL << CEPH_CAP_SFILE)
+#define CEPH_CAP_FILE_CACHE (CEPH_CAP_GCACHE << CEPH_CAP_SFILE)
#define CEPH_CAP_FILE_RD (CEPH_CAP_GRD << CEPH_CAP_SFILE)
#define CEPH_CAP_FILE_WR (CEPH_CAP_GWR << CEPH_CAP_SFILE)
-#define CEPH_CAP_FILE_WRBUFFER (CEPH_CAP_GWRBUFFER << CEPH_CAP_SFILE)
+#define CEPH_CAP_FILE_BUFFER (CEPH_CAP_GBUFFER << CEPH_CAP_SFILE)
#define CEPH_CAP_FILE_WREXTEND (CEPH_CAP_GWREXTEND << CEPH_CAP_SFILE)
#define CEPH_CAP_FILE_LAZYIO (CEPH_CAP_GLAZYIO << CEPH_CAP_SFILE)
#define CEPH_STAT_CAP_INODE CEPH_CAP_PIN
#define CEPH_STAT_CAP_TYPE CEPH_CAP_PIN /* mode >> 12 */
#define CEPH_STAT_CAP_SYMLINK CEPH_CAP_PIN
-#define CEPH_STAT_CAP_UID CEPH_CAP_AUTH_RDCACHE
-#define CEPH_STAT_CAP_GID CEPH_CAP_AUTH_RDCACHE
-#define CEPH_STAT_CAP_MODE CEPH_CAP_AUTH_RDCACHE
-#define CEPH_STAT_CAP_NLINK CEPH_CAP_LINK_RDCACHE
-#define CEPH_STAT_CAP_LAYOUT CEPH_CAP_FILE_RDCACHE
-#define CEPH_STAT_CAP_MTIME CEPH_CAP_FILE_RDCACHE
-#define CEPH_STAT_CAP_SIZE CEPH_CAP_FILE_RDCACHE
-#define CEPH_STAT_CAP_ATIME CEPH_CAP_FILE_RDCACHE /* fixme */
-#define CEPH_STAT_CAP_XATTR CEPH_CAP_XATTR_RDCACHE
+#define CEPH_STAT_CAP_UID CEPH_CAP_AUTH_SHARED
+#define CEPH_STAT_CAP_GID CEPH_CAP_AUTH_SHARED
+#define CEPH_STAT_CAP_MODE CEPH_CAP_AUTH_SHARED
+#define CEPH_STAT_CAP_NLINK CEPH_CAP_LINK_SHARED
+#define CEPH_STAT_CAP_LAYOUT CEPH_CAP_FILE_SHARED
+#define CEPH_STAT_CAP_MTIME CEPH_CAP_FILE_SHARED
+#define CEPH_STAT_CAP_SIZE CEPH_CAP_FILE_SHARED
+#define CEPH_STAT_CAP_ATIME CEPH_CAP_FILE_SHARED /* fixme */
+#define CEPH_STAT_CAP_XATTR CEPH_CAP_XATTR_SHARED
#define CEPH_STAT_CAP_INODE_ALL (CEPH_CAP_PIN | \
- CEPH_CAP_AUTH_RDCACHE | \
- CEPH_CAP_LINK_RDCACHE | \
- CEPH_CAP_FILE_RDCACHE | \
- CEPH_CAP_XATTR_RDCACHE)
+ CEPH_CAP_AUTH_SHARED | \
+ CEPH_CAP_LINK_SHARED | \
+ CEPH_CAP_FILE_SHARED | \
+ CEPH_CAP_XATTR_SHARED)
-#define CEPH_CAP_ANY_RDCACHE (CEPH_CAP_AUTH_RDCACHE | \
- CEPH_CAP_LINK_RDCACHE | \
- CEPH_CAP_XATTR_RDCACHE | \
- CEPH_CAP_FILE_RDCACHE)
-#define CEPH_CAP_ANY_RD (CEPH_CAP_ANY_RDCACHE | CEPH_CAP_FILE_RD)
+#define CEPH_CAP_ANY_SHARED (CEPH_CAP_AUTH_SHARED | \
+ CEPH_CAP_LINK_SHARED | \
+ CEPH_CAP_XATTR_SHARED | \
+ CEPH_CAP_FILE_SHARED)
+#define CEPH_CAP_ANY_RD (CEPH_CAP_ANY_SHARED | CEPH_CAP_FILE_RD | CEPH_CAP_FILE_CACHE)
#define CEPH_CAP_ANY_EXCL (CEPH_CAP_AUTH_EXCL | \
CEPH_CAP_LINK_EXCL | \
CEPH_CAP_XATTR_EXCL | \
CEPH_CAP_FILE_EXCL)
-#define CEPH_CAP_ANY_FILE_WR (CEPH_CAP_FILE_WR|CEPH_CAP_FILE_WRBUFFER)
+#define CEPH_CAP_ANY_FILE_WR (CEPH_CAP_FILE_WR|CEPH_CAP_FILE_BUFFER)
#define CEPH_CAP_ANY_WR (CEPH_CAP_ANY_EXCL | CEPH_CAP_ANY_FILE_WR)
#define CEPH_CAP_ANY (CEPH_CAP_ANY_RD|CEPH_CAP_ANY_EXCL|CEPH_CAP_ANY_FILE_WR|CEPH_CAP_PIN)
#define CEPH_CAP_LOCKS (CEPH_LOCK_IFILE|CEPH_LOCK_IAUTH|CEPH_LOCK_ILINK|CEPH_LOCK_IXATTR)
-/*
- * these cap bits time out, if no others are held and nothing is
- * registered as 'wanted' by the client.
- */
-#define CEPH_CAP_EXPIREABLE (CEPH_CAP_PIN|CEPH_CAP_ANY_RDCACHE)
-
static inline int ceph_caps_for_mode(int mode)
{
switch (mode) {
case CEPH_FILE_MODE_PIN:
return CEPH_CAP_PIN;
case CEPH_FILE_MODE_RD:
- return CEPH_CAP_PIN |
- CEPH_CAP_FILE_RDCACHE | CEPH_CAP_FILE_RD;
+ return CEPH_CAP_PIN | CEPH_CAP_FILE_SHARED |
+ CEPH_CAP_FILE_RD | CEPH_CAP_FILE_CACHE;
case CEPH_FILE_MODE_RDWR:
- return CEPH_CAP_PIN |
- ((CEPH_CAP_GRD | CEPH_CAP_GRDCACHE |
- CEPH_CAP_GWR | CEPH_CAP_GWRBUFFER |
- CEPH_CAP_GEXCL) << CEPH_CAP_SFILE) |
- ((CEPH_CAP_GRDCACHE | CEPH_CAP_GEXCL) << CEPH_CAP_SAUTH) |
- ((CEPH_CAP_GRDCACHE | CEPH_CAP_GEXCL) << CEPH_CAP_SXATTR);
+ return CEPH_CAP_PIN | CEPH_CAP_FILE_SHARED | CEPH_CAP_FILE_EXCL |
+ CEPH_CAP_FILE_RD | CEPH_CAP_FILE_CACHE |
+ CEPH_CAP_FILE_WR | CEPH_CAP_FILE_BUFFER |
+ CEPH_CAP_AUTH_SHARED | CEPH_CAP_AUTH_EXCL |
+ CEPH_CAP_XATTR_SHARED | CEPH_CAP_XATTR_EXCL;
case CEPH_FILE_MODE_WR:
- return CEPH_CAP_PIN |
- ((CEPH_CAP_GWR | CEPH_CAP_GWRBUFFER |
- CEPH_CAP_GEXCL) << CEPH_CAP_SFILE) |
- ((CEPH_CAP_GRDCACHE | CEPH_CAP_GEXCL) << CEPH_CAP_SAUTH) |
- ((CEPH_CAP_GRDCACHE | CEPH_CAP_GEXCL) << CEPH_CAP_SXATTR);
+ return CEPH_CAP_PIN | CEPH_CAP_FILE_SHARED | CEPH_CAP_FILE_EXCL |
+ CEPH_CAP_FILE_WR | CEPH_CAP_FILE_BUFFER |
+ CEPH_CAP_AUTH_SHARED | CEPH_CAP_AUTH_EXCL |
+ CEPH_CAP_XATTR_SHARED | CEPH_CAP_XATTR_EXCL;
}
return 0;
}
* cap is being revoked.
*/
do_sync = wbc->sync_mode == WB_SYNC_ALL;
- if (ceph_caps_revoking(ci, CEPH_CAP_FILE_WRBUFFER))
+ if (ceph_caps_revoking(ci, CEPH_CAP_FILE_BUFFER))
do_sync = 1;
dout(10, "writepages_start %p dosync=%d (pdflush=%d mode=%s)\n",
inode, do_sync, current_is_pdflush(),
static char *gcap_string(char *s, int c)
{
- if (c & CEPH_CAP_GRDCACHE)
- *s++ = 'c';
+ if (c & CEPH_CAP_GSHARED)
+ *s++ = 's';
if (c & CEPH_CAP_GEXCL)
*s++ = 'x';
+ if (c & CEPH_CAP_GCACHE)
+ *s++ = 'c';
if (c & CEPH_CAP_GRD)
*s++ = 'r';
if (c & CEPH_CAP_GWR)
*s++ = 'w';
- if (c & CEPH_CAP_GWRBUFFER)
+ if (c & CEPH_CAP_GBUFFER)
*s++ = 'b';
if (c & CEPH_CAP_GLAZYIO)
*s++ = 'l';
if (mseq)
*mseq = cap->mseq;
if (cap->issued & (CEPH_CAP_FILE_WR |
- CEPH_CAP_FILE_WRBUFFER |
+ CEPH_CAP_FILE_BUFFER |
CEPH_CAP_FILE_EXCL))
break;
}
}
/*
- * if we are newly issued FILE_RDCACHE, clear I_COMPLETE; we
+ * if we are newly issued FILE_SHARED, clear I_COMPLETE; we
* don't know what happened to this directory while we didn't
* have the cap.
*/
if (S_ISDIR(inode->i_mode) &&
- (issued & CEPH_CAP_FILE_RDCACHE) &&
- (cap->issued & CEPH_CAP_FILE_RDCACHE) == 0) {
+ (issued & CEPH_CAP_FILE_SHARED) &&
+ (cap->issued & CEPH_CAP_FILE_SHARED) == 0) {
dout(10, " marking %p NOT complete\n", inode);
ci->i_ceph_flags &= ~CEPH_I_COMPLETE;
}
spin_unlock(&inode->i_lock);
- if (dropping & CEPH_CAP_FILE_RDCACHE) {
+ if (dropping & CEPH_CAP_FILE_CACHE) {
/* invalidate what we can */
dout(20, "invalidating pages on %p\n", inode);
invalidate_mapping_pages(&inode->i_data, 0, -1);
if (want) {
retain |= CEPH_CAP_ANY; /* be greedy */
} else {
- retain |= CEPH_CAP_ANY_RDCACHE;
+ retain |= CEPH_CAP_ANY_SHARED;
/*
* keep RD only if we didn't have the file open RW,
* because then the mds would revoke it anyway to
igrab(inode);
dirty |= I_DIRTY_SYNC;
}
- if ((was & CEPH_CAP_FILE_WRBUFFER) &&
- (mask & CEPH_CAP_FILE_WRBUFFER))
+ if ((was & CEPH_CAP_FILE_BUFFER) &&
+ (mask & CEPH_CAP_FILE_BUFFER))
dirty |= I_DIRTY_DATASYNC;
if (dirty)
__mark_inode_dirty(inode, dirty);
ci->i_pin_ref++;
if (got & CEPH_CAP_FILE_RD)
ci->i_rd_ref++;
- if (got & CEPH_CAP_FILE_RDCACHE)
+ if (got & CEPH_CAP_FILE_CACHE)
ci->i_rdcache_ref++;
if (got & CEPH_CAP_FILE_WR)
ci->i_wr_ref++;
- if (got & CEPH_CAP_FILE_WRBUFFER) {
+ if (got & CEPH_CAP_FILE_BUFFER) {
if (ci->i_wrbuffer_ref == 0)
igrab(&ci->vfs_inode);
ci->i_wrbuffer_ref++;
if (had & CEPH_CAP_FILE_RD)
if (--ci->i_rd_ref == 0)
last++;
- if (had & CEPH_CAP_FILE_RDCACHE)
+ if (had & CEPH_CAP_FILE_CACHE)
if (--ci->i_rdcache_ref == 0)
last++;
- if (had & CEPH_CAP_FILE_WRBUFFER) {
+ if (had & CEPH_CAP_FILE_BUFFER) {
if (--ci->i_wrbuffer_ref == 0)
last++;
dout(30, "put_cap_refs %p wrbuffer %d -> %d (?)\n",
cap->gen = session->s_cap_gen;
/*
- * Each time we receive RDCACHE anew, we increment i_rdcache_gen.
+ * Each time we receive CACHE anew, we increment i_rdcache_gen.
* Also clear I_COMPLETE: we don't know what happened to this directory
*/
- if ((newcaps & CEPH_CAP_FILE_RDCACHE) && /* got RDCACHE */
- (cap->issued & CEPH_CAP_FILE_RDCACHE) == 0 && /* but not before */
- (__ceph_caps_issued(ci, NULL) & CEPH_CAP_FILE_RDCACHE) == 0) {
+ if ((newcaps & CEPH_CAP_FILE_CACHE) && /* got RDCACHE */
+ (cap->issued & CEPH_CAP_FILE_CACHE) == 0 && /* but not before */
+ (__ceph_caps_issued(ci, NULL) & CEPH_CAP_FILE_CACHE) == 0) {
ci->i_rdcache_gen++;
if (S_ISDIR(inode->i_mode)) {
}
/*
- * If RDCACHE is being revoked, and we have no dirty buffers,
+ * If CACHE is being revoked, and we have no dirty buffers,
* try to invalidate (once). (If there are dirty buffers, we
* will invalidate _after_ writeback.)
*/
- if (((cap->issued & ~newcaps) & CEPH_CAP_FILE_RDCACHE) &&
+ if (((cap->issued & ~newcaps) & CEPH_CAP_FILE_CACHE) &&
!ci->i_wrbuffer_ref && !tried_invalidate) {
- dout(10, "RDCACHE invalidation\n");
+ dout(10, "CACHE invalidation\n");
spin_unlock(&inode->i_lock);
tried_invalidate = 1;
if (cap->issued & ~newcaps) {
dout(10, "revocation: %s -> %s\n", ceph_cap_string(cap->issued),
ceph_cap_string(newcaps));
- if ((used & ~newcaps) & CEPH_CAP_FILE_WRBUFFER) {
+ if ((used & ~newcaps) & CEPH_CAP_FILE_BUFFER) {
writeback = 1; /* will delay ack */
} else if (dirty & ~newcaps) {
reply = 2; /* initiate writeback in check_caps */
- } else if (((used & ~newcaps) & CEPH_CAP_FILE_RDCACHE) == 0 ||
+ } else if (((used & ~newcaps) & CEPH_CAP_FILE_CACHE) == 0 ||
revoked_rdcache) {
/*
* we're not using revoked caps.. ack now.
if ((filp->f_pos == 2 || fi->dentry) &&
!ceph_test_opt(client, NOASYNCREADDIR) &&
(ci->i_ceph_flags & CEPH_I_COMPLETE) &&
- (__ceph_caps_issued(ci, NULL) & CEPH_CAP_FILE_RDCACHE)) {
+ (__ceph_caps_issued(ci, NULL) & CEPH_CAP_FILE_SHARED)) {
err = __dcache_readdir(filp, dirent, filldir);
if (err != -EAGAIN) {
spin_unlock(&inode->i_lock);
client->mount_args.snapdir_name,
dentry->d_name.len) &&
(ci->i_ceph_flags & CEPH_I_COMPLETE) &&
- (__ceph_caps_issued(ci, NULL) & CEPH_CAP_FILE_RDCACHE)) {
+ (__ceph_caps_issued(ci, NULL) & CEPH_CAP_FILE_SHARED)) {
ceph_dentry(dentry)->offset = ci->i_max_offset++;
spin_unlock(&dir->i_lock);
dout(10, " dir %p complete, -ENOENT\n", dir);
req->r_locked_dir = dir;
req->r_args.mknod.mode = cpu_to_le32(mode);
req->r_args.mknod.rdev = cpu_to_le32(rdev);
- req->r_dentry_drop = CEPH_CAP_FILE_RDCACHE;
+ req->r_dentry_drop = CEPH_CAP_FILE_SHARED;
req->r_dentry_unless = CEPH_CAP_FILE_EXCL;
err = ceph_mdsc_do_request(mdsc, dir, req);
if (!err && !req->r_reply_info.head->is_dentry)
req->r_num_caps = 2;
req->r_path2 = dest;
req->r_locked_dir = dir;
- req->r_dentry_drop = CEPH_CAP_FILE_RDCACHE;
+ req->r_dentry_drop = CEPH_CAP_FILE_SHARED;
req->r_dentry_unless = CEPH_CAP_FILE_EXCL;
err = ceph_mdsc_do_request(mdsc, dir, req);
if (!err && !req->r_reply_info.head->is_dentry)
req->r_num_caps = 2;
req->r_locked_dir = dir;
req->r_args.mkdir.mode = cpu_to_le32(mode);
- req->r_dentry_drop = CEPH_CAP_FILE_RDCACHE;
+ req->r_dentry_drop = CEPH_CAP_FILE_SHARED;
req->r_dentry_unless = CEPH_CAP_FILE_EXCL;
err = ceph_mdsc_do_request(mdsc, dir, req);
if (!err && !req->r_reply_info.head->is_dentry)
req->r_num_caps = 2;
req->r_old_dentry = dget(old_dentry); /* or inode? hrm. */
req->r_locked_dir = dir;
- req->r_dentry_drop = CEPH_CAP_FILE_RDCACHE;
+ req->r_dentry_drop = CEPH_CAP_FILE_SHARED;
req->r_dentry_unless = CEPH_CAP_FILE_EXCL;
err = ceph_mdsc_do_request(mdsc, dir, req);
if (err) {
static int drop_caps_for_unlink(struct inode *inode)
{
struct ceph_inode_info *ci = ceph_inode(inode);
- int drop = CEPH_CAP_LINK_RDCACHE | CEPH_CAP_LINK_EXCL;
+ int drop = CEPH_CAP_LINK_SHARED | CEPH_CAP_LINK_EXCL;
spin_lock(&inode->i_lock);
if (inode->i_nlink == 1) {
req->r_dentry = dget(dentry);
req->r_num_caps = 2;
req->r_locked_dir = dir;
- req->r_dentry_drop = CEPH_CAP_FILE_RDCACHE;
+ req->r_dentry_drop = CEPH_CAP_FILE_SHARED;
req->r_dentry_unless = CEPH_CAP_FILE_EXCL;
req->r_inode_drop = drop_caps_for_unlink(inode);
err = ceph_mdsc_do_request(mdsc, dir, req);
req->r_num_caps = 2;
req->r_old_dentry = dget(old_dentry);
req->r_locked_dir = new_dir;
- req->r_old_dentry_drop = CEPH_CAP_FILE_RDCACHE;
+ req->r_old_dentry_drop = CEPH_CAP_FILE_SHARED;
req->r_old_dentry_unless = CEPH_CAP_FILE_EXCL;
- req->r_dentry_drop = CEPH_CAP_FILE_RDCACHE;
+ req->r_dentry_drop = CEPH_CAP_FILE_SHARED;
req->r_dentry_unless = CEPH_CAP_FILE_EXCL;
/* release LINK_RDCACHE on source inode (mds will lock it) */
- req->r_old_inode_drop = CEPH_CAP_LINK_RDCACHE;
+ req->r_old_inode_drop = CEPH_CAP_LINK_SHARED;
if (new_dentry->d_inode)
req->r_inode_drop = drop_caps_for_unlink(new_dentry->d_inode);
err = ceph_mdsc_do_request(mdsc, old_dir, req);
spin_lock(&dir->i_lock);
if (ci->i_rdcache_gen == dentry->d_time)
- valid = __ceph_caps_issued(ci, NULL) & CEPH_CAP_FILE_RDCACHE;
+ valid = __ceph_caps_issued(ci, NULL) & CEPH_CAP_FILE_SHARED;
spin_unlock(&dir->i_lock);
dout(20, "dir_lease_is_valid dir %p v%u dentry %p v%lu = %d\n",
dir, (unsigned)ci->i_rdcache_gen, dentry, dentry->d_time, valid);
req->r_dentry = dget(dentry);
req->r_num_caps = 2;
if (flags & O_CREAT) {
- req->r_dentry_drop = CEPH_CAP_FILE_RDCACHE;
+ req->r_dentry_drop = CEPH_CAP_FILE_SHARED;
req->r_dentry_unless = CEPH_CAP_FILE_EXCL;
}
req->r_locked_dir = dir; /* caller holds dir->i_mutex */
dout(10, "aio_read %llx.%llx %llu~%u trying to get caps on %p\n",
ceph_vinop(inode), pos, (unsigned)len, inode);
__ceph_do_pending_vmtruncate(inode);
- ret = ceph_get_caps(ci, CEPH_CAP_FILE_RD, CEPH_CAP_FILE_RDCACHE,
+ ret = ceph_get_caps(ci, CEPH_CAP_FILE_RD, CEPH_CAP_FILE_CACHE,
&got, -1);
if (ret < 0)
goto out;
dout(10, "aio_read %llx.%llx %llu~%u got cap refs on %s\n",
ceph_vinop(inode), pos, (unsigned)len, ceph_cap_string(got));
- if ((got & CEPH_CAP_FILE_RDCACHE) == 0 ||
+ if ((got & CEPH_CAP_FILE_CACHE) == 0 ||
(iocb->ki_filp->f_flags & O_DIRECT) ||
(inode->i_sb->s_flags & MS_SYNCHRONOUS))
/* hmm, this isn't really async... */
check_max_size(inode, endoff);
dout(10, "aio_write %p %llu~%u getting caps. i_size %llu\n",
inode, pos, (unsigned)iov->iov_len, inode->i_size);
- ret = ceph_get_caps(ci, CEPH_CAP_FILE_WR, CEPH_CAP_FILE_WRBUFFER,
+ ret = ceph_get_caps(ci, CEPH_CAP_FILE_WR, CEPH_CAP_FILE_BUFFER,
&got, endoff);
if (ret < 0)
goto out;
dout(10, "aio_write %p %llu~%u got cap refs on %s\n",
inode, pos, (unsigned)iov->iov_len, ceph_cap_string(got));
- if ((got & CEPH_CAP_FILE_WRBUFFER) == 0 ||
+ if ((got & CEPH_CAP_FILE_BUFFER) == 0 ||
(iocb->ki_filp->f_flags & O_DIRECT) ||
(inode->i_sb->s_flags & MS_SYNCHRONOUS)) {
ret = ceph_sync_write(file, iov->iov_base, iov->iov_len,
ci->i_truncate_seq, truncate_seq);
ci->i_truncate_seq = truncate_seq;
ci->i_truncate_pending++;
- if (issued & (CEPH_CAP_FILE_RDCACHE|CEPH_CAP_FILE_RD|
- CEPH_CAP_FILE_WR|CEPH_CAP_FILE_WRBUFFER|
+ if (issued & (CEPH_CAP_FILE_CACHE|CEPH_CAP_FILE_RD|
+ CEPH_CAP_FILE_WR|CEPH_CAP_FILE_BUFFER|
CEPH_CAP_FILE_EXCL))
queue_trunc = 1;
}
if (issued & (CEPH_CAP_FILE_EXCL|
CEPH_CAP_FILE_WR|
- CEPH_CAP_FILE_WRBUFFER)) {
+ CEPH_CAP_FILE_BUFFER)) {
if (timespec_compare(ctime, &inode->i_ctime) > 0) {
dout(20, "ctime %ld.%09ld -> %ld.%09ld inc w/ cap\n",
inode->i_ctime.tv_sec, inode->i_ctime.tv_nsec,
/* set dir completion flag? */
if (ci->i_files == 0 && ci->i_subdirs == 0 &&
ceph_snap(inode) == CEPH_NOSNAP &&
- (le32_to_cpu(info->cap.caps) & CEPH_CAP_FILE_RDCACHE)) {
+ (le32_to_cpu(info->cap.caps) & CEPH_CAP_FILE_SHARED)) {
dout(10, " marking %p complete (empty)\n", inode);
ci->i_ceph_flags |= CEPH_I_COMPLETE;
ci->i_max_offset = 2;
/* do we have a lease on the whole dir? */
have_dir_cap =
(le32_to_cpu(rinfo->diri.in->cap.caps) &
- CEPH_CAP_FILE_RDCACHE);
+ CEPH_CAP_FILE_SHARED);
/* do we have a dn lease? */
have_lease = have_dir_cap ||
if (issued & CEPH_CAP_AUTH_EXCL) {
inode->i_uid = attr->ia_uid;
dirtied |= CEPH_CAP_AUTH_EXCL;
- } else if ((issued & CEPH_CAP_AUTH_RDCACHE) == 0 ||
+ } else if ((issued & CEPH_CAP_AUTH_SHARED) == 0 ||
attr->ia_uid != inode->i_uid) {
req->r_args.setattr.uid = cpu_to_le32(attr->ia_uid);
mask |= CEPH_SETATTR_UID;
- release |= CEPH_CAP_AUTH_RDCACHE;
+ release |= CEPH_CAP_AUTH_SHARED;
}
}
if (ia_valid & ATTR_GID) {
if (issued & CEPH_CAP_AUTH_EXCL) {
inode->i_gid = attr->ia_gid;
dirtied |= CEPH_CAP_AUTH_EXCL;
- } else if ((issued & CEPH_CAP_AUTH_RDCACHE) == 0 ||
+ } else if ((issued & CEPH_CAP_AUTH_SHARED) == 0 ||
attr->ia_gid != inode->i_gid) {
req->r_args.setattr.gid = cpu_to_le32(attr->ia_gid);
mask |= CEPH_SETATTR_GID;
- release |= CEPH_CAP_AUTH_RDCACHE;
+ release |= CEPH_CAP_AUTH_SHARED;
}
}
if (ia_valid & ATTR_MODE) {
if (issued & CEPH_CAP_AUTH_EXCL) {
inode->i_mode = attr->ia_mode;
dirtied |= CEPH_CAP_AUTH_EXCL;
- } else if ((issued & CEPH_CAP_AUTH_RDCACHE) == 0 ||
+ } else if ((issued & CEPH_CAP_AUTH_SHARED) == 0 ||
attr->ia_mode != inode->i_mode) {
req->r_args.setattr.mode = cpu_to_le32(attr->ia_mode);
mask |= CEPH_SETATTR_MODE;
- release |= CEPH_CAP_AUTH_RDCACHE;
+ release |= CEPH_CAP_AUTH_SHARED;
}
}
&attr->ia_atime) < 0) {
inode->i_atime = attr->ia_atime;
dirtied |= CEPH_CAP_FILE_WR;
- } else if ((issued & CEPH_CAP_FILE_RDCACHE) == 0 ||
+ } else if ((issued & CEPH_CAP_FILE_SHARED) == 0 ||
!timespec_equal(&inode->i_atime, &attr->ia_atime)) {
ceph_encode_timespec(&req->r_args.setattr.atime,
&attr->ia_atime);
mask |= CEPH_SETATTR_ATIME;
- release |= CEPH_CAP_FILE_RDCACHE | CEPH_CAP_FILE_RD |
+ release |= CEPH_CAP_FILE_CACHE | CEPH_CAP_FILE_RD |
CEPH_CAP_FILE_WR;
}
}
&attr->ia_mtime) < 0) {
inode->i_mtime = attr->ia_mtime;
dirtied |= CEPH_CAP_FILE_WR;
- } else if ((issued & CEPH_CAP_FILE_RDCACHE) == 0 ||
+ } else if ((issued & CEPH_CAP_FILE_SHARED) == 0 ||
!timespec_equal(&inode->i_mtime, &attr->ia_mtime)) {
ceph_encode_timespec(&req->r_args.setattr.mtime,
&attr->ia_mtime);
mask |= CEPH_SETATTR_MTIME;
- release |= CEPH_CAP_FILE_RDCACHE | CEPH_CAP_FILE_RD |
+ release |= CEPH_CAP_FILE_SHARED | CEPH_CAP_FILE_RD |
CEPH_CAP_FILE_WR;
}
}
inode->i_ctime = attr->ia_ctime;
ci->i_reported_size = attr->ia_size;
dirtied |= CEPH_CAP_FILE_EXCL;
- } else if ((issued & CEPH_CAP_FILE_RDCACHE) == 0 ||
+ } else if ((issued & CEPH_CAP_FILE_SHARED) == 0 ||
attr->ia_size != inode->i_size) {
req->r_args.setattr.size = cpu_to_le64(attr->ia_size);
req->r_args.setattr.old_size =
cpu_to_le64(inode->i_size);
mask |= CEPH_SETATTR_SIZE;
- release |= CEPH_CAP_FILE_RDCACHE | CEPH_CAP_FILE_RD |
+ release |= CEPH_CAP_FILE_SHARED | CEPH_CAP_FILE_RD |
CEPH_CAP_FILE_WR;
}
}
*/
int ceph_permission(struct inode *inode, int mask)
{
- int err = ceph_do_getattr(inode, CEPH_CAP_AUTH_RDCACHE);
+ int err = ceph_do_getattr(inode, CEPH_CAP_AUTH_SHARED);
if (!err)
err = generic_permission(inode, mask, NULL);
ceph_cap_string(issued),
ci->i_xattrs.version, ci->i_xattrs.index_version);
- if ((issued & CEPH_CAP_XATTR_RDCACHE) &&
+ if ((issued & CEPH_CAP_XATTR_SHARED) &&
(ci->i_xattrs.index_version >= ci->i_xattrs.version)) {
goto get_xattr;
} else {
ceph_cap_string(issued),
ci->i_xattrs.version, ci->i_xattrs.index_version);
- if ((issued & CEPH_CAP_XATTR_RDCACHE) &&
+ if ((issued & CEPH_CAP_XATTR_SHARED) &&
(ci->i_xattrs.index_version > ci->i_xattrs.version)) {
goto list_xattr;
} else {
if (IS_ERR(req))
return PTR_ERR(req);
req->r_inode = igrab(inode);
- req->r_inode_drop = CEPH_CAP_XATTR_RDCACHE;
+ req->r_inode_drop = CEPH_CAP_XATTR_SHARED;
req->r_num_caps = 1;
req->r_args.setxattr.flags = cpu_to_le32(flags);
req->r_path2 = name;
if (IS_ERR(req))
return PTR_ERR(req);
req->r_inode = igrab(inode);
- req->r_inode_drop = CEPH_CAP_XATTR_RDCACHE;
+ req->r_inode_drop = CEPH_CAP_XATTR_SHARED;
req->r_num_caps = 1;
req->r_path2 = name;
if (IS_ERR(req))
return PTR_ERR(req);
req->r_inode = igrab(inode);
- req->r_inode_drop = CEPH_CAP_FILE_RDCACHE | CEPH_CAP_FILE_EXCL;
+ req->r_inode_drop = CEPH_CAP_FILE_SHARED | CEPH_CAP_FILE_EXCL;
req->r_args.setlayout.layout = layout;
err = ceph_mdsc_do_request(mdsc, parent_inode, req);
if (ci->i_rd_ref)
used |= CEPH_CAP_FILE_RD;
if (ci->i_rdcache_ref || ci->i_rdcache_gen)
- used |= CEPH_CAP_FILE_RDCACHE;
+ used |= CEPH_CAP_FILE_CACHE;
if (ci->i_wr_ref)
used |= CEPH_CAP_FILE_WR;
if (ci->i_wrbuffer_ref)
- used |= CEPH_CAP_FILE_WRBUFFER;
+ used |= CEPH_CAP_FILE_BUFFER;
return used;
}
static inline int __ceph_caps_wanted(struct ceph_inode_info *ci)
{
int w = __ceph_caps_file_wanted(ci) | __ceph_caps_used(ci);
- if (w & CEPH_CAP_FILE_WRBUFFER)
+ if (w & CEPH_CAP_FILE_BUFFER)
w |= (CEPH_CAP_FILE_EXCL); /* we want EXCL if dirty data */
return w;
}
e.fragtree.nsplits = dirfragtree._splits.size();
i = pxattr ? pi:oi;
- bool had_latest_xattrs = cap && (cap->issued() & CEPH_CAP_XATTR_RDCACHE) &&
+ bool had_latest_xattrs = cap && (cap->issued() & CEPH_CAP_XATTR_SHARED) &&
cap->client_xattr_version == i->xattr_version;
// include capability?
e.xattr_version = i->xattr_version;
if (!had_latest_xattrs &&
cap &&
- (cap->pending() & CEPH_CAP_XATTR_RDCACHE)) {
+ (cap->pending() & CEPH_CAP_XATTR_SHARED)) {
if (!pxattrs)
pxattrs = pxattr ? get_projected_xattrs() : &xattrs;
i = pxattr ? pi:oi;
map<string,bufferptr> *ix = pxattr ? get_projected_xattrs() : &xattrs;
- if ((cap->pending() & CEPH_CAP_XATTR_RDCACHE) &&
+ if ((cap->pending() & CEPH_CAP_XATTR_SHARED) &&
i->xattr_version > cap->client_xattr_version) {
dout(10) << " including xattrs v " << i->xattr_version << dendl;
::encode(*ix, m->xattrbl);
// caps allowed
int get_caps_liked() {
if (is_dir())
- return CEPH_CAP_PIN | CEPH_CAP_ANY_EXCL | CEPH_CAP_ANY_RDCACHE; // but not, say, FILE_RD|WR|WRBUFFER
+ return CEPH_CAP_PIN | CEPH_CAP_ANY_EXCL | CEPH_CAP_ANY_SHARED; // but not, say, FILE_RD|WR|WRBUFFER
else
return CEPH_CAP_ANY;
}
// choose loner?
if (in->is_auth() && in->get_loner() < 0) {
int wanted = in->get_caps_wanted();
- if (((wanted & (CEPH_CAP_GWR|CEPH_CAP_GWRBUFFER|CEPH_CAP_GEXCL)) ||
+ if (((wanted & (CEPH_CAP_GWR|CEPH_CAP_GBUFFER|CEPH_CAP_GEXCL)) ||
(in->inode.is_dir() && !in->has_subtree_root_dirfrag() &&
!in->multiple_nonstale_caps())) &&
in->try_choose_loner()) {
if (update_size)
size = new_size;
- if ((in->get_caps_wanted() & (CEPH_CAP_FILE_WR|CEPH_CAP_FILE_WRBUFFER)) == 0)
+ if ((in->get_caps_wanted() & (CEPH_CAP_FILE_WR|CEPH_CAP_FILE_BUFFER)) == 0)
new_max = 0;
else if ((size << 1) >= latest->max_size)
new_max = latest->max_size ? (latest->max_size << 1):in->get_layout_size_increment();
CInode *diri = dn->get_dir()->get_inode();
if (!diri->is_stray() && // do not issue dn leases in stray dir!
((!diri->filelock.can_lease(client) &&
- (diri->get_client_cap_pending(client) & ((CEPH_CAP_GEXCL|CEPH_CAP_GRDCACHE) << CEPH_CAP_SFILE)) == 0)) &&
+ (diri->get_client_cap_pending(client) & (CEPH_CAP_FILE_SHARED | CEPH_CAP_FILE_EXCL)) == 0)) &&
dn->lock.can_lease(client))
mask |= CEPH_LOCK_DN;
int loner_issued, other_issued, xlocker_issued;
in->get_caps_issued(&loner_issued, &other_issued, &xlocker_issued, CEPH_CAP_SFILE);
- if (!(loner_issued & (CEPH_CAP_GEXCL|CEPH_CAP_GWR|CEPH_CAP_GWRBUFFER|CEPH_CAP_GRD)) ||
- (other_wanted & (CEPH_CAP_GEXCL|CEPH_CAP_GWR|CEPH_CAP_GWRBUFFER|CEPH_CAP_GRD|CEPH_CAP_GRDCACHE)) ||
+ if (!(loner_issued & (CEPH_CAP_GEXCL|CEPH_CAP_GWR|CEPH_CAP_GBUFFER)) ||
+ (other_wanted & (CEPH_CAP_GEXCL|CEPH_CAP_GWR|CEPH_CAP_GBUFFER|CEPH_CAP_GRD|CEPH_CAP_GCACHE)) ||
(in->inode.is_dir() && in->multiple_nonstale_caps())) { // FIXME.. :/
dout(20) << " should lose it" << dendl;
// we should lose it.
else if (lock->get_state() != LOCK_EXCL &&
//!lock->is_rdlocked() &&
//!lock->is_waiter_for(SimpleLock::WAIT_WR) &&
- ((wanted & (CEPH_CAP_GWR|CEPH_CAP_GWRBUFFER)) ||
+ ((wanted & (CEPH_CAP_GWR|CEPH_CAP_GBUFFER)) ||
(in->inode.is_dir() && !in->has_subtree_root_dirfrag())) &&
in->try_choose_loner()) {
dout(7) << "file_eval stable, bump to loner " << *lock
// * -> sync?
else if (lock->get_state() != LOCK_SYNC &&
!in->filelock.is_waiter_for(SimpleLock::WAIT_WR) &&
- !(wanted & (CEPH_CAP_GWR|CEPH_CAP_GWRBUFFER)) &&
+ !(wanted & (CEPH_CAP_GWR|CEPH_CAP_GBUFFER)) &&
!(in->get_state() == LOCK_MIX &&
in->is_dir() && in->has_subtree_root_dirfrag()) // if we are a delegation point, stay where we are
//((wanted & CEPH_CAP_RD) ||
// wr?
if (issued & CEPH_CAP_ANY_WR) {
in->loner_cap = -1;
- if (issued & ((CEPH_CAP_GRDCACHE|CEPH_CAP_GWRBUFFER) << CEPH_CAP_SFILE)) {
+ if (issued & (CEPH_CAP_FILE_CACHE|CEPH_CAP_FILE_BUFFER)) {
in->filelock.set_state(LOCK_EXCL);
in->try_choose_loner();
} else {
issued = cap->issued();
int mask = req->head.args.getattr.mask;
- if ((mask & CEPH_CAP_LINK_RDCACHE) && (issued & CEPH_CAP_LINK_EXCL) == 0) rdlocks.insert(&ref->linklock);
- if ((mask & CEPH_CAP_AUTH_RDCACHE) && (issued & CEPH_CAP_AUTH_EXCL) == 0) rdlocks.insert(&ref->authlock);
- if ((mask & CEPH_CAP_FILE_RDCACHE) && (issued & CEPH_CAP_FILE_EXCL) == 0) rdlocks.insert(&ref->filelock);
- if ((mask & CEPH_CAP_XATTR_RDCACHE) && (issued & CEPH_CAP_XATTR_EXCL) == 0) rdlocks.insert(&ref->xattrlock);
+ if ((mask & CEPH_CAP_LINK_SHARED) && (issued & CEPH_CAP_LINK_EXCL) == 0) rdlocks.insert(&ref->linklock);
+ if ((mask & CEPH_CAP_AUTH_SHARED) && (issued & CEPH_CAP_AUTH_EXCL) == 0) rdlocks.insert(&ref->authlock);
+ if ((mask & CEPH_CAP_FILE_SHARED) && (issued & CEPH_CAP_FILE_EXCL) == 0) rdlocks.insert(&ref->filelock);
+ if ((mask & CEPH_CAP_XATTR_SHARED) && (issued & CEPH_CAP_XATTR_EXCL) == 0) rdlocks.insert(&ref->xattrlock);
if (!mds->locker->acquire_locks(mdr, rdlocks, wrlocks, xlocks))
return;
newi->filelock.set_state(LOCK_EXCL);
newi->authlock.set_state(LOCK_EXCL);
newi->xattrlock.set_state(LOCK_EXCL);
- cap->issue_norevoke(CEPH_CAP_AUTH_EXCL|CEPH_CAP_AUTH_RDCACHE|
- CEPH_CAP_XATTR_EXCL|CEPH_CAP_XATTR_RDCACHE);
+ cap->issue_norevoke(CEPH_CAP_AUTH_EXCL|CEPH_CAP_AUTH_SHARED|
+ CEPH_CAP_XATTR_EXCL|CEPH_CAP_XATTR_SHARED);
// make sure this inode gets into the journal
le->metablob.add_opened_ino(newi->ino());
int gcaps_xlocker_mask(int client) {
if (client == xlock_by_client)
- return CEPH_CAP_GRDCACHE | CEPH_CAP_GWRBUFFER;
+ return type == CEPH_LOCK_IFILE ? 0xffff : (CEPH_CAP_GSHARED|CEPH_CAP_GEXCL);
return 0;
}
struct sm_state_t simplelock[20] = {
// stable loner rep state r rp rd wr l x caps,other
- [LOCK_SYNC] = { 0, false, LOCK_SYNC, ANY, 0, ANY, 0, ANY, 0, CEPH_CAP_GRDCACHE,0,0,CEPH_CAP_GRDCACHE },
+ [LOCK_SYNC] = { 0, false, LOCK_SYNC, ANY, 0, ANY, 0, ANY, 0, CEPH_CAP_GSHARED,0,0,CEPH_CAP_GSHARED },
[LOCK_LOCK_SYNC] = { LOCK_SYNC, false, LOCK_SYNC, ANY, XCL, XCL, 0, XCL, 0, 0,0,0,0 },
- [LOCK_EXCL_SYNC] = { LOCK_SYNC, true, LOCK_LOCK, 0, 0, 0, 0, 0, 0, 0,CEPH_CAP_GRDCACHE,0,0 },
+ [LOCK_EXCL_SYNC] = { LOCK_SYNC, true, LOCK_LOCK, 0, 0, 0, 0, 0, 0, 0,CEPH_CAP_GSHARED,0,0 },
[LOCK_LOCK] = { 0, false, LOCK_LOCK, AUTH, 0, 0, 0, 0, 0, 0,0,0,0 },
[LOCK_SYNC_LOCK] = { LOCK_LOCK, false, LOCK_LOCK, ANY, 0, 0, 0, 0, 0, 0,0,0,0 },
[LOCK_PREXLOCK] = { LOCK_SYNC, false, LOCK_LOCK, 0, XCL, 0, 0, 0, ANY, 0,0,0 },
[LOCK_XLOCK] = { LOCK_SYNC, false, LOCK_LOCK, 0, XCL, 0, 0, 0, 0, 0,0,0 },
- [LOCK_XLOCKDONE] = { LOCK_SYNC, false, LOCK_LOCK, XCL, XCL, XCL, 0, XCL, 0, 0,0,CEPH_CAP_GRDCACHE,0 },
+ [LOCK_XLOCKDONE] = { LOCK_SYNC, false, LOCK_LOCK, XCL, XCL, XCL, 0, XCL, 0, 0,0,CEPH_CAP_GSHARED,0 },
[LOCK_LOCK_XLOCK]= { LOCK_PREXLOCK,false,LOCK_LOCK,0, XCL, 0, 0, 0, XCL, 0,0,0,0 },
- [LOCK_EXCL] = { 0, true, LOCK_LOCK, 0, 0, FW, XCL, 0, 0, 0,CEPH_CAP_GEXCL|CEPH_CAP_GRDCACHE,0,0 },
- [LOCK_SYNC_EXCL] = { LOCK_EXCL, true, LOCK_LOCK, ANY, 0, 0, 0, 0, 0, 0,CEPH_CAP_GRDCACHE,0,0 },
- [LOCK_LOCK_EXCL] = { LOCK_EXCL, false, LOCK_LOCK, ANY, 0, 0, 0, 0, 0, CEPH_CAP_GRDCACHE,0,0,0 },
+ [LOCK_EXCL] = { 0, true, LOCK_LOCK, 0, 0, FW, XCL, 0, 0, 0,CEPH_CAP_GEXCL|CEPH_CAP_GSHARED,0,0 },
+ [LOCK_SYNC_EXCL] = { LOCK_EXCL, true, LOCK_LOCK, ANY, 0, 0, 0, 0, 0, 0,CEPH_CAP_GSHARED,0,0 },
+ [LOCK_LOCK_EXCL] = { LOCK_EXCL, false, LOCK_LOCK, ANY, 0, 0, 0, 0, 0, CEPH_CAP_GSHARED,0,0,0 },
[LOCK_REMOTEXLOCK]={ LOCK_LOCK, false, LOCK_LOCK, 0, 0, 0, 0, 0, 0, 0,0,0,0 },
};
struct sm_t sm_simplelock = {
.states = simplelock,
- .allowed_ever_auth = CEPH_CAP_GRDCACHE | CEPH_CAP_GEXCL,
- .allowed_ever_replica = CEPH_CAP_GRDCACHE,
- .careful = CEPH_CAP_GRDCACHE | CEPH_CAP_GEXCL,
+ .allowed_ever_auth = CEPH_CAP_GSHARED | CEPH_CAP_GEXCL,
+ .allowed_ever_replica = CEPH_CAP_GSHARED,
+ .careful = CEPH_CAP_GSHARED | CEPH_CAP_GEXCL,
.can_remote_xlock = 1,
};
struct sm_state_t scatterlock[30] = {
// stable loner rep state r rp rd wr l x caps,other
- [LOCK_SYNC] = { 0, false, LOCK_SYNC, ANY, 0, ANY, 0, ANY, 0, CEPH_CAP_GRDCACHE,0,0,CEPH_CAP_GRDCACHE },
+ [LOCK_SYNC] = { 0, false, LOCK_SYNC, ANY, 0, ANY, 0, ANY, 0, CEPH_CAP_GSHARED,0,0,CEPH_CAP_GSHARED },
[LOCK_LOCK_SYNC] = { LOCK_SYNC, false, LOCK_LOCK, AUTH, 0, 0, 0, 0, 0, 0,0,0,0 },
[LOCK_MIX_SYNC] = { LOCK_SYNC, false, LOCK_LOCK, 0, 0, 0, 0, 0, 0, 0,0,0,0 },
struct sm_t sm_scatterlock = {
.states = scatterlock,
- .allowed_ever_auth = CEPH_CAP_GRDCACHE | CEPH_CAP_GEXCL,
- .allowed_ever_replica = CEPH_CAP_GRDCACHE,
- .careful = CEPH_CAP_GRDCACHE | CEPH_CAP_GEXCL,
+ .allowed_ever_auth = CEPH_CAP_GSHARED | CEPH_CAP_GEXCL,
+ .allowed_ever_replica = CEPH_CAP_GSHARED,
+ .careful = CEPH_CAP_GSHARED | CEPH_CAP_GEXCL,
.can_remote_xlock = 0,
};
struct sm_state_t filelock[30] = {
- // stable loner rep state r rp rd wr l x caps,other
- [LOCK_SYNC] = { 0, false, LOCK_SYNC, ANY, 0, ANY, 0, ANY, 0, CEPH_CAP_GRDCACHE|CEPH_CAP_GRD,0,0,CEPH_CAP_GRDCACHE|CEPH_CAP_GRD },
- [LOCK_LOCK_SYNC] = { LOCK_SYNC, false, LOCK_SYNC, AUTH, 0, AUTH,0, 0, 0, CEPH_CAP_GRDCACHE|CEPH_CAP_GWRBUFFER,0,0,0 },
- [LOCK_EXCL_SYNC] = { LOCK_SYNC, true, LOCK_LOCK, 0, 0, 0, 0, 0, 0, 0,CEPH_CAP_GRDCACHE|CEPH_CAP_GRD,0,0 },
+ // stable loner rep state r rp rd wr l x caps(any,loner,xlocker,replica)
+ [LOCK_SYNC] = { 0, false, LOCK_SYNC, ANY, 0, ANY, 0, ANY, 0, CEPH_CAP_GSHARED|CEPH_CAP_GCACHE|CEPH_CAP_GRD,0,0,CEPH_CAP_GSHARED|CEPH_CAP_GCACHE|CEPH_CAP_GRD },
+ [LOCK_LOCK_SYNC] = { LOCK_SYNC, false, LOCK_SYNC, AUTH, 0, AUTH,0, 0, 0, CEPH_CAP_GCACHE,0,0,0 },
+ [LOCK_EXCL_SYNC] = { LOCK_SYNC, true, LOCK_LOCK, 0, 0, 0, 0, 0, 0, 0,CEPH_CAP_GSHARED|CEPH_CAP_GCACHE|CEPH_CAP_GRD,0,0 },
[LOCK_MIX_SYNC] = { LOCK_SYNC, false, LOCK_MIX, 0, 0, 0, 0, 0, 0, CEPH_CAP_GRD,0,0,CEPH_CAP_GRD },
[LOCK_MIX_SYNC2] = { LOCK_SYNC, false, 0, 0, 0, 0, 0, 0, 0, CEPH_CAP_GRD,0,0,CEPH_CAP_GRD },
- [LOCK_LOCK] = { 0, false, LOCK_LOCK, AUTH, 0, AUTH,AUTH,0, 0, CEPH_CAP_GRDCACHE|CEPH_CAP_GWRBUFFER,0,0,0 },
- [LOCK_SYNC_LOCK] = { LOCK_LOCK, false, LOCK_LOCK, AUTH, 0, 0, 0, 0, 0, CEPH_CAP_GRDCACHE,0,0,CEPH_CAP_GRDCACHE },
- [LOCK_EXCL_LOCK] = { LOCK_LOCK, false, LOCK_LOCK, 0, 0, 0, 0, 0, 0, CEPH_CAP_GRDCACHE|CEPH_CAP_GWRBUFFER,0,0,CEPH_CAP_GRDCACHE },
+ [LOCK_LOCK] = { 0, false, LOCK_LOCK, AUTH, 0, AUTH,AUTH,0, 0, CEPH_CAP_GCACHE|CEPH_CAP_GBUFFER,0,0,0 },
+ [LOCK_SYNC_LOCK] = { LOCK_LOCK, false, LOCK_LOCK, AUTH, 0, 0, 0, 0, 0, CEPH_CAP_GCACHE,0,0,CEPH_CAP_GCACHE },
+ [LOCK_EXCL_LOCK] = { LOCK_LOCK, false, LOCK_LOCK, 0, 0, 0, 0, 0, 0, CEPH_CAP_GCACHE|CEPH_CAP_GBUFFER,0,0,CEPH_CAP_GCACHE },
[LOCK_MIX_LOCK] = { LOCK_LOCK, false, LOCK_LOCK, AUTH, 0, 0, 0, 0, 0, 0,0,0,0 },
- [LOCK_PREXLOCK] = { LOCK_SYNC, false, LOCK_LOCK, 0, XCL, 0, 0, 0, ANY, CEPH_CAP_GRDCACHE|CEPH_CAP_GWRBUFFER,0,0,0 },
- [LOCK_XLOCK] = { LOCK_SYNC, false, LOCK_LOCK, 0, XCL, 0, 0, 0, 0, CEPH_CAP_GRDCACHE|CEPH_CAP_GWRBUFFER,0,0,0 },
- [LOCK_XLOCKDONE] = { LOCK_SYNC, false, LOCK_LOCK, XCL, XCL, XCL, 0, XCL, 0, CEPH_CAP_GRDCACHE|CEPH_CAP_GWRBUFFER,0,0,0 },
- [LOCK_LOCK_XLOCK]= { LOCK_PREXLOCK,false,LOCK_LOCK,0, XCL, 0, 0, 0, XCL, CEPH_CAP_GRDCACHE|CEPH_CAP_GWRBUFFER,0,0,0 },
+ [LOCK_PREXLOCK] = { LOCK_SYNC, false, LOCK_LOCK, 0, XCL, 0, 0, 0, ANY, CEPH_CAP_GCACHE|CEPH_CAP_GBUFFER,0,0,0 },
+ [LOCK_XLOCK] = { LOCK_SYNC, false, LOCK_LOCK, 0, XCL, 0, 0, 0, 0, CEPH_CAP_GCACHE|CEPH_CAP_GBUFFER,0,0,0 },
+ [LOCK_XLOCKDONE] = { LOCK_SYNC, false, LOCK_LOCK, XCL, XCL, XCL, 0, XCL, 0, CEPH_CAP_GCACHE|CEPH_CAP_GBUFFER,0,CEPH_CAP_GSHARED,0 },
+ [LOCK_LOCK_XLOCK]= { LOCK_PREXLOCK,false,LOCK_LOCK,0, XCL, 0, 0, 0, XCL, CEPH_CAP_GCACHE|CEPH_CAP_GBUFFER,0,0,0 },
[LOCK_MIX] = { 0, false, LOCK_MIX, 0, 0, FW, ANY, 0, 0, CEPH_CAP_GRD|CEPH_CAP_GWR,0,0,CEPH_CAP_GRD },
[LOCK_SYNC_MIX] = { LOCK_MIX, false, LOCK_MIX, ANY, 0, 0, 0, 0, 0, CEPH_CAP_GRD,0,0,CEPH_CAP_GRD },
[LOCK_SYNC_MIX2] = { LOCK_MIX, false, 0, ANY, 0, 0, 0, 0, 0, CEPH_CAP_GRD,0,0,CEPH_CAP_GRD },
[LOCK_EXCL_MIX] = { LOCK_MIX, true, LOCK_LOCK, 0, 0, 0, XCL, 0, 0, 0,CEPH_CAP_GRD|CEPH_CAP_GWR,0,0 },
- [LOCK_EXCL] = { 0, true, LOCK_LOCK, 0, 0, FW, XCL, 0, 0, 0,CEPH_CAP_GRDCACHE|CEPH_CAP_GEXCL|CEPH_CAP_GRD|CEPH_CAP_GWR|CEPH_CAP_GWRBUFFER,0,0 },
- [LOCK_SYNC_EXCL] = { LOCK_EXCL, true, LOCK_LOCK, AUTH, 0, 0, 0, 0, 0, 0,CEPH_CAP_GRDCACHE|CEPH_CAP_GRD,0,0 },
+ [LOCK_EXCL] = { 0, true, LOCK_LOCK, 0, 0, FW, XCL, 0, 0, 0,CEPH_CAP_GSHARED|CEPH_CAP_GEXCL|CEPH_CAP_GCACHE|CEPH_CAP_GRD|CEPH_CAP_GWR|CEPH_CAP_GBUFFER,0,0 },
+ [LOCK_SYNC_EXCL] = { LOCK_EXCL, true, LOCK_LOCK, AUTH, 0, 0, 0, 0, 0, 0,CEPH_CAP_GSHARED|CEPH_CAP_GCACHE|CEPH_CAP_GRD,0,0 },
[LOCK_MIX_EXCL] = { LOCK_EXCL, true, LOCK_LOCK, 0, 0, 0, XCL, 0, 0, 0,CEPH_CAP_GRD|CEPH_CAP_GWR,0,0 },
- [LOCK_LOCK_EXCL] = { LOCK_EXCL, true, LOCK_LOCK, AUTH, 0, 0, 0, 0, 0, 0,CEPH_CAP_GRDCACHE|CEPH_CAP_GWRBUFFER,0,0 },
+ [LOCK_LOCK_EXCL] = { LOCK_EXCL, true, LOCK_LOCK, AUTH, 0, 0, 0, 0, 0, 0,CEPH_CAP_GCACHE|CEPH_CAP_GBUFFER,0,0 },
};
struct sm_t sm_filelock = {
.states = filelock,
- .allowed_ever_auth = (CEPH_CAP_GRDCACHE |
+ .allowed_ever_auth = (CEPH_CAP_GSHARED |
CEPH_CAP_GEXCL |
+ CEPH_CAP_GCACHE |
CEPH_CAP_GRD |
CEPH_CAP_GWR |
CEPH_CAP_GWREXTEND |
- CEPH_CAP_GWRBUFFER |
+ CEPH_CAP_GBUFFER |
CEPH_CAP_GLAZYIO),
- .allowed_ever_replica = (CEPH_CAP_GRDCACHE |
+ .allowed_ever_replica = (CEPH_CAP_GSHARED |
+ CEPH_CAP_GCACHE |
CEPH_CAP_GRD |
CEPH_CAP_GLAZYIO),
- .careful = (CEPH_CAP_GRDCACHE |
+ .careful = (CEPH_CAP_GSHARED |
CEPH_CAP_GEXCL |
- CEPH_CAP_GWRBUFFER),
+ CEPH_CAP_GCACHE |
+ CEPH_CAP_GBUFFER),
.can_remote_xlock = 0,
};
inline string gcap_string(int cap)
{
string s;
- if (cap & CEPH_CAP_GRDCACHE) s += "c";
+ if (cap & CEPH_CAP_GSHARED) s += "s";
if (cap & CEPH_CAP_GEXCL) s += "x";
+ if (cap & CEPH_CAP_GCACHE) s += "c";
if (cap & CEPH_CAP_GRD) s += "r";
if (cap & CEPH_CAP_GWR) s += "w";
- if (cap & CEPH_CAP_GWRBUFFER) s += "b";
+ if (cap & CEPH_CAP_GBUFFER) s += "b";
if (cap & CEPH_CAP_GWREXTEND) s += "a";
if (cap & CEPH_CAP_GLAZYIO) s += "l";
return s;