diff --git a/libcfs/include/libcfs/curproc.h b/libcfs/include/libcfs/curproc.h index 518fbd403c4a9113f50b07bb2bec1653e6c00648..b79caf1929f0cd29bfb625100e1cfad369a4c910 100644 --- a/libcfs/include/libcfs/curproc.h +++ b/libcfs/include/libcfs/curproc.h @@ -70,10 +70,37 @@ char *cfs_curproc_comm(void); * * cfs_kernel_cap_t */ -cfs_kernel_cap_t cfs_curproc_cap_get(void); -void cfs_curproc_cap_set(cfs_kernel_cap_t cap); #endif +typedef __u32 cfs_cap_t; + +#define CFS_CAP_CHOWN 0 +#define CFS_CAP_DAC_OVERRIDE 1 +#define CFS_CAP_DAC_READ_SEARCH 2 +#define CFS_CAP_FOWNER 3 +#define CFS_CAP_FSETID 4 +#define CFS_CAP_LINUX_IMMUTABLE 9 +#define CFS_CAP_SYS_ADMIN 21 +#define CFS_CAP_SYS_BOOT 23 +#define CFS_CAP_SYS_RESOURCE 24 + +#define CFS_CAP_FS_MASK ((1 << CFS_CAP_CHOWN) | \ + (1 << CFS_CAP_DAC_OVERRIDE) | \ + (1 << CFS_CAP_DAC_READ_SEARCH) | \ + (1 << CFS_CAP_FOWNER) | \ + (1 << CFS_CAP_FSETID ) | \ + (1 << CFS_CAP_LINUX_IMMUTABLE) | \ + (1 << CFS_CAP_SYS_ADMIN) | \ + (1 << CFS_CAP_SYS_BOOT) | \ + (1 << CFS_CAP_SYS_RESOURCE)) + +void cfs_cap_raise(cfs_cap_t cap); +void cfs_cap_lower(cfs_cap_t cap); +int cfs_cap_raised(cfs_cap_t cap); +cfs_cap_t cfs_curproc_cap_pack(void); +void cfs_curproc_cap_unpack(cfs_cap_t cap); +int cfs_capable(cfs_cap_t cap); + /* __LIBCFS_CURPROC_H__ */ #endif /* diff --git a/libcfs/include/libcfs/darwin/darwin-prim.h b/libcfs/include/libcfs/darwin/darwin-prim.h index 966af967492b195b6b67e815305693c1d1f58c51..2b877def18785653d2c9c4467b646ede20d6b9ee 100644 --- a/libcfs/include/libcfs/darwin/darwin-prim.h +++ b/libcfs/include/libcfs/darwin/darwin-prim.h @@ -437,10 +437,6 @@ extern int is_suser(void); #define lock_kernel() do {} while(0) #define unlock_kernel() do {} while(0) -#define CAP_SYS_BOOT 0 -#define CAP_SYS_ADMIN 1 -#define capable(a) ((a) == CAP_SYS_BOOT ? is_suser(): is_suser1()) - #define USERMODEHELPER(path, argv, envp) (0) #define cfs_module(name, version, init, fini) \ diff --git a/libcfs/include/libcfs/darwin/libcfs.h b/libcfs/include/libcfs/darwin/libcfs.h index bd2e0016c75a2db605d325fad1ecbb8ff198c982..ee7b181f7ec7aabc2b891430535a572366fc12dc 100644 --- a/libcfs/include/libcfs/darwin/libcfs.h +++ b/libcfs/include/libcfs/darwin/libcfs.h @@ -190,7 +190,7 @@ __entry_nesting(&__cdd); /* * XNU has no capabilities */ -typedef int cfs_kernel_cap_t; +typedef __u32 cfs_kernel_cap_t; #ifdef __KERNEL__ enum { diff --git a/libcfs/include/libcfs/winnt/winnt-prim.h b/libcfs/include/libcfs/winnt/winnt-prim.h index c1ed6ff4139e74d6597b814ddbf766327910d6c4..87f905b3e34ec7b2e3c55facefcb10fa53b45ae0 100644 --- a/libcfs/include/libcfs/winnt/winnt-prim.h +++ b/libcfs/include/libcfs/winnt/winnt-prim.h @@ -708,11 +708,6 @@ libcfs_arch_cleanup(void); #define lock_kernel() do {} while(0) #define unlock_kernel() do {} while(0) -#define CAP_SYS_ADMIN 0 -#define CAP_SYS_ROOT 1 - -#define capable(a) (TRUE) - #define USERMODEHELPER(path, argv, envp) (0) diff --git a/libcfs/libcfs/darwin/darwin-curproc.c b/libcfs/libcfs/darwin/darwin-curproc.c index 7e3ca1dbad6ca3f9c8e2d77d2c008096f965d2e0..be3790765b5e92367a6f6b5443e188a348c3cdb3 100644 --- a/libcfs/libcfs/darwin/darwin-curproc.c +++ b/libcfs/libcfs/darwin/darwin-curproc.c @@ -163,16 +163,25 @@ char *cfs_curproc_comm(void) #endif } -cfs_kernel_cap_t cfs_curproc_cap_get(void) +void cfs_cap_raise(cfs_cap_t cap) {} +void cfs_cap_lower(cfs_cap_t cap) {} + +int cfs_cap_raised(cfs_cap_t cap) { + return 1; +} + +cfs_cap_t cfs_curproc_cap_pack(void) { return -1; } -void cfs_curproc_cap_set(cfs_kernel_cap_t cap) -{ - return; +void cfs_curproc_cap_unpack(cfs_cap_t cap) { } +int cfs_capable(cfs_cap_t cap) +{ + return cap == CFS_CAP_SYS_BOOT ? is_suser(): is_suser1(); +} /* * Local variables: diff --git a/libcfs/libcfs/linux/linux-curproc.c b/libcfs/libcfs/linux/linux-curproc.c index 391f6246cd17dfd9abdf662525f9a3f6745d03d3..eb12dae5463b8e02b7039b65cdef524087fce006 100644 --- a/libcfs/libcfs/linux/linux-curproc.c +++ b/libcfs/libcfs/linux/linux-curproc.c @@ -120,14 +120,48 @@ char *cfs_curproc_comm(void) return current->comm; } -cfs_kernel_cap_t cfs_curproc_cap_get(void) +/* Currently all the CFS_CAP_* defines match CAP_* ones. */ +#define cfs_cap_pack(cap) (cap) +#define cfs_cap_unpack(cap) (cap) + +void cfs_cap_raise(cfs_cap_t cap) +{ + cap_raise(cfs_current()->cap_effective, cfs_cap_unpack(cap)); +} + +void cfs_cap_lower(cfs_cap_t cap) { - return current->cap_effective; + cap_lower(cfs_current()->cap_effective, cfs_cap_unpack(cap)); +} + +int cfs_cap_raised(cfs_cap_t cap) +{ + return cap_raised(cfs_current()->cap_effective, cfs_cap_unpack(cap)); +} + +cfs_cap_t cfs_curproc_cap_pack(void) { +#if _LINUX_CAPABILITY_VERSION == 0x19980330 + return cfs_cap_pack(current->cap_effective); +#elif _LINUX_CAPABILITY_VERSION == 0x20071026 + return cfs_cap_pack(current->cap_effective[0]); +#else + #error "need correct _LINUX_CAPABILITY_VERSION " +#endif +} + +void cfs_curproc_cap_unpack(cfs_cap_t cap) { +#if _LINUX_CAPABILITY_VERSION == 0x19980330 + current->cap_effective = cfs_cap_unpack(cap); +#elif _LINUX_CAPABILITY_VERSION == 0x20071026 + current->cap_effective[0] = cfs_cap_unpack(cap); +#else + #error "need correct _LINUX_CAPABILITY_VERSION " +#endif } -void cfs_curproc_cap_set(cfs_kernel_cap_t cap) +int cfs_capable(cfs_cap_t cap) { - current->cap_effective = cap; + return capable(cfs_cap_unpack(cap)); } EXPORT_SYMBOL(cfs_curproc_uid); @@ -140,8 +174,12 @@ EXPORT_SYMBOL(cfs_curproc_comm); EXPORT_SYMBOL(cfs_curproc_groups_nr); EXPORT_SYMBOL(cfs_curproc_groups_dump); EXPORT_SYMBOL(cfs_curproc_is_in_groups); -EXPORT_SYMBOL(cfs_curproc_cap_get); -EXPORT_SYMBOL(cfs_curproc_cap_set); +EXPORT_SYMBOL(cfs_cap_raise); +EXPORT_SYMBOL(cfs_cap_lower); +EXPORT_SYMBOL(cfs_cap_raised); +EXPORT_SYMBOL(cfs_curproc_cap_pack); +EXPORT_SYMBOL(cfs_curproc_cap_unpack); +EXPORT_SYMBOL(cfs_capable); /* * Local variables: diff --git a/libcfs/libcfs/linux/linux-module.c b/libcfs/libcfs/linux/linux-module.c index 998162a469b7a1d54f9fa35ed14e1990c872aeb2..88eab3ea54b495d0bcb1e9b7187d25f4e37fbc98 100644 --- a/libcfs/libcfs/linux/linux-module.c +++ b/libcfs/libcfs/linux/linux-module.c @@ -152,12 +152,12 @@ libcfs_ioctl(struct inode *inode, struct file *file, /* Handle platform-dependent IOC requests */ switch (cmd) { case IOC_LIBCFS_PANIC: - if (!capable (CAP_SYS_BOOT)) + if (!cfs_capable(CFS_CAP_SYS_BOOT)) return (-EPERM); panic("debugctl-invoked panic"); return (0); case IOC_LIBCFS_MEMHOG: - if (!capable (CAP_SYS_ADMIN)) + if (!cfs_capable(CFS_CAP_SYS_ADMIN)) return -EPERM; /* go thought */ } diff --git a/libcfs/libcfs/lwt.c b/libcfs/libcfs/lwt.c index ca9e7e4841cc81a6ca217fd33f519c2d04154e74..325785b633a67267549da420b6b50360c318fc14 100644 --- a/libcfs/libcfs/lwt.c +++ b/libcfs/libcfs/lwt.c @@ -86,7 +86,7 @@ lwt_lookup_string (int *size, char *knl_ptr, * trying to determine the string length, so we're trusting our * caller... */ - if (!capable(CAP_SYS_ADMIN)) + if (!cfs_capable(CFS_CAP_SYS_ADMIN)) return (-EPERM); if (user_size > 0 && @@ -117,7 +117,7 @@ lwt_control (int enable, int clear) int i; int j; - if (!capable(CAP_SYS_ADMIN)) + if (!cfs_capable(CFS_CAP_SYS_ADMIN)) return (-EPERM); if (!enable) { @@ -164,7 +164,7 @@ lwt_snapshot (cycles_t *now, int *ncpu, int *total_size, int i; int j; - if (!capable(CAP_SYS_ADMIN)) + if (!cfs_capable(CFS_CAP_SYS_ADMIN)) return (-EPERM); *ncpu = num_online_cpus(); diff --git a/libcfs/libcfs/winnt/winnt-curproc.c b/libcfs/libcfs/winnt/winnt-curproc.c index 9efcdc18fb134542db634fb498390cc70f2a53d6..7e6f394f244ff46a94efdac9c119fac68791f069 100644 --- a/libcfs/libcfs/winnt/winnt-curproc.c +++ b/libcfs/libcfs/winnt/winnt-curproc.c @@ -106,16 +106,33 @@ char *cfs_curproc_comm(void) return this_task.comm; } -cfs_kernel_cap_t cfs_curproc_cap_get(void) +void cfs_cap_raise(cfs_cap_t cap) { - return this_task.cap_effective; + this_task.cap_effective |= (1 << cap); } -void cfs_curproc_cap_set(cfs_kernel_cap_t cap) +void cfs_cap_lower(cfs_cap_t cap) { - this_task.cap_effective = cap; + this_task.cap_effective &= ~(1 << cap); } +int cfs_cap_raised(cfs_cap_t cap) +{ + return this_task.cap_effective & (1 << cap); +} + +cfs_cap_t cfs_curproc_cap_pack(void) { + return this_task.cap_effective; +} + +void cfs_curproc_cap_unpack(cfs_cap_t cap) { + this_task.cap_effective = cap; +} + +int cfs_capable(cfs_cap_t cap) +{ + return TRUE; +} /* * Implementation of linux task management routines @@ -468,5 +485,9 @@ EXPORT_SYMBOL(cfs_curproc_comm); EXPORT_SYMBOL(cfs_curproc_groups_nr); EXPORT_SYMBOL(cfs_curproc_groups_dump); EXPORT_SYMBOL(cfs_curproc_is_in_groups); -EXPORT_SYMBOL(cfs_curproc_cap_get); -EXPORT_SYMBOL(cfs_curproc_cap_set); +EXPORT_SYMBOL(cfs_cap_raise); +EXPORT_SYMBOL(cfs_cap_lower); +EXPORT_SYMBOL(cfs_cap_raised); +EXPORT_SYMBOL(cfs_curproc_cap_pack); +EXPORT_SYMBOL(cfs_curproc_cap_unpack); +EXPORT_SYMBOL(cfs_capable); diff --git a/libcfs/libcfs/winnt/winnt-module.c b/libcfs/libcfs/winnt/winnt-module.c index bc5de9e73a7a2aefca284edf7fe56d93c139ea65..ac255bae366cdccd44d8e65b28ce424614f5352d 100644 --- a/libcfs/libcfs/winnt/winnt-module.c +++ b/libcfs/libcfs/winnt/winnt-module.c @@ -137,7 +137,7 @@ libcfs_ioctl(cfs_file_t * file, unsigned int cmd, ulong_ptr arg) /* Handle platform-dependent IOC requests */ switch (cmd) { case IOC_LIBCFS_PANIC: - if (!capable (CAP_SYS_BOOT)) + if (!cfs_capable(CFS_CAP_SYS_BOOT)) return (-EPERM); CERROR(("debugctl-invoked panic")); KeBugCheckEx('LUFS', (ULONG_PTR)libcfs_ioctl, (ULONG_PTR)NULL, (ULONG_PTR)NULL, (ULONG_PTR)NULL); @@ -145,7 +145,7 @@ libcfs_ioctl(cfs_file_t * file, unsigned int cmd, ulong_ptr arg) return (0); case IOC_LIBCFS_MEMHOG: - if (!capable (CAP_SYS_ADMIN)) + if (!cfs_capable(CFS_CAP_SYS_ADMIN)) return -EPERM; break; } diff --git a/lustre/cmm/mdc_object.c b/lustre/cmm/mdc_object.c index 94d57d3c9947035e6501fb20b52b52927d6fa0e8..edc2fb6215ca6421b52fbd063591eef779c91fe1 100644 --- a/lustre/cmm/mdc_object.c +++ b/lustre/cmm/mdc_object.c @@ -293,7 +293,7 @@ static int mdc_attr_set(const struct lu_env *env, struct md_object *mo, } else { mci->mci_opdata.op_fsuid = la->la_uid; mci->mci_opdata.op_fsgid = la->la_gid; - mci->mci_opdata.op_cap = current->cap_effective; + mci->mci_opdata.op_cap = cfs_curproc_cap_pack(); mci->mci_opdata.op_suppgids[0] = mci->mci_opdata.op_suppgids[1] = -1; } @@ -319,7 +319,7 @@ static int mdc_object_create(const struct lu_env *env, int rc, symlen; uid_t uid; gid_t gid; - __u32 cap; + cfs_cap_t cap; ENTRY; LASSERT(S_ISDIR(la->la_mode)); @@ -415,7 +415,7 @@ static int mdc_ref_add(const struct lu_env *env, struct md_object *mo, } else { mci->mci_opdata.op_fsuid = la->la_uid; mci->mci_opdata.op_fsgid = la->la_gid; - mci->mci_opdata.op_cap = current->cap_effective; + mci->mci_opdata.op_cap = cfs_curproc_cap_pack(); mci->mci_opdata.op_suppgids[0] = mci->mci_opdata.op_suppgids[1] = -1; } @@ -459,7 +459,7 @@ static int mdc_ref_del(const struct lu_env *env, struct md_object *mo, } else { mci->mci_opdata.op_fsuid = la->la_uid; mci->mci_opdata.op_fsgid = la->la_gid; - mci->mci_opdata.op_cap = current->cap_effective; + mci->mci_opdata.op_cap = cfs_curproc_cap_pack(); mci->mci_opdata.op_suppgids[0] = -1; } @@ -535,7 +535,7 @@ static int mdc_rename_tgt(const struct lu_env *env, struct md_object *mo_p, } else { mci->mci_opdata.op_fsuid = la->la_uid; mci->mci_opdata.op_fsgid = la->la_gid; - mci->mci_opdata.op_cap = current->cap_effective; + mci->mci_opdata.op_cap = cfs_curproc_cap_pack(); mci->mci_opdata.op_suppgids[0] = mci->mci_opdata.op_suppgids[1] = -1; } 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 b62b08a7674a76b923438cf77ef3d383f095c463..7539c0a06be3f93177a73cceeb80de13e4613990 100644 --- a/lustre/include/liblustre.h +++ b/lustre/include/liblustre.h @@ -261,13 +261,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) @@ -403,12 +396,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 335373af2ba58bfd35652c1b1556cce238565b77..26959b526c80d906578ec661158c537568ea0628 100644 --- a/lustre/include/linux/lvfs.h +++ b/lustre/include/linux/lvfs.h @@ -62,7 +62,7 @@ struct lvfs_ucred { __u32 luc_gid; __u32 luc_fsuid; __u32 luc_fsgid; - __u32 luc_cap; + cfs_kernel_cap_t luc_cap; __u32 luc_umask; struct group_info *luc_ginfo; struct md_identity *luc_identity; diff --git a/lustre/include/lustre_log.h b/lustre/include/lustre_log.h index 66ebc179b5ea5febe7f3678d71ca3bc4457de969..1ec438487754d2418179553c8b5eeeebd3acf24e 100644 --- a/lustre/include/lustre_log.h +++ b/lustre/include/lustre_log.h @@ -333,14 +333,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; @@ -488,8 +480,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); @@ -506,10 +497,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); } @@ -605,8 +598,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); @@ -615,10 +607,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/md_object.h b/lustre/include/md_object.h index b543013b00a56ce3c48a1b7cf75880f823849fdd..ceb85a852ac27a6dade46cae4e2e3486ccd9e908 100644 --- a/lustre/include/md_object.h +++ b/lustre/include/md_object.h @@ -81,7 +81,7 @@ struct md_ucred { __u32 mu_fsuid; __u32 mu_fsgid; __u32 mu_suppgids[2]; - __u32 mu_cap; + cfs_cap_t mu_cap; __u32 mu_umask; struct group_info *mu_ginfo; struct md_identity *mu_identity; diff --git a/lustre/include/obd.h b/lustre/include/obd.h index 54e7e924aa67d06081035d85181d3682e9f23570..109c9af858bed0eb2c3c2747397f12a2f5b8d0b8 100644 --- a/lustre/include/obd.h +++ b/lustre/include/obd.h @@ -1094,7 +1094,7 @@ struct md_op_data { __u32 op_suppgids[2]; __u32 op_fsuid; __u32 op_fsgid; - __u32 op_cap; + cfs_cap_t op_cap; void *op_data; /* iattr fields and blocks. */ @@ -1400,7 +1400,7 @@ struct md_ops { int (*m_close)(struct obd_export *, struct md_op_data *, struct md_open_data *, struct ptlrpc_request **); int (*m_create)(struct obd_export *, struct md_op_data *, - const void *, int, int, __u32, __u32, __u32, + const void *, int, int, __u32, __u32, cfs_cap_t, __u64, struct ptlrpc_request **); int (*m_done_writing)(struct obd_export *, struct md_op_data *, struct md_open_data *); diff --git a/lustre/include/obd_class.h b/lustre/include/obd_class.h index 0fa132c68389997b5e285067439dfdfc899bf0e0..8a73f272be08f4dfe5af97495f10bcb3a801d85a 100644 --- a/lustre/include/obd_class.h +++ b/lustre/include/obd_class.h @@ -1855,7 +1855,7 @@ static inline int md_close(struct obd_export *exp, struct md_op_data *op_data, static inline int md_create(struct obd_export *exp, struct md_op_data *op_data, const void *data, int datalen, int mode, __u32 uid, - __u32 gid, __u32 cap_effective, __u64 rdev, + __u32 gid, cfs_cap_t cap_effective, __u64 rdev, struct ptlrpc_request **request) { int rc; diff --git a/lustre/liblustre/lutil.c b/lustre/liblustre/lutil.c index 1a832bba8c118841bcbc045c94abf083b127be1a..0de50cf72c56e3c68bdce0b4f14ef78d173aa2da 100644 --- a/lustre/liblustre/lutil.c +++ b/lustre/liblustre/lutil.c @@ -228,6 +228,34 @@ 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); +} + +cfs_cap_t cfs_curproc_cap_pack(void) { + return cfs_current()->cap_effective; +} + +void cfs_curproc_cap_unpack(cfs_cap_t cap) { + 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 4c9aaad05b58a2473a54127853826257f8fafdbd..552a5869b9107b549ce3622d79e651a5d935192d 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; } @@ -635,7 +635,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); */ @@ -821,7 +821,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); } } @@ -979,10 +979,9 @@ static int llu_iop_symlink_raw(struct pnode *pno, const char *tgt) llu_prep_md_op_data(&op_data, dir, NULL, name, len, 0, LUSTRE_OPC_SYMLINK); - err = md_create(sbi->ll_md_exp, &op_data, - tgt, strlen(tgt) + 1, S_IFLNK | S_IRWXUGO, - current->fsuid, current->fsgid, current->cap_effective, - 0, &request); + err = md_create(sbi->ll_md_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); @@ -1108,7 +1107,7 @@ static int llu_iop_mknod_raw(struct pnode *pno, err = md_create(sbi->ll_md_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: @@ -1343,7 +1342,7 @@ static int llu_iop_mkdir_raw(struct pnode *pno, mode_t mode) err = md_create(llu_i2sbi(dir)->ll_md_exp, &op_data, NULL, 0, mode | S_IFDIR, current->fsuid, current->fsgid, - current->cap_effective, 0, &request); + 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 708b01a9c0970767969822a1e3e87545a7260148..55fa6a8b403e2bd8e6b5b624682fe53c6f5a47f4 100644 --- a/lustre/llite/dir.c +++ b/lustre/llite/dir.c @@ -949,7 +949,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); @@ -973,7 +973,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); @@ -1028,13 +1028,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 c46aa0bb0984979d8397901711c734e0ed0e6d83..04e3c4117ad37e0cb15aa179289c3a2313a685d4 100644 --- a/lustre/llite/file.c +++ b/lustre/llite/file.c @@ -1973,7 +1973,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, @@ -2173,7 +2173,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); @@ -3214,10 +3214,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 4c165a558ecf68020976174881d29f49387990d4..b42fb5a810f02502d3c2232c2b12b5b457603b2a 100644 --- a/lustre/llite/llite_lib.c +++ b/lustre/llite/llite_lib.c @@ -1513,7 +1513,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); } @@ -2399,7 +2400,7 @@ struct md_op_data * ll_prep_md_op_data(struct md_op_data *op_data, op_data->op_mod_time = cfs_time_current_sec(); op_data->op_fsuid = current->fsuid; op_data->op_fsgid = current->fsgid; - op_data->op_cap = current->cap_effective; + op_data->op_cap = cfs_curproc_cap_pack(); op_data->op_bias = MDS_CHECK_SPLIT; op_data->op_opc = opc; op_data->op_mds = 0; diff --git a/lustre/llite/namei.c b/lustre/llite/namei.c index 1bd7c2c41ce186ab424b913a74fbb4bc51ebe038..cd46159dad027be8b1d96ccafc1a8387697bb3d5 100644 --- a/lustre/llite/namei.c +++ b/lustre/llite/namei.c @@ -847,7 +847,7 @@ static int ll_new_node(struct inode *dir, struct qstr *name, err = md_create(sbi->ll_md_exp, op_data, tgt, tgt_len, mode, current->fsuid, current->fsgid, - current->cap_effective, rdev, &request); + cfs_curproc_cap_pack(), rdev, &request); ll_finish_md_op_data(op_data); if (err) GOTO(err_exit, err); diff --git a/lustre/llite/rw.c b/lustre/llite/rw.c index 3d62c588e1a8dbe0e08bb1c7e16a286e3900e099..41b177af32fe017f535a76ef406456b9977a3f97 100644 --- a/lustre/llite/rw.c +++ b/lustre/llite/rw.c @@ -1029,7 +1029,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 @@ -2229,7 +2229,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 28075a9f9cdf4ccf29259d81cd2fd5e879b6c443..2749725df4ccc95f30d738765782277de8cdc8ed 100644 --- a/lustre/llite/xattr.c +++ b/lustre/llite/xattr.c @@ -101,7 +101,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/lmv/lmv_obd.c b/lustre/lmv/lmv_obd.c index cd96327fbca7309ff9e6f9f327ad77280bbf1882..4a30926137ee45e6a5ad968788cb38557b56fad4 100644 --- a/lustre/lmv/lmv_obd.c +++ b/lustre/lmv/lmv_obd.c @@ -1378,7 +1378,7 @@ cleanup: int lmv_create(struct obd_export *exp, struct md_op_data *op_data, const void *data, int datalen, int mode, __u32 uid, - __u32 gid, __u32 cap_effective, __u64 rdev, + __u32 gid, cfs_cap_t cap_effective, __u64 rdev, struct ptlrpc_request **request) { struct obd_device *obd = exp->exp_obd; @@ -1897,7 +1897,7 @@ repeat: op_data->op_fsuid = current->fsuid; op_data->op_fsgid = current->fsgid; - op_data->op_cap = current->cap_effective; + op_data->op_cap = cfs_curproc_cap_pack(); tgt_exp = lmv->tgts[mds].ltd_exp; if (op_data->op_namelen) { @@ -2021,7 +2021,7 @@ repeat: request: op_data->op_fsuid = current->fsuid; op_data->op_fsgid = current->fsgid; - op_data->op_cap = current->cap_effective; + op_data->op_cap = cfs_curproc_cap_pack(); src_exp = lmv_get_export(lmv, mds1); tgt_exp = lmv_get_export(lmv, mds2); @@ -2468,7 +2468,7 @@ repeat: op_data->op_fsuid = current->fsuid; op_data->op_fsgid = current->fsgid; - op_data->op_cap = current->cap_effective; + op_data->op_cap = cfs_curproc_cap_pack(); /* If child's fid is given, cancel unused locks for it if it is from * another export than parent. */ diff --git a/lustre/lvfs/fsfilt_ext3.c b/lustre/lvfs/fsfilt_ext3.c index dd7292d2e57c0b4e54d0a56293836ac83f98ad05..1577be76e886588b62bd8046cca1b5299777e161 100644 --- a/lustre/lvfs/fsfilt_ext3.c +++ b/lustre/lvfs/fsfilt_ext3.c @@ -523,7 +523,8 @@ static int fsfilt_ext3_setattr(struct dentry *dentry, void *handle, if (iattr->ia_valid & ATTR_MODE) { inode->i_mode = iattr->ia_mode; - if (!in_group_p(inode->i_gid) && !capable(CAP_FSETID)) + if (!in_group_p(inode->i_gid) && + !cfs_capable(CFS_CAP_FSETID)) inode->i_mode &= ~S_ISGID; } diff --git a/lustre/mdc/mdc_internal.h b/lustre/mdc/mdc_internal.h index 0676f0d22751eb152d318616f6a2c569936f4e3b..62b85bfa7b5537fc5d9c6220d8da559407e9dfb6 100644 --- a/lustre/mdc/mdc_internal.h +++ b/lustre/mdc/mdc_internal.h @@ -64,7 +64,7 @@ void mdc_setattr_pack(struct ptlrpc_request *req, struct md_op_data *op_data, void *ea, int ealen, void *ea2, int ea2len); void mdc_create_pack(struct ptlrpc_request *req, struct md_op_data *op_data, const void *data, int datalen, __u32 mode, __u32 uid, - __u32 gid, __u32 cap_effective, __u64 rdev); + __u32 gid, cfs_cap_t capability, __u64 rdev); void mdc_open_pack(struct ptlrpc_request *req, struct md_op_data *op_data, __u32 mode, __u64 rdev, __u32 flags, const void *data, int datalen); @@ -144,7 +144,8 @@ void mdc_commit_delayed(struct ptlrpc_request *req); int mdc_create(struct obd_export *exp, struct md_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 capability, __u64 rdev, + struct ptlrpc_request **request); int mdc_link(struct obd_export *exp, struct md_op_data *op_data, struct ptlrpc_request **request); int mdc_rename(struct obd_export *exp, struct md_op_data *op_data, diff --git a/lustre/mdc/mdc_lib.c b/lustre/mdc/mdc_lib.c index a293b36f5d39320bf7267eb89d0c5a271b8be753..dc5aa09264be7452a7add64c6ce5b9ce56685cd3 100644 --- a/lustre/mdc/mdc_lib.c +++ b/lustre/mdc/mdc_lib.c @@ -59,7 +59,7 @@ static void __mdc_pack_body(struct mdt_body *b, __u32 suppgid) b->gid = current->gid; b->fsuid = current->fsuid; b->fsgid = current->fsgid; - b->capability = current->cap_effective; + b->capability = cfs_curproc_cap_pack(); } void mdc_pack_capa(struct ptlrpc_request *req, const struct req_msg_field *field, @@ -128,7 +128,7 @@ void mdc_readdir_pack(struct ptlrpc_request *req, __u64 pgoff, /* packing of MDS records */ void mdc_create_pack(struct ptlrpc_request *req, struct md_op_data *op_data, const void *data, int datalen, __u32 mode, - __u32 uid, __u32 gid, __u32 cap_effective, __u64 rdev) + __u32 uid, __u32 gid, cfs_cap_t cap_effective, __u64 rdev) { struct mdt_rec_create *rec; char *tmp; @@ -218,7 +218,7 @@ void mdc_open_pack(struct ptlrpc_request *req, struct md_op_data *op_data, 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(); if (op_data != NULL) { rec->cr_fid1 = op_data->op_fid1; rec->cr_fid2 = op_data->op_fid2; @@ -298,7 +298,7 @@ static void mdc_setattr_pack_rec(struct mdt_rec_setattr *rec, 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_suppgid = -1; rec->sa_fid = op_data->op_fid1; @@ -452,7 +452,7 @@ void mdc_getattr_pack(struct ptlrpc_request *req, __u64 valid, int flags, b->fsuid = current->fsuid; b->fsgid = current->fsgid; - b->capability = current->cap_effective; + b->capability = cfs_curproc_cap_pack(); b->valid = valid; if (op_data->op_bias & MDS_CHECK_SPLIT) b->valid |= OBD_MD_FLCKSPLIT; diff --git a/lustre/mdc/mdc_reint.c b/lustre/mdc/mdc_reint.c index c45907ff5bb01be8ccb5ddcb242b40cada585b1e..67effaf41e687d108201752fe148155f408794c7 100644 --- a/lustre/mdc/mdc_reint.c +++ b/lustre/mdc/mdc_reint.c @@ -205,7 +205,8 @@ int mdc_setattr(struct obd_export *exp, struct md_op_data *op_data, int mdc_create(struct obd_export *exp, struct md_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) { struct ptlrpc_request *req; int level, rc; diff --git a/lustre/mdc/mdc_request.c b/lustre/mdc/mdc_request.c index 7bfe0cd8231bc0ea946bcdf353a80d026b22eae1..2ebe9a2e6bee326da3e619e8f3c045bb05362574 100644 --- a/lustre/mdc/mdc_request.c +++ b/lustre/mdc/mdc_request.c @@ -374,7 +374,7 @@ static int mdc_xattr_common(struct obd_export *exp,const struct req_format *fmt, */ rec->sx_fsuid = current->fsuid; rec->sx_fsgid = current->fsgid; - rec->sx_cap = current->cap_effective; + rec->sx_cap = cfs_curproc_cap_pack(); rec->sx_suppgid1 = suppgid; rec->sx_suppgid2 = -1; rec->sx_fid = *fid; diff --git a/lustre/mdd/mdd_dir.c b/lustre/mdd/mdd_dir.c index 1c76e3d893361f15b00660f6785435e12b6ef4c7..8692b230622526c5e9dfd99f7b73f6f1b1983cf3 100644 --- a/lustre/mdd/mdd_dir.c +++ b/lustre/mdd/mdd_dir.c @@ -359,7 +359,7 @@ static inline int mdd_is_sticky(const struct lu_env *env, if (tmp_la->la_uid == uc->mu_fsuid) return 0; - return !mdd_capable(uc, CAP_FOWNER); + return !mdd_capable(uc, CFS_CAP_FOWNER); } /* diff --git a/lustre/mdd/mdd_internal.h b/lustre/mdd/mdd_internal.h index 27476785cfc6b7ea077bd2333fb8aa2c2f98f1a4..526355601c4d0eedfac323638e5864b4b6de3ebe 100644 --- a/lustre/mdd/mdd_internal.h +++ b/lustre/mdd/mdd_internal.h @@ -326,7 +326,7 @@ struct mdd_object *mdd_object_find(const struct lu_env *env, #define mdd_cap_raised(c, flag) (mdd_cap_t(c) & MDD_CAP_TO_MASK(flag)) /* capable() is copied from linux kernel! */ -static inline int mdd_capable(struct md_ucred *uc, int cap) +static inline int mdd_capable(struct md_ucred *uc, cfs_cap_t cap) { if (mdd_cap_raised(uc->mu_cap, cap)) return 1; diff --git a/lustre/mdd/mdd_lov.c b/lustre/mdd/mdd_lov.c index 9e076073f6f25772c2105a1d23fe0099349eb3cd..182a8b7317c9c2ee0e07ee2de2ce2cbd994d8662 100644 --- a/lustre/mdd/mdd_lov.c +++ b/lustre/mdd/mdd_lov.c @@ -294,7 +294,8 @@ int mdd_lsm_sanity_check(const struct lu_env *env, struct mdd_object *obj) if (rc) RETURN(rc); - if ((uc->mu_fsuid != tmp_la->la_uid) && !mdd_capable(uc, CAP_FOWNER)) + if ((uc->mu_fsuid != tmp_la->la_uid) && + !mdd_capable(uc, CFS_CAP_FOWNER)) rc = mdd_permission_internal_locked(env, obj, tmp_la, MAY_WRITE); diff --git a/lustre/mdd/mdd_object.c b/lustre/mdd/mdd_object.c index 39d3814ab6609642f50a91f248aa316d35c8fb1b..1f49ce035ad53ca0fda44224099f09d7dbb95b6c 100644 --- a/lustre/mdd/mdd_object.c +++ b/lustre/mdd/mdd_object.c @@ -696,7 +696,7 @@ static int mdd_fix_attr(const struct lu_env *env, struct mdd_object *obj, (LUSTRE_IMMUTABLE_FL | LUSTRE_APPEND_FL); if ((uc->mu_fsuid != tmp_la->la_uid) && - !mdd_capable(uc, CAP_FOWNER)) + !mdd_capable(uc, CFS_CAP_FOWNER)) RETURN(-EPERM); /* XXX: the IMMUTABLE and APPEND_ONLY flags can @@ -706,7 +706,7 @@ static int mdd_fix_attr(const struct lu_env *env, struct mdd_object *obj, if (mdd_is_append(obj)) oldflags |= LUSTRE_APPEND_FL; if ((oldflags ^ newflags) && - !mdd_capable(uc, CAP_LINUX_IMMUTABLE)) + !mdd_capable(uc, CFS_CAP_LINUX_IMMUTABLE)) RETURN(-EPERM); if (!S_ISDIR(tmp_la->la_mode)) @@ -722,7 +722,7 @@ static int mdd_fix_attr(const struct lu_env *env, struct mdd_object *obj, if ((la->la_valid & (LA_MTIME | LA_ATIME | LA_CTIME)) && !(la->la_valid & ~(LA_MTIME | LA_ATIME | LA_CTIME))) { if ((uc->mu_fsuid != tmp_la->la_uid) && - !mdd_capable(uc, CAP_FOWNER)) { + !mdd_capable(uc, CFS_CAP_FOWNER)) { rc = mdd_permission_internal_locked(env, obj, tmp_la, MAY_WRITE); if (rc) @@ -737,7 +737,7 @@ static int mdd_fix_attr(const struct lu_env *env, struct mdd_object *obj, if ((la->la_valid & ~LA_MODE) && !(ma->ma_attr_flags & MDS_PERM_BYPASS) && (uc->mu_fsuid != tmp_la->la_uid) && - !mdd_capable(uc, CAP_FOWNER)) + !mdd_capable(uc, CFS_CAP_FOWNER)) RETURN(-EPERM); if (la->la_mode == (umode_t) -1) @@ -747,8 +747,9 @@ static int mdd_fix_attr(const struct lu_env *env, struct mdd_object *obj, (tmp_la->la_mode & ~S_IALLUGO); /* Also check the setgid bit! */ - if (!lustre_in_group_p(uc, (la->la_valid & LA_GID) ? la->la_gid : - tmp_la->la_gid) && !mdd_capable(uc, CAP_FSETID)) + if (!lustre_in_group_p(uc, (la->la_valid & LA_GID) ? + la->la_gid : tmp_la->la_gid) && + !mdd_capable(uc, CFS_CAP_FSETID)) la->la_mode &= ~S_ISGID; } else { la->la_mode = tmp_la->la_mode; @@ -760,7 +761,7 @@ static int mdd_fix_attr(const struct lu_env *env, struct mdd_object *obj, la->la_uid = tmp_la->la_uid; if (((uc->mu_fsuid != tmp_la->la_uid) || (la->la_uid != tmp_la->la_uid)) && - !mdd_capable(uc, CAP_CHOWN)) + !mdd_capable(uc, CFS_CAP_CHOWN)) RETURN(-EPERM); /* If the user or group of a non-directory has been @@ -786,7 +787,7 @@ static int mdd_fix_attr(const struct lu_env *env, struct mdd_object *obj, if (((uc->mu_fsuid != tmp_la->la_uid) || ((la->la_gid != tmp_la->la_gid) && !lustre_in_group_p(uc, la->la_gid))) && - !mdd_capable(uc, CAP_CHOWN)) + !mdd_capable(uc, CFS_CAP_CHOWN)) RETURN(-EPERM); /* Likewise, if the user or group of a non-directory @@ -961,7 +962,8 @@ static int mdd_xattr_sanity_check(const struct lu_env *env, if (rc) RETURN(rc); - if ((uc->mu_fsuid != tmp_la->la_uid) && !mdd_capable(uc, CAP_FOWNER)) + if ((uc->mu_fsuid != tmp_la->la_uid) && + !mdd_capable(uc, CFS_CAP_FOWNER)) RETURN(-EPERM); RETURN(rc); @@ -1299,7 +1301,7 @@ static int mdd_open_sanity_check(const struct lu_env *env, if (uc && ((uc->mu_valid == UCRED_OLD) || (uc->mu_valid == UCRED_NEW)) && (uc->mu_fsuid != tmp_la->la_uid) && - !mdd_capable(uc, CAP_FOWNER)) + !mdd_capable(uc, CFS_CAP_FOWNER)) RETURN(-EPERM); } #endif diff --git a/lustre/mdd/mdd_permission.c b/lustre/mdd/mdd_permission.c index 12385825d4d8a2d50dceb16b0c41bd9ec655efdd..f1cf0ac0a317c8bf70c3dd036e7ecdf692800ac1 100644 --- a/lustre/mdd/mdd_permission.c +++ b/lustre/mdd/mdd_permission.c @@ -259,12 +259,12 @@ int __mdd_permission_internal(const struct lu_env *env, struct mdd_object *obj, check_capabilities: if (!(mask & MAY_EXEC) || (la->la_mode & S_IXUGO) || S_ISDIR(la->la_mode)) - if (mdd_capable(uc, CAP_DAC_OVERRIDE)) + if (mdd_capable(uc, CFS_CAP_DAC_OVERRIDE)) RETURN(0); if ((mask == MAY_READ) || (S_ISDIR(la->la_mode) && !(mask & MAY_WRITE))) - if (mdd_capable(uc, CAP_DAC_READ_SEARCH)) + if (mdd_capable(uc, CFS_CAP_DAC_READ_SEARCH)) RETURN(0); RETURN(-EACCES); @@ -365,7 +365,8 @@ int mdd_permission(const struct lu_env *env, RETURN(rc); } - if (la->la_uid != uc->mu_fsuid && !mdd_capable(uc, CAP_FOWNER)) + if (la->la_uid != uc->mu_fsuid && + !mdd_capable(uc, CFS_CAP_FOWNER)) rc = -EPERM; } diff --git a/lustre/mdt/mdt_lib.c b/lustre/mdt/mdt_lib.c index 5fffcf2052c160631298161cabb0b348d6aedfa4..b3dc46284daa2b3c8ca671188818456eddff1456 100644 --- a/lustre/mdt/mdt_lib.c +++ b/lustre/mdt/mdt_lib.c @@ -243,7 +243,7 @@ static int new_init_ucred(struct mdt_thread_info *info, ucred_init_type_t type, /* remove fs privilege for non-root user */ if (ucred->mu_fsuid) - ucred->mu_cap = pud->pud_cap & ~CAP_FS_MASK; + ucred->mu_cap = pud->pud_cap & ~CFS_CAP_FS_MASK; else ucred->mu_cap = pud->pud_cap; ucred->mu_valid = UCRED_NEW; @@ -406,7 +406,7 @@ static int old_init_ucred(struct mdt_thread_info *info, /* remove fs privilege for non-root user */ if (uc->mu_fsuid) - uc->mu_cap = body->capability & ~CAP_FS_MASK; + uc->mu_cap = body->capability & ~CFS_CAP_FS_MASK; else uc->mu_cap = body->capability; uc->mu_valid = UCRED_OLD; @@ -446,7 +446,7 @@ static int old_init_ucred_reint(struct mdt_thread_info *info) /* remove fs privilege for non-root user */ if (uc->mu_fsuid) - uc->mu_cap &= ~CAP_FS_MASK; + uc->mu_cap &= ~CFS_CAP_FS_MASK; uc->mu_valid = UCRED_OLD; RETURN(0); diff --git a/lustre/obdclass/llog_obd.c b/lustre/obdclass/llog_obd.c index f13d78fe428f6efdcbd1502188ce480a70c6a4cc..2e4b3a27ba9986faab1c93aff4dd421dde0200d4 100644 --- a/lustre/obdclass/llog_obd.c +++ b/lustre/obdclass/llog_obd.c @@ -213,8 +213,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) { @@ -223,10 +222,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/obdclass/obdo.c b/lustre/obdclass/obdo.c index 88c70111577d236ccf74f545f45d8132be09015e..153048a7c9a040873069a490ea22a9542f7c7601 100644 --- a/lustre/obdclass/obdo.c +++ b/lustre/obdclass/obdo.c @@ -163,7 +163,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) { @@ -211,7 +211,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/obdecho/echo_client.c b/lustre/obdecho/echo_client.c index 701422122f62c42c06398803826048dbc814e6e5..ffd1116ca0bf3972d82bd942f5f682ba1052a29a 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); @@ -1185,7 +1185,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); @@ -1200,7 +1200,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; @@ -1219,7 +1219,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 */ @@ -1236,7 +1236,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 134db4742ba0fe47298363a77ad97bc353f2371b..e60e2b5ef80ca238161e122c8fe5c2a6d96c5402 100644 --- a/lustre/obdfilter/filter.c +++ b/lustre/obdfilter/filter.c @@ -1567,8 +1567,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_26.c b/lustre/obdfilter/filter_io_26.c index a301fba00cd8bfdde9f67ad45fc714db77646bc7..e96513ca011646b635326cf5140048b37400b2fb 100644 --- a/lustre/obdfilter/filter_io_26.c +++ b/lustre/obdfilter/filter_io_26.c @@ -754,7 +754,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/ptlrpc/sec.c b/lustre/ptlrpc/sec.c index 94267cf3d0d4ddbc27340d263d853ad36421e46a..59fedf7e20ddb238455dbdc802eb0f34e390df5d 100644 --- a/lustre/ptlrpc/sec.c +++ b/lustre/ptlrpc/sec.c @@ -2203,7 +2203,7 @@ int sptlrpc_pack_user_desc(struct lustre_msg *msg, int offset) pud->pud_gid = cfs_current()->gid; pud->pud_fsuid = cfs_current()->fsuid; pud->pud_fsgid = cfs_current()->fsgid; - pud->pud_cap = cfs_current()->cap_effective; + pud->pud_cap = cfs_curproc_cap_pack(); pud->pud_ngroups = (msg->lm_buflens[offset] - sizeof(*pud)) / 4; #ifdef __KERNEL__ diff --git a/lustre/quota/quota_interface.c b/lustre/quota/quota_interface.c index dff20af378a08a83992d80dc2eb468bbed984c36..e035ceb57ae3acae261780952e7157bf11af8f7b 100644 --- a/lustre/quota/quota_interface.c +++ b/lustre/quota/quota_interface.c @@ -353,9 +353,9 @@ static int filter_quota_enforce(struct obd_device *obd, unsigned int ignore) RETURN(0); if (ignore) - 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); } diff --git a/lustre/tests/it_test.c b/lustre/tests/it_test.c index b78d9f8db250d6e05c62658ee26c8a3d81f7872a..0b394a03e23d93030fd953ebc4af9b90e83ff9c3 100644 --- a/lustre/tests/it_test.c +++ b/lustre/tests/it_test.c @@ -245,8 +245,9 @@ static enum interval_iter sanity_cb(struct interval_node *node, void *args) } if (!has) { - int count = 1; + int count; err: + count = 1; dprintf("node"__S":%llu Child list:\n", node->in_extent.start, node->in_extent.end, diff --git a/lustre/utils/loadgen.c b/lustre/utils/loadgen.c index 76fd4e3dcb617c2d0f9a4a07b001d351dbb3cdb6..bb6c965a7ae2c6b1a3f8720a46075d638fbb2c4a 100644 --- a/lustre/utils/loadgen.c +++ b/lustre/utils/loadgen.c @@ -667,7 +667,7 @@ static void *run_one_child(void *threadvp) { struct kid_t *kid; char oname[10], ename[10]; - int thread = (long)threadvp, dev; + int thread = (long)threadvp, dev = 0; int rc = 0, err; if (o_verbose > 2)