diff --git a/lustre/include/darwin/lvfs.h b/lustre/include/darwin/lvfs.h
index bda6594f1450f3250272fad8b195263cc561c5f8..a465578a0c3068c7620f98b0ab24beed55b6771e 100644
--- a/lustre/include/darwin/lvfs.h
+++ b/lustre/include/darwin/lvfs.h
@@ -48,7 +48,7 @@
 struct lvfs_ucred { 
 	__u32 luc_fsuid; 
 	__u32 luc_fsgid; 
-	__u32 luc_cap; 
+	cfs_kernel_cap_t luc_cap; 
 	__u32 luc_uid; 
 	__u32 luc_umask;
 };
diff --git a/lustre/include/liblustre.h b/lustre/include/liblustre.h
index 840c017fe821cc9c6f4900729d8ceb9acc2edacc..a2b6ebace338a0800d8249fc59bd00c9e50c5346 100644
--- a/lustre/include/liblustre.h
+++ b/lustre/include/liblustre.h
@@ -597,7 +597,7 @@ struct task_struct {
         int max_groups;
         int ngroups;
         gid_t *groups;
-        __u32 cap_effective;
+        cfs_cap_t cap_effective;
 };
 
 typedef struct task_struct cfs_task_t;
@@ -607,13 +607,6 @@ typedef struct task_struct cfs_task_t;
 
 extern struct task_struct *current;
 int in_group_p(gid_t gid);
-static inline int capable(int cap)
-{
-        if (current->cap_effective & (1 << cap))
-                return 1;
-        else
-                return 0;
-}
 
 #define set_current_state(foo) do { current->state = foo; } while (0)
 
@@ -753,12 +746,6 @@ typedef enum {
     CAP_SET=1
 } cap_flag_value_t;
 
-#define CAP_DAC_OVERRIDE        1
-#define CAP_DAC_READ_SEARCH     2
-#define CAP_FOWNER              3
-#define CAP_FSETID              4
-#define CAP_SYS_ADMIN          21
-
 cap_t   cap_get_proc(void);
 int     cap_get_flag(cap_t, cap_value_t, cap_flag_t, cap_flag_value_t *);
 
