Skip to content

Commit 704f4cb

Browse files
committed
Merge tag 'ceph-for-5.14-rc3' of git://github.com/ceph/ceph-client
Pull ceph fixes from Ilya Dryomov: "A subtle deadlock on lock_rwsem (marked for stable) and rbd fixes for a -rc1 regression. Also included a rare WARN condition tweak" * tag 'ceph-for-5.14-rc3' of git://github.com/ceph/ceph-client: rbd: resurrect setting of disk->private_data in rbd_init_disk() ceph: don't WARN if we're still opening a session to an MDS rbd: don't hold lock_rwsem while running_list is being drained rbd: always kick acquire on "acquired" and "released" notifications
2 parents 05daae0 + 0077a50 commit 704f4cb

File tree

2 files changed

+14
-21
lines changed

2 files changed

+14
-21
lines changed

drivers/block/rbd.c

Lines changed: 13 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -4100,8 +4100,6 @@ static void rbd_acquire_lock(struct work_struct *work)
41004100

41014101
static bool rbd_quiesce_lock(struct rbd_device *rbd_dev)
41024102
{
4103-
bool need_wait;
4104-
41054103
dout("%s rbd_dev %p\n", __func__, rbd_dev);
41064104
lockdep_assert_held_write(&rbd_dev->lock_rwsem);
41074105

@@ -4113,11 +4111,11 @@ static bool rbd_quiesce_lock(struct rbd_device *rbd_dev)
41134111
*/
41144112
rbd_dev->lock_state = RBD_LOCK_STATE_RELEASING;
41154113
rbd_assert(!completion_done(&rbd_dev->releasing_wait));
4116-
need_wait = !list_empty(&rbd_dev->running_list);
4117-
downgrade_write(&rbd_dev->lock_rwsem);
4118-
if (need_wait)
4119-
wait_for_completion(&rbd_dev->releasing_wait);
4120-
up_read(&rbd_dev->lock_rwsem);
4114+
if (list_empty(&rbd_dev->running_list))
4115+
return true;
4116+
4117+
up_write(&rbd_dev->lock_rwsem);
4118+
wait_for_completion(&rbd_dev->releasing_wait);
41214119

41224120
down_write(&rbd_dev->lock_rwsem);
41234121
if (rbd_dev->lock_state != RBD_LOCK_STATE_RELEASING)
@@ -4203,15 +4201,11 @@ static void rbd_handle_acquired_lock(struct rbd_device *rbd_dev, u8 struct_v,
42034201
if (!rbd_cid_equal(&cid, &rbd_empty_cid)) {
42044202
down_write(&rbd_dev->lock_rwsem);
42054203
if (rbd_cid_equal(&cid, &rbd_dev->owner_cid)) {
4206-
/*
4207-
* we already know that the remote client is
4208-
* the owner
4209-
*/
4210-
up_write(&rbd_dev->lock_rwsem);
4211-
return;
4204+
dout("%s rbd_dev %p cid %llu-%llu == owner_cid\n",
4205+
__func__, rbd_dev, cid.gid, cid.handle);
4206+
} else {
4207+
rbd_set_owner_cid(rbd_dev, &cid);
42124208
}
4213-
4214-
rbd_set_owner_cid(rbd_dev, &cid);
42154209
downgrade_write(&rbd_dev->lock_rwsem);
42164210
} else {
42174211
down_read(&rbd_dev->lock_rwsem);
@@ -4236,14 +4230,12 @@ static void rbd_handle_released_lock(struct rbd_device *rbd_dev, u8 struct_v,
42364230
if (!rbd_cid_equal(&cid, &rbd_empty_cid)) {
42374231
down_write(&rbd_dev->lock_rwsem);
42384232
if (!rbd_cid_equal(&cid, &rbd_dev->owner_cid)) {
4239-
dout("%s rbd_dev %p unexpected owner, cid %llu-%llu != owner_cid %llu-%llu\n",
4233+
dout("%s rbd_dev %p cid %llu-%llu != owner_cid %llu-%llu\n",
42404234
__func__, rbd_dev, cid.gid, cid.handle,
42414235
rbd_dev->owner_cid.gid, rbd_dev->owner_cid.handle);
4242-
up_write(&rbd_dev->lock_rwsem);
4243-
return;
4236+
} else {
4237+
rbd_set_owner_cid(rbd_dev, &rbd_empty_cid);
42444238
}
4245-
4246-
rbd_set_owner_cid(rbd_dev, &rbd_empty_cid);
42474239
downgrade_write(&rbd_dev->lock_rwsem);
42484240
} else {
42494241
down_read(&rbd_dev->lock_rwsem);
@@ -4951,6 +4943,7 @@ static int rbd_init_disk(struct rbd_device *rbd_dev)
49514943
disk->minors = RBD_MINORS_PER_MAJOR;
49524944
}
49534945
disk->fops = &rbd_bd_ops;
4946+
disk->private_data = rbd_dev;
49544947

49554948
blk_queue_flag_set(QUEUE_FLAG_NONROT, q);
49564949
/* QUEUE_FLAG_ADD_RANDOM is off by default for blk-mq */

fs/ceph/mds_client.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4456,7 +4456,7 @@ bool check_session_state(struct ceph_mds_session *s)
44564456
break;
44574457
case CEPH_MDS_SESSION_CLOSING:
44584458
/* Should never reach this when we're unmounting */
4459-
WARN_ON_ONCE(true);
4459+
WARN_ON_ONCE(s->s_ttl);
44604460
fallthrough;
44614461
case CEPH_MDS_SESSION_NEW:
44624462
case CEPH_MDS_SESSION_RESTARTING:

0 commit comments

Comments
 (0)