Skip to content

Commit e3161f1

Browse files
Luis Henriquesidryomov
authored andcommitted
ceph: quota: cache inode pointer in ceph_snap_realm
Keep a pointer to the inode in struct ceph_snap_realm. This allows to optimize functions that walk the realms hierarchy (e.g. in quotas). Signed-off-by: Luis Henriques <[email protected]> Reviewed-by: "Yan, Zheng" <[email protected]> Signed-off-by: Ilya Dryomov <[email protected]>
1 parent 0eb6bbe commit e3161f1

File tree

5 files changed

+19
-15
lines changed

5 files changed

+19
-15
lines changed

fs/ceph/caps.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -703,9 +703,11 @@ void ceph_add_cap(struct inode *inode,
703703
}
704704

705705
spin_lock(&realm->inodes_with_caps_lock);
706-
ci->i_snap_realm = realm;
707706
list_add(&ci->i_snap_realm_item,
708707
&realm->inodes_with_caps);
708+
ci->i_snap_realm = realm;
709+
if (realm->ino == ci->i_vino.ino)
710+
realm->inode = inode;
709711
spin_unlock(&realm->inodes_with_caps_lock);
710712

711713
if (oldrealm)

fs/ceph/inode.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -551,6 +551,9 @@ void ceph_destroy_inode(struct inode *inode)
551551
dout(" dropping residual ref to snap realm %p\n", realm);
552552
spin_lock(&realm->inodes_with_caps_lock);
553553
list_del_init(&ci->i_snap_realm_item);
554+
ci->i_snap_realm = NULL;
555+
if (realm->ino == ci->i_vino.ino)
556+
realm->inode = NULL;
554557
spin_unlock(&realm->inodes_with_caps_lock);
555558
ceph_put_snap_realm(mdsc, realm);
556559
}

fs/ceph/quota.c

Lines changed: 10 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,6 @@ static struct ceph_snap_realm *get_quota_realm(struct ceph_mds_client *mdsc,
8383
{
8484
struct ceph_inode_info *ci = NULL;
8585
struct ceph_snap_realm *realm, *next;
86-
struct ceph_vino vino;
8786
struct inode *in;
8887
bool has_quota;
8988

@@ -97,13 +96,12 @@ static struct ceph_snap_realm *get_quota_realm(struct ceph_mds_client *mdsc,
9796
pr_err_ratelimited("get_quota_realm: ino (%llx.%llx) "
9897
"null i_snap_realm\n", ceph_vinop(inode));
9998
while (realm) {
100-
vino.ino = realm->ino;
101-
vino.snap = CEPH_NOSNAP;
102-
in = ceph_find_inode(inode->i_sb, vino);
103-
if (!in) {
104-
pr_warn("Failed to find inode for %llu\n", vino.ino);
99+
spin_lock(&realm->inodes_with_caps_lock);
100+
in = realm->inode ? igrab(realm->inode) : NULL;
101+
spin_unlock(&realm->inodes_with_caps_lock);
102+
if (!in)
105103
break;
106-
}
104+
107105
ci = ceph_inode(in);
108106
has_quota = ceph_has_quota(ci);
109107
iput(in);
@@ -161,7 +159,6 @@ static bool check_quota_exceeded(struct inode *inode, enum quota_check_op op,
161159
struct ceph_mds_client *mdsc = ceph_inode_to_client(inode)->mdsc;
162160
struct ceph_inode_info *ci;
163161
struct ceph_snap_realm *realm, *next;
164-
struct ceph_vino vino;
165162
struct inode *in;
166163
u64 max, rvalue;
167164
bool exceeded = false;
@@ -177,13 +174,12 @@ static bool check_quota_exceeded(struct inode *inode, enum quota_check_op op,
177174
pr_err_ratelimited("check_quota_exceeded: ino (%llx.%llx) "
178175
"null i_snap_realm\n", ceph_vinop(inode));
179176
while (realm) {
180-
vino.ino = realm->ino;
181-
vino.snap = CEPH_NOSNAP;
182-
in = ceph_find_inode(inode->i_sb, vino);
183-
if (!in) {
184-
pr_warn("Failed to find inode for %llu\n", vino.ino);
177+
spin_lock(&realm->inodes_with_caps_lock);
178+
in = realm->inode ? igrab(realm->inode) : NULL;
179+
spin_unlock(&realm->inodes_with_caps_lock);
180+
if (!in)
185181
break;
186-
}
182+
187183
ci = ceph_inode(in);
188184
spin_lock(&ci->i_ceph_lock);
189185
if (op == QUOTA_CHECK_MAX_FILES_OP) {

fs/ceph/snap.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -931,6 +931,8 @@ void ceph_handle_snap(struct ceph_mds_client *mdsc,
931931
list_add(&ci->i_snap_realm_item,
932932
&realm->inodes_with_caps);
933933
ci->i_snap_realm = realm;
934+
if (realm->ino == ci->i_vino.ino)
935+
realm->inode = inode;
934936
spin_unlock(&realm->inodes_with_caps_lock);
935937

936938
spin_unlock(&ci->i_ceph_lock);

fs/ceph/super.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -755,6 +755,7 @@ struct ceph_readdir_cache_control {
755755
*/
756756
struct ceph_snap_realm {
757757
u64 ino;
758+
struct inode *inode;
758759
atomic_t nref;
759760
struct rb_node node;
760761

0 commit comments

Comments
 (0)