diff --git a/lustre/include/linux/lvfs.h b/lustre/include/linux/lvfs.h
index 8c101d3711aab74edf892566eb0af61749825f7f..801281bfe9ca627cc4cabc0314c6a31fe53fc4e0 100644
--- a/lustre/include/linux/lvfs.h
+++ b/lustre/include/linux/lvfs.h
@@ -64,7 +64,7 @@ struct lvfs_ucred {
         struct upcall_cache_entry *luc_uce;
         __u32 luc_fsuid;
         __u32 luc_fsgid;
-        __u32 luc_cap;
+        cfs_kernel_cap_t luc_cap;
         __u32 luc_suppgid1;
         __u32 luc_suppgid2;
         __u32 luc_umask;
diff --git a/lustre/include/lustre_log.h b/lustre/include/lustre_log.h
index 129459de9636e3dc7e2d3729b9e749454b2bc787..90e40ccb50c3caed7774c99d0674fa7e19d743f9 100644
--- a/lustre/include/lustre_log.h
+++ b/lustre/include/lustre_log.h
@@ -331,14 +331,6 @@ extern int llog_recov_thread_start(struct llog_commit_master *lcm);
 extern void llog_recov_thread_stop(struct llog_commit_master *lcm, 
                                    int force);
 
-#ifndef __KERNEL__
-
-#define cap_raise(c, flag) do {} while(0)
-
-#define CAP_SYS_RESOURCE 24
-
-#endif   /* !__KERNEL__ */
-
 static inline void llog_gen_init(struct llog_ctxt *ctxt)
 {
         struct obd_device *obd = ctxt->loc_exp->exp_obd;
@@ -442,8 +434,7 @@ static inline int llog_write_rec(struct llog_handle *handle,
                                  int numcookies, void *buf, int idx)
 {
         struct llog_operations *lop;
-        __u32 cap;
-        int rc, buflen;
+        int raised, rc, buflen;
         ENTRY;
 
         rc = llog_handle2ops(handle, &lop);
@@ -459,10 +450,12 @@ static inline int llog_write_rec(struct llog_handle *handle,
                 buflen = rec->lrh_len;
         LASSERT(size_round(buflen) == buflen);
 
-        cap = current->cap_effective;             
-        cap_raise(current->cap_effective, CAP_SYS_RESOURCE); 
+        raised = cfs_cap_raised(CFS_CAP_SYS_RESOURCE);
+        if (!raised)
+                cfs_cap_raise(CFS_CAP_SYS_RESOURCE); 
         rc = lop->lop_write_rec(handle, rec, logcookies, numcookies, buf, idx);
-        current->cap_effective = cap; 
+        if (!raised)
+                cfs_cap_lower(CFS_CAP_SYS_RESOURCE); 
         RETURN(rc);
 }
 
@@ -558,8 +551,7 @@ static inline int llog_create(struct llog_ctxt *ctxt, struct llog_handle **res,
                               struct llog_logid *logid, char *name)
 {
         struct llog_operations *lop;
-        __u32 cap;
-        int rc;
+        int raised, rc;
         ENTRY;
 
         rc = llog_obd2ops(ctxt, &lop);
@@ -568,10 +560,12 @@ static inline int llog_create(struct llog_ctxt *ctxt, struct llog_handle **res,
         if (lop->lop_create == NULL)
                 RETURN(-EOPNOTSUPP);
 
-        cap = current->cap_effective;             
-        cap_raise(current->cap_effective, CAP_SYS_RESOURCE);
+        raised = cfs_cap_raised(CFS_CAP_SYS_RESOURCE);
+        if (!raised)
+                cfs_cap_raise(CFS_CAP_SYS_RESOURCE);
         rc = lop->lop_create(ctxt, res, logid, name);
-        current->cap_effective = cap; 
+        if (!raised)
+                cfs_cap_lower(CFS_CAP_SYS_RESOURCE);
         RETURN(rc);
 }
 
diff --git a/lustre/include/lustre_mds.h b/lustre/include/lustre_mds.h
index a64bc8d421a7e77df82f7d678ffd248b5fe9359c..0812a2d53289fca305e40378ffcb4c4db728893e 100644
--- a/lustre/include/lustre_mds.h
+++ b/lustre/include/lustre_mds.h
@@ -209,7 +209,8 @@ int mdc_readpage(struct obd_export *exp, struct ll_fid *mdc_fid, __u64 offset,
                  struct page *, struct ptlrpc_request **);
 int mdc_create(struct obd_export *exp, struct mdc_op_data *op_data,
                const void *data, int datalen, int mode, __u32 uid, __u32 gid,
-               __u32 cap_effective, __u64 rdev,struct ptlrpc_request **request);
+               cfs_cap_t cap_effective, __u64 rdev,
+               struct ptlrpc_request **request);
 int mdc_unlink(struct obd_export *exp, struct mdc_op_data *data,
                struct ptlrpc_request **request);
 int mdc_link(struct obd_export *exp, struct mdc_op_data *data,
diff --git a/lustre/liblustre/lutil.c b/lustre/liblustre/lutil.c
index 2b0e6042d6e3e10861c351c758f1892b281a4acb..7b0946c4d165b4ed849977378de3873c04542286 100644
--- a/lustre/liblustre/lutil.c
+++ b/lustre/liblustre/lutil.c
@@ -227,6 +227,46 @@ int liblustre_init_current(char *comm)
         return 0;
 }
 
+void cfs_cap_raise(cfs_cap_t cap)
+{
+        current->cap_effective |= (1 << cap);
+}
+
+void cfs_cap_lower(cfs_cap_t cap)
+{
+        current->cap_effective &= ~(1 << cap);
+}
+
+int cfs_cap_raised(cfs_cap_t cap)
+{
+        return current->cap_effective & (1 << cap);
+}
+
+void cfs_kernel_cap_pack(cfs_kernel_cap_t kcap, cfs_cap_t *cap)
+{
+        *cap = kcap;
+}
+
+void cfs_kernel_cap_unpack(cfs_kernel_cap_t *kcap, cfs_cap_t cap)
+{
+        *kcap = cap;
+}
+
+cfs_cap_t cfs_curproc_cap_pack(void) {
+        cfs_cap_t cap;
+        cfs_kernel_cap_pack(cfs_current()->cap_effective, &cap);
+        return cap;
+}
+
+void cfs_curproc_cap_unpack(cfs_cap_t cap) {
+        cfs_kernel_cap_unpack(&cfs_current()->cap_effective, cap);
+}
+
+int cfs_capable(cfs_cap_t cap)
+{
+        return cfs_cap_raised(cap);
+}
+
 int init_lib_portals()
 {
         int rc;
diff --git a/lustre/liblustre/super.c b/lustre/liblustre/super.c
index 072007a8a219cedf6df0d309d7ff2408a943d98a..a70faec6c7077eb0fdded1498c35ba7cc60242cb 100644
--- a/lustre/liblustre/super.c
+++ b/lustre/liblustre/super.c
@@ -92,12 +92,12 @@ static int ll_permission(struct inode *inode, int mask)
 
         if ((mask & (MAY_READ|MAY_WRITE)) ||
             (st->st_mode & S_IXUGO))
-                if (capable(CAP_DAC_OVERRIDE))
+                if (cfs_capable(CFS_CAP_DAC_OVERRIDE))
                         return 0;
 
         if (mask == MAY_READ ||
             (S_ISDIR(st->st_mode) && !(mask & MAY_WRITE))) {
-                if (capable(CAP_DAC_READ_SEARCH))
+                if (cfs_capable(CFS_CAP_DAC_READ_SEARCH))
                         return 0;
         }
 
@@ -609,7 +609,7 @@ static int inode_setattr(struct inode * inode, struct iattr * attr)
                 st->st_ctime = attr->ia_ctime;
         if (ia_valid & ATTR_MODE) {
                 st->st_mode = attr->ia_mode;
-                if (!in_group_p(st->st_gid) && !capable(CAP_FSETID))
+                if (!in_group_p(st->st_gid) && !cfs_capable(CFS_CAP_FSETID))
                         st->st_mode &= ~S_ISGID;
         }
         /* mark_inode_dirty(inode); */
@@ -735,7 +735,7 @@ int llu_setattr_raw(struct inode *inode, struct iattr *attr)
                         } else {
                                 /* from inode_change_ok() */
                                 if (current->fsuid != st->st_uid &&
-                                    !capable(CAP_FOWNER))
+                                    !cfs_capable(CFS_CAP_FOWNER))
                                         RETURN(-EPERM);
                         }
                 }
@@ -886,10 +886,9 @@ static int llu_iop_symlink_raw(struct pnode *pno, const char *tgt)
                 RETURN(err);
 
         llu_prepare_mdc_op_data(&op_data, dir, NULL, name, len, 0);
-        err = mdc_create(sbi->ll_mdc_exp, &op_data,
-                         tgt, strlen(tgt) + 1, S_IFLNK | S_IRWXUGO,
-                         current->fsuid, current->fsgid, current->cap_effective,
-                         0, &request);
+        err = mdc_create(sbi->ll_mdc_exp, &op_data, tgt, strlen(tgt) + 1,
+                         S_IFLNK | S_IRWXUGO, current->fsuid, current->fsgid,
+                         cfs_curproc_cap_pack(), 0, &request);
         ptlrpc_req_finished(request);
         liblustre_wait_event(0);
         RETURN(err);
@@ -1018,7 +1017,7 @@ static int llu_iop_mknod_raw(struct pnode *pno,
                                         0);
                 err = mdc_create(sbi->ll_mdc_exp, &op_data, NULL, 0, mode,
                                  current->fsuid, current->fsgid,
-                                 current->cap_effective, dev, &request);
+                                 cfs_curproc_cap_pack(), dev, &request);
                 ptlrpc_req_finished(request);
                 break;
         case S_IFDIR:
