From e0013f41c7d2bbfd7323587032d01d62c70bd7d7 Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Mon, 30 Mar 2009 10:10:05 -0700 Subject: [PATCH] kclient: keep track of which cap is authoritative --- src/include/ceph_fs.h | 3 +++ src/kernel/caps.c | 11 +++++++++-- src/kernel/inode.c | 2 ++ src/kernel/super.h | 3 ++- src/mds/CInode.cc | 1 + 5 files changed, 17 insertions(+), 3 deletions(-) diff --git a/src/include/ceph_fs.h b/src/include/ceph_fs.h index 8d28bbc661d0d..ee5ac7a73e8e8 100644 --- a/src/include/ceph_fs.h +++ b/src/include/ceph_fs.h @@ -871,8 +871,11 @@ struct ceph_mds_reply_cap { __le32 seq, mseq; __le64 realm; __le32 ttl_ms; /* ttl, in ms. if readonly and unwanted. */ + __u8 flags; } __attribute__ ((packed)); +#define CEPH_CAP_FLAG_AUTH 1 + struct ceph_mds_reply_inode { __le64 ino; __le64 snapid; diff --git a/src/kernel/caps.c b/src/kernel/caps.c index c2ddd2dad129e..90e411bdbbce8 100644 --- a/src/kernel/caps.c +++ b/src/kernel/caps.c @@ -254,7 +254,7 @@ int ceph_add_cap(struct inode *inode, struct ceph_mds_session *session, u64 cap_id, int fmode, unsigned issued, unsigned wanted, unsigned seq, unsigned mseq, u64 realmino, - unsigned ttl_ms, unsigned long ttl_from, + unsigned ttl_ms, unsigned long ttl_from, int flags, struct ceph_cap *new_cap) { struct ceph_mds_client *mdsc = &ceph_inode_to_client(inode)->mdsc; @@ -340,6 +340,11 @@ retry: ci->i_ceph_flags &= ~CEPH_I_COMPLETE; } + if (flags & CEPH_CAP_FLAG_AUTH) + ci->i_auth_cap = cap; + else if (ci->i_auth_cap == cap) + ci->i_auth_cap = NULL; + /* * Ensure our rdcaps status is correct */ @@ -536,6 +541,8 @@ static int __ceph_remove_cap(struct ceph_cap *cap) /* remove from inode list */ rb_erase(&cap->ci_node, &ci->i_caps); cap->session = NULL; + if (ci->i_auth_cap == cap) + ci->i_auth_cap = NULL; kfree(cap); @@ -1774,7 +1781,7 @@ static void handle_cap_import(struct ceph_mds_client *mdsc, downgrade_write(&mdsc->snap_rwsem); ceph_add_cap(inode, session, cap_id, -1, issued, wanted, seq, mseq, realmino, - ttl_ms, jiffies - ttl_ms/2, NULL); + ttl_ms, jiffies - ttl_ms/2, CEPH_CAP_FLAG_AUTH, NULL); up_read(&mdsc->snap_rwsem); } diff --git a/src/kernel/inode.c b/src/kernel/inode.c index 6ab193327655a..ebdb20bea50c5 100644 --- a/src/kernel/inode.c +++ b/src/kernel/inode.c @@ -258,6 +258,7 @@ struct inode *ceph_alloc_inode(struct super_block *sb) ci->i_xattr_data = NULL; ci->i_caps = RB_ROOT; + ci->i_auth_cap = NULL; ci->i_dirty_caps = 0; init_waitqueue_head(&ci->i_cap_wq); ci->i_hold_caps_until = 0; @@ -571,6 +572,7 @@ no_change: le64_to_cpu(info->cap.realm), le32_to_cpu(info->cap.ttl_ms), ttl_from, + info->cap.flags, NULL); } else { spin_lock(&inode->i_lock); diff --git a/src/kernel/super.h b/src/kernel/super.h index 3df1e85dce43d..79e779d3abef6 100644 --- a/src/kernel/super.h +++ b/src/kernel/super.h @@ -257,6 +257,7 @@ struct ceph_inode_info { /* capabilities. protected _both_ by i_lock and cap->session's * s_mutex. */ struct rb_root i_caps; /* cap list */ + struct ceph_cap *i_auth_cap; /* authoritative cap, if any */ unsigned i_dirty_caps; /* mask of dirtied fields */ wait_queue_head_t i_cap_wq; /* threads waiting on a capability */ unsigned long i_hold_caps_until; /* jiffies */ @@ -732,7 +733,7 @@ extern int ceph_add_cap(struct inode *inode, struct ceph_mds_session *session, u64 cap_id, int fmode, unsigned issued, unsigned wanted, unsigned cap, unsigned seq, u64 realmino, - unsigned ttl_ms, unsigned long ttl_from, + unsigned ttl_ms, unsigned long ttl_from, int flags, struct ceph_cap *new_cap); extern void ceph_remove_cap(struct ceph_cap *cap); extern int ceph_get_cap_mds(struct inode *inode); diff --git a/src/mds/CInode.cc b/src/mds/CInode.cc index fdf1142c381fa..9dce70c7f45de 100644 --- a/src/mds/CInode.cc +++ b/src/mds/CInode.cc @@ -1492,6 +1492,7 @@ bool CInode::encode_inodestat(bufferlist& bl, Session *session, e.cap.ttl_ms = 0; } } + e.cap.flags = is_auth() ? CEPH_CAP_FLAG_AUTH:0; dout(10) << "encode_inodestat caps " << ccap_string(e.cap.caps) << " seq " << e.cap.seq << " mseq " << e.cap.mseq << dendl; -- 2.39.5