X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Fptlrpc%2Fsec_null.c;h=5b51c188ff1ddfe4af1bd40a0c669e85f0bc9395;hb=9fb46705ae86aa2c0ac29427f0ff24f923560eb7;hp=813adf0baffa6519abedd6d20a6b97eb87795dbe;hpb=6869932b552ac705f411de3362f01bd50c1f6f7d;p=fs%2Flustre-release.git diff --git a/lustre/ptlrpc/sec_null.c b/lustre/ptlrpc/sec_null.c index 813adf0..5b51c18 100644 --- a/lustre/ptlrpc/sec_null.c +++ b/lustre/ptlrpc/sec_null.c @@ -1,6 +1,4 @@ -/* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*- - * vim:expandtab:shiftwidth=8:tabstop=8: - * +/* * GPL HEADER START * * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. @@ -26,8 +24,10 @@ * GPL HEADER END */ /* - * Copyright 2008 Sun Microsystems, Inc. All rights reserved + * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved. * Use is subject to license terms. + * + * Copyright (c) 2011, Whamcloud, Inc. */ /* * This file is part of Lustre, http://www.lustre.org/ @@ -38,9 +38,6 @@ * Author: Eric Mei */ -#ifndef EXPORT_SYMTAB -# define EXPORT_SYMTAB -#endif #define DEBUG_SUBSYSTEM S_SEC #ifndef __KERNEL__ @@ -59,26 +56,19 @@ static struct ptlrpc_cli_ctx null_cli_ctx; static struct ptlrpc_svc_ctx null_svc_ctx; /* - * null sec temporarily use the third byte of lm_secflvr to identify + * we can temporarily use the topmost 8-bits of lm_secflvr to identify * the source sec part. */ static inline void null_encode_sec_part(struct lustre_msg *msg, enum lustre_sec_part sp) { - msg->lm_secflvr |= (((__u32) sp) & 0xFF) << 16; + msg->lm_secflvr |= (((__u32) sp) & 0xFF) << 24; } static inline enum lustre_sec_part null_decode_sec_part(struct lustre_msg *msg) { - switch (msg->lm_magic) { - case LUSTRE_MSG_MAGIC_V2: - return (msg->lm_secflvr >> 16) & 0xFF; - case LUSTRE_MSG_MAGIC_V2_SWABBED: - return (msg->lm_secflvr >> 8) & 0xFF; - default: - return LUSTRE_SP_ANY; - } + return (msg->lm_secflvr >> 24) & 0xFF; } static int null_ctx_refresh(struct ptlrpc_cli_ctx *ctx) @@ -96,7 +86,7 @@ int null_ctx_sign(struct ptlrpc_cli_ctx *ctx, struct ptlrpc_request *req) if (!req->rq_import->imp_dlm_fake) { struct obd_device *obd = req->rq_import->imp_obd; null_encode_sec_part(req->rq_reqbuf, - obd->u.cli.cl_sec_part); + obd->u.cli.cl_sp_me); } req->rq_reqdata_len = req->rq_reqlen; return 0; @@ -109,27 +99,29 @@ int null_ctx_verify(struct ptlrpc_cli_ctx *ctx, struct ptlrpc_request *req) LASSERT(req->rq_repdata); - /* real reply rq_repdata point inside of rq_reqbuf; early reply - * rq_repdata point to a separate allocated space */ - if ((char *) req->rq_repdata < req->rq_repbuf || - (char *) req->rq_repdata >= req->rq_repbuf + req->rq_repbuf_len) { - cksums = req->rq_repdata->lm_cksum; - req->rq_repdata->lm_cksum = 0; - - if (req->rq_repdata->lm_magic == LUSTRE_MSG_MAGIC_V2_SWABBED) - __swab32s(&cksums); + req->rq_repmsg = req->rq_repdata; + req->rq_replen = req->rq_repdata_len; - cksumc = crc32_le(!(__u32) 0, (unsigned char *)req->rq_repdata, - req->rq_repdata_len); + if (req->rq_early) { + cksums = lustre_msg_get_cksum(req->rq_repdata); +#if LUSTRE_VERSION_CODE < OBD_OCD_VERSION(2, 7, 50, 0) + if (lustre_msghdr_get_flags(req->rq_reqmsg) & + MSGHDR_CKSUM_INCOMPAT18) + cksumc = lustre_msg_calc_cksum(req->rq_repmsg, 0); + else + cksumc = lustre_msg_calc_cksum(req->rq_repmsg, 1); +#else +# warning "remove checksum compatibility support for b1_8" + cksumc = lustre_msg_calc_cksum(req->rq_repmsg); +#endif if (cksumc != cksums) { - CWARN("early reply checksum mismatch: %08x != %08x\n", - cksumc, cksums); + CDEBUG(D_SEC, + "early reply checksum mismatch: %08x != %08x\n", + cksumc, cksums); return -EINVAL; } } - req->rq_repmsg = req->rq_repdata; - req->rq_replen = req->rq_repdata_len; return 0; } @@ -138,14 +130,7 @@ struct ptlrpc_sec *null_create_sec(struct obd_import *imp, struct ptlrpc_svc_ctx *svc_ctx, struct sptlrpc_flavor *sf) { - LASSERT(RPC_FLVR_POLICY(sf->sf_rpc) == SPTLRPC_POLICY_NULL); - - if (sf->sf_bulk_ciph != BULK_CIPH_ALG_NULL || - sf->sf_bulk_hash != BULK_HASH_ALG_NULL) { - CERROR("null sec don't support bulk algorithm: %u/%u\n", - sf->sf_bulk_ciph, sf->sf_bulk_hash); - return NULL; - } + LASSERT(SPTLRPC_FLVR_POLICY(sf->sf_rpc) == SPTLRPC_POLICY_NULL); /* general layer has take a module reference for us, because we never * really destroy the sec, simply release the reference here. @@ -165,7 +150,7 @@ struct ptlrpc_cli_ctx *null_lookup_ctx(struct ptlrpc_sec *sec, struct vfs_cred *vcred, int create, int remove_dead) { - atomic_inc(&null_cli_ctx.cc_refcount); + cfs_atomic_inc(&null_cli_ctx.cc_refcount); return &null_cli_ctx; } @@ -186,7 +171,7 @@ int null_alloc_reqbuf(struct ptlrpc_sec *sec, int alloc_size = size_roundup_power2(msgsize); LASSERT(!req->rq_pool); - OBD_ALLOC(req->rq_reqbuf, alloc_size); + OBD_ALLOC_LARGE(req->rq_reqbuf, alloc_size); if (!req->rq_reqbuf) return -ENOMEM; @@ -213,12 +198,10 @@ void null_free_reqbuf(struct ptlrpc_sec *sec, "req %p: reqlen %d should smaller than buflen %d\n", req, req->rq_reqlen, req->rq_reqbuf_len); - OBD_FREE(req->rq_reqbuf, req->rq_reqbuf_len); - req->rq_reqmsg = req->rq_reqbuf = NULL; + OBD_FREE_LARGE(req->rq_reqbuf, req->rq_reqbuf_len); + req->rq_reqbuf = NULL; req->rq_reqbuf_len = 0; } - - req->rq_reqmsg = NULL; } static @@ -231,7 +214,7 @@ int null_alloc_repbuf(struct ptlrpc_sec *sec, msgsize = size_roundup_power2(msgsize); - OBD_ALLOC(req->rq_repbuf, msgsize); + OBD_ALLOC_LARGE(req->rq_repbuf, msgsize); if (!req->rq_repbuf) return -ENOMEM; @@ -245,11 +228,9 @@ void null_free_repbuf(struct ptlrpc_sec *sec, { LASSERT(req->rq_repbuf); - OBD_FREE(req->rq_repbuf, req->rq_repbuf_len); + OBD_FREE_LARGE(req->rq_repbuf, req->rq_repbuf_len); req->rq_repbuf = NULL; req->rq_repbuf_len = 0; - - req->rq_repmsg = NULL; } static @@ -278,13 +259,13 @@ int null_enlarge_reqbuf(struct ptlrpc_sec *sec, if (req->rq_reqbuf_len < newmsg_size) { alloc_size = size_roundup_power2(newmsg_size); - OBD_ALLOC(newbuf, alloc_size); + OBD_ALLOC_LARGE(newbuf, alloc_size); if (newbuf == NULL) return -ENOMEM; memcpy(newbuf, req->rq_reqbuf, req->rq_reqlen); - OBD_FREE(req->rq_reqbuf, req->rq_reqbuf_len); + OBD_FREE_LARGE(req->rq_reqbuf, req->rq_reqbuf_len); req->rq_reqbuf = req->rq_reqmsg = newbuf; req->rq_reqbuf_len = alloc_size; } @@ -296,14 +277,15 @@ int null_enlarge_reqbuf(struct ptlrpc_sec *sec, } static struct ptlrpc_svc_ctx null_svc_ctx = { - .sc_refcount = ATOMIC_INIT(1), + .sc_refcount = CFS_ATOMIC_INIT(1), .sc_policy = &null_policy, }; static int null_accept(struct ptlrpc_request *req) { - LASSERT(RPC_FLVR_POLICY(req->rq_flvr.sf_rpc) == SPTLRPC_POLICY_NULL); + LASSERT(SPTLRPC_FLVR_POLICY(req->rq_flvr.sf_rpc) == + SPTLRPC_POLICY_NULL); if (req->rq_flvr.sf_rpc != SPTLRPC_FLVR_NULL) { CERROR("Invalid rpc flavor 0x%x\n", req->rq_flvr.sf_rpc); @@ -316,7 +298,7 @@ int null_accept(struct ptlrpc_request *req) req->rq_reqlen = req->rq_reqdata_len; req->rq_svc_ctx = &null_svc_ctx; - atomic_inc(&req->rq_svc_ctx->sc_refcount); + cfs_atomic_inc(&req->rq_svc_ctx->sc_refcount); return SECSVC_OK; } @@ -335,7 +317,7 @@ int null_alloc_rs(struct ptlrpc_request *req, int msgsize) /* pre-allocated */ LASSERT(rs->rs_size >= rs_size); } else { - OBD_ALLOC(rs, rs_size); + OBD_ALLOC_LARGE(rs, rs_size); if (rs == NULL) return -ENOMEM; @@ -343,7 +325,7 @@ int null_alloc_rs(struct ptlrpc_request *req, int msgsize) } rs->rs_svc_ctx = req->rq_svc_ctx; - atomic_inc(&req->rq_svc_ctx->sc_refcount); + cfs_atomic_inc(&req->rq_svc_ctx->sc_refcount); rs->rs_repbuf = (struct lustre_msg *) (rs + 1); rs->rs_repbuf_len = rs_size - sizeof(*rs); @@ -356,11 +338,11 @@ int null_alloc_rs(struct ptlrpc_request *req, int msgsize) static void null_free_rs(struct ptlrpc_reply_state *rs) { - LASSERT(atomic_read(&rs->rs_svc_ctx->sc_refcount) > 1); - atomic_dec(&rs->rs_svc_ctx->sc_refcount); + LASSERT_ATOMIC_GT(&rs->rs_svc_ctx->sc_refcount, 1); + cfs_atomic_dec(&rs->rs_svc_ctx->sc_refcount); if (!rs->rs_prealloc) - OBD_FREE(rs, rs->rs_size); + OBD_FREE_LARGE(rs, rs->rs_size); } static @@ -374,12 +356,24 @@ int null_authorize(struct ptlrpc_request *req) rs->rs_repdata_len = req->rq_replen; if (likely(req->rq_packed_final)) { - req->rq_reply_off = lustre_msg_early_size(); + if (lustre_msghdr_get_flags(req->rq_reqmsg) & MSGHDR_AT_SUPPORT) + req->rq_reply_off = lustre_msg_early_size(); + else + req->rq_reply_off = 0; } else { - rs->rs_repbuf->lm_cksum = - crc32_le(!(__u32) 0, - (unsigned char *)rs->rs_repbuf, - rs->rs_repdata_len); + __u32 cksum; + +#if LUSTRE_VERSION_CODE < OBD_OCD_VERSION(2, 7, 50, 0) + if (lustre_msghdr_get_flags(req->rq_reqmsg) & + MSGHDR_CKSUM_INCOMPAT18) + cksum = lustre_msg_calc_cksum(rs->rs_repbuf, 0); + else + cksum = lustre_msg_calc_cksum(rs->rs_repbuf, 1); +#else +# warning "remove checksum compatibility support for b1_8" + cksum = lustre_msg_calc_cksum(rs->rs_repbuf); +#endif + lustre_msg_set_cksum(rs->rs_repbuf, cksum); req->rq_reply_off = 0; } @@ -421,35 +415,33 @@ static struct ptlrpc_sec_policy null_policy = { static void null_init_internal(void) { - static HLIST_HEAD(__list); + static CFS_HLIST_HEAD(__list); null_sec.ps_policy = &null_policy; - atomic_set(&null_sec.ps_refcount, 1); /* always busy */ + cfs_atomic_set(&null_sec.ps_refcount, 1); /* always busy */ null_sec.ps_id = -1; null_sec.ps_import = NULL; null_sec.ps_flvr.sf_rpc = SPTLRPC_FLVR_NULL; - null_sec.ps_flvr.sf_bulk_ciph = BULK_CIPH_ALG_NULL; - null_sec.ps_flvr.sf_bulk_hash = BULK_HASH_ALG_NULL; null_sec.ps_flvr.sf_flags = 0; null_sec.ps_part = LUSTRE_SP_ANY; null_sec.ps_dying = 0; - spin_lock_init(&null_sec.ps_lock); - atomic_set(&null_sec.ps_nctx, 1); /* for "null_cli_ctx" */ + spin_lock_init(&null_sec.ps_lock); + cfs_atomic_set(&null_sec.ps_nctx, 1); /* for "null_cli_ctx" */ CFS_INIT_LIST_HEAD(&null_sec.ps_gc_list); null_sec.ps_gc_interval = 0; null_sec.ps_gc_next = 0; - hlist_add_head(&null_cli_ctx.cc_cache, &__list); - atomic_set(&null_cli_ctx.cc_refcount, 1); /* for hash */ + cfs_hlist_add_head(&null_cli_ctx.cc_cache, &__list); + cfs_atomic_set(&null_cli_ctx.cc_refcount, 1); /* for hash */ null_cli_ctx.cc_sec = &null_sec; null_cli_ctx.cc_ops = &null_ctx_ops; null_cli_ctx.cc_expire = 0; null_cli_ctx.cc_flags = PTLRPC_CTX_CACHED | PTLRPC_CTX_ETERNAL | PTLRPC_CTX_UPTODATE; null_cli_ctx.cc_vcred.vc_uid = 0; - spin_lock_init(&null_cli_ctx.cc_lock); - CFS_INIT_LIST_HEAD(&null_cli_ctx.cc_req_list); - CFS_INIT_LIST_HEAD(&null_cli_ctx.cc_gc_chain); + spin_lock_init(&null_cli_ctx.cc_lock); + CFS_INIT_LIST_HEAD(&null_cli_ctx.cc_req_list); + CFS_INIT_LIST_HEAD(&null_cli_ctx.cc_gc_chain); } int sptlrpc_null_init(void)