Whamcloud - gitweb
- capability fixes on head
authorbraam <braam>
Thu, 7 Nov 2002 20:46:28 +0000 (20:46 +0000)
committerbraam <braam>
Thu, 7 Nov 2002 20:46:28 +0000 (20:46 +0000)
- LL_SAVE_INTENT fixes

12 files changed:
lustre/include/linux/lustre_idl.h
lustre/include/linux/lustre_mds.h
lustre/include/linux/obd.h
lustre/lib/mds_updates.c
lustre/lib/simple.c
lustre/llite/namei.c
lustre/mds/handler.c
lustre/mds/mds_reint.c
lustre/ptlrpc/client.c
lustre/tests/Makefile.am
lustre/tests/createmany.c [new file with mode: 0644]
lustre/tests/runslabinfo

index 2e225ee..2ef3481 100644 (file)
@@ -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;
 };
index 401682b..7e0005b 100644 (file)
@@ -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;
index 46b1ca4..89624fb 100644 (file)
@@ -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
index 3e6194a..75a59da 100644 (file)
@@ -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;
 
index 98e2b46..0a3d058 100644 (file)
@@ -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 */
index 5a8d882..420ca29 100644 (file)
@@ -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 &&
index e33f1b9..e60cac7 100644 (file)
@@ -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))
index 8c0a226..318bbb0 100644 (file)
@@ -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);
index 5e3d137..c2e4ce4 100644 (file)
@@ -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) { 
index 062d3b6..034f12d 100644 (file)
@@ -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 (file)
index 0000000..27ba3f7
--- /dev/null
@@ -0,0 +1,38 @@
+#include <stdio.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <errno.h>
+#include <string.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <stdlib.h>
+
+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;
+} 
index c0f0e1e..48d6602 100755 (executable)
@@ -1,4 +1,5 @@
 #!/bin/sh
 while sleep 1 ; do
        egrep "ll_|ldlm|filp|dentry|inode|portals|size-[0-9]* " /proc/slabinfo
+        echo '-----------------------'
 done