From b88ba023ca23992a4fb98f337534d2997fabaf44 Mon Sep 17 00:00:00 2001 From: NeilBrown Date: Fri, 11 Oct 2019 10:38:45 -0400 Subject: [PATCH] LU-9859 libcfs: opencode cfs_cap_{raise,lower,raised} Each of these functions is used precisely once, so having a separate exported function seems like overkill. cfs_cap_raised() is trivial - one line. cfs_cap_raise() and cfs_cap_lower() are used as a pair which is more effectively implemented with override_cred() / revert_creds(). Linux-commit: cc738c1a69da27be8ff7885b4069fa02e45c75c1 There exists a bug in the original Linux client patch. Additionally handling the SYS_CAP_RESOURCE is used extensively with the server code so create we can create simple inline functions that handle this and it makes the code cleaner. Change-Id: I3a39a855fb9718ca43e74ef4b9e749b0f43f4bc8 Signed-off-by: NeilBrown Signed-off-by: Greg Kroah-Hartman Reviewed-on: https://review.whamcloud.com/36304 Tested-by: jenkins Tested-by: Maloo Reviewed-by: Neil Brown Reviewed-by: Andreas Dilger Reviewed-by: Shaun Tancheff Reviewed-by: Oleg Drokin --- libcfs/include/libcfs/curproc.h | 3 -- libcfs/libcfs/linux/linux-curproc.c | 26 ----------- lustre/obdclass/llog.c | 90 ++++++++++++++++++++----------------- 3 files changed, 48 insertions(+), 71 deletions(-) diff --git a/libcfs/include/libcfs/curproc.h b/libcfs/include/libcfs/curproc.h index 0f00c72..17ecd90 100644 --- a/libcfs/include/libcfs/curproc.h +++ b/libcfs/include/libcfs/curproc.h @@ -65,9 +65,6 @@ typedef __u32 cfs_cap_t; (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); diff --git a/libcfs/libcfs/linux/linux-curproc.c b/libcfs/libcfs/linux/linux-curproc.c index fee47a2..70510c9 100644 --- a/libcfs/libcfs/linux/linux-curproc.c +++ b/libcfs/libcfs/linux/linux-curproc.c @@ -59,29 +59,6 @@ #define cfs_cap_pack(cap) (cap) #define cfs_cap_unpack(cap) (cap) -void cfs_cap_raise(cfs_cap_t cap) -{ - struct cred *cred; - if ((cred = prepare_creds())) { - cap_raise(cred->cap_effective, cfs_cap_unpack(cap)); - commit_creds(cred); - } -} - -void cfs_cap_lower(cfs_cap_t cap) -{ - struct cred *cred; - if ((cred = prepare_creds())) { - cap_lower(cred->cap_effective, cfs_cap_unpack(cap)); - commit_creds(cred); - } -} - -int cfs_cap_raised(cfs_cap_t cap) -{ - return cap_raised(current_cap(), cfs_cap_unpack(cap)); -} - static void cfs_kernel_cap_pack(kernel_cap_t kcap, cfs_cap_t *cap) { #if defined (_LINUX_CAPABILITY_VERSION) && _LINUX_CAPABILITY_VERSION == 0x19980330 @@ -289,9 +266,6 @@ out: } EXPORT_SYMBOL(cfs_get_environ); -EXPORT_SYMBOL(cfs_cap_raise); -EXPORT_SYMBOL(cfs_cap_lower); -EXPORT_SYMBOL(cfs_cap_raised); EXPORT_SYMBOL(cfs_curproc_cap_pack); EXPORT_SYMBOL(cfs_capable); diff --git a/lustre/obdclass/llog.c b/lustre/obdclass/llog.c index 43bf396..5ae88a2 100644 --- a/lustre/obdclass/llog.c +++ b/lustre/obdclass/llog.c @@ -828,6 +828,27 @@ int llog_process(const struct lu_env *env, struct llog_handle *loghandle, } EXPORT_SYMBOL(llog_process); +static inline const struct cred *llog_raise_resource(void) +{ + struct cred *cred = NULL; + + if (cap_raised(current_cap(), CAP_SYS_RESOURCE)) + return cred; + + cred = prepare_creds(); + if (!cred) + return cred; + + cap_raise(cred->cap_effective, CAP_SYS_RESOURCE); + return override_creds(cred); +} + +static inline void llog_restore_resource(const struct cred *old_cred) +{ + if (old_cred) + revert_creds(old_cred); +} + int llog_reverse_process(const struct lu_env *env, struct llog_handle *loghandle, llog_cb_t cb, void *data, void *catdata) @@ -952,8 +973,9 @@ EXPORT_SYMBOL(llog_exist); int llog_declare_create(const struct lu_env *env, struct llog_handle *loghandle, struct thandle *th) { + const struct cred *old_cred; struct llog_operations *lop; - int raised, rc; + int rc; ENTRY; @@ -963,20 +985,18 @@ int llog_declare_create(const struct lu_env *env, if (lop->lop_declare_create == NULL) RETURN(-EOPNOTSUPP); - raised = cfs_cap_raised(CFS_CAP_SYS_RESOURCE); - if (!raised) - cfs_cap_raise(CFS_CAP_SYS_RESOURCE); + old_cred = llog_raise_resource(); rc = lop->lop_declare_create(env, loghandle, th); - if (!raised) - cfs_cap_lower(CFS_CAP_SYS_RESOURCE); + llog_restore_resource(old_cred); RETURN(rc); } int llog_create(const struct lu_env *env, struct llog_handle *handle, struct thandle *th) { + const struct cred *old_cred; struct llog_operations *lop; - int raised, rc; + int rc; ENTRY; @@ -986,12 +1006,9 @@ int llog_create(const struct lu_env *env, struct llog_handle *handle, if (lop->lop_create == NULL) RETURN(-EOPNOTSUPP); - raised = cfs_cap_raised(CFS_CAP_SYS_RESOURCE); - if (!raised) - cfs_cap_raise(CFS_CAP_SYS_RESOURCE); + old_cred = llog_raise_resource(); rc = lop->lop_create(env, handle, th); - if (!raised) - cfs_cap_lower(CFS_CAP_SYS_RESOURCE); + llog_restore_resource(old_cred); RETURN(rc); } @@ -1000,8 +1017,9 @@ int llog_declare_write_rec(const struct lu_env *env, struct llog_rec_hdr *rec, int idx, struct thandle *th) { + const struct cred *old_cred; struct llog_operations *lop; - int raised, rc; + int rc; ENTRY; @@ -1012,12 +1030,9 @@ int llog_declare_write_rec(const struct lu_env *env, if (lop->lop_declare_write_rec == NULL) RETURN(-EOPNOTSUPP); - raised = cfs_cap_raised(CFS_CAP_SYS_RESOURCE); - if (!raised) - cfs_cap_raise(CFS_CAP_SYS_RESOURCE); + old_cred = llog_raise_resource(); rc = lop->lop_declare_write_rec(env, handle, rec, idx, th); - if (!raised) - cfs_cap_lower(CFS_CAP_SYS_RESOURCE); + llog_restore_resource(old_cred); RETURN(rc); } @@ -1025,8 +1040,9 @@ int llog_write_rec(const struct lu_env *env, struct llog_handle *handle, struct llog_rec_hdr *rec, struct llog_cookie *logcookies, int idx, struct thandle *th) { + const struct cred *old_cred; struct llog_operations *lop; - int raised, rc, buflen; + int rc, buflen; ENTRY; @@ -1059,12 +1075,9 @@ int llog_write_rec(const struct lu_env *env, struct llog_handle *handle, buflen = rec->lrh_len; LASSERT(cfs_size_round(buflen) == buflen); - raised = cfs_cap_raised(CFS_CAP_SYS_RESOURCE); - if (!raised) - cfs_cap_raise(CFS_CAP_SYS_RESOURCE); + old_cred = llog_raise_resource(); rc = lop->lop_write_rec(env, handle, rec, logcookies, idx, th); - if (!raised) - cfs_cap_lower(CFS_CAP_SYS_RESOURCE); + llog_restore_resource(old_cred); RETURN(rc); } @@ -1072,19 +1085,17 @@ int llog_add(const struct lu_env *env, struct llog_handle *lgh, struct llog_rec_hdr *rec, struct llog_cookie *logcookies, struct thandle *th) { - int raised, rc; + const struct cred *old_cred; + int rc; ENTRY; if (lgh->lgh_logops->lop_add == NULL) RETURN(-EOPNOTSUPP); - raised = cfs_cap_raised(CFS_CAP_SYS_RESOURCE); - if (!raised) - cfs_cap_raise(CFS_CAP_SYS_RESOURCE); + old_cred = llog_raise_resource(); rc = lgh->lgh_logops->lop_add(env, lgh, rec, logcookies, th); - if (!raised) - cfs_cap_lower(CFS_CAP_SYS_RESOURCE); + llog_restore_resource(old_cred); RETURN(rc); } EXPORT_SYMBOL(llog_add); @@ -1092,19 +1103,17 @@ EXPORT_SYMBOL(llog_add); int llog_declare_add(const struct lu_env *env, struct llog_handle *lgh, struct llog_rec_hdr *rec, struct thandle *th) { - int raised, rc; + const struct cred *old_cred; + int rc; ENTRY; if (lgh->lgh_logops->lop_declare_add == NULL) RETURN(-EOPNOTSUPP); - raised = cfs_cap_raised(CFS_CAP_SYS_RESOURCE); - if (!raised) - cfs_cap_raise(CFS_CAP_SYS_RESOURCE); + old_cred = llog_raise_resource(); rc = lgh->lgh_logops->lop_declare_add(env, lgh, rec, th); - if (!raised) - cfs_cap_lower(CFS_CAP_SYS_RESOURCE); + llog_restore_resource(old_cred); RETURN(rc); } EXPORT_SYMBOL(llog_declare_add); @@ -1257,7 +1266,7 @@ int llog_open(const struct lu_env *env, struct llog_ctxt *ctxt, struct llog_handle **lgh, struct llog_logid *logid, char *name, enum llog_open_param open_param) { - int raised; + const struct cred *old_cred; int rc; ENTRY; @@ -1276,12 +1285,9 @@ int llog_open(const struct lu_env *env, struct llog_ctxt *ctxt, (*lgh)->lgh_ctxt = ctxt; (*lgh)->lgh_logops = ctxt->loc_logops; - raised = cfs_cap_raised(CFS_CAP_SYS_RESOURCE); - if (!raised) - cfs_cap_raise(CFS_CAP_SYS_RESOURCE); + old_cred = llog_raise_resource(); rc = ctxt->loc_logops->lop_open(env, *lgh, logid, name, open_param); - if (!raised) - cfs_cap_lower(CFS_CAP_SYS_RESOURCE); + llog_restore_resource(old_cred); if (rc) { llog_free_handle(*lgh); *lgh = NULL; -- 1.8.3.1