| From 4c091ce39b6fef7827cc20bba06d3f222003de76 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Mon, 22 Nov 2021 22:22:12 +0800 |
| Subject: ceph: fix duplicate increment of opened_inodes metric |
| |
| From: Hu Weiwen <sehuww@mail.scut.edu.cn> |
| |
| [ Upstream commit 973e5245637accc4002843f6b888495a6a7762bc ] |
| |
| opened_inodes is incremented twice when the same inode is opened twice |
| with O_RDONLY and O_WRONLY respectively. |
| |
| To reproduce, run this python script, then check the metrics: |
| |
| import os |
| for _ in range(10000): |
| fd_r = os.open('a', os.O_RDONLY) |
| fd_w = os.open('a', os.O_WRONLY) |
| os.close(fd_r) |
| os.close(fd_w) |
| |
| Fixes: 1dd8d4708136 ("ceph: metrics for opened files, pinned caps and opened inodes") |
| Signed-off-by: Hu Weiwen <sehuww@mail.scut.edu.cn> |
| Reviewed-by: Xiubo Li <xiubli@redhat.com> |
| Signed-off-by: Ilya Dryomov <idryomov@gmail.com> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| fs/ceph/caps.c | 16 ++++++++-------- |
| 1 file changed, 8 insertions(+), 8 deletions(-) |
| |
| diff --git a/fs/ceph/caps.c b/fs/ceph/caps.c |
| index 8f537f1d9d1d3..8be4da2e2b826 100644 |
| --- a/fs/ceph/caps.c |
| +++ b/fs/ceph/caps.c |
| @@ -4349,7 +4349,7 @@ void ceph_get_fmode(struct ceph_inode_info *ci, int fmode, int count) |
| { |
| struct ceph_mds_client *mdsc = ceph_sb_to_mdsc(ci->vfs_inode.i_sb); |
| int bits = (fmode << 1) | 1; |
| - bool is_opened = false; |
| + bool already_opened = false; |
| int i; |
| |
| if (count == 1) |
| @@ -4357,19 +4357,19 @@ void ceph_get_fmode(struct ceph_inode_info *ci, int fmode, int count) |
| |
| spin_lock(&ci->i_ceph_lock); |
| for (i = 0; i < CEPH_FILE_MODE_BITS; i++) { |
| - if (bits & (1 << i)) |
| - ci->i_nr_by_mode[i] += count; |
| - |
| /* |
| - * If any of the mode ref is larger than 1, |
| + * If any of the mode ref is larger than 0, |
| * that means it has been already opened by |
| * others. Just skip checking the PIN ref. |
| */ |
| - if (i && ci->i_nr_by_mode[i] > 1) |
| - is_opened = true; |
| + if (i && ci->i_nr_by_mode[i]) |
| + already_opened = true; |
| + |
| + if (bits & (1 << i)) |
| + ci->i_nr_by_mode[i] += count; |
| } |
| |
| - if (!is_opened) |
| + if (!already_opened) |
| percpu_counter_inc(&mdsc->metric.opened_inodes); |
| spin_unlock(&ci->i_ceph_lock); |
| } |
| -- |
| 2.33.0 |
| |