X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Fptlrpc%2Fsec_ctx.c;h=a5de86426a86c66bb08973e4e12c67f54bd25f9f;hb=d8ff73097be78cc3e603ab49b6aaa03a1c766fcb;hp=fad7984af43490577c6c106a060fae2cd4fbaf84;hpb=d00c924149b5dd042e6fee09ef724013df1b4e14;p=fs%2Flustre-release.git diff --git a/lustre/ptlrpc/sec_ctx.c b/lustre/ptlrpc/sec_ctx.c index fad7984..a5de864 100644 --- a/lustre/ptlrpc/sec_ctx.c +++ b/lustre/ptlrpc/sec_ctx.c @@ -20,10 +20,14 @@ * * GPL HEADER END */ +/* + * Copyright (c) 2014, 2017, Intel Corporation. + */ #define DEBUG_SUBSYSTEM S_FILTER #include +#include #include #include #include @@ -34,15 +38,30 @@ /* Debugging check only needed during development */ #ifdef OBD_CTXT_DEBUG # define ASSERT_CTXT_MAGIC(magic) LASSERT((magic) == OBD_RUN_CTXT_MAGIC) -# define ASSERT_NOT_KERNEL_CTXT(msg) LASSERTF(!segment_eq(get_fs(), get_ds()),\ - msg) -# define ASSERT_KERNEL_CTXT(msg) LASSERTF(segment_eq(get_fs(), get_ds()), msg) #else # define ASSERT_CTXT_MAGIC(magic) do {} while(0) -# define ASSERT_NOT_KERNEL_CTXT(msg) do {} while(0) -# define ASSERT_KERNEL_CTXT(msg) do {} while(0) #endif +static inline void ll_set_fs_pwd(struct fs_struct *fs, struct vfsmount *mnt, + struct dentry *dentry) +{ + struct path path; + struct path old_pwd; + + path.mnt = mnt; + path.dentry = dentry; + path_get(&path); + spin_lock(&fs->lock); + write_seqcount_begin(&fs->seq); + old_pwd = fs->pwd; + fs->pwd = path; + write_seqcount_end(&fs->seq); + spin_unlock(&fs->lock); + + if (old_pwd.dentry) + path_put(&old_pwd); +} + /* push / pop to root of obd store */ void push_ctxt(struct lvfs_run_ctxt *save, struct lvfs_run_ctxt *new_ctx) { @@ -50,11 +69,9 @@ void push_ctxt(struct lvfs_run_ctxt *save, struct lvfs_run_ctxt *new_ctx) if (new_ctx->dt != NULL) return; - //ASSERT_NOT_KERNEL_CTXT("already in kernel context!\n"); ASSERT_CTXT_MAGIC(new_ctx->magic); OBD_SET_CTXT_MAGIC(save); - save->fs = get_fs(); LASSERT(ll_d_count(current->fs->pwd.dentry)); LASSERT(ll_d_count(new_ctx->pwd)); save->pwd = dget(current->fs->pwd.dentry); @@ -67,7 +84,6 @@ void push_ctxt(struct lvfs_run_ctxt *save, struct lvfs_run_ctxt *new_ctx) LASSERT(new_ctx->pwdmnt); current->fs->umask = 0; /* umask already applied on client */ - set_fs(new_ctx->fs); ll_set_fs_pwd(current->fs, new_ctx->pwdmnt, new_ctx->pwd); } EXPORT_SYMBOL(push_ctxt); @@ -79,14 +95,12 @@ void pop_ctxt(struct lvfs_run_ctxt *saved, struct lvfs_run_ctxt *new_ctx) return; ASSERT_CTXT_MAGIC(saved->magic); - ASSERT_KERNEL_CTXT("popping non-kernel context!\n"); LASSERTF(current->fs->pwd.dentry == new_ctx->pwd, "%p != %p\n", current->fs->pwd.dentry, new_ctx->pwd); LASSERTF(current->fs->pwd.mnt == new_ctx->pwdmnt, "%p != %p\n", current->fs->pwd.mnt, new_ctx->pwdmnt); - set_fs(saved->fs); ll_set_fs_pwd(current->fs, saved->pwdmnt, saved->pwd); dput(saved->pwd); @@ -94,34 +108,3 @@ void pop_ctxt(struct lvfs_run_ctxt *saved, struct lvfs_run_ctxt *new_ctx) current->fs->umask = saved->umask; } EXPORT_SYMBOL(pop_ctxt); - -/* utility to rename a file */ -int lustre_rename(struct dentry *dir, struct vfsmount *mnt, - char *oldname, char *newname) -{ - struct dentry *dchild_old, *dchild_new; - int err = 0; - ENTRY; - - ASSERT_KERNEL_CTXT("kernel doing rename outside kernel context\n"); - CDEBUG(D_INODE, "renaming file %.*s to %.*s\n", - (int)strlen(oldname), oldname, (int)strlen(newname), newname); - - dchild_old = ll_lookup_one_len(oldname, dir, strlen(oldname)); - if (IS_ERR(dchild_old)) - RETURN(PTR_ERR(dchild_old)); - - if (!dchild_old->d_inode) - GOTO(put_old, err = -ENOENT); - - dchild_new = ll_lookup_one_len(newname, dir, strlen(newname)); - if (IS_ERR(dchild_new)) - GOTO(put_old, err = PTR_ERR(dchild_new)); - - err = ll_vfs_rename(dir->d_inode, dchild_old, dir->d_inode, dchild_new); - - dput(dchild_new); -put_old: - dput(dchild_old); - RETURN(err); -}