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 44e27db14919269176ec040479d199225a37aafb8cGreg Kroah-Hartman#include "../include/obd_support.h" 45e27db14919269176ec040479d199225a37aafb8cGreg Kroah-Hartman#include "../include/obd_cksum.h" 46e27db14919269176ec040479d199225a37aafb8cGreg Kroah-Hartman#include "../include/obd_class.h" 47e27db14919269176ec040479d199225a37aafb8cGreg Kroah-Hartman#include "../include/lustre_net.h" 48e27db14919269176ec040479d199225a37aafb8cGreg Kroah-Hartman#include "../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 26361d7258bf144ff388f51d0a3b295a7493fe10035Oleg Drokin /* Must lock this, so that otherwise unprotected change of 26461d7258bf144ff388f51d0a3b295a7493fe10035Oleg Drokin * rq_reqmsg is not racing with parallel processing of 26561d7258bf144ff388f51d0a3b295a7493fe10035Oleg Drokin * imp_replay_list traversing threads. See LU-3333 26661d7258bf144ff388f51d0a3b295a7493fe10035Oleg Drokin * This is a bandaid at best, we really need to deal with this 26761d7258bf144ff388f51d0a3b295a7493fe10035Oleg Drokin * in request enlarging code before unpacking that's already 26861d7258bf144ff388f51d0a3b295a7493fe10035Oleg Drokin * there */ 26961d7258bf144ff388f51d0a3b295a7493fe10035Oleg Drokin if (req->rq_import) 27061d7258bf144ff388f51d0a3b295a7493fe10035Oleg Drokin spin_lock(&req->rq_import->imp_lock); 271d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao memcpy(newbuf, req->rq_reqbuf, req->rq_reqlen); 272d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 273d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao OBD_FREE_LARGE(req->rq_reqbuf, req->rq_reqbuf_len); 274d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao req->rq_reqbuf = req->rq_reqmsg = newbuf; 275d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao req->rq_reqbuf_len = alloc_size; 27661d7258bf144ff388f51d0a3b295a7493fe10035Oleg Drokin 27761d7258bf144ff388f51d0a3b295a7493fe10035Oleg Drokin if (req->rq_import) 27861d7258bf144ff388f51d0a3b295a7493fe10035Oleg Drokin spin_unlock(&req->rq_import->imp_lock); 279d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao } 280d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 281d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao _sptlrpc_enlarge_msg_inplace(req->rq_reqmsg, segment, newsize); 282d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao req->rq_reqlen = newmsg_size; 283d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 284d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao return 0; 285d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao} 286d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 287d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taostatic struct ptlrpc_svc_ctx null_svc_ctx = { 288d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao .sc_refcount = ATOMIC_INIT(1), 289d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao .sc_policy = &null_policy, 290d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao}; 291d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 292d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taostatic 293d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taoint null_accept(struct ptlrpc_request *req) 294d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao{ 295d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao LASSERT(SPTLRPC_FLVR_POLICY(req->rq_flvr.sf_rpc) == 296d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao SPTLRPC_POLICY_NULL); 297d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 298d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao if (req->rq_flvr.sf_rpc != SPTLRPC_FLVR_NULL) { 299d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao CERROR("Invalid rpc flavor 0x%x\n", req->rq_flvr.sf_rpc); 300d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao return SECSVC_DROP; 301d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao } 302d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 303d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao req->rq_sp_from = null_decode_sec_part(req->rq_reqbuf); 304d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 305d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao req->rq_reqmsg = req->rq_reqbuf; 306d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao req->rq_reqlen = req->rq_reqdata_len; 307d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 308d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao req->rq_svc_ctx = &null_svc_ctx; 309d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao atomic_inc(&req->rq_svc_ctx->sc_refcount); 310d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 311d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao return SECSVC_OK; 312d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao} 313d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 314d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taostatic 315d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taoint null_alloc_rs(struct ptlrpc_request *req, int msgsize) 316d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao{ 317d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct ptlrpc_reply_state *rs; 318d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao int rs_size = sizeof(*rs) + msgsize; 319d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 320d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao LASSERT(msgsize % 8 == 0); 321d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 322d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao rs = req->rq_reply_state; 323d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 324d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao if (rs) { 325d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao /* pre-allocated */ 326d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao LASSERT(rs->rs_size >= rs_size); 327d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao } else { 328d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao OBD_ALLOC_LARGE(rs, rs_size); 329d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao if (rs == NULL) 330d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao return -ENOMEM; 331d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 332d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao rs->rs_size = rs_size; 333d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao } 334d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 335d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao rs->rs_svc_ctx = req->rq_svc_ctx; 336d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao atomic_inc(&req->rq_svc_ctx->sc_refcount); 337d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 338d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao rs->rs_repbuf = (struct lustre_msg *) (rs + 1); 339d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao rs->rs_repbuf_len = rs_size - sizeof(*rs); 340d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao rs->rs_msg = rs->rs_repbuf; 341d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 342d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao req->rq_reply_state = rs; 343d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao return 0; 344d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao} 345d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 346d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taostatic 347d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taovoid null_free_rs(struct ptlrpc_reply_state *rs) 348d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao{ 349d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao LASSERT_ATOMIC_GT(&rs->rs_svc_ctx->sc_refcount, 1); 350d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao atomic_dec(&rs->rs_svc_ctx->sc_refcount); 351d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 352d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao if (!rs->rs_prealloc) 353d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao OBD_FREE_LARGE(rs, rs->rs_size); 354d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao} 355d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 356d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taostatic 357d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taoint null_authorize(struct ptlrpc_request *req) 358d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao{ 359d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct ptlrpc_reply_state *rs = req->rq_reply_state; 360d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 361d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao LASSERT(rs); 362d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 363d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao rs->rs_repbuf->lm_secflvr = SPTLRPC_FLVR_NULL; 364d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao rs->rs_repdata_len = req->rq_replen; 365d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 366d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao if (likely(req->rq_packed_final)) { 367d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao if (lustre_msghdr_get_flags(req->rq_reqmsg) & MSGHDR_AT_SUPPORT) 368d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao req->rq_reply_off = lustre_msg_early_size(); 369d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao else 370d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao req->rq_reply_off = 0; 371d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao } else { 372d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao __u32 cksum; 373d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 374d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao#if LUSTRE_VERSION_CODE < OBD_OCD_VERSION(2, 7, 50, 0) 375d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao if (lustre_msghdr_get_flags(req->rq_reqmsg) & 376d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao MSGHDR_CKSUM_INCOMPAT18) 377d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao cksum = lustre_msg_calc_cksum(rs->rs_repbuf, 0); 378d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao else 379d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao cksum = lustre_msg_calc_cksum(rs->rs_repbuf, 1); 380d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao#else 381d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao# warning "remove checksum compatibility support for b1_8" 382d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao cksum = lustre_msg_calc_cksum(rs->rs_repbuf); 383d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao#endif 384d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao lustre_msg_set_cksum(rs->rs_repbuf, cksum); 385d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao req->rq_reply_off = 0; 386d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao } 387d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 388d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao return 0; 389d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao} 390d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 391d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taostatic struct ptlrpc_ctx_ops null_ctx_ops = { 392d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao .refresh = null_ctx_refresh, 393d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao .sign = null_ctx_sign, 394d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao .verify = null_ctx_verify, 395d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao}; 396d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 397d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taostatic struct ptlrpc_sec_cops null_sec_cops = { 398d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao .create_sec = null_create_sec, 399d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao .destroy_sec = null_destroy_sec, 400d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao .lookup_ctx = null_lookup_ctx, 401d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao .flush_ctx_cache = null_flush_ctx_cache, 402d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao .alloc_reqbuf = null_alloc_reqbuf, 403d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao .alloc_repbuf = null_alloc_repbuf, 404d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao .free_reqbuf = null_free_reqbuf, 405d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao .free_repbuf = null_free_repbuf, 406d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao .enlarge_reqbuf = null_enlarge_reqbuf, 407d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao}; 408d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 409d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taostatic struct ptlrpc_sec_sops null_sec_sops = { 410d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao .accept = null_accept, 411d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao .alloc_rs = null_alloc_rs, 412d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao .authorize = null_authorize, 413d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao .free_rs = null_free_rs, 414d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao}; 415d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 416d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taostatic struct ptlrpc_sec_policy null_policy = { 417d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao .sp_owner = THIS_MODULE, 418d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao .sp_name = "sec.null", 419d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao .sp_policy = SPTLRPC_POLICY_NULL, 420d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao .sp_cops = &null_sec_cops, 421d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao .sp_sops = &null_sec_sops, 422d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao}; 423d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 424d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taostatic void null_init_internal(void) 425d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao{ 426d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao static HLIST_HEAD(__list); 427d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 428d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao null_sec.ps_policy = &null_policy; 429d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao atomic_set(&null_sec.ps_refcount, 1); /* always busy */ 430d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao null_sec.ps_id = -1; 431d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao null_sec.ps_import = NULL; 432d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao null_sec.ps_flvr.sf_rpc = SPTLRPC_FLVR_NULL; 433d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao null_sec.ps_flvr.sf_flags = 0; 434d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao null_sec.ps_part = LUSTRE_SP_ANY; 435d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao null_sec.ps_dying = 0; 436d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao spin_lock_init(&null_sec.ps_lock); 437d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao atomic_set(&null_sec.ps_nctx, 1); /* for "null_cli_ctx" */ 438d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao INIT_LIST_HEAD(&null_sec.ps_gc_list); 439d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao null_sec.ps_gc_interval = 0; 440d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao null_sec.ps_gc_next = 0; 441d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 442d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao hlist_add_head(&null_cli_ctx.cc_cache, &__list); 443d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao atomic_set(&null_cli_ctx.cc_refcount, 1); /* for hash */ 444d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao null_cli_ctx.cc_sec = &null_sec; 445d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao null_cli_ctx.cc_ops = &null_ctx_ops; 446d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao null_cli_ctx.cc_expire = 0; 447d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao null_cli_ctx.cc_flags = PTLRPC_CTX_CACHED | PTLRPC_CTX_ETERNAL | 448d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao PTLRPC_CTX_UPTODATE; 449d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao null_cli_ctx.cc_vcred.vc_uid = 0; 450d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao spin_lock_init(&null_cli_ctx.cc_lock); 451d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao INIT_LIST_HEAD(&null_cli_ctx.cc_req_list); 452d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao INIT_LIST_HEAD(&null_cli_ctx.cc_gc_chain); 453d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao} 454d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 455d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taoint sptlrpc_null_init(void) 456d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao{ 457d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao int rc; 458d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 459d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao null_init_internal(); 460d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 461d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao rc = sptlrpc_register_policy(&null_policy); 462d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao if (rc) 463d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao CERROR("failed to register %s: %d\n", null_policy.sp_name, rc); 464d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 465d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao return rc; 466d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao} 467d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 468d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taovoid sptlrpc_null_fini(void) 469d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao{ 470d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao int rc; 471d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 472d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao rc = sptlrpc_unregister_policy(&null_policy); 473d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao if (rc) 4741d8cb70c7bdda47125ed551fc390aa9597c5f264Greg Donald CERROR("failed to unregister %s: %d\n", 4751d8cb70c7bdda47125ed551fc390aa9597c5f264Greg Donald null_policy.sp_name, rc); 476d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao} 477