From cfeaa0cbd24e7ed5c863d7a8276aafe63dec351e Mon Sep 17 00:00:00 2001 From: braam Date: Thu, 7 Nov 2002 20:46:28 +0000 Subject: [PATCH] - capability fixes on head - LL_SAVE_INTENT fixes --- lustre/include/linux/lustre_idl.h | 11 +++++++++-- lustre/include/linux/lustre_mds.h | 1 + lustre/include/linux/obd.h | 3 ++- lustre/lib/mds_updates.c | 12 ++++++++++++ lustre/lib/simple.c | 12 +++++++----- lustre/llite/namei.c | 2 +- lustre/mds/handler.c | 6 +++++- lustre/mds/mds_reint.c | 1 + lustre/ptlrpc/client.c | 2 +- lustre/tests/Makefile.am | 3 ++- lustre/tests/createmany.c | 38 ++++++++++++++++++++++++++++++++++++++ lustre/tests/runslabinfo | 1 + 12 files changed, 80 insertions(+), 12 deletions(-) create mode 100644 lustre/tests/createmany.c diff --git a/lustre/include/linux/lustre_idl.h b/lustre/include/linux/lustre_idl.h index 2e225ee..2ef3481 100644 --- a/lustre/include/linux/lustre_idl.h +++ b/lustre/include/linux/lustre_idl.h @@ -375,6 +375,7 @@ struct mds_body { __u32 valid; __u32 fsuid; __u32 fsgid; + __u32 capability; __u32 mode; __u32 uid; __u32 gid; @@ -400,6 +401,8 @@ struct mds_rec_setattr { __u32 sa_opcode; __u32 sa_fsuid; __u32 sa_fsgid; + __u32 sa_cap; + __u32 sa_reserved; __u32 sa_valid; struct ll_fid sa_fid; __u32 sa_mode; @@ -416,6 +419,8 @@ struct mds_rec_create { __u32 cr_opcode; __u32 cr_fsuid; __u32 cr_fsgid; + __u32 cr_cap; + __u32 cr_reserved; __u32 cr_mode; struct ll_fid cr_fid; struct ll_fid cr_replayfid; @@ -429,7 +434,7 @@ struct mds_rec_link { __u32 lk_opcode; __u32 lk_fsuid; __u32 lk_fsgid; - __u32 lk_reserved; + __u32 lk_cap; struct ll_fid lk_fid1; struct ll_fid lk_fid2; }; @@ -438,6 +443,8 @@ struct mds_rec_unlink { __u32 ul_opcode; __u32 ul_fsuid; __u32 ul_fsgid; + __u32 ul_cap; + __u32 ul_reserved; __u32 ul_mode; struct ll_fid ul_fid1; struct ll_fid ul_fid2; @@ -447,7 +454,7 @@ struct mds_rec_rename { __u32 rn_opcode; __u32 rn_fsuid; __u32 rn_fsgid; - __u32 rn_reserved; + __u32 rn_cap; struct ll_fid rn_fid1; struct ll_fid rn_fid2; }; diff --git a/lustre/include/linux/lustre_mds.h b/lustre/include/linux/lustre_mds.h index 401682b..7e0005b 100644 --- a/lustre/include/linux/lustre_mds.h +++ b/lustre/include/linux/lustre_mds.h @@ -47,6 +47,7 @@ struct obd_device; struct mds_update_record { __u32 ur_fsuid; __u32 ur_fsgid; + __u32 ur_cap; __u32 ur_opcode; struct ll_fid *ur_fid1; struct ll_fid *ur_fid2; diff --git a/lustre/include/linux/obd.h b/lustre/include/linux/obd.h index 46b1ca4..89624fb 100644 --- a/lustre/include/linux/obd.h +++ b/lustre/include/linux/obd.h @@ -63,6 +63,7 @@ struct ext2_obd { struct obd_ucred { __u32 ouc_fsuid; __u32 ouc_fsgid; + __u32 ouc_cap; }; #define OBD_RUN_CTXT_MAGIC 0xC0FFEEAA @@ -73,7 +74,7 @@ struct obd_run_ctxt { mm_segment_t fs; __u32 fsuid; __u32 fsgid; - __u32 override; + __u32 cap; #ifdef OBD_CTXT_DEBUG __u32 magic; #endif diff --git a/lustre/lib/mds_updates.c b/lustre/lib/mds_updates.c index 3e6194a..75a59da 100644 --- a/lustre/lib/mds_updates.c +++ b/lustre/lib/mds_updates.c @@ -83,6 +83,7 @@ static void mds_pack_body(struct mds_body *b) b->fsuid = HTON__u32(current->fsuid); b->fsgid = HTON__u32(current->fsgid); + b->capability = HTON__u32(current->cap_effective); mds_pack_fid(&b->fid1); mds_pack_fid(&b->fid2); @@ -144,6 +145,7 @@ void mds_create_pack(struct ptlrpc_request *req, int offset, rec->cr_opcode = HTON__u32(REINT_CREATE); rec->cr_fsuid = HTON__u32(current->fsuid); rec->cr_fsgid = HTON__u32(current->fsgid); + rec->cr_cap = HTON__u32(current->cap_effective); ll_inode2fid(&rec->cr_fid, dir); memset(&rec->cr_replayfid, 0, sizeof rec->cr_replayfid); rec->cr_mode = HTON__u32(mode); @@ -171,6 +173,7 @@ void mds_setattr_pack(struct ptlrpc_request *req, int offset, rec->sa_opcode = HTON__u32(REINT_SETATTR); rec->sa_fsuid = HTON__u32(current->fsuid); rec->sa_fsgid = HTON__u32(current->fsgid); + rec->sa_cap = HTON__u32(current->cap_effective); ll_inode2fid(&rec->sa_fid, inode); rec->sa_valid = HTON__u32(iattr->ia_valid); rec->sa_mode = HTON__u32(iattr->ia_mode); @@ -201,6 +204,7 @@ void mds_unlink_pack(struct ptlrpc_request *req, int offset, rec->ul_opcode = HTON__u32(REINT_UNLINK); rec->ul_fsuid = HTON__u32(current->fsuid); rec->ul_fsgid = HTON__u32(current->fsgid); + rec->ul_cap = HTON__u32(current->cap_effective); rec->ul_mode = HTON__u32(mode); ll_inode2fid(&rec->ul_fid1, inode); if (child) @@ -222,6 +226,7 @@ void mds_link_pack(struct ptlrpc_request *req, int offset, rec->lk_opcode = HTON__u32(REINT_LINK); rec->lk_fsuid = HTON__u32(current->fsuid); rec->lk_fsgid = HTON__u32(current->fsgid); + rec->lk_cap = HTON__u32(current->cap_effective); ll_inode2fid(&rec->lk_fid1, inode); ll_inode2fid(&rec->lk_fid2, dir); @@ -242,6 +247,7 @@ void mds_rename_pack(struct ptlrpc_request *req, int offset, rec->rn_opcode = HTON__u32(REINT_RENAME); rec->rn_fsuid = HTON__u32(current->fsuid); rec->rn_fsgid = HTON__u32(current->fsgid); + rec->rn_cap = HTON__u32(current->cap_effective); ll_inode2fid(&rec->rn_fid1, srcdir); ll_inode2fid(&rec->rn_fid2, tgtdir); @@ -273,6 +279,7 @@ void mds_unpack_body(struct mds_body *b) b->valid = NTOH__u32(b->valid); b->fsuid = NTOH__u32(b->fsuid); b->fsgid = NTOH__u32(b->fsgid); + b->capability = NTOH__u32(b->capability); b->ino = NTOH__u32(b->ino); b->mode = NTOH__u32(b->mode); b->uid = NTOH__u32(b->uid); @@ -299,6 +306,7 @@ static int mds_setattr_unpack(struct ptlrpc_request *req, int offset, r->ur_fsuid = NTOH__u32(rec->sa_fsuid); r->ur_fsgid = NTOH__u32(rec->sa_fsgid); + r->ur_cap = NTOH__u32(rec->sa_cap); r->ur_fid1 = &rec->sa_fid; attr->ia_valid = NTOH__u32(rec->sa_valid); attr->ia_mode = NTOH__u32(rec->sa_mode); @@ -331,6 +339,7 @@ static int mds_create_unpack(struct ptlrpc_request *req, int offset, r->ur_fsuid = NTOH__u32(rec->cr_fsuid); r->ur_fsgid = NTOH__u32(rec->cr_fsgid); + r->ur_cap = NTOH__u32(rec->cr_cap); r->ur_fid1 = &rec->cr_fid; r->ur_fid2 = &rec->cr_replayfid; r->ur_mode = NTOH__u32(rec->cr_mode); @@ -364,6 +373,7 @@ static int mds_link_unpack(struct ptlrpc_request *req, int offset, r->ur_fsuid = NTOH__u32(rec->lk_fsuid); r->ur_fsgid = NTOH__u32(rec->lk_fsgid); + r->ur_cap = NTOH__u32(rec->lk_cap); r->ur_fid1 = &rec->lk_fid1; r->ur_fid2 = &rec->lk_fid2; @@ -384,6 +394,7 @@ static int mds_unlink_unpack(struct ptlrpc_request *req, int offset, r->ur_fsuid = NTOH__u32(rec->ul_fsuid); r->ur_fsgid = NTOH__u32(rec->ul_fsgid); + r->ur_cap = NTOH__u32(rec->ul_cap); r->ur_mode = NTOH__u32(rec->ul_mode); r->ur_fid1 = &rec->ul_fid1; r->ur_fid2 = &rec->ul_fid2; @@ -405,6 +416,7 @@ static int mds_rename_unpack(struct ptlrpc_request *req, int offset, r->ur_fsuid = NTOH__u32(rec->rn_fsuid); r->ur_fsgid = NTOH__u32(rec->rn_fsgid); + r->ur_cap = NTOH__u32(rec->rn_cap); r->ur_fid1 = &rec->rn_fid1; r->ur_fid2 = &rec->rn_fid2; diff --git a/lustre/lib/simple.c b/lustre/lib/simple.c index 98e2b46..0a3d058 100644 --- a/lustre/lib/simple.c +++ b/lustre/lib/simple.c @@ -50,7 +50,6 @@ void push_ctxt(struct obd_run_ctxt *save, struct obd_run_ctxt *new, save->fs = get_fs(); save->pwd = dget(current->fs->pwd); save->pwdmnt = mntget(current->fs->pwdmnt); - save->override = cap_raised(current->cap_effective, CAP_DAC_OVERRIDE); LASSERT(save->pwd); LASSERT(save->pwdmnt); @@ -59,14 +58,16 @@ void push_ctxt(struct obd_run_ctxt *save, struct obd_run_ctxt *new, save->fsuid = current->fsuid; save->fsgid = current->fsgid; + save->cap = current->cap_effective; if (uc) { current->fsuid = uc->ouc_fsuid; current->fsgid = uc->ouc_fsgid; + current->cap_effective = uc->ouc_cap; } set_fs(new->fs); set_fs_pwd(current->fs, new->pwdmnt, new->pwd); - if (save->override) - cap_lower(current->cap_effective, CAP_DAC_OVERRIDE); + //if (save->override) + // cap_lower(current->cap_effective, CAP_DAC_OVERRIDE); } void pop_ctxt(struct obd_run_ctxt *saved) @@ -87,9 +88,10 @@ void pop_ctxt(struct obd_run_ctxt *saved) //printk("pc6\n"); current->fsuid = saved->fsuid; current->fsgid = saved->fsgid; + current->cap_effective = saved->cap; - if (saved->override) - cap_raise(current->cap_effective, CAP_DAC_OVERRIDE); + // if (saved->override) + // cap_raise(current->cap_effective, CAP_DAC_OVERRIDE); } /* utility to make a file */ diff --git a/lustre/llite/namei.c b/lustre/llite/namei.c index 5a8d882..420ca29 100644 --- a/lustre/llite/namei.c +++ b/lustre/llite/namei.c @@ -345,7 +345,7 @@ int ll_intent_lock(struct inode *parent, struct dentry **de, * operation can lay its hands on it; but that is not * always needed... */ - if (it->it_status == 0 && + if ( // it->it_status == 0 && it->it_op != IT_RENAME2 && it->it_op != IT_SETATTR && it->it_op != IT_GETATTR && diff --git a/lustre/mds/handler.c b/lustre/mds/handler.c index e33f1b9..e60cac7 100644 --- a/lustre/mds/handler.c +++ b/lustre/mds/handler.c @@ -608,6 +608,7 @@ static int mds_getattr_name(int offset, struct ptlrpc_request *req) uc.ouc_fsuid = body->fsuid; uc.ouc_fsgid = body->fsgid; + uc.ouc_cap = body->capability; push_ctxt(&saved, &mds->mds_ctxt, &uc); de = mds_fid2dentry(mds, &body->fid1, NULL); if (IS_ERR(de)) { @@ -675,6 +676,7 @@ static int mds_getattr(int offset, struct ptlrpc_request *req) body = lustre_msg_buf(req->rq_reqmsg, offset); uc.ouc_fsuid = body->fsuid; uc.ouc_fsgid = body->fsgid; + uc.ouc_cap = body->capability; push_ctxt(&saved, &mds->mds_ctxt, &uc); de = mds_fid2dentry(mds, &body->fid1, NULL); if (IS_ERR(de)) { @@ -774,7 +776,8 @@ static int mds_store_ea(struct mds_obd *mds, struct ptlrpc_request *req, uc.ouc_fsuid = body->fsuid; uc.ouc_fsgid = body->fsgid; - push_ctxt(&saved, &mds->mds_ctxt, &uc); + uc.ouc_cap = body->capability; + push_ctxt(&saved, &mds->mds_ctxt, &uc); handle = mds_fs_start(mds, de->d_inode, MDS_FSOP_SETATTR); if (!handle) GOTO(out_ea, rc = -ENOMEM); @@ -952,6 +955,7 @@ static int mds_readpage(struct ptlrpc_request *req) body = lustre_msg_buf(req->rq_reqmsg, 0); uc.ouc_fsuid = body->fsuid; uc.ouc_fsgid = body->fsgid; + uc.ouc_cap = body->capability; push_ctxt(&saved, &mds->mds_ctxt, &uc); de = mds_fid2dentry(mds, &body->fid1, &mnt); if (IS_ERR(de)) diff --git a/lustre/mds/mds_reint.c b/lustre/mds/mds_reint.c index 8c0a226..318bbb0 100644 --- a/lustre/mds/mds_reint.c +++ b/lustre/mds/mds_reint.c @@ -856,6 +856,7 @@ int mds_reint_rec(struct mds_update_record *rec, int offset, uc.ouc_fsuid = rec->ur_fsuid; uc.ouc_fsgid = rec->ur_fsgid; + uc.ouc_cap = rec->ur_cap; push_ctxt(&saved, &mds->mds_ctxt, &uc); rc = reinters[realop] (rec, offset, req); diff --git a/lustre/ptlrpc/client.c b/lustre/ptlrpc/client.c index 5e3d137..c2e4ce4 100644 --- a/lustre/ptlrpc/client.c +++ b/lustre/ptlrpc/client.c @@ -553,7 +553,7 @@ int ptlrpc_queue_wait(struct ptlrpc_request *req) ENTRY; init_waitqueue_head(&req->rq_wait_for_rep); - DEBUG_REQ(D_HA, req, "subsys: %s:", cli->cli_name); + // DEBUG_REQ(D_HA, req, "subsys: %s:", cli->cli_name); /* XXX probably both an import and connection level are needed */ if (req->rq_level > conn->c_level) { diff --git a/lustre/tests/Makefile.am b/lustre/tests/Makefile.am index 062d3b6..034f12d 100644 --- a/lustre/tests/Makefile.am +++ b/lustre/tests/Makefile.am @@ -23,7 +23,7 @@ noinst_SCRIPTS += fs.sh intent-test.sh intent-test2.sh leak_finder.pl \ runtests runvmstat snaprun.sh tbox.sh common.sh noinst_PROGRAMS = openunlink testreq truncate directio openme writeme mcreate noinst_PROGRAMS += munlink tchmod toexcl fsx test_brw openclose createdestroy -noinst_PROGRAMS += lovstripe stat # ldaptest +noinst_PROGRAMS += lovstripe stat createmany # ldaptest # ldaptest_SOURCES = ldaptest.c tchmod_SOURCES = tchmod.c @@ -42,5 +42,6 @@ openclose_SOURCES = openclose.c createdestroy_SOURCES = createdestroy.c lovstripe_SOURCES = lovstripe.c stat_SOURCES = stat.c +createmany_SOURCES = createmany.c include $(top_srcdir)/Rules diff --git a/lustre/tests/createmany.c b/lustre/tests/createmany.c new file mode 100644 index 0000000..27ba3f7 --- /dev/null +++ b/lustre/tests/createmany.c @@ -0,0 +1,38 @@ +#include +#include +#include +#include +#include +#include +#include +#include + +int main(int argc, char ** argv) +{ + int i, rc, count; + char filename[4096]; + + if (argc < 3) { + printf("Usage %s filenamebase count\n", argv[0]); + return 1; + } + + if (strlen(argv[1]) > 4080) { + printf("name too long\n"); + return 1; + } + + count = strtoul(argv[2], NULL, 0); + + + for (i=0 ; i < count ; i++) { + sprintf(filename, "%s-%d", argv[1], i); + rc = mknod(filename, S_IFREG| 0444, 0); + if (rc) { + printf("mknod(%s) error: %s\n", + filename, strerror(errno)); + break; + } + } + return rc; +} diff --git a/lustre/tests/runslabinfo b/lustre/tests/runslabinfo index c0f0e1e..48d6602 100755 --- a/lustre/tests/runslabinfo +++ b/lustre/tests/runslabinfo @@ -1,4 +1,5 @@ #!/bin/sh while sleep 1 ; do egrep "ll_|ldlm|filp|dentry|inode|portals|size-[0-9]* " /proc/slabinfo + echo '-----------------------' done -- 1.8.3.1