#define DEBUG_SUBSYSTEM S_FILTER
-#include <linux/obd_support.h>
#include <linux/obd.h>
-#include <linux/lustre_mds.h>
#include <linux/lustre_lib.h>
-#include <linux/lustre_net.h>
-#ifdef OBD_CTXT_DEBUG
/* Debugging check only needed during development */
-#define ASSERT_CTXT_MAGIC(magic) LASSERT((magic) == OBD_RUN_CTXT_MAGIC)
-#define ASSERT_NOT_KERNEL_CTXT(msg) LASSERT(!segment_eq(get_fs(), get_ds()))
-#define ASSERT_KERNEL_CTXT(msg) LASSERT(segment_eq(get_fs(), get_ds()))
+#ifdef OBD_CTXT_DEBUG
+# define ASSERT_CTXT_MAGIC(magic) LASSERT((magic) == OBD_RUN_CTXT_MAGIC)
+# define ASSERT_NOT_KERNEL_CTXT(msg) LASSERT(!segment_eq(get_fs(), get_ds()))
+# define ASSERT_KERNEL_CTXT(msg) LASSERT(segment_eq(get_fs(), get_ds()))
#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)
+# 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
/* push / pop to root of obd store */
LASSERT(atomic_read(&new_ctx->pwd->d_count));
save->pwd = dget(current->fs->pwd);
save->pwdmnt = mntget(current->fs->pwdmnt);
+ save->ngroups = current->ngroups;
LASSERT(save->pwd);
LASSERT(save->pwdmnt);
LASSERT(new_ctx->pwdmnt);
if (uc) {
- save->fsuid = current->fsuid;
- save->fsgid = current->fsgid;
- save->cap = current->cap_effective;
+ save->ouc.ouc_fsuid = current->fsuid;
+ save->ouc.ouc_fsgid = current->fsgid;
+ save->ouc.ouc_cap = current->cap_effective;
+ save->ouc.ouc_suppgid1 = current->groups[0];
+ save->ouc.ouc_suppgid2 = current->groups[1];
current->fsuid = uc->ouc_fsuid;
current->fsgid = uc->ouc_fsgid;
current->cap_effective = uc->ouc_cap;
+ current->ngroups = 0;
+
if (uc->ouc_suppgid1 != -1)
current->groups[current->ngroups++] = uc->ouc_suppgid1;
if (uc->ouc_suppgid2 != -1)
atomic_read(¤t->fs->pwdmnt->mnt_count));
*/
}
+EXPORT_SYMBOL(push_ctxt);
void pop_ctxt(struct obd_run_ctxt *saved, struct obd_run_ctxt *new_ctx,
struct obd_ucred *uc)
dput(saved->pwd);
mntput(saved->pwdmnt);
if (uc) {
- current->fsuid = saved->fsuid;
- current->fsgid = saved->fsgid;
- current->cap_effective = saved->cap;
+ current->fsuid = saved->ouc.ouc_fsuid;
+ current->fsgid = saved->ouc.ouc_fsgid;
+ current->cap_effective = saved->ouc.ouc_cap;
+ current->ngroups = saved->ngroups;
- if (uc->ouc_suppgid1 != -1)
- current->ngroups--;
- if (uc->ouc_suppgid2 != -1)
- current->ngroups--;
+ current->groups[0] = saved->ouc.ouc_suppgid1;
+ current->groups[1] = saved->ouc.ouc_suppgid2;
}
/*
atomic_read(¤t->fs->pwdmnt->mnt_count));
*/
}
+EXPORT_SYMBOL(pop_ctxt);
/* utility to make a file */
struct dentry *simple_mknod(struct dentry *dir, char *name, int mode)
GOTO(out_up, dchild);
if (dchild->d_inode) {
- if ((dchild->d_inode->i_mode & S_IFMT) != S_IFREG)
+ if (!S_ISREG(dchild->d_inode->i_mode))
GOTO(out_err, err = -EEXIST);
GOTO(out_up, dchild);
out_up:
return dchild;
}
+EXPORT_SYMBOL(simple_mknod);
/* utility to make a directory */
struct dentry *simple_mkdir(struct dentry *dir, char *name, int mode)
out_up:
return dchild;
}
+EXPORT_SYMBOL(simple_mkdir);
/*
* Read a file from within kernel context. Prior to calling this
* function we should already have done a push_ctxt().
*/
-int lustre_fread(struct file *file, char *str, int len, loff_t *off)
+int lustre_fread(struct file *file, void *buf, int len, loff_t *off)
{
ASSERT_KERNEL_CTXT("kernel doing read outside kernel context\n");
if (!file || !file->f_op || !file->f_op->read || !off)
RETURN(-ENOSYS);
- return file->f_op->read(file, str, len, off);
+ return file->f_op->read(file, buf, len, off);
}
+EXPORT_SYMBOL(lustre_fread);
/*
* Write a file from within kernel context. Prior to calling this
* function we should already have done a push_ctxt().
*/
-int lustre_fwrite(struct file *file, const char *str, int len, loff_t *off)
+int lustre_fwrite(struct file *file, const void *buf, int len, loff_t *off)
{
ENTRY;
ASSERT_KERNEL_CTXT("kernel doing write outside kernel context\n");
if (!file->f_op->write)
RETURN(-EROFS);
- RETURN(file->f_op->write(file, str, len, off));
+ RETURN(file->f_op->write(file, buf, len, off));
}
+EXPORT_SYMBOL(lustre_fwrite);
/*
* Sync a file from within kernel context. Prior to calling this
RETURN(file->f_op->fsync(file, file->f_dentry, 0));
}
+EXPORT_SYMBOL(lustre_fsync);