X-Git-Url: https://git.whamcloud.com/?p=fs%2Flustre-release.git;a=blobdiff_plain;f=lustre%2Fosd-ldiskfs%2Fosd_handler.c;h=27367ecb4f8f6f0450594fa041c4a142c0123c6f;hp=3bdcaf91dc433f9fa8609f60fe7f2d014039b694;hb=d750891e478804bc495ffa075d771d1816369958;hpb=0b54f38a7eb79ece762f12e121bfe26814a2e655 diff --git a/lustre/osd-ldiskfs/osd_handler.c b/lustre/osd-ldiskfs/osd_handler.c index 3bdcaf9..27367ec 100644 --- a/lustre/osd-ldiskfs/osd_handler.c +++ b/lustre/osd-ldiskfs/osd_handler.c @@ -213,23 +213,33 @@ static inline void osd_push_ctxt(const struct lu_env *env, struct osd_ctxt *save) { struct md_ucred *uc = md_ucred(env); + struct cred *tc; LASSERT(uc != NULL); - save->oc_uid = current->fsuid; - save->oc_gid = current->fsgid; - save->oc_cap = current->cap_effective; - current->fsuid = uc->mu_fsuid; - current->fsgid = uc->mu_fsgid; - current->cap_effective = uc->mu_cap; + save->oc_uid = current_fsuid(); + save->oc_gid = current_fsgid(); + save->oc_cap = current_cap(); + if ((tc = prepare_creds())) { + tc->fsuid = uc->mu_fsuid; + tc->fsgid = uc->mu_fsgid; + commit_creds(tc); + } + /* XXX not suboptimal */ + cfs_curproc_cap_unpack(uc->mu_cap); } static inline void osd_pop_ctxt(struct osd_ctxt *save) { - current->fsuid = save->oc_uid; - current->fsgid = save->oc_gid; - current->cap_effective = save->oc_cap; + struct cred *tc; + + if ((tc = prepare_creds())) { + tc->fsuid = save->oc_uid; + tc->fsgid = save->oc_gid; + tc->cap_effective = save->oc_cap; + commit_creds(tc); + } } #endif @@ -1357,7 +1367,7 @@ static int osd_inode_setattr(const struct lu_env *env, iattr.ia_uid = attr->la_uid; iattr.ia_gid = attr->la_gid; osd_push_ctxt(env, save); - rc = DQUOT_TRANSFER(inode, &iattr) ? -EDQUOT : 0; + rc = ll_vfs_dq_transfer(inode, &iattr) ? -EDQUOT : 0; osd_pop_ctxt(save); if (rc != 0) return rc; @@ -2604,7 +2614,7 @@ static ssize_t osd_write(const struct lu_env *env, struct dt_object *dt, struct osd_thandle *oh; ssize_t result = 0; #ifdef HAVE_QUOTA_SUPPORT - cfs_cap_t save = current->cap_effective; + cfs_cap_t save = cfs_curproc_cap_pack(); #endif LASSERT(handle != NULL); @@ -2616,9 +2626,9 @@ static ssize_t osd_write(const struct lu_env *env, struct dt_object *dt, LASSERT(oh->ot_handle->h_transaction != NULL); #ifdef HAVE_QUOTA_SUPPORT if (ignore_quota) - current->cap_effective |= CFS_CAP_SYS_RESOURCE_MASK; + cfs_cap_raise(CFS_CAP_SYS_RESOURCE); else - current->cap_effective &= ~CFS_CAP_SYS_RESOURCE_MASK; + cfs_cap_lower(CFS_CAP_SYS_RESOURCE); #endif /* Write small symlink to inode body as we need to maintain correct * on-disk symlinks for ldiskfs. @@ -2631,7 +2641,7 @@ static ssize_t osd_write(const struct lu_env *env, struct dt_object *dt, buf->lb_len, pos, oh->ot_handle); #ifdef HAVE_QUOTA_SUPPORT - current->cap_effective = save; + cfs_curproc_cap_unpack(save); #endif if (result == 0) result = buf->lb_len; @@ -2848,7 +2858,7 @@ static int osd_index_iam_insert(const struct lu_env *env, struct dt_object *dt, struct osd_thandle *oh; struct iam_container *bag = &obj->oo_dir->od_container; #ifdef HAVE_QUOTA_SUPPORT - cfs_cap_t save = current->cap_effective; + cfs_cap_t save = cfs_curproc_cap_pack(); #endif struct osd_thread_info *oti = osd_oti_get(env); struct iam_rec *iam_rec = (struct iam_rec *)oti->oti_ldp; @@ -2873,9 +2883,9 @@ static int osd_index_iam_insert(const struct lu_env *env, struct dt_object *dt, LASSERT(oh->ot_handle->h_transaction != NULL); #ifdef HAVE_QUOTA_SUPPORT if (ignore_quota) - current->cap_effective |= CFS_CAP_SYS_RESOURCE_MASK; + cfs_cap_raise(CFS_CAP_SYS_RESOURCE); else - current->cap_effective &= ~CFS_CAP_SYS_RESOURCE_MASK; + cfs_cap_lower(CFS_CAP_SYS_RESOURCE); #endif if (S_ISDIR(obj->oo_inode->i_mode)) osd_fid_pack((struct osd_fid_pack *)iam_rec, rec, &oti->oti_fid); @@ -2884,7 +2894,7 @@ static int osd_index_iam_insert(const struct lu_env *env, struct dt_object *dt, rc = iam_insert(oh->ot_handle, bag, (const struct iam_key *)key, iam_rec, ipd); #ifdef HAVE_QUOTA_SUPPORT - current->cap_effective = save; + cfs_curproc_cap_unpack(save); #endif osd_ipd_put(env, bag, ipd); LINVRNT(osd_invariant(obj)); @@ -3138,7 +3148,7 @@ static int osd_index_ea_insert(const struct lu_env *env, struct dt_object *dt, const char *name = (const char *)key; struct osd_object *child; #ifdef HAVE_QUOTA_SUPPORT - cfs_cap_t save = current->cap_effective; + cfs_cap_t save = cfs_curproc_cap_pack(); #endif int rc; @@ -3162,15 +3172,15 @@ static int osd_index_ea_insert(const struct lu_env *env, struct dt_object *dt, *mtime = inode->i_mtime; #ifdef HAVE_QUOTA_SUPPORT if (ignore_quota) - current->cap_effective |= CFS_CAP_SYS_RESOURCE_MASK; + cfs_cap_raise(CFS_CAP_SYS_RESOURCE); else - current->cap_effective &= ~CFS_CAP_SYS_RESOURCE_MASK; + cfs_cap_lower(CFS_CAP_SYS_RESOURCE); #endif cfs_down_write(&obj->oo_ext_idx_sem); rc = osd_ea_add_rec(env, obj, child->oo_inode, name, rec, th); cfs_up_write(&obj->oo_ext_idx_sem); #ifdef HAVE_QUOTA_SUPPORT - current->cap_effective = save; + cfs_curproc_cap_unpack(save); #endif osd_object_put(env, child); /* xtime should not be updated with server-side time. */