Loading fs/ceph/mds_client.c +49 −45 Original line number Diff line number Diff line Loading @@ -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, Loading @@ -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 */ Loading @@ -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 { Loading @@ -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)) { Loading Loading @@ -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, Loading @@ -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); Loading @@ -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; } Loading Loading
fs/ceph/mds_client.c +49 −45 Original line number Diff line number Diff line Loading @@ -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, Loading @@ -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 */ Loading @@ -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 { Loading @@ -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)) { Loading Loading @@ -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, Loading @@ -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); Loading @@ -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; } Loading