Skip to content

Commit 52d60f8

Browse files
jtlaytonidryomov
authored andcommitted
ceph: eliminate session->s_gen_ttl_lock
Turn s_cap_gen field into an atomic_t, and just rely on the fact that we hold the s_mutex when changing the s_cap_ttl field. Signed-off-by: Jeff Layton <jlayton@kernel.org> Reviewed-by: Luis Henriques <lhenriques@suse.de> Signed-off-by: Ilya Dryomov <idryomov@gmail.com>
1 parent 7e65624 commit 52d60f8

5 files changed

Lines changed: 17 additions & 29 deletions

File tree

fs/ceph/caps.c

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -645,9 +645,7 @@ void ceph_add_cap(struct inode *inode,
645645
dout("add_cap %p mds%d cap %llx %s seq %d\n", inode,
646646
session->s_mds, cap_id, ceph_cap_string(issued), seq);
647647

648-
spin_lock(&session->s_gen_ttl_lock);
649-
gen = session->s_cap_gen;
650-
spin_unlock(&session->s_gen_ttl_lock);
648+
gen = atomic_read(&session->s_cap_gen);
651649

652650
cap = __get_cap_for_mds(ci, mds);
653651
if (!cap) {
@@ -785,10 +783,8 @@ static int __cap_is_valid(struct ceph_cap *cap)
785783
unsigned long ttl;
786784
u32 gen;
787785

788-
spin_lock(&cap->session->s_gen_ttl_lock);
789-
gen = cap->session->s_cap_gen;
786+
gen = atomic_read(&cap->session->s_cap_gen);
790787
ttl = cap->session->s_cap_ttl;
791-
spin_unlock(&cap->session->s_gen_ttl_lock);
792788

793789
if (cap->cap_gen < gen || time_after_eq(jiffies, ttl)) {
794790
dout("__cap_is_valid %p cap %p issued %s "
@@ -1182,7 +1178,8 @@ void __ceph_remove_cap(struct ceph_cap *cap, bool queue_release)
11821178
* s_cap_gen while session is in the reconnect state.
11831179
*/
11841180
if (queue_release &&
1185-
(!session->s_cap_reconnect || cap->cap_gen == session->s_cap_gen)) {
1181+
(!session->s_cap_reconnect ||
1182+
cap->cap_gen == atomic_read(&session->s_cap_gen))) {
11861183
cap->queue_release = 1;
11871184
if (removed) {
11881185
__ceph_queue_cap_release(session, cap);
@@ -3288,7 +3285,7 @@ static void handle_cap_grant(struct inode *inode,
32883285
u64 size = le64_to_cpu(grant->size);
32893286
u64 max_size = le64_to_cpu(grant->max_size);
32903287
unsigned char check_caps = 0;
3291-
bool was_stale = cap->cap_gen < session->s_cap_gen;
3288+
bool was_stale = cap->cap_gen < atomic_read(&session->s_cap_gen);
32923289
bool wake = false;
32933290
bool writeback = false;
32943291
bool queue_trunc = false;
@@ -3340,7 +3337,7 @@ static void handle_cap_grant(struct inode *inode,
33403337
}
33413338

33423339
/* side effects now are allowed */
3343-
cap->cap_gen = session->s_cap_gen;
3340+
cap->cap_gen = atomic_read(&session->s_cap_gen);
33443341
cap->seq = seq;
33453342

33463343
__check_cap_issue(ci, cap, newcaps);

fs/ceph/dir.c

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1548,10 +1548,8 @@ static bool __dentry_lease_is_valid(struct ceph_dentry_info *di)
15481548
u32 gen;
15491549
unsigned long ttl;
15501550

1551-
spin_lock(&session->s_gen_ttl_lock);
1552-
gen = session->s_cap_gen;
1551+
gen = atomic_read(&session->s_cap_gen);
15531552
ttl = session->s_cap_ttl;
1554-
spin_unlock(&session->s_gen_ttl_lock);
15551553

15561554
if (di->lease_gen == gen &&
15571555
time_before(jiffies, ttl) &&

fs/ceph/inode.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1124,7 +1124,7 @@ static void __update_dentry_lease(struct inode *dir, struct dentry *dentry,
11241124
return;
11251125
}
11261126

1127-
if (di->lease_gen == session->s_cap_gen &&
1127+
if (di->lease_gen == atomic_read(&session->s_cap_gen) &&
11281128
time_before(ttl, di->time))
11291129
return; /* we already have a newer lease. */
11301130

@@ -1135,7 +1135,7 @@ static void __update_dentry_lease(struct inode *dir, struct dentry *dentry,
11351135

11361136
if (!di->lease_session)
11371137
di->lease_session = ceph_get_mds_session(session);
1138-
di->lease_gen = session->s_cap_gen;
1138+
di->lease_gen = atomic_read(&session->s_cap_gen);
11391139
di->lease_seq = le32_to_cpu(lease->seq);
11401140
di->lease_renew_after = half_ttl;
11411141
di->lease_renew_from = 0;

fs/ceph/mds_client.c

Lines changed: 6 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -749,8 +749,7 @@ static struct ceph_mds_session *register_session(struct ceph_mds_client *mdsc,
749749

750750
ceph_con_init(&s->s_con, s, &mds_con_ops, &mdsc->fsc->client->msgr);
751751

752-
spin_lock_init(&s->s_gen_ttl_lock);
753-
s->s_cap_gen = 1;
752+
atomic_set(&s->s_cap_gen, 1);
754753
s->s_cap_ttl = jiffies - 1;
755754

756755
spin_lock_init(&s->s_cap_lock);
@@ -1763,7 +1762,7 @@ static int wake_up_session_cb(struct inode *inode, struct ceph_cap *cap,
17631762
ci->i_requested_max_size = 0;
17641763
spin_unlock(&ci->i_ceph_lock);
17651764
} else if (ev == RENEWCAPS) {
1766-
if (cap->cap_gen < cap->session->s_cap_gen) {
1765+
if (cap->cap_gen < atomic_read(&cap->session->s_cap_gen)) {
17671766
/* mds did not re-issue stale cap */
17681767
spin_lock(&ci->i_ceph_lock);
17691768
cap->issued = cap->implemented = CEPH_CAP_PIN;
@@ -3501,10 +3500,8 @@ static void handle_session(struct ceph_mds_session *session,
35013500
case CEPH_SESSION_STALE:
35023501
pr_info("mds%d caps went stale, renewing\n",
35033502
session->s_mds);
3504-
spin_lock(&session->s_gen_ttl_lock);
3505-
session->s_cap_gen++;
3503+
atomic_inc(&session->s_cap_gen);
35063504
session->s_cap_ttl = jiffies - 1;
3507-
spin_unlock(&session->s_gen_ttl_lock);
35083505
send_renew_caps(mdsc, session);
35093506
break;
35103507

@@ -3773,7 +3770,7 @@ static int reconnect_caps_cb(struct inode *inode, struct ceph_cap *cap,
37733770
cap->seq = 0; /* reset cap seq */
37743771
cap->issue_seq = 0; /* and issue_seq */
37753772
cap->mseq = 0; /* and migrate_seq */
3776-
cap->cap_gen = cap->session->s_cap_gen;
3773+
cap->cap_gen = atomic_read(&cap->session->s_cap_gen);
37773774

37783775
/* These are lost when the session goes away */
37793776
if (S_ISDIR(inode->i_mode)) {
@@ -4013,9 +4010,7 @@ static void send_mds_reconnect(struct ceph_mds_client *mdsc,
40134010
dout("session %p state %s\n", session,
40144011
ceph_session_state_name(session->s_state));
40154012

4016-
spin_lock(&session->s_gen_ttl_lock);
4017-
session->s_cap_gen++;
4018-
spin_unlock(&session->s_gen_ttl_lock);
4013+
atomic_inc(&session->s_cap_gen);
40194014

40204015
spin_lock(&session->s_cap_lock);
40214016
/* don't know if session is readonly */
@@ -4346,7 +4341,7 @@ static void handle_lease(struct ceph_mds_client *mdsc,
43464341

43474342
case CEPH_MDS_LEASE_RENEW:
43484343
if (di->lease_session == session &&
4349-
di->lease_gen == session->s_cap_gen &&
4344+
di->lease_gen == atomic_read(&session->s_cap_gen) &&
43504345
di->lease_renew_from &&
43514346
di->lease_renew_after == 0) {
43524347
unsigned long duration =

fs/ceph/mds_client.h

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -186,10 +186,8 @@ struct ceph_mds_session {
186186

187187
struct ceph_auth_handshake s_auth;
188188

189-
/* protected by s_gen_ttl_lock */
190-
spinlock_t s_gen_ttl_lock;
191-
u32 s_cap_gen; /* inc each time we get mds stale msg */
192-
unsigned long s_cap_ttl; /* when session caps expire */
189+
atomic_t s_cap_gen; /* inc each time we get mds stale msg */
190+
unsigned long s_cap_ttl; /* when session caps expire. protected by s_mutex */
193191

194192
/* protected by s_cap_lock */
195193
spinlock_t s_cap_lock;

0 commit comments

Comments
 (0)