[Devel] [PATCH rhel6 1/3] cpt: export dentry alias search helper
Stanislav Kinsburskiy
skinsbursky at odin.com
Mon Sep 28 06:16:23 PDT 2015
From: Stanislav Kinsburskiy <skinsbursky at parallels.com>
It will be used in other parts of checkpointing
Signed-off-by: Stanislav Kinsburskiy <skinsbursky at 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);
More information about the Devel
mailing list