]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/commitdiff
ceph: optimize flock encoding during reconnect
authorYan, Zheng <zyan@redhat.com>
Mon, 11 Sep 2017 02:36:28 +0000 (10:36 +0800)
committerIlya Dryomov <idryomov@gmail.com>
Mon, 13 Nov 2017 11:11:27 +0000 (12:11 +0100)
Don't malloc if there is no flock.

Signed-off-by: "Yan, Zheng" <zyan@redhat.com>
Reviewed-by: Jeff Layton <jlayton@redhat.com>
Signed-off-by: Ilya Dryomov <idryomov@gmail.com>
fs/ceph/locks.c
fs/ceph/mds_client.c

index 2927f3bc2fc93eba22503b230baa416524dee00b..aaea820768492197ebaa5bcd5fa65ea937abb7ea 100644 (file)
@@ -431,19 +431,22 @@ int ceph_locks_to_pagelist(struct ceph_filelock *flocks,
        if (err)
                goto out_fail;
 
-       err = ceph_pagelist_append(pagelist, flocks,
-                                  num_fcntl_locks * sizeof(*flocks));
-       if (err)
-               goto out_fail;
+       if (num_fcntl_locks > 0) {
+               err = ceph_pagelist_append(pagelist, flocks,
+                                          num_fcntl_locks * sizeof(*flocks));
+               if (err)
+                       goto out_fail;
+       }
 
        nlocks = cpu_to_le32(num_flock_locks);
        err = ceph_pagelist_append(pagelist, &nlocks, sizeof(nlocks));
        if (err)
                goto out_fail;
 
-       err = ceph_pagelist_append(pagelist,
-                                  &flocks[num_fcntl_locks],
-                                  num_flock_locks * sizeof(*flocks));
+       if (num_flock_locks > 0) {
+               err = ceph_pagelist_append(pagelist, &flocks[num_fcntl_locks],
+                                          num_flock_locks * sizeof(*flocks));
+       }
 out_fail:
        return err;
 }
index c8a811db387a19aac29cd8080748cf3672ed14be..295cf5e42ea9eb57e241c521f5c899e0d8e7839f 100644 (file)
@@ -2899,26 +2899,32 @@ static int encode_caps_cb(struct inode *inode, struct ceph_cap *cap,
 
        if (recon_state->msg_version >= 2) {
                int num_fcntl_locks, num_flock_locks;
-               struct ceph_filelock *flocks;
+               struct ceph_filelock *flocks = NULL;
                size_t struct_len, total_len = 0;
                u8 struct_v = 0;
 
 encode_again:
                ceph_count_locks(inode, &num_fcntl_locks, &num_flock_locks);
-               flocks = kmalloc((num_fcntl_locks+num_flock_locks) *
-                                sizeof(struct ceph_filelock), GFP_NOFS);
-               if (!flocks) {
-                       err = -ENOMEM;
-                       goto out_free;
-               }
-               err = ceph_encode_locks_to_buffer(inode, flocks,
-                                                 num_fcntl_locks,
-                                                 num_flock_locks);
-               if (err) {
+               if (num_fcntl_locks + num_flock_locks > 0) {
+                       flocks = kmalloc((num_fcntl_locks + num_flock_locks) *
+                                        sizeof(struct ceph_filelock), GFP_NOFS);
+                       if (!flocks) {
+                               err = -ENOMEM;
+                               goto out_free;
+                       }
+                       err = ceph_encode_locks_to_buffer(inode, flocks,
+                                                         num_fcntl_locks,
+                                                         num_flock_locks);
+                       if (err) {
+                               kfree(flocks);
+                               flocks = NULL;
+                               if (err == -ENOSPC)
+                                       goto encode_again;
+                               goto out_free;
+                       }
+               } else {
                        kfree(flocks);
-                       if (err == -ENOSPC)
-                               goto encode_again;
-                       goto out_free;
+                       flocks = NULL;
                }
 
                if (recon_state->msg_version >= 3) {