Skip to content

Commit 557ccdc

Browse files
committed
Merge PR ceph#60411 into main
* refs/pull/60411/head: client: Fix a deadlock when osd is full Reviewed-by: Venky Shankar <[email protected]> Reviewed-by: Patrick Donnelly <[email protected]> Reviewed-by: Dhairya Parmar <[email protected]>
2 parents 467582d + 60c5801 commit 557ccdc

File tree

1 file changed

+6
-2
lines changed

1 file changed

+6
-2
lines changed

src/client/Client.cc

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11753,8 +11753,12 @@ int64_t Client::_write(Fh *f, int64_t offset, uint64_t size, const char *buf,
1175311753
cond_iofinish = new C_SaferCond();
1175411754
filer_iofinish.reset(cond_iofinish);
1175511755
} else {
11756-
//Register a wrapper callback for the C_Write_Finisher which takes 'client_lock'
11757-
filer_iofinish.reset(new C_Lock_Client_Finisher(this, iofinish.get()));
11756+
//Register a wrapper callback C_Lock_Client_Finisher for the C_Write_Finisher which takes 'client_lock'.
11757+
//Use C_OnFinisher for callbacks. The op_cancel_writes has to be called without 'client_lock' held because
11758+
//the callback registered here needs to take it. This would cause incorrect lock order i.e., objecter->rwlock
11759+
//taken by objecter's op_cancel and then 'client_lock' taken by callback. To fix the lock order, queue
11760+
//the callback using the finisher
11761+
filer_iofinish.reset(new C_OnFinisher(new C_Lock_Client_Finisher(this, iofinish.get()), &objecter_finisher));
1175811762
}
1175911763

1176011764
get_cap_ref(in, CEPH_CAP_FILE_BUFFER);

0 commit comments

Comments
 (0)