mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-12-27 08:45:26 -05:00
libceph: fix log output race condition in OSD client
OSD client logging has a problem in get_osd() and put_osd(). For one logging output refcount_read() is called twice. If recount value changes between both calls logging output is not consistent. This patch prints out only the resulting value. [ idryomov: don't make the log messages more verbose ] Signed-off-by: Simon Buttgereit <simon.buttgereit@tu-ilmenau.de> Reviewed-by: Viacheslav Dubeyko <Slava.Dubeyko@ibm.com> Signed-off-by: Ilya Dryomov <idryomov@gmail.com>
This commit is contained in:
committed by
Ilya Dryomov
parent
7d0a66e4bb
commit
d6c2f41eb9
@@ -1280,8 +1280,7 @@ static struct ceph_osd *create_osd(struct ceph_osd_client *osdc, int onum)
|
||||
static struct ceph_osd *get_osd(struct ceph_osd *osd)
|
||||
{
|
||||
if (refcount_inc_not_zero(&osd->o_ref)) {
|
||||
dout("get_osd %p %d -> %d\n", osd, refcount_read(&osd->o_ref)-1,
|
||||
refcount_read(&osd->o_ref));
|
||||
dout("get_osd %p -> %d\n", osd, refcount_read(&osd->o_ref));
|
||||
return osd;
|
||||
} else {
|
||||
dout("get_osd %p FAIL\n", osd);
|
||||
@@ -1291,8 +1290,7 @@ static struct ceph_osd *get_osd(struct ceph_osd *osd)
|
||||
|
||||
static void put_osd(struct ceph_osd *osd)
|
||||
{
|
||||
dout("put_osd %p %d -> %d\n", osd, refcount_read(&osd->o_ref),
|
||||
refcount_read(&osd->o_ref) - 1);
|
||||
dout("put_osd %p -> %d\n", osd, refcount_read(&osd->o_ref) - 1);
|
||||
if (refcount_dec_and_test(&osd->o_ref)) {
|
||||
osd_cleanup(osd);
|
||||
kfree(osd);
|
||||
|
||||
Reference in New Issue
Block a user