From: Stanislav Kinsburskiy <skinsbur...@parallels.com> It will be used in other parts of checkpointing
Signed-off-by: Stanislav Kinsburskiy <skinsbur...@parallels.com> --- kernel/cpt/cpt_files.c | 56 +++++++++++++++++++++++++----------------------- kernel/cpt/cpt_files.h | 3 +++ 2 files changed, 32 insertions(+), 27 deletions(-) diff --git a/kernel/cpt/cpt_files.c b/kernel/cpt/cpt_files.c index 1375f83..1838a80 100644 --- a/kernel/cpt/cpt_files.c +++ b/kernel/cpt/cpt_files.c @@ -1218,9 +1218,10 @@ static int cpt_filldir(void * __buf, const char * name, int namelen, return 0; } -static int find_linked_dentry(struct dentry *d, struct vfsmount *mnt, - struct inode *ino, struct cpt_context *ctx) +struct dentry *get_linked_dentry(struct dentry *d, struct vfsmount *mnt, + struct cpt_context *ctx) { + struct inode *ino = d->d_inode; int err = -EBUSY; struct file *f = NULL; struct cpt_dirent entry; @@ -1238,63 +1239,64 @@ static int find_linked_dentry(struct dentry *d, struct vfsmount *mnt, } spin_unlock(&dcache_lock); if (found) { - err = cpt_dump_path(found, mnt, 0, ctx); - dput(found); - if (!err) { - dprintk_ctx("dentry found in aliases\n"); - return 0; - } + dprintk_ctx("dentry found in aliases\n"); + return found; } /* 2. Try to find file in current dir */ de = dget_parent(d); - if (!de) - return -EINVAL; + if (found) + return ERR_PTR(-EINVAL); mntget(mnt); f = dentry_open(de, mnt, O_RDONLY | O_LARGEFILE, current_cred()); if (IS_ERR(f)) - return PTR_ERR(f); + return (void *)f; entry.ino = ino->i_ino; entry.name = cpt_get_buf(ctx); entry.found = 0; err = vfs_readdir(f, cpt_filldir, &entry); + fput(f); if (err || !entry.found) { - err = err ? err : -ENOENT; + found = err ? ERR_PTR(err) : ERR_PTR(-ENOENT); goto err_readdir; } mutex_lock(&de->d_inode->i_mutex); found = lookup_one_len(entry.name, de, entry.namelen); mutex_unlock(&de->d_inode->i_mutex); - if (IS_ERR(found)) { - err = PTR_ERR(found); + if (IS_ERR(found)) goto err_readdir; - } - - err = -ENOENT; - if (found->d_inode != ino) - goto err_lookup; - dprintk_ctx("dentry found in dir\n"); - __cpt_release_buf(ctx); - err = cpt_dump_path(found, mnt, 0, ctx); + if (found->d_inode != ino) { + dput(found); + found = ERR_PTR(-ENOENT); + } else + dprintk_ctx("dentry found in dir\n"); -err_lookup: - dput(found); err_readdir: - fput(f); __cpt_release_buf(ctx); - return err; + return found; } static int dump_unlinked_dentry(struct dentry *d, struct vfsmount *mnt, struct cpt_context *ctx) { + struct dentry *found; + int err; + if (d->d_flags & DCACHE_NFSFS_RENAMED) return cpt_dump_nfs_path(d, mnt, ctx); - return find_linked_dentry(d, mnt, d->d_inode, ctx); + + found = get_linked_dentry(d, mnt, ctx); + if (IS_ERR(found)) + return PTR_ERR(found); + + err = cpt_dump_path(found, mnt, 0, ctx); + + dput(found); + return err; } static struct dentry *find_linkdir(struct vfsmount *mnt, struct cpt_context *ctx) diff --git a/kernel/cpt/cpt_files.h b/kernel/cpt/cpt_files.h index 2ba17f5..9203715 100644 --- a/kernel/cpt/cpt_files.h +++ b/kernel/cpt/cpt_files.h @@ -126,3 +126,6 @@ int rst_cgroup_task(struct cpt_context * ctx); void rst_cgroup_close(struct cpt_context * ctx); void uuid_bytes_to_hex(char *buf, const u8 *u); + +struct dentry *get_linked_dentry(struct dentry *d, struct vfsmount *mnt, + struct cpt_context *ctx); _______________________________________________ Devel mailing list Devel@openvz.org https://lists.openvz.org/mailman/listinfo/devel