Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 5ccedf1c authored by Yan, Zheng's avatar Yan, Zheng Committed by Ilya Dryomov
Browse files

ceph: don't encode inode pathes into reconnect message



mds hasn't used inode pathes since introducing inode backtrace.

Signed-off-by: default avatar"Yan, Zheng" <zyan@redhat.com>
Signed-off-by: default avatarIlya Dryomov <idryomov@gmail.com>
parent d2f8bb27
Loading
Loading
Loading
Loading
+49 −45
Original line number Diff line number Diff line
@@ -2960,11 +2960,8 @@ static int encode_caps_cb(struct inode *inode, struct ceph_cap *cap,
	struct ceph_inode_info *ci = cap->ci;
	struct ceph_reconnect_state *recon_state = arg;
	struct ceph_pagelist *pagelist = recon_state->pagelist;
	char *path;
	int pathlen, err;
	u64 pathbase;
	int err;
	u64 snap_follows;
	struct dentry *dentry;

	dout(" adding %p ino %llx.%llx cap %p %lld %s\n",
	     inode, ceph_vinop(inode), cap, cap->cap_id,
@@ -2973,19 +2970,6 @@ static int encode_caps_cb(struct inode *inode, struct ceph_cap *cap,
	if (err)
		return err;

	dentry = d_find_alias(inode);
	if (dentry) {
		path = ceph_mdsc_build_path(dentry, &pathlen, &pathbase, 0);
		if (IS_ERR(path)) {
			err = PTR_ERR(path);
			goto out_dput;
		}
	} else {
		path = NULL;
		pathlen = 0;
		pathbase = 0;
	}

	spin_lock(&ci->i_ceph_lock);
	cap->seq = 0;        /* reset cap seq */
	cap->issue_seq = 0;  /* and issue_seq */
@@ -2997,7 +2981,7 @@ static int encode_caps_cb(struct inode *inode, struct ceph_cap *cap,
		rec.v2.wanted = cpu_to_le32(__ceph_caps_wanted(ci));
		rec.v2.issued = cpu_to_le32(cap->issued);
		rec.v2.snaprealm = cpu_to_le64(ci->i_snap_realm->ino);
		rec.v2.pathbase = cpu_to_le64(pathbase);
		rec.v2.pathbase = 0;
		rec.v2.flock_len = (__force __le32)
			((ci->i_ceph_flags & CEPH_I_ERROR_FILELOCK) ? 0 : 1);
	} else {
@@ -3008,7 +2992,7 @@ static int encode_caps_cb(struct inode *inode, struct ceph_cap *cap,
		ceph_encode_timespec64(&rec.v1.mtime, &inode->i_mtime);
		ceph_encode_timespec64(&rec.v1.atime, &inode->i_atime);
		rec.v1.snaprealm = cpu_to_le64(ci->i_snap_realm->ino);
		rec.v1.pathbase = cpu_to_le64(pathbase);
		rec.v1.pathbase = 0;
	}

	if (list_empty(&ci->i_cap_snaps)) {
@@ -3040,7 +3024,7 @@ static int encode_caps_cb(struct inode *inode, struct ceph_cap *cap,
					       GFP_NOFS);
			if (!flocks) {
				err = -ENOMEM;
				goto out_free;
				goto out_err;
			}
			err = ceph_encode_locks_to_buffer(inode, flocks,
							  num_fcntl_locks,
@@ -3050,7 +3034,7 @@ static int encode_caps_cb(struct inode *inode, struct ceph_cap *cap,
				flocks = NULL;
				if (err == -ENOSPC)
					goto encode_again;
				goto out_free;
				goto out_err;
			}
		} else {
			kfree(flocks);
@@ -3070,44 +3054,64 @@ static int encode_caps_cb(struct inode *inode, struct ceph_cap *cap,
			    sizeof(struct ceph_filelock);
		rec.v2.flock_len = cpu_to_le32(struct_len);

		struct_len += sizeof(rec.v2);
		struct_len += sizeof(u32) + pathlen;
		struct_len += sizeof(u32) + sizeof(rec.v2);

		if (struct_v >= 2)
			struct_len += sizeof(u64); /* snap_follows */

		total_len += struct_len;
		err = ceph_pagelist_reserve(pagelist, total_len);
		if (err) {
			kfree(flocks);
			goto out_err;
		}

		if (!err) {
		if (recon_state->msg_version >= 3) {
			ceph_pagelist_encode_8(pagelist, struct_v);
			ceph_pagelist_encode_8(pagelist, 1);
			ceph_pagelist_encode_32(pagelist, struct_len);
		}
			ceph_pagelist_encode_string(pagelist, path, pathlen);
		ceph_pagelist_encode_string(pagelist, NULL, 0);
		ceph_pagelist_append(pagelist, &rec, sizeof(rec.v2));
		ceph_locks_to_pagelist(flocks, pagelist,
					       num_fcntl_locks,
					       num_flock_locks);
				       num_fcntl_locks, num_flock_locks);
		if (struct_v >= 2)
			ceph_pagelist_encode_64(pagelist, snap_follows);
		}

		kfree(flocks);
	} else {
		size_t size = sizeof(u32) + pathlen + sizeof(rec.v1);
		err = ceph_pagelist_reserve(pagelist, size);
		if (!err) {
		u64 pathbase = 0;
		int pathlen = 0;
		char *path = NULL;
		struct dentry *dentry;

		dentry = d_find_alias(inode);
		if (dentry) {
			path = ceph_mdsc_build_path(dentry,
						&pathlen, &pathbase, 0);
			dput(dentry);
			if (IS_ERR(path)) {
				err = PTR_ERR(path);
				goto out_err;
			}
			rec.v1.pathbase = cpu_to_le64(pathbase);
		}

		err = ceph_pagelist_reserve(pagelist,
				pathlen + sizeof(u32) + sizeof(rec.v1));
		if (err) {
			kfree(path);
			goto out_err;
		}

		ceph_pagelist_encode_string(pagelist, path, pathlen);
		ceph_pagelist_append(pagelist, &rec, sizeof(rec.v1));
		}

		kfree(path);
	}

	recon_state->nr_caps++;
out_free:
	kfree(path);
out_dput:
	dput(dentry);
out_err:
	return err;
}