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);
 
        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);
 
@@ -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);
 
        __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);
 
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. */
 
@@ -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);
        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);
                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) &&
                    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) ||
            !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

Reply via email to