sec_null.c revision d7e09d0397e84eefbabfd9cb353221f3c6448d83
1d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao/* 2d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * GPL HEADER START 3d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * 4d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 5d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * 6d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * This program is free software; you can redistribute it and/or modify 7d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * it under the terms of the GNU General Public License version 2 only, 8d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * as published by the Free Software Foundation. 9d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * 10d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * This program is distributed in the hope that it will be useful, but 11d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * WITHOUT ANY WARRANTY; without even the implied warranty of 12d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 13d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * General Public License version 2 for more details (a copy is included 14d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * in the LICENSE file that accompanied this code). 15d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * 16d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * You should have received a copy of the GNU General Public License 17d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * version 2 along with this program; If not, see 18d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * http://www.sun.com/software/products/lustre/docs/GPLv2.pdf 19d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * 20d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, 21d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * CA 95054 USA or visit www.sun.com if you need additional information or 22d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * have any questions. 23d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * 24d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * GPL HEADER END 25d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao */ 26d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao/* 27d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved. 28d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * Use is subject to license terms. 29d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * 30d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * Copyright (c) 2011, 2012, Intel Corporation. 31d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao */ 32d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao/* 33d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * This file is part of Lustre, http://www.lustre.org/ 34d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * Lustre is a trademark of Sun Microsystems, Inc. 35d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * 36d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * lustre/ptlrpc/sec_null.c 37d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * 38d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * Author: Eric Mei <ericm@clusterfs.com> 39d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao */ 40d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 41d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao#define DEBUG_SUBSYSTEM S_SEC 42d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 43d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 44d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao#include <obd_support.h> 45d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao#include <obd_cksum.h> 46d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao#include <obd_class.h> 47d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao#include <lustre_net.h> 48d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao#include <lustre_sec.h> 49d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 50d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taostatic struct ptlrpc_sec_policy null_policy; 51d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taostatic struct ptlrpc_sec null_sec; 52d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taostatic struct ptlrpc_cli_ctx null_cli_ctx; 53d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taostatic struct ptlrpc_svc_ctx null_svc_ctx; 54d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 55d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao/* 56d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * we can temporarily use the topmost 8-bits of lm_secflvr to identify 57d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * the source sec part. 58d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao */ 59d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taostatic inline 60d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taovoid null_encode_sec_part(struct lustre_msg *msg, enum lustre_sec_part sp) 61d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao{ 62d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao msg->lm_secflvr |= (((__u32) sp) & 0xFF) << 24; 63d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao} 64d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 65d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taostatic inline 66d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taoenum lustre_sec_part null_decode_sec_part(struct lustre_msg *msg) 67d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao{ 68d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao return (msg->lm_secflvr >> 24) & 0xFF; 69d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao} 70d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 71d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taostatic int null_ctx_refresh(struct ptlrpc_cli_ctx *ctx) 72d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao{ 73d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao /* should never reach here */ 74d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao LBUG(); 75d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao return 0; 76d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao} 77d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 78d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taostatic 79d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taoint null_ctx_sign(struct ptlrpc_cli_ctx *ctx, struct ptlrpc_request *req) 80d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao{ 81d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao req->rq_reqbuf->lm_secflvr = SPTLRPC_FLVR_NULL; 82d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 83d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao if (!req->rq_import->imp_dlm_fake) { 84d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct obd_device *obd = req->rq_import->imp_obd; 85d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao null_encode_sec_part(req->rq_reqbuf, 86d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao obd->u.cli.cl_sp_me); 87d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao } 88d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao req->rq_reqdata_len = req->rq_reqlen; 89d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao return 0; 90d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao} 91d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 92d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taostatic 93d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taoint null_ctx_verify(struct ptlrpc_cli_ctx *ctx, struct ptlrpc_request *req) 94d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao{ 95d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao __u32 cksums, cksumc; 96d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 97d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao LASSERT(req->rq_repdata); 98d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 99d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao req->rq_repmsg = req->rq_repdata; 100d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao req->rq_replen = req->rq_repdata_len; 101d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 102d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao if (req->rq_early) { 103d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao cksums = lustre_msg_get_cksum(req->rq_repdata); 104d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao#if LUSTRE_VERSION_CODE < OBD_OCD_VERSION(2, 7, 50, 0) 105d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao if (lustre_msghdr_get_flags(req->rq_reqmsg) & 106d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao MSGHDR_CKSUM_INCOMPAT18) 107d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao cksumc = lustre_msg_calc_cksum(req->rq_repmsg, 0); 108d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao else 109d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao cksumc = lustre_msg_calc_cksum(req->rq_repmsg, 1); 110d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao#else 111d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao# warning "remove checksum compatibility support for b1_8" 112d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao cksumc = lustre_msg_calc_cksum(req->rq_repmsg); 113d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao#endif 114d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao if (cksumc != cksums) { 115d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao CDEBUG(D_SEC, 116d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao "early reply checksum mismatch: %08x != %08x\n", 117d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao cksumc, cksums); 118d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao return -EINVAL; 119d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao } 120d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao } 121d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 122d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao return 0; 123d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao} 124d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 125d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taostatic 126d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taostruct ptlrpc_sec *null_create_sec(struct obd_import *imp, 127d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct ptlrpc_svc_ctx *svc_ctx, 128d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct sptlrpc_flavor *sf) 129d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao{ 130d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao LASSERT(SPTLRPC_FLVR_POLICY(sf->sf_rpc) == SPTLRPC_POLICY_NULL); 131d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 132d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao /* general layer has take a module reference for us, because we never 133d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * really destroy the sec, simply release the reference here. 134d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao */ 135d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao sptlrpc_policy_put(&null_policy); 136d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao return &null_sec; 137d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao} 138d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 139d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taostatic 140d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taovoid null_destroy_sec(struct ptlrpc_sec *sec) 141d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao{ 142d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao LASSERT(sec == &null_sec); 143d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao} 144d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 145d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taostatic 146d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taostruct ptlrpc_cli_ctx *null_lookup_ctx(struct ptlrpc_sec *sec, 147d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct vfs_cred *vcred, 148d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao int create, int remove_dead) 149d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao{ 150d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao atomic_inc(&null_cli_ctx.cc_refcount); 151d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao return &null_cli_ctx; 152d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao} 153d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 154d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taostatic 155d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taoint null_flush_ctx_cache(struct ptlrpc_sec *sec, 156d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao uid_t uid, 157d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao int grace, int force) 158d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao{ 159d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao return 0; 160d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao} 161d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 162d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taostatic 163d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taoint null_alloc_reqbuf(struct ptlrpc_sec *sec, 164d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct ptlrpc_request *req, 165d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao int msgsize) 166d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao{ 167d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao if (!req->rq_reqbuf) { 168d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao int alloc_size = size_roundup_power2(msgsize); 169d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 170d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao LASSERT(!req->rq_pool); 171d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao OBD_ALLOC_LARGE(req->rq_reqbuf, alloc_size); 172d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao if (!req->rq_reqbuf) 173d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao return -ENOMEM; 174d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 175d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao req->rq_reqbuf_len = alloc_size; 176d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao } else { 177d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao LASSERT(req->rq_pool); 178d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao LASSERT(req->rq_reqbuf_len >= msgsize); 179d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao memset(req->rq_reqbuf, 0, msgsize); 180d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao } 181d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 182d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao req->rq_reqmsg = req->rq_reqbuf; 183d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao return 0; 184d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao} 185d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 186d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taostatic 187d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taovoid null_free_reqbuf(struct ptlrpc_sec *sec, 188d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct ptlrpc_request *req) 189d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao{ 190d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao if (!req->rq_pool) { 191d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao LASSERTF(req->rq_reqmsg == req->rq_reqbuf, 192d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao "req %p: reqmsg %p is not reqbuf %p in null sec\n", 193d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao req, req->rq_reqmsg, req->rq_reqbuf); 194d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao LASSERTF(req->rq_reqbuf_len >= req->rq_reqlen, 195d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao "req %p: reqlen %d should smaller than buflen %d\n", 196d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao req, req->rq_reqlen, req->rq_reqbuf_len); 197d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 198d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao OBD_FREE_LARGE(req->rq_reqbuf, req->rq_reqbuf_len); 199d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao req->rq_reqbuf = NULL; 200d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao req->rq_reqbuf_len = 0; 201d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao } 202d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao} 203d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 204d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taostatic 205d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taoint null_alloc_repbuf(struct ptlrpc_sec *sec, 206d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct ptlrpc_request *req, 207d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao int msgsize) 208d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao{ 209d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao /* add space for early replied */ 210d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao msgsize += lustre_msg_early_size(); 211d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 212d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao msgsize = size_roundup_power2(msgsize); 213d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 214d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao OBD_ALLOC_LARGE(req->rq_repbuf, msgsize); 215d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao if (!req->rq_repbuf) 216d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao return -ENOMEM; 217d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 218d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao req->rq_repbuf_len = msgsize; 219d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao return 0; 220d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao} 221d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 222d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taostatic 223d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taovoid null_free_repbuf(struct ptlrpc_sec *sec, 224d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct ptlrpc_request *req) 225d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao{ 226d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao LASSERT(req->rq_repbuf); 227d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 228d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao OBD_FREE_LARGE(req->rq_repbuf, req->rq_repbuf_len); 229d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao req->rq_repbuf = NULL; 230d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao req->rq_repbuf_len = 0; 231d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao} 232d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 233d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taostatic 234d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taoint null_enlarge_reqbuf(struct ptlrpc_sec *sec, 235d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct ptlrpc_request *req, 236d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao int segment, int newsize) 237d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao{ 238d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct lustre_msg *newbuf; 239d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct lustre_msg *oldbuf = req->rq_reqmsg; 240d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao int oldsize, newmsg_size, alloc_size; 241d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 242d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao LASSERT(req->rq_reqbuf); 243d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao LASSERT(req->rq_reqbuf == req->rq_reqmsg); 244d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao LASSERT(req->rq_reqbuf_len >= req->rq_reqlen); 245d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao LASSERT(req->rq_reqlen == lustre_packed_msg_size(oldbuf)); 246d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 247d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao /* compute new message size */ 248d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao oldsize = req->rq_reqbuf->lm_buflens[segment]; 249d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao req->rq_reqbuf->lm_buflens[segment] = newsize; 250d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao newmsg_size = lustre_packed_msg_size(oldbuf); 251d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao req->rq_reqbuf->lm_buflens[segment] = oldsize; 252d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 253d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao /* request from pool should always have enough buffer */ 254d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao LASSERT(!req->rq_pool || req->rq_reqbuf_len >= newmsg_size); 255d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 256d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao if (req->rq_reqbuf_len < newmsg_size) { 257d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao alloc_size = size_roundup_power2(newmsg_size); 258d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 259d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao OBD_ALLOC_LARGE(newbuf, alloc_size); 260d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao if (newbuf == NULL) 261d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao return -ENOMEM; 262d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 263d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao memcpy(newbuf, req->rq_reqbuf, req->rq_reqlen); 264d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 265d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao OBD_FREE_LARGE(req->rq_reqbuf, req->rq_reqbuf_len); 266d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao req->rq_reqbuf = req->rq_reqmsg = newbuf; 267d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao req->rq_reqbuf_len = alloc_size; 268d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao } 269d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 270d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao _sptlrpc_enlarge_msg_inplace(req->rq_reqmsg, segment, newsize); 271d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao req->rq_reqlen = newmsg_size; 272d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 273d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao return 0; 274d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao} 275d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 276d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taostatic struct ptlrpc_svc_ctx null_svc_ctx = { 277d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao .sc_refcount = ATOMIC_INIT(1), 278d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao .sc_policy = &null_policy, 279d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao}; 280d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 281d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taostatic 282d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taoint null_accept(struct ptlrpc_request *req) 283d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao{ 284d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao LASSERT(SPTLRPC_FLVR_POLICY(req->rq_flvr.sf_rpc) == 285d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao SPTLRPC_POLICY_NULL); 286d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 287d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao if (req->rq_flvr.sf_rpc != SPTLRPC_FLVR_NULL) { 288d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao CERROR("Invalid rpc flavor 0x%x\n", req->rq_flvr.sf_rpc); 289d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao return SECSVC_DROP; 290d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao } 291d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 292d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao req->rq_sp_from = null_decode_sec_part(req->rq_reqbuf); 293d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 294d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao req->rq_reqmsg = req->rq_reqbuf; 295d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao req->rq_reqlen = req->rq_reqdata_len; 296d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 297d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao req->rq_svc_ctx = &null_svc_ctx; 298d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao atomic_inc(&req->rq_svc_ctx->sc_refcount); 299d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 300d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao return SECSVC_OK; 301d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao} 302d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 303d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taostatic 304d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taoint null_alloc_rs(struct ptlrpc_request *req, int msgsize) 305d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao{ 306d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct ptlrpc_reply_state *rs; 307d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao int rs_size = sizeof(*rs) + msgsize; 308d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 309d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao LASSERT(msgsize % 8 == 0); 310d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 311d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao rs = req->rq_reply_state; 312d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 313d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao if (rs) { 314d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao /* pre-allocated */ 315d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao LASSERT(rs->rs_size >= rs_size); 316d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao } else { 317d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao OBD_ALLOC_LARGE(rs, rs_size); 318d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao if (rs == NULL) 319d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao return -ENOMEM; 320d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 321d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao rs->rs_size = rs_size; 322d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao } 323d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 324d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao rs->rs_svc_ctx = req->rq_svc_ctx; 325d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao atomic_inc(&req->rq_svc_ctx->sc_refcount); 326d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 327d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao rs->rs_repbuf = (struct lustre_msg *) (rs + 1); 328d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao rs->rs_repbuf_len = rs_size - sizeof(*rs); 329d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao rs->rs_msg = rs->rs_repbuf; 330d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 331d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao req->rq_reply_state = rs; 332d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao return 0; 333d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao} 334d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 335d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taostatic 336d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taovoid null_free_rs(struct ptlrpc_reply_state *rs) 337d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao{ 338d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao LASSERT_ATOMIC_GT(&rs->rs_svc_ctx->sc_refcount, 1); 339d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao atomic_dec(&rs->rs_svc_ctx->sc_refcount); 340d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 341d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao if (!rs->rs_prealloc) 342d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao OBD_FREE_LARGE(rs, rs->rs_size); 343d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao} 344d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 345d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taostatic 346d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taoint null_authorize(struct ptlrpc_request *req) 347d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao{ 348d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct ptlrpc_reply_state *rs = req->rq_reply_state; 349d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 350d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao LASSERT(rs); 351d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 352d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao rs->rs_repbuf->lm_secflvr = SPTLRPC_FLVR_NULL; 353d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao rs->rs_repdata_len = req->rq_replen; 354d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 355d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao if (likely(req->rq_packed_final)) { 356d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao if (lustre_msghdr_get_flags(req->rq_reqmsg) & MSGHDR_AT_SUPPORT) 357d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao req->rq_reply_off = lustre_msg_early_size(); 358d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao else 359d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao req->rq_reply_off = 0; 360d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao } else { 361d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao __u32 cksum; 362d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 363d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao#if LUSTRE_VERSION_CODE < OBD_OCD_VERSION(2, 7, 50, 0) 364d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao if (lustre_msghdr_get_flags(req->rq_reqmsg) & 365d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao MSGHDR_CKSUM_INCOMPAT18) 366d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao cksum = lustre_msg_calc_cksum(rs->rs_repbuf, 0); 367d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao else 368d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao cksum = lustre_msg_calc_cksum(rs->rs_repbuf, 1); 369d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao#else 370d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao# warning "remove checksum compatibility support for b1_8" 371d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao cksum = lustre_msg_calc_cksum(rs->rs_repbuf); 372d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao#endif 373d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao lustre_msg_set_cksum(rs->rs_repbuf, cksum); 374d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao req->rq_reply_off = 0; 375d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao } 376d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 377d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao return 0; 378d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao} 379d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 380d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taostatic struct ptlrpc_ctx_ops null_ctx_ops = { 381d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao .refresh = null_ctx_refresh, 382d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao .sign = null_ctx_sign, 383d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao .verify = null_ctx_verify, 384d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao}; 385d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 386d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taostatic struct ptlrpc_sec_cops null_sec_cops = { 387d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao .create_sec = null_create_sec, 388d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao .destroy_sec = null_destroy_sec, 389d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao .lookup_ctx = null_lookup_ctx, 390d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao .flush_ctx_cache = null_flush_ctx_cache, 391d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao .alloc_reqbuf = null_alloc_reqbuf, 392d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao .alloc_repbuf = null_alloc_repbuf, 393d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao .free_reqbuf = null_free_reqbuf, 394d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao .free_repbuf = null_free_repbuf, 395d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao .enlarge_reqbuf = null_enlarge_reqbuf, 396d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao}; 397d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 398d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taostatic struct ptlrpc_sec_sops null_sec_sops = { 399d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao .accept = null_accept, 400d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao .alloc_rs = null_alloc_rs, 401d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao .authorize = null_authorize, 402d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao .free_rs = null_free_rs, 403d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao}; 404d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 405d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taostatic struct ptlrpc_sec_policy null_policy = { 406d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao .sp_owner = THIS_MODULE, 407d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao .sp_name = "sec.null", 408d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao .sp_policy = SPTLRPC_POLICY_NULL, 409d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao .sp_cops = &null_sec_cops, 410d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao .sp_sops = &null_sec_sops, 411d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao}; 412d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 413d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taostatic void null_init_internal(void) 414d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao{ 415d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao static HLIST_HEAD(__list); 416d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 417d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao null_sec.ps_policy = &null_policy; 418d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao atomic_set(&null_sec.ps_refcount, 1); /* always busy */ 419d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao null_sec.ps_id = -1; 420d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao null_sec.ps_import = NULL; 421d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao null_sec.ps_flvr.sf_rpc = SPTLRPC_FLVR_NULL; 422d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao null_sec.ps_flvr.sf_flags = 0; 423d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao null_sec.ps_part = LUSTRE_SP_ANY; 424d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao null_sec.ps_dying = 0; 425d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao spin_lock_init(&null_sec.ps_lock); 426d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao atomic_set(&null_sec.ps_nctx, 1); /* for "null_cli_ctx" */ 427d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao INIT_LIST_HEAD(&null_sec.ps_gc_list); 428d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao null_sec.ps_gc_interval = 0; 429d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao null_sec.ps_gc_next = 0; 430d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 431d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao hlist_add_head(&null_cli_ctx.cc_cache, &__list); 432d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao atomic_set(&null_cli_ctx.cc_refcount, 1); /* for hash */ 433d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao null_cli_ctx.cc_sec = &null_sec; 434d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao null_cli_ctx.cc_ops = &null_ctx_ops; 435d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao null_cli_ctx.cc_expire = 0; 436d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao null_cli_ctx.cc_flags = PTLRPC_CTX_CACHED | PTLRPC_CTX_ETERNAL | 437d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao PTLRPC_CTX_UPTODATE; 438d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao null_cli_ctx.cc_vcred.vc_uid = 0; 439d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao spin_lock_init(&null_cli_ctx.cc_lock); 440d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao INIT_LIST_HEAD(&null_cli_ctx.cc_req_list); 441d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao INIT_LIST_HEAD(&null_cli_ctx.cc_gc_chain); 442d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao} 443d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 444d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taoint sptlrpc_null_init(void) 445d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao{ 446d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao int rc; 447d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 448d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao null_init_internal(); 449d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 450d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao rc = sptlrpc_register_policy(&null_policy); 451d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao if (rc) 452d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao CERROR("failed to register %s: %d\n", null_policy.sp_name, rc); 453d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 454d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao return rc; 455d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao} 456d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 457d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taovoid sptlrpc_null_fini(void) 458d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao{ 459d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao int rc; 460d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 461d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao rc = sptlrpc_unregister_policy(&null_policy); 462d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao if (rc) 463d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao CERROR("failed to unregister %s: %d\n", null_policy.sp_name,rc); 464d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao} 465