@@ -1246,9 +1245,9 @@ static int llu_iop_mkdir_raw(struct pnode *pno, mode_t mode)
                 RETURN(err);
 
         llu_prepare_mdc_op_data(&op_data, dir, NULL, name, len, 0);
-        err = mdc_create(llu_i2sbi(dir)->ll_mdc_exp, &op_data, NULL, 0, mode | S_IFDIR,
-                         current->fsuid, current->fsgid, current->cap_effective,
-                         0, &request);
+        err = mdc_create(llu_i2sbi(dir)->ll_mdc_exp, &op_data, NULL, 0,
+                         mode | S_IFDIR, current->fsuid, current->fsgid,
+                         cfs_curproc_cap_pack(), 0, &request);
         ptlrpc_req_finished(request);
         liblustre_wait_event(0);
         RETURN(err);
diff --git a/lustre/llite/dir.c b/lustre/llite/dir.c
index 2a87bc1b2af752c158d8c4460c4c7f0de09615c6..2c40b41cca98ac8089d3c4227c4bf85d11c8cff7 100644
--- a/lustre/llite/dir.c
+++ b/lustre/llite/dir.c
@@ -876,7 +876,7 @@ static int ll_dir_ioctl(struct inode *inode, struct file *file,
                 struct obd_quotactl *oqctl;
                 int rc, error = 0;
 
-                if (!capable(CAP_SYS_ADMIN))
+                if (!cfs_capable(CFS_CAP_SYS_ADMIN))
                         RETURN(-EPERM);
 
                 OBD_ALLOC_PTR(oqctl);
@@ -900,7 +900,7 @@ static int ll_dir_ioctl(struct inode *inode, struct file *file,
                 struct if_quotacheck *check;
                 int rc;
 
-                if (!capable(CAP_SYS_ADMIN))
+                if (!cfs_capable(CFS_CAP_SYS_ADMIN))
                         RETURN(-EPERM);
 
                 OBD_ALLOC_PTR(check);
@@ -956,13 +956,13 @@ static int ll_dir_ioctl(struct inode *inode, struct file *file,
                 case Q_QUOTAOFF:
                 case Q_SETQUOTA:
                 case Q_SETINFO:
-                        if (!capable(CAP_SYS_ADMIN))
+                        if (!cfs_capable(CFS_CAP_SYS_ADMIN))
                                 GOTO(out_quotactl, rc = -EPERM);
                         break;
                 case Q_GETQUOTA:
                         if (((type == USRQUOTA && current->euid != id) ||
                              (type == GRPQUOTA && !in_egroup_p(id))) &&
-                            !capable(CAP_SYS_ADMIN))
+                            !cfs_capable(CFS_CAP_SYS_ADMIN))
                                 GOTO(out_quotactl, rc = -EPERM);
 
                         /* XXX: dqb_valid is borrowed as a flag to mark that
diff --git a/lustre/llite/file.c b/lustre/llite/file.c
index e73d6e178ab0ca0e392ea6dce652b16985ce5041..1b0df577b6f58727a79a73626b6bb2ccf089b615 100644
--- a/lustre/llite/file.c
+++ b/lustre/llite/file.c
@@ -1921,7 +1921,7 @@ static int ll_lov_recreate_obj(struct inode *inode, struct file *file,
         struct lov_stripe_md *lsm, *lsm2;
         ENTRY;
 
-        if (!capable (CAP_SYS_ADMIN))
+        if (!cfs_capable(CFS_CAP_SYS_ADMIN))
                 RETURN(-EPERM);
 
         rc = copy_from_user(&ucreatp, (struct ll_recreate_obj *)arg,
@@ -2134,7 +2134,7 @@ static int ll_lov_setea(struct inode *inode, struct file *file,
         int rc;
         ENTRY;
 
-        if (!capable (CAP_SYS_ADMIN))
+        if (!cfs_capable(CFS_CAP_SYS_ADMIN))
                 RETURN(-EPERM);
 
         OBD_ALLOC(lump, lum_size);
@@ -3146,10 +3146,10 @@ check_groups:
 check_capabilities:
         if (!(mask & MAY_EXEC) ||
             (inode->i_mode & S_IXUGO) || S_ISDIR(inode->i_mode))
-                if (capable(CAP_DAC_OVERRIDE))
+                if (cfs_capable(CFS_CAP_DAC_OVERRIDE))
                         return 0;
 
-        if (capable(CAP_DAC_READ_SEARCH) && ((mask == MAY_READ) ||
+        if (cfs_capable(CFS_CAP_DAC_READ_SEARCH) && ((mask == MAY_READ) ||
             (S_ISDIR(inode->i_mode) && !(mask & MAY_WRITE))))
                 return 0;
 
diff --git a/lustre/llite/llite_lib.c b/lustre/llite/llite_lib.c
index 97f04b3bdff5998670d49f465b4f14ef272f95e9..ccaeec26209c9dc34f4ac29f583edf32d071e83c 100644
--- a/lustre/llite/llite_lib.c
+++ b/lustre/llite/llite_lib.c
@@ -1444,7 +1444,8 @@ int ll_setattr_raw(struct inode *inode, struct iattr *attr)
 
         /* POSIX: check before ATTR_*TIME_SET set (from inode_change_ok) */
         if (ia_valid & (ATTR_MTIME_SET | ATTR_ATIME_SET)) {
-                if (current->fsuid != inode->i_uid && !capable(CAP_FOWNER))
+                if (current->fsuid != inode->i_uid &&
+                    !cfs_capable(CFS_CAP_FOWNER))
                         RETURN(-EPERM);
         }
 
diff --git a/lustre/llite/namei.c b/lustre/llite/namei.c
index 435f9ec6424328fd01a7f3fd67fb5b034787444e..0832d9a25df379c683d0657af77081c26fff3dad 100644
--- a/lustre/llite/namei.c
+++ b/lustre/llite/namei.c
@@ -901,7 +901,7 @@ static int ll_new_node(struct inode *dir, struct qstr *name,
 
         err = mdc_create(sbi->ll_mdc_exp, &op_data, tgt, tgt_len,
                          mode, current->fsuid, current->fsgid,
-                         current->cap_effective, rdev, &request);
+                         cfs_curproc_cap_pack(), rdev, &request);
         if (err)
                 GOTO(err_exit, err);
 
diff --git a/lustre/llite/rw.c b/lustre/llite/rw.c
index 107f6894a12c7f5e5a3b218b7b9e6f160fb47d65..1702f202ec7a3e9feb51c233307b4560ed473fe5 100644
--- a/lustre/llite/rw.c
+++ b/lustre/llite/rw.c
@@ -843,7 +843,7 @@ int ll_commit_write(struct file *file, struct page *page, unsigned from,
         if (exp == NULL)
                 RETURN(-EINVAL);
 
-        llap->llap_ignore_quota = capable(CAP_SYS_RESOURCE);
+        llap->llap_ignore_quota = cfs_capable(CFS_CAP_SYS_RESOURCE);
 
         /* queue a write for some time in the future the first time we
          * dirty the page */
@@ -2038,7 +2038,7 @@ static int ll_file_oig_pages(struct inode * inode, struct page **pages,
         if (rc)
                 RETURN(rc);
         brw_flags = OBD_BRW_SRVLOCK;
-        if (capable(CAP_SYS_RESOURCE))
+        if (cfs_capable(CFS_CAP_SYS_RESOURCE))
                 brw_flags |= OBD_BRW_NOQUOTA;
 
         for (i = 0; i < numpages; i++) {
diff --git a/lustre/llite/xattr.c b/lustre/llite/xattr.c
index 77e4ef53bd192d43cbab172d904da36c7523913e..63d2761f80ea48c358605b42d4fb51b4e7c33262 100644
--- a/lustre/llite/xattr.c
+++ b/lustre/llite/xattr.c
@@ -112,7 +112,7 @@ int xattr_type_filter(struct ll_sb_info *sbi, int xattr_type)
 
         if (xattr_type == XATTR_USER_T && !(sbi->ll_flags & LL_SBI_USER_XATTR))
                 return -EOPNOTSUPP;
-        if (xattr_type == XATTR_TRUSTED_T && !capable(CAP_SYS_ADMIN))
+        if (xattr_type == XATTR_TRUSTED_T && !cfs_capable(CFS_CAP_SYS_ADMIN))
                 return -EPERM;
         if (xattr_type == XATTR_OTHER_T)
                 return -EOPNOTSUPP;
diff --git a/lustre/mdc/mdc_internal.h b/lustre/mdc/mdc_internal.h
index 11935dbba1c4bd92819f5920160ac5ef10cfdeb3..049727615f5de618f9d90c9b8712a714a4e0409a 100644
--- a/lustre/mdc/mdc_internal.h
+++ b/lustre/mdc/mdc_internal.h
@@ -60,7 +60,7 @@ void mdc_setattr_pack(struct ptlrpc_request *req, int offset,
                       void *ea2, int ea2len);
 void mdc_create_pack(struct ptlrpc_request *req, int offset,
                      struct mdc_op_data *op_data, const void *data, int datalen,
-                     __u32 mode, __u32 uid, __u32 gid, __u32 cap_effective,
+                     __u32 mode, __u32 uid, __u32 gid, cfs_cap_t cap_effective,
                      __u64 rdev);
 void mdc_open_pack(struct ptlrpc_request *req, int offset,
                    struct mdc_op_data *op_data, __u32 mode, __u64 rdev,
diff --git a/lustre/mdc/mdc_lib.c b/lustre/mdc/mdc_lib.c
index 575cf612a113e4cfb46477d7a7aea24947d509c1..f5106bdf59bca13a508e7f23f4f405c77ed33f9e 100644
--- a/lustre/mdc/mdc_lib.c
+++ b/lustre/mdc/mdc_lib.c
@@ -58,7 +58,7 @@ void mdc_readdir_pack(struct ptlrpc_request *req, int offset, __u64 pg_off,
         b = lustre_msg_buf(req->rq_reqmsg, offset, sizeof(*b));
         b->fsuid = current->fsuid;
         b->fsgid = current->fsgid;
-        b->capability = current->cap_effective;
+        b->capability = cfs_curproc_cap_pack();
         b->fid1 = *fid;
         b->size = pg_off;                       /* !! */
         b->suppgid = -1;
@@ -71,7 +71,7 @@ static void mdc_pack_body(struct mds_body *b)
 
         b->fsuid = current->fsuid;
         b->fsgid = current->fsgid;
-        b->capability = current->cap_effective;
+        b->capability = cfs_curproc_cap_pack();
 }
 
 void mdc_pack_req_body(struct ptlrpc_request *req, int offset,
@@ -90,7 +90,7 @@ void mdc_pack_req_body(struct ptlrpc_request *req, int offset,
 /* packing of MDS records */
 void mdc_create_pack(struct ptlrpc_request *req, int offset,
                      struct mdc_op_data *op_data, const void *data, int datalen,
-                     __u32 mode, __u32 uid, __u32 gid, __u32 cap_effective,
+                     __u32 mode, __u32 uid, __u32 gid, cfs_cap_t cap_effective,
                      __u64 rdev)
 {
         struct mds_rec_create *rec;
@@ -168,7 +168,7 @@ void mdc_open_pack(struct ptlrpc_request *req, int offset,
         rec->cr_opcode = REINT_OPEN;
         rec->cr_fsuid = current->fsuid;
         rec->cr_fsgid = current->fsgid;
-        rec->cr_cap = current->cap_effective;
+        rec->cr_cap = cfs_curproc_cap_pack();
         rec->cr_fid = op_data->fid1;
         memset(&rec->cr_replayfid, 0, sizeof(rec->cr_replayfid));
         rec->cr_mode = mode;
@@ -242,7 +242,7 @@ void mdc_setattr_pack(struct ptlrpc_request *req, int offset,
         rec->sa_opcode = REINT_SETATTR;
         rec->sa_fsuid = current->fsuid;
         rec->sa_fsgid = current->fsgid;
-        rec->sa_cap = current->cap_effective;
+        rec->sa_cap = cfs_curproc_cap_pack();
         rec->sa_fid = data->fid1;
         rec->sa_suppgid = -1;
 
@@ -286,7 +286,7 @@ void mdc_unlink_pack(struct ptlrpc_request *req, int offset,
         rec->ul_opcode = REINT_UNLINK;
         rec->ul_fsuid = current->fsuid;
         rec->ul_fsgid = current->fsgid;
-        rec->ul_cap = current->cap_effective;
+        rec->ul_cap = cfs_curproc_cap_pack();
         rec->ul_mode = data->create_mode;
         rec->ul_suppgid = data->suppgids[0];
         rec->ul_fid1 = data->fid1;
@@ -309,7 +309,7 @@ void mdc_link_pack(struct ptlrpc_request *req, int offset,
         rec->lk_opcode = REINT_LINK;
         rec->lk_fsuid = current->fsuid;
         rec->lk_fsgid = current->fsgid;
-        rec->lk_cap = current->cap_effective;
+        rec->lk_cap = cfs_curproc_cap_pack();
         rec->lk_suppgid1 = data->suppgids[0];
         rec->lk_suppgid2 = data->suppgids[1];
         rec->lk_fid1 = data->fid1;
@@ -333,7 +333,7 @@ void mdc_rename_pack(struct ptlrpc_request *req, int offset,
         rec->rn_opcode = REINT_RENAME;
         rec->rn_fsuid = current->fsuid;
         rec->rn_fsgid = current->fsgid;
-        rec->rn_cap = current->cap_effective;
+        rec->rn_cap = cfs_curproc_cap_pack();
         rec->rn_suppgid1 = data->suppgids[0];
         rec->rn_suppgid2 = data->suppgids[1];
         rec->rn_fid1 = data->fid1;
@@ -357,7 +357,7 @@ void mdc_getattr_pack(struct ptlrpc_request *req, int offset, __u64 valid,
 
         b->fsuid = current->fsuid;
         b->fsgid = current->fsgid;
-        b->capability = current->cap_effective;
+        b->capability = cfs_curproc_cap_pack();
         b->valid = valid;
         b->flags = flags | MDS_BFLAG_EXT_FLAGS;
         /* skip MDS_BFLAG_EXT_FLAGS to verify the "client < 1.4.7" case 
diff --git a/lustre/mdc/mdc_reint.c b/lustre/mdc/mdc_reint.c
index f9cfe69f7056efbd611258a4bd4b67d71159c07b..a51d03e855c767e5216d1aee33fd37f438284342 100644
--- a/lustre/mdc/mdc_reint.c
+++ b/lustre/mdc/mdc_reint.c
@@ -176,7 +176,8 @@ int mdc_setattr(struct obd_export *exp, struct mdc_op_data *op_data,
 
 int mdc_create(struct obd_export *exp, struct mdc_op_data *op_data,
                const void *data, int datalen, int mode, __u32 uid, __u32 gid,
-               __u32 cap_effective, __u64 rdev, struct ptlrpc_request **request)
+               cfs_cap_t cap_effective, __u64 rdev,
+               struct ptlrpc_request **request)
 {
         CFS_LIST_HEAD(cancels);
         struct obd_device *obd = exp->exp_obd;
diff --git a/lustre/mds/mds_internal.h b/lustre/mds/mds_internal.h
index 27d97a04a522e4f3b10dca09c86f2353307ff80c..91e2774cddf95888bf1238269346549989e9fca7 100644
--- a/lustre/mds/mds_internal.h
+++ b/lustre/mds/mds_internal.h
@@ -198,7 +198,7 @@ int mds_init_ucred(struct lvfs_ucred *ucred, struct ptlrpc_request *req,
                    int offset);
 void mds_exit_ucred(struct lvfs_ucred *ucred, struct mds_obd *obd);
 void mds_root_squash(struct mds_obd *mds, lnet_nid_t *peernid,
-                     __u32 *fsuid, __u32 *fsgid, __u32 *cap,
+                     __u32 *fsuid, __u32 *fsgid, cfs_kernel_cap_t *cap,
                      __u32 *suppgid, __u32 *suppgid2);
 
 /* mds/mds_unlink_open.c */
diff --git a/lustre/mds/mds_lib.c b/lustre/mds/mds_lib.c
index b1bad61d8505930bde2fb3111394549259f6e76d..3ba3e53dd60997ca94d373819cdcad1a73c449fd 100644
--- a/lustre/mds/mds_lib.c
+++ b/lustre/mds/mds_lib.c
@@ -156,7 +156,7 @@ static int mds_setattr_unpack(struct ptlrpc_request *req, int offset,
 
         r->ur_uc.luc_fsuid = rec->sa_fsuid;
         r->ur_uc.luc_fsgid = rec->sa_fsgid;
-        r->ur_uc.luc_cap = rec->sa_cap;
+        cfs_kernel_cap_unpack(&r->ur_uc.luc_cap, rec->sa_cap);
         r->ur_uc.luc_suppgid1 = rec->sa_suppgid;
         r->ur_uc.luc_suppgid2 = -1;
         r->ur_fid1 = &rec->sa_fid;
@@ -206,7 +206,7 @@ static int mds_create_unpack(struct ptlrpc_request *req, int offset,
 
         r->ur_uc.luc_fsuid = rec->cr_fsuid;
         r->ur_uc.luc_fsgid = rec->cr_fsgid;
-        r->ur_uc.luc_cap = rec->cr_cap;
+        cfs_kernel_cap_unpack(&r->ur_uc.luc_cap, rec->cr_cap);
         r->ur_uc.luc_suppgid1 = rec->cr_suppgid;
         r->ur_uc.luc_suppgid2 = -1;
         r->ur_fid1 = &rec->cr_fid;
@@ -259,7 +259,7 @@ static int mds_link_unpack(struct ptlrpc_request *req, int offset,
 
         r->ur_uc.luc_fsuid = rec->lk_fsuid;
         r->ur_uc.luc_fsgid = rec->lk_fsgid;
-        r->ur_uc.luc_cap = rec->lk_cap;
+        cfs_kernel_cap_unpack(&r->ur_uc.luc_cap, rec->lk_cap);
         r->ur_uc.luc_suppgid1 = rec->lk_suppgid1;
         r->ur_uc.luc_suppgid2 = rec->lk_suppgid2;
         r->ur_fid1 = &rec->lk_fid1;
@@ -294,7 +294,7 @@ static int mds_unlink_unpack(struct ptlrpc_request *req, int offset,
 
         r->ur_uc.luc_fsuid = rec->ul_fsuid;
         r->ur_uc.luc_fsgid = rec->ul_fsgid;
-        r->ur_uc.luc_cap = rec->ul_cap;
+        cfs_kernel_cap_unpack(&r->ur_uc.luc_cap, rec->ul_cap);
         r->ur_uc.luc_suppgid1 = rec->ul_suppgid;
         r->ur_uc.luc_suppgid2 = -1;
         r->ur_mode = rec->ul_mode;
@@ -331,7 +331,7 @@ static int mds_rename_unpack(struct ptlrpc_request *req, int offset,
 
         r->ur_uc.luc_fsuid = rec->rn_fsuid;
         r->ur_uc.luc_fsgid = rec->rn_fsgid;
-        r->ur_uc.luc_cap = rec->rn_cap;
+        cfs_kernel_cap_unpack(&r->ur_uc.luc_cap, rec->rn_cap);
         r->ur_uc.luc_suppgid1 = rec->rn_suppgid1;
         r->ur_uc.luc_suppgid2 = rec->rn_suppgid2;
         r->ur_fid1 = &rec->rn_fid1;
@@ -372,7 +372,7 @@ static int mds_open_unpack(struct ptlrpc_request *req, int offset,
 
         r->ur_uc.luc_fsuid = rec->cr_fsuid;
         r->ur_uc.luc_fsgid = rec->cr_fsgid;
-        r->ur_uc.luc_cap = rec->cr_cap;
+        cfs_kernel_cap_unpack(&r->ur_uc.luc_cap, rec->cr_cap);
         r->ur_uc.luc_suppgid1 = rec->cr_suppgid;
         r->ur_uc.luc_suppgid2 = -1;
         r->ur_fid1 = &rec->cr_fid;
@@ -440,7 +440,7 @@ int mds_update_unpack(struct ptlrpc_request *req, int offset,
 }
 
 void mds_root_squash(struct mds_obd *mds, lnet_nid_t *peernid,
-                     __u32 *fsuid, __u32 *fsgid, __u32 *cap,
+                     __u32 *fsuid, __u32 *fsgid, cfs_kernel_cap_t *kcap,
                      __u32 *suppgid, __u32 *suppgid2)
 {
         if (!mds->mds_squash_uid || *fsuid)
@@ -449,13 +449,13 @@ void mds_root_squash(struct mds_obd *mds, lnet_nid_t *peernid,
         if (*peernid == mds->mds_nosquash_nid)
                 return;
 
-        CDEBUG(D_OTHER, "squash req from %s, (%d:%d/%x)=>(%d:%d/%x)\n",
-               libcfs_nid2str(*peernid), *fsuid, *fsgid, *cap,
-               mds->mds_squash_uid, mds->mds_squash_gid, 0);
+        CDEBUG(D_OTHER, "squash req from %s, (%d:%d)=>(%d:%d)\n",
+               libcfs_nid2str(*peernid), *fsuid, *fsgid,
+               mds->mds_squash_uid, mds->mds_squash_gid);
 
         *fsuid = mds->mds_squash_uid;
         *fsgid = mds->mds_squash_gid;
-        *cap = 0;
+        cfs_kernel_cap_unpack(kcap, 0);
         *suppgid = -1;
         if (suppgid2)
                 *suppgid2 = -1;
@@ -479,13 +479,13 @@ int mds_init_ucred(struct lvfs_ucred *ucred, struct ptlrpc_request *req,
         } else
 #endif
         {
+                cfs_kernel_cap_unpack(&ucred->luc_cap, body->capability);
                 mds_root_squash(mds, &req->rq_peer.nid, &body->fsuid,
-                                &body->fsgid, &body->capability,
+                                &body->fsgid, &ucred->luc_cap,
                                 &body->suppgid, NULL);
 
                 ucred->luc_fsuid = body->fsuid;
                 ucred->luc_fsgid = body->fsgid;
-                ucred->luc_cap = body->capability;
         }
 
         ucred->luc_uce = upcall_cache_get_entry(mds->mds_group_hash,
diff --git a/lustre/mds/mds_reint.c b/lustre/mds/mds_reint.c
index c7da418a9b925b0b70f5ae132d6301b2134f6fd7..8c088123245eb332def0ee3bb36edb13b88078da 100644
--- a/lustre/mds/mds_reint.c
+++ b/lustre/mds/mds_reint.c
@@ -2464,7 +2464,7 @@ int mds_reint_rec(struct mds_update_record *rec, int offset,
                  * NB root's creds are believed... */
                 LASSERT (req->rq_uid != 0);
                 rec->ur_uc.luc_fsuid = req->rq_uid;
-                rec->ur_uc.luc_cap = 0;
+                cfs_kernel_cap_unpack(&rec->ur_uc.luc_cap, 0);
         }
 #endif
 
diff --git a/lustre/obdclass/linux/linux-obdo.c b/lustre/obdclass/linux/linux-obdo.c
index a8857bf9e92990a520c1ce97459bcdd6934fe982..04155cca1204fe61f1b2b0aec8ab7cd83b03f458 100644
--- a/lustre/obdclass/linux/linux-obdo.c
+++ b/lustre/obdclass/linux/linux-obdo.c
@@ -78,7 +78,7 @@ void obdo_from_iattr(struct obdo *oa, struct iattr *attr, unsigned int ia_valid)
         if (ia_valid & ATTR_MODE) {
                 oa->o_mode = attr->ia_mode;
                 oa->o_valid |= OBD_MD_FLTYPE | OBD_MD_FLMODE;
-                if (!in_group_p(oa->o_gid) && !capable(CAP_FSETID))
+                if (!in_group_p(oa->o_gid) && !cfs_capable(CFS_CAP_FSETID))
                         oa->o_mode &= ~S_ISGID;
         }
         if (ia_valid & ATTR_UID) {
@@ -126,7 +126,7 @@ void iattr_from_obdo(struct iattr *attr, struct obdo *oa, obd_flag valid)
         if (valid & OBD_MD_FLMODE) {
                 attr->ia_mode = (attr->ia_mode & S_IFMT)|(oa->o_mode & ~S_IFMT);
                 attr->ia_valid |= ATTR_MODE;
-                if (!in_group_p(oa->o_gid) && !capable(CAP_FSETID))
+                if (!in_group_p(oa->o_gid) && !cfs_capable(CFS_CAP_FSETID))
                         attr->ia_mode &= ~S_ISGID;
         }
         if (valid & OBD_MD_FLUID) {
diff --git a/lustre/obdclass/llog_obd.c b/lustre/obdclass/llog_obd.c
index d03b6372bdbcb61d160e8ea4da703d4d6363c843..77163a8095e6de07caa00aed53f9fe5cddc53447 100644
--- a/lustre/obdclass/llog_obd.c
+++ b/lustre/obdclass/llog_obd.c
@@ -206,8 +206,7 @@ int llog_add(struct llog_ctxt *ctxt, struct llog_rec_hdr *rec,
                 struct lov_stripe_md *lsm, struct llog_cookie *logcookies,
                 int numcookies)
 {
-        __u32 cap;
-        int rc;
+        int raised, rc;
         ENTRY;
 
         if (!ctxt) {
@@ -216,10 +215,12 @@ int llog_add(struct llog_ctxt *ctxt, struct llog_rec_hdr *rec,
         }
         
         CTXT_CHECK_OP(ctxt, add, -EOPNOTSUPP);
-        cap = current->cap_effective;             
-        cap_raise(current->cap_effective, CAP_SYS_RESOURCE);
+        raised = cfs_cap_raised(CFS_CAP_SYS_RESOURCE);
+        if (!raised)
+                cfs_cap_raise(CFS_CAP_SYS_RESOURCE);
         rc = CTXTP(ctxt, add)(ctxt, rec, lsm, logcookies, numcookies);
-        current->cap_effective = cap; 
+        if (!raised)
+                cfs_cap_lower(CFS_CAP_SYS_RESOURCE);
         RETURN(rc);
 }
 EXPORT_SYMBOL(llog_add);
diff --git a/lustre/obdecho/echo_client.c b/lustre/obdecho/echo_client.c
index 8e54dbb074ede96704b7a30d8b383e3f44e6fbe2..bd8127da6046003bf6db2fa80440c836087158c1 100644
--- a/lustre/obdecho/echo_client.c
+++ b/lustre/obdecho/echo_client.c
@@ -1148,7 +1148,7 @@ echo_client_iocontrol(unsigned int cmd, struct obd_export *exp,
 
         switch (cmd) {
         case OBD_IOC_CREATE:                    /* may create echo object */
-                if (!capable (CAP_SYS_ADMIN))
+                if (!cfs_capable(CFS_CAP_SYS_ADMIN))
                         GOTO (out, rc = -EPERM);
 
                 rc = echo_create_object (obd, 1, &data->ioc_obdo1,
@@ -1157,7 +1157,7 @@ echo_client_iocontrol(unsigned int cmd, struct obd_export *exp,
                 GOTO(out, rc);
 
         case OBD_IOC_DESTROY:
-                if (!capable (CAP_SYS_ADMIN))
+                if (!cfs_capable(CFS_CAP_SYS_ADMIN))
                         GOTO (out, rc = -EPERM);
                 rc = echo_get_object (&eco, obd, &data->ioc_obdo1);
                 if (rc == 0) {
@@ -1184,7 +1184,7 @@ echo_client_iocontrol(unsigned int cmd, struct obd_export *exp,
                 GOTO(out, rc);
 
         case OBD_IOC_SETATTR:
-                if (!capable (CAP_SYS_ADMIN))
+                if (!cfs_capable(CFS_CAP_SYS_ADMIN))
                         GOTO (out, rc = -EPERM);
 
                 rc = echo_get_object (&eco, obd, &data->ioc_obdo1);
@@ -1199,7 +1199,7 @@ echo_client_iocontrol(unsigned int cmd, struct obd_export *exp,
                 GOTO(out, rc);
 
         case OBD_IOC_BRW_WRITE:
-                if (!capable (CAP_SYS_ADMIN))
+                if (!cfs_capable(CFS_CAP_SYS_ADMIN))
                         GOTO (out, rc = -EPERM);
 
                 rw = OBD_BRW_WRITE;
@@ -1218,7 +1218,7 @@ echo_client_iocontrol(unsigned int cmd, struct obd_export *exp,
                 GOTO(out, rc);
 
         case ECHO_IOC_SET_STRIPE:
-                if (!capable (CAP_SYS_ADMIN))
+                if (!cfs_capable(CFS_CAP_SYS_ADMIN))
                         GOTO (out, rc = -EPERM);
 
                 if (data->ioc_pbuf1 == NULL) {  /* unset */
@@ -1235,7 +1235,7 @@ echo_client_iocontrol(unsigned int cmd, struct obd_export *exp,
                 GOTO (out, rc);
 
         case ECHO_IOC_ENQUEUE:
-                if (!capable (CAP_SYS_ADMIN))
+                if (!cfs_capable(CFS_CAP_SYS_ADMIN))
                         GOTO (out, rc = -EPERM);
 
                 rc = echo_client_enqueue(exp, &data->ioc_obdo1,
diff --git a/lustre/obdfilter/filter.c b/lustre/obdfilter/filter.c
index ebbac7e539f0d2204b08c1144dac7bb513d3fa37..80ea370a6e570dc6e14f3f1e6d11f589684b1e9a 100644
--- a/lustre/obdfilter/filter.c
+++ b/lustre/obdfilter/filter.c
@@ -1352,8 +1352,9 @@ int filter_vfs_unlink(struct inode *dir, struct dentry *dentry,
                 GOTO(out, rc = -EPERM);
 
         /* check_sticky() */
-        if ((dentry->d_inode->i_uid != current->fsuid && !capable(CAP_FOWNER))||
-            IS_APPEND(dentry->d_inode) || IS_IMMUTABLE(dentry->d_inode))
+        if ((dentry->d_inode->i_uid != current->fsuid &&
+             !cfs_capable(CFS_CAP_FOWNER)) || IS_APPEND(dentry->d_inode) ||
+            IS_IMMUTABLE(dentry->d_inode))
                 GOTO(out, rc = -EPERM);
 
         /* NOTE: This might need to go outside i_mutex, though it isn't clear if
diff --git a/lustre/obdfilter/filter_io_24.c b/lustre/obdfilter/filter_io_24.c
index 45fe017ba109a135ca81be954f758e514cf8cc8f..6031c1fec4854a8b405bb6e81d62b09456935b0d 100644
--- a/lustre/obdfilter/filter_io_24.c
+++ b/lustre/obdfilter/filter_io_24.c
@@ -506,7 +506,7 @@ int filter_commitrw_write(struct obd_export *exp, struct obdo *oa, int objcount,
                 CDEBUG(D_INODE, "update UID/GID to %lu/%lu\n",
                        (unsigned long)oa->o_uid, (unsigned long)oa->o_gid);
 
-                cap_raise(current->cap_effective, CAP_SYS_RESOURCE);
+                cfs_cap_raise(CFS_CAP_SYS_RESOURCE);
 
                 iattr.ia_valid |= ATTR_MODE;
                 iattr.ia_mode = inode->i_mode;
diff --git a/lustre/obdfilter/filter_io_26.c b/lustre/obdfilter/filter_io_26.c
index 6fd6b3a33532bfd6bac7fa4793a48668d58f60e9..a98d4fcae7deb2ee1e57b29ae1c722ecdc4757f2 100644
--- a/lustre/obdfilter/filter_io_26.c
+++ b/lustre/obdfilter/filter_io_26.c
@@ -745,7 +745,7 @@ int filter_commitrw_write(struct obd_export *exp, struct obdo *oa,
                 CDEBUG(D_INODE, "update UID/GID to %lu/%lu\n",
                        (unsigned long)oa->o_uid, (unsigned long)oa->o_gid);
 
-                cap_raise(current->cap_effective, CAP_SYS_RESOURCE);
+                cfs_cap_raise(CFS_CAP_SYS_RESOURCE);
 
                 iattr.ia_valid |= ATTR_MODE;
                 iattr.ia_mode = inode->i_mode;
diff --git a/lustre/osc/osc_request.c b/lustre/osc/osc_request.c
index 86818af89a9b8db5c11ed13d552eab92c8145e75..861e36d0cf3ac0063ad1dedf0a19bba825ffcb58 100644
--- a/lustre/osc/osc_request.c
+++ b/lustre/osc/osc_request.c
@@ -3426,7 +3426,7 @@ static int osc_iocontrol(unsigned int cmd, struct obd_export *exp, int len,
         case OBD_IOC_DESTROY: {
                 struct obdo            *oa;
 
-                if (!capable (CAP_SYS_ADMIN))
+                if (!cfs_capable(CFS_CAP_SYS_ADMIN))
                         GOTO (out, err = -EPERM);
                 oa = &data->ioc_obdo1;
 
diff --git a/lustre/quota/quota_interface.c b/lustre/quota/quota_interface.c
index 0097c94161bfcf7539ff2cf705d601e0b8b0ec6b..1ec25e38f1002d1c8bfd34ce72b36f234008cac8 100644
--- a/lustre/quota/quota_interface.c
+++ b/lustre/quota/quota_interface.c
@@ -156,9 +156,9 @@ static int filter_quota_enforce(struct obd_device *obd, unsigned int ignore)
 
         if (ignore) {
                 CDEBUG(D_QUOTA, "blocks will be written with ignoring quota.\n");
-                cap_raise(current->cap_effective, CAP_SYS_RESOURCE);
+                cfs_cap_raise(CFS_CAP_SYS_RESOURCE);
         } else {
-                cap_lower(current->cap_effective, CAP_SYS_RESOURCE);
+                cfs_cap_lower(CFS_CAP_SYS_RESOURCE);
         }
 
         RETURN(0);