mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-11-18 04:35:11 +00:00
ceph: don't encode inode pathes into reconnect message
mds hasn't used inode pathes since introducing inode backtrace. Signed-off-by: "Yan, Zheng" <zyan@redhat.com> Signed-off-by: Ilya Dryomov <idryomov@gmail.com>
This commit is contained in:
parent
d2f8bb27c8
commit
5ccedf1ccd
1 changed files with 50 additions and 46 deletions
|
|
@ -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_inode_info *ci = cap->ci;
|
||||||
struct ceph_reconnect_state *recon_state = arg;
|
struct ceph_reconnect_state *recon_state = arg;
|
||||||
struct ceph_pagelist *pagelist = recon_state->pagelist;
|
struct ceph_pagelist *pagelist = recon_state->pagelist;
|
||||||
char *path;
|
int err;
|
||||||
int pathlen, err;
|
|
||||||
u64 pathbase;
|
|
||||||
u64 snap_follows;
|
u64 snap_follows;
|
||||||
struct dentry *dentry;
|
|
||||||
|
|
||||||
dout(" adding %p ino %llx.%llx cap %p %lld %s\n",
|
dout(" adding %p ino %llx.%llx cap %p %lld %s\n",
|
||||||
inode, ceph_vinop(inode), cap, cap->cap_id,
|
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)
|
if (err)
|
||||||
return 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);
|
spin_lock(&ci->i_ceph_lock);
|
||||||
cap->seq = 0; /* reset cap seq */
|
cap->seq = 0; /* reset cap seq */
|
||||||
cap->issue_seq = 0; /* and issue_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.wanted = cpu_to_le32(__ceph_caps_wanted(ci));
|
||||||
rec.v2.issued = cpu_to_le32(cap->issued);
|
rec.v2.issued = cpu_to_le32(cap->issued);
|
||||||
rec.v2.snaprealm = cpu_to_le64(ci->i_snap_realm->ino);
|
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)
|
rec.v2.flock_len = (__force __le32)
|
||||||
((ci->i_ceph_flags & CEPH_I_ERROR_FILELOCK) ? 0 : 1);
|
((ci->i_ceph_flags & CEPH_I_ERROR_FILELOCK) ? 0 : 1);
|
||||||
} else {
|
} 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.mtime, &inode->i_mtime);
|
||||||
ceph_encode_timespec64(&rec.v1.atime, &inode->i_atime);
|
ceph_encode_timespec64(&rec.v1.atime, &inode->i_atime);
|
||||||
rec.v1.snaprealm = cpu_to_le64(ci->i_snap_realm->ino);
|
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)) {
|
if (list_empty(&ci->i_cap_snaps)) {
|
||||||
|
|
@ -3040,7 +3024,7 @@ encode_again:
|
||||||
GFP_NOFS);
|
GFP_NOFS);
|
||||||
if (!flocks) {
|
if (!flocks) {
|
||||||
err = -ENOMEM;
|
err = -ENOMEM;
|
||||||
goto out_free;
|
goto out_err;
|
||||||
}
|
}
|
||||||
err = ceph_encode_locks_to_buffer(inode, flocks,
|
err = ceph_encode_locks_to_buffer(inode, flocks,
|
||||||
num_fcntl_locks,
|
num_fcntl_locks,
|
||||||
|
|
@ -3050,7 +3034,7 @@ encode_again:
|
||||||
flocks = NULL;
|
flocks = NULL;
|
||||||
if (err == -ENOSPC)
|
if (err == -ENOSPC)
|
||||||
goto encode_again;
|
goto encode_again;
|
||||||
goto out_free;
|
goto out_err;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
kfree(flocks);
|
kfree(flocks);
|
||||||
|
|
@ -3070,44 +3054,64 @@ encode_again:
|
||||||
sizeof(struct ceph_filelock);
|
sizeof(struct ceph_filelock);
|
||||||
rec.v2.flock_len = cpu_to_le32(struct_len);
|
rec.v2.flock_len = cpu_to_le32(struct_len);
|
||||||
|
|
||||||
struct_len += sizeof(rec.v2);
|
struct_len += sizeof(u32) + sizeof(rec.v2);
|
||||||
struct_len += sizeof(u32) + pathlen;
|
|
||||||
|
|
||||||
if (struct_v >= 2)
|
if (struct_v >= 2)
|
||||||
struct_len += sizeof(u64); /* snap_follows */
|
struct_len += sizeof(u64); /* snap_follows */
|
||||||
|
|
||||||
total_len += struct_len;
|
total_len += struct_len;
|
||||||
err = ceph_pagelist_reserve(pagelist, total_len);
|
err = ceph_pagelist_reserve(pagelist, total_len);
|
||||||
|
if (err) {
|
||||||
|
kfree(flocks);
|
||||||
|
goto out_err;
|
||||||
|
}
|
||||||
|
|
||||||
if (!err) {
|
|
||||||
if (recon_state->msg_version >= 3) {
|
if (recon_state->msg_version >= 3) {
|
||||||
ceph_pagelist_encode_8(pagelist, struct_v);
|
ceph_pagelist_encode_8(pagelist, struct_v);
|
||||||
ceph_pagelist_encode_8(pagelist, 1);
|
ceph_pagelist_encode_8(pagelist, 1);
|
||||||
ceph_pagelist_encode_32(pagelist, struct_len);
|
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_pagelist_append(pagelist, &rec, sizeof(rec.v2));
|
||||||
ceph_locks_to_pagelist(flocks, pagelist,
|
ceph_locks_to_pagelist(flocks, pagelist,
|
||||||
num_fcntl_locks,
|
num_fcntl_locks, num_flock_locks);
|
||||||
num_flock_locks);
|
|
||||||
if (struct_v >= 2)
|
if (struct_v >= 2)
|
||||||
ceph_pagelist_encode_64(pagelist, snap_follows);
|
ceph_pagelist_encode_64(pagelist, snap_follows);
|
||||||
}
|
|
||||||
kfree(flocks);
|
kfree(flocks);
|
||||||
} else {
|
} else {
|
||||||
size_t size = sizeof(u32) + pathlen + sizeof(rec.v1);
|
u64 pathbase = 0;
|
||||||
err = ceph_pagelist_reserve(pagelist, size);
|
int pathlen = 0;
|
||||||
if (!err) {
|
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_encode_string(pagelist, path, pathlen);
|
||||||
ceph_pagelist_append(pagelist, &rec, sizeof(rec.v1));
|
ceph_pagelist_append(pagelist, &rec, sizeof(rec.v1));
|
||||||
}
|
|
||||||
|
kfree(path);
|
||||||
}
|
}
|
||||||
|
|
||||||
recon_state->nr_caps++;
|
recon_state->nr_caps++;
|
||||||
out_free:
|
out_err:
|
||||||
kfree(path);
|
|
||||||
out_dput:
|
|
||||||
dput(dentry);
|
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue