Commit 4deb14a2 authored by Yan, Zheng's avatar Yan, Zheng Committed by Ilya Dryomov
Browse files

ceph: optimize flock encoding during reconnect



Don't malloc if there is no flock.

Signed-off-by: default avatar"Yan, Zheng" <zyan@redhat.com>
Reviewed-by: default avatarJeff Layton <jlayton@redhat.com>
Signed-off-by: default avatarIlya Dryomov <idryomov@gmail.com>
parent c6db8472
Loading
Loading
Loading
Loading
+10 −7
Original line number Original line Diff line number Diff line
@@ -431,19 +431,22 @@ int ceph_locks_to_pagelist(struct ceph_filelock *flocks,
	if (err)
	if (err)
		goto out_fail;
		goto out_fail;


	if (num_fcntl_locks > 0) {
		err = ceph_pagelist_append(pagelist, flocks,
		err = ceph_pagelist_append(pagelist, flocks,
					   num_fcntl_locks * sizeof(*flocks));
					   num_fcntl_locks * sizeof(*flocks));
		if (err)
		if (err)
			goto out_fail;
			goto out_fail;
	}


	nlocks = cpu_to_le32(num_flock_locks);
	nlocks = cpu_to_le32(num_flock_locks);
	err = ceph_pagelist_append(pagelist, &nlocks, sizeof(nlocks));
	err = ceph_pagelist_append(pagelist, &nlocks, sizeof(nlocks));
	if (err)
	if (err)
		goto out_fail;
		goto out_fail;


	err = ceph_pagelist_append(pagelist,
	if (num_flock_locks > 0) {
				   &flocks[num_fcntl_locks],
		err = ceph_pagelist_append(pagelist, &flocks[num_fcntl_locks],
					   num_flock_locks * sizeof(*flocks));
					   num_flock_locks * sizeof(*flocks));
	}
out_fail:
out_fail:
	return err;
	return err;
}
}
+20 −14
Original line number Original line Diff line number Diff line
@@ -2899,12 +2899,13 @@ static int encode_caps_cb(struct inode *inode, struct ceph_cap *cap,


	if (recon_state->msg_version >= 2) {
	if (recon_state->msg_version >= 2) {
		int num_fcntl_locks, num_flock_locks;
		int num_fcntl_locks, num_flock_locks;
		struct ceph_filelock *flocks;
		struct ceph_filelock *flocks = NULL;
		size_t struct_len, total_len = 0;
		size_t struct_len, total_len = 0;
		u8 struct_v = 0;
		u8 struct_v = 0;


encode_again:
encode_again:
		ceph_count_locks(inode, &num_fcntl_locks, &num_flock_locks);
		ceph_count_locks(inode, &num_fcntl_locks, &num_flock_locks);
		if (num_fcntl_locks + num_flock_locks > 0) {
			flocks = kmalloc((num_fcntl_locks + num_flock_locks) *
			flocks = kmalloc((num_fcntl_locks + num_flock_locks) *
					 sizeof(struct ceph_filelock), GFP_NOFS);
					 sizeof(struct ceph_filelock), GFP_NOFS);
			if (!flocks) {
			if (!flocks) {
@@ -2916,10 +2917,15 @@ static int encode_caps_cb(struct inode *inode, struct ceph_cap *cap,
							  num_flock_locks);
							  num_flock_locks);
			if (err) {
			if (err) {
				kfree(flocks);
				kfree(flocks);
				flocks = NULL;
				if (err == -ENOSPC)
				if (err == -ENOSPC)
					goto encode_again;
					goto encode_again;
				goto out_free;
				goto out_free;
			}
			}
		} else {
			kfree(flocks);
			flocks = NULL;
		}


		if (recon_state->msg_version >= 3) {
		if (recon_state->msg_version >= 3) {
			/* version, compat_version and struct_len */
			/* version, compat_version and struct_len */