On Fri, 13 Jan 2012, Alex Elder wrote:
> The ceph_mds_session s_cap_gen field can be accessed concurrently
> and is used for synchronization. Change it to be an atomic_t to
> make the desired atomicity explicit.
>
> Signed-off-by: Alex Elder <[email protected]>
> ---
> fs/ceph/caps.c | 6 +++---
> fs/ceph/dir.c | 2 +-
> fs/ceph/inode.c | 4 ++--
> fs/ceph/mds_client.c | 8 ++++----
> fs/ceph/mds_client.h | 2 +-
> 5 files changed, 11 insertions(+), 11 deletions(-)
>
> diff --git a/fs/ceph/caps.c b/fs/ceph/caps.c
> index 90d789d..fd240e3 100644
> --- a/fs/ceph/caps.c
> +++ b/fs/ceph/caps.c
> @@ -622,7 +622,7 @@ retry:
> cap->seq = seq;
> cap->issue_seq = seq;
> cap->mseq = mseq;
> - cap->cap_gen = session->s_cap_gen;
> + cap->cap_gen = atomic_read(&session->s_cap_gen);
This (cap update/addition) happens under the session mutex, so we don't
need to worry about an s_cap_gen update here.
>
> if (fmode >= 0)
> __ceph_get_fmode(ci, fmode);
> @@ -642,7 +642,7 @@ static int __cap_is_valid(struct ceph_cap *cap)
> u32 gen;
>
> spin_lock(&cap->session->s_gen_ttl_lock);
> - gen = cap->session->s_cap_gen;
> + gen = atomic_read(&cap->session->s_cap_gen);
> ttl = cap->session->s_cap_ttl;
> spin_unlock(&cap->session->s_gen_ttl_lock);
If we hold the spinlock, I don't think we need it here, either.
>
> @@ -2347,7 +2347,7 @@ static void handle_cap_grant(struct inode *inode,
> struct ceph_mds_caps *grant,
> issued = __ceph_caps_issued(ci, &implemented);
> issued |= implemented | __ceph_caps_dirty(ci);
>
> - cap->cap_gen = session->s_cap_gen;
> + cap->cap_gen = atomic_read(&session->s_cap_gen);
Also under session mutex.
>
> __check_cap_issue(ci, cap, newcaps);
>
> diff --git a/fs/ceph/dir.c b/fs/ceph/dir.c
> index a1a0693..da9427d 100644
> --- a/fs/ceph/dir.c
> +++ b/fs/ceph/dir.c
> @@ -978,7 +978,7 @@ static int dentry_lease_is_valid(struct dentry
> *dentry)
> ceph_get_mds_session(s);
>
> spin_lock(&s->s_gen_ttl_lock);
> - gen = s->s_cap_gen;
> + gen = atomic_read(&s->s_cap_gen);
> ttl = s->s_cap_ttl;
> spin_unlock(&s->s_gen_ttl_lock);
or the spinlock
>
> diff --git a/fs/ceph/inode.c b/fs/ceph/inode.c
> index f556e76..23bee03 100644
> --- a/fs/ceph/inode.c
> +++ b/fs/ceph/inode.c
> @@ -820,7 +820,7 @@ static void update_dentry_lease(struct dentry
> *dentry,
> if (duration == 0)
> goto out_unlock;
>
> - if (di->lease_gen == session->s_cap_gen &&
> + if (di->lease_gen == atomic_read(&session->s_cap_gen) &&
> time_before(ttl, dentry->d_time))
> goto out_unlock; /* we already have a newer lease. */
under session mutex
>
> @@ -831,7 +831,7 @@ static void update_dentry_lease(struct dentry
> *dentry,
>
> if (!di->lease_session)
> di->lease_session = ceph_get_mds_session(session);
> - di->lease_gen = session->s_cap_gen;
> + di->lease_gen = atomic_read(&session->s_cap_gen);
here too
> di->lease_seq = le32_to_cpu(lease->seq);
> di->lease_renew_after = half_ttl;
> di->lease_renew_from = 0;
> diff --git a/fs/ceph/mds_client.c b/fs/ceph/mds_client.c
> index bd147fa..cd567c3 100644
> --- a/fs/ceph/mds_client.c
> +++ b/fs/ceph/mds_client.c
> @@ -399,7 +399,7 @@ static struct ceph_mds_session
> *register_session(struct ceph_mds_client *mdsc,
> s->s_con.peer_name.num = cpu_to_le64(mds);
>
> spin_lock_init(&s->s_gen_ttl_lock);
> - s->s_cap_gen = 0;
> + atomic_set(&s->s_cap_gen, 0);
> s->s_cap_ttl = jiffies - 1;
>
> spin_lock_init(&s->s_cap_lock);
> @@ -2328,7 +2328,7 @@ static void handle_session(struct ceph_mds_session
> *session,
> pr_info("mds%d caps went stale, renewing\n",
> session->s_mds);
> spin_lock(&session->s_gen_ttl_lock);
> - session->s_cap_gen++;
> + atomic_inc(&session->s_cap_gen);
spinlock
> session->s_cap_ttl = jiffies - 1;
> spin_unlock(&session->s_gen_ttl_lock);
> send_renew_caps(mdsc, session);
> @@ -2783,7 +2783,7 @@ static void handle_lease(struct ceph_mds_client
> *mdsc,
>
> case CEPH_MDS_LEASE_RENEW:
> if (di->lease_session == session &&
> - di->lease_gen == session->s_cap_gen &&
> + di->lease_gen == atomic_read(&session->s_cap_gen) &&
under session->mutex
> di->lease_renew_from &&
> di->lease_renew_after == 0) {
> unsigned long duration =
> @@ -2874,7 +2874,7 @@ void ceph_mdsc_lease_release(struct
> ceph_mds_client *mdsc, struct inode *inode,
> di = ceph_dentry(dentry);
> if (!di || !di->lease_session ||
> di->lease_session->s_mds < 0 ||
> - di->lease_gen != di->lease_session->s_cap_gen ||
> + di->lease_gen != atomic_read(&di->lease_session->s_cap_gen) ||
Okay, this one needs synchronization. It looks like the only one, too.
Can we just use the spinlock for it?
> !time_before(jiffies, dentry->d_time)) {
> dout("lease_release inode %p dentry %p -- "
> "no lease\n",
> diff --git a/fs/ceph/mds_client.h b/fs/ceph/mds_client.h
> index 8c7c04e..20ca17e 100644
> --- a/fs/ceph/mds_client.h
> +++ b/fs/ceph/mds_client.h
> @@ -119,7 +119,7 @@ struct ceph_mds_session {
>
> /* protected by s_gen_ttl_lock */
> spinlock_t s_gen_ttl_lock;
> - u32 s_cap_gen; /* inc each time we get mds stale msg */
> + atomic_t s_cap_gen; /* inc each time we get mds stale msg */
> unsigned long s_cap_ttl; /* when session caps expire */
>
> /* protected by s_cap_lock */
> --
> 1.7.5.4
>
>
>
> --
> To unsubscribe from this list: send the line "unsubscribe ceph-devel" in
> the body of a message to [email protected]
> More majordomo info at http://vger.kernel.org/majordomo-info.html
>
>
--
To unsubscribe from this list: send the line "unsubscribe ceph-devel" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html