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) 2003, 2010, Oracle and/or its affiliates. All rights reserved. 28d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * Use is subject to license terms. 29d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * 30d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * Copyright (c) 2010, 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 37d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao/** 38d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * This file deals with various client/target related logic including recovery. 39d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * 40d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * TODO: This code more logically belongs in the ptlrpc module than in ldlm and 41d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * should be moved. 42d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao */ 43d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 44d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao#define DEBUG_SUBSYSTEM S_LDLM 45d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 469fdaf8c0b92ab374f8501eb47855776afc928e45Greg Kroah-Hartman#include "../../include/linux/libcfs/libcfs.h" 47e27db14919269176ec040479d199225a37aafb8cGreg Kroah-Hartman#include "../include/obd.h" 48e27db14919269176ec040479d199225a37aafb8cGreg Kroah-Hartman#include "../include/obd_class.h" 49e27db14919269176ec040479d199225a37aafb8cGreg Kroah-Hartman#include "../include/lustre_dlm.h" 50e27db14919269176ec040479d199225a37aafb8cGreg Kroah-Hartman#include "../include/lustre_net.h" 51e27db14919269176ec040479d199225a37aafb8cGreg Kroah-Hartman#include "../include/lustre_sec.h" 52d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao#include "ldlm_internal.h" 53d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 54d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao/* @priority: If non-zero, move the selected connection to the list head. 55d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * @create: If zero, only search in existing connections. 56d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao */ 57d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taostatic int import_set_conn(struct obd_import *imp, struct obd_uuid *uuid, 58d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao int priority, int create) 59d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao{ 60d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct ptlrpc_connection *ptlrpc_conn; 61d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct obd_import_conn *imp_conn = NULL, *item; 62d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao int rc = 0; 63d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 64d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao if (!create && !priority) { 65d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao CDEBUG(D_HA, "Nothing to do\n"); 660a3bdb00710bf253ba8ba8f645645f22297c7a04Greg Kroah-Hartman return -EINVAL; 67d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao } 68d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 69d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao ptlrpc_conn = ptlrpc_uuid_to_connection(uuid); 70d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao if (!ptlrpc_conn) { 71d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao CDEBUG(D_HA, "can't find connection %s\n", uuid->uuid); 720a3bdb00710bf253ba8ba8f645645f22297c7a04Greg Kroah-Hartman return -ENOENT; 73d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao } 74d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 75d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao if (create) { 76d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao OBD_ALLOC(imp_conn, sizeof(*imp_conn)); 77d1c0d446da8e0255a0edb348325cac293e9eff4cJulia Lawall if (!imp_conn) { 78d1c0d446da8e0255a0edb348325cac293e9eff4cJulia Lawall rc = -ENOMEM; 79d1c0d446da8e0255a0edb348325cac293e9eff4cJulia Lawall goto out_put; 80d1c0d446da8e0255a0edb348325cac293e9eff4cJulia Lawall } 81d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao } 82d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 83d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao spin_lock(&imp->imp_lock); 84d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao list_for_each_entry(item, &imp->imp_conn_list, oic_item) { 85d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao if (obd_uuid_equals(uuid, &item->oic_uuid)) { 86d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao if (priority) { 87d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao list_del(&item->oic_item); 88d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao list_add(&item->oic_item, 89d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao &imp->imp_conn_list); 90d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao item->oic_last_attempt = 0; 91d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao } 92d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao CDEBUG(D_HA, "imp %p@%s: found existing conn %s%s\n", 93d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao imp, imp->imp_obd->obd_name, uuid->uuid, 94d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao (priority ? ", moved to head" : "")); 95d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao spin_unlock(&imp->imp_lock); 96d1c0d446da8e0255a0edb348325cac293e9eff4cJulia Lawall rc = 0; 97d1c0d446da8e0255a0edb348325cac293e9eff4cJulia Lawall goto out_free; 98d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao } 99d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao } 100d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao /* No existing import connection found for \a uuid. */ 101d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao if (create) { 102d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao imp_conn->oic_conn = ptlrpc_conn; 103d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao imp_conn->oic_uuid = *uuid; 104d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao imp_conn->oic_last_attempt = 0; 105d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao if (priority) 106d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao list_add(&imp_conn->oic_item, &imp->imp_conn_list); 107d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao else 108d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao list_add_tail(&imp_conn->oic_item, 109d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao &imp->imp_conn_list); 110d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao CDEBUG(D_HA, "imp %p@%s: add connection %s at %s\n", 111d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao imp, imp->imp_obd->obd_name, uuid->uuid, 112d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao (priority ? "head" : "tail")); 113d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao } else { 114d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao spin_unlock(&imp->imp_lock); 115d1c0d446da8e0255a0edb348325cac293e9eff4cJulia Lawall rc = -ENOENT; 116d1c0d446da8e0255a0edb348325cac293e9eff4cJulia Lawall goto out_free; 117d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao } 118d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 119d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao spin_unlock(&imp->imp_lock); 1200a3bdb00710bf253ba8ba8f645645f22297c7a04Greg Kroah-Hartman return 0; 121d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taoout_free: 122d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao if (imp_conn) 123d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao OBD_FREE(imp_conn, sizeof(*imp_conn)); 124d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taoout_put: 125d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao ptlrpc_connection_put(ptlrpc_conn); 1260a3bdb00710bf253ba8ba8f645645f22297c7a04Greg Kroah-Hartman return rc; 127d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao} 128d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 129d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taoint import_set_conn_priority(struct obd_import *imp, struct obd_uuid *uuid) 130d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao{ 131d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao return import_set_conn(imp, uuid, 1, 0); 132d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao} 133d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 134d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taoint client_import_add_conn(struct obd_import *imp, struct obd_uuid *uuid, 135d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao int priority) 136d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao{ 137d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao return import_set_conn(imp, uuid, priority, 1); 138d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao} 139d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng TaoEXPORT_SYMBOL(client_import_add_conn); 140d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 141d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taoint client_import_del_conn(struct obd_import *imp, struct obd_uuid *uuid) 142d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao{ 143d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct obd_import_conn *imp_conn; 144d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct obd_export *dlmexp; 145d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao int rc = -ENOENT; 146d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 147d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao spin_lock(&imp->imp_lock); 148d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao if (list_empty(&imp->imp_conn_list)) { 149d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao LASSERT(!imp->imp_connection); 150d1c0d446da8e0255a0edb348325cac293e9eff4cJulia Lawall goto out; 151d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao } 152d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 153d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao list_for_each_entry(imp_conn, &imp->imp_conn_list, oic_item) { 154d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao if (!obd_uuid_equals(uuid, &imp_conn->oic_uuid)) 155d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao continue; 156d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao LASSERT(imp_conn->oic_conn); 157d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 158d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao if (imp_conn == imp->imp_conn_current) { 159d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao LASSERT(imp_conn->oic_conn == imp->imp_connection); 160d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 161d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao if (imp->imp_state != LUSTRE_IMP_CLOSED && 162d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao imp->imp_state != LUSTRE_IMP_DISCON) { 163d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao CERROR("can't remove current connection\n"); 164d1c0d446da8e0255a0edb348325cac293e9eff4cJulia Lawall rc = -EBUSY; 165d1c0d446da8e0255a0edb348325cac293e9eff4cJulia Lawall goto out; 166d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao } 167d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 168d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao ptlrpc_connection_put(imp->imp_connection); 169d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao imp->imp_connection = NULL; 170d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 171d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao dlmexp = class_conn2export(&imp->imp_dlm_handle); 172d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao if (dlmexp && dlmexp->exp_connection) { 173d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao LASSERT(dlmexp->exp_connection == 174d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao imp_conn->oic_conn); 175d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao ptlrpc_connection_put(dlmexp->exp_connection); 176d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao dlmexp->exp_connection = NULL; 177d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao } 178d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao } 179d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 180d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao list_del(&imp_conn->oic_item); 181d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao ptlrpc_connection_put(imp_conn->oic_conn); 182d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao OBD_FREE(imp_conn, sizeof(*imp_conn)); 183d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao CDEBUG(D_HA, "imp %p@%s: remove connection %s\n", 184d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao imp, imp->imp_obd->obd_name, uuid->uuid); 185d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao rc = 0; 186d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao break; 187d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao } 188d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taoout: 189d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao spin_unlock(&imp->imp_lock); 190d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao if (rc == -ENOENT) 191d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao CERROR("connection %s not found\n", uuid->uuid); 1920a3bdb00710bf253ba8ba8f645645f22297c7a04Greg Kroah-Hartman return rc; 193d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao} 194d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng TaoEXPORT_SYMBOL(client_import_del_conn); 195d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 196d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao/** 197d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * Find conn UUID by peer NID. \a peer is a server NID. This function is used 198d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * to find a conn uuid of \a imp which can reach \a peer. 199d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao */ 200d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taoint client_import_find_conn(struct obd_import *imp, lnet_nid_t peer, 201d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct obd_uuid *uuid) 202d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao{ 203d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct obd_import_conn *conn; 204d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao int rc = -ENOENT; 205d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 206d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao spin_lock(&imp->imp_lock); 207d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao list_for_each_entry(conn, &imp->imp_conn_list, oic_item) { 208d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao /* Check if conn UUID does have this peer NID. */ 209d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao if (class_check_uuid(&conn->oic_uuid, peer)) { 210d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao *uuid = conn->oic_uuid; 211d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao rc = 0; 212d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao break; 213d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao } 214d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao } 215d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao spin_unlock(&imp->imp_lock); 2160a3bdb00710bf253ba8ba8f645645f22297c7a04Greg Kroah-Hartman return rc; 217d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao} 218d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng TaoEXPORT_SYMBOL(client_import_find_conn); 219d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 220d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taovoid client_destroy_import(struct obd_import *imp) 221d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao{ 222d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao /* Drop security policy instance after all RPCs have finished/aborted 223d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * to let all busy contexts be released. */ 224d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao class_import_get(imp); 225d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao class_destroy_import(imp); 226d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao sptlrpc_import_sec_put(imp); 227d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao class_import_put(imp); 228d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao} 229d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng TaoEXPORT_SYMBOL(client_destroy_import); 230d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 231d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao/** 232d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * Check whether or not the OSC is on MDT. 233d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * In the config log, 234d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * osc on MDT 235d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * setup 0:{fsname}-OSTxxxx-osc[-MDTxxxx] 1:lustre-OST0000_UUID 2:NID 236d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * osc on client 237d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * setup 0:{fsname}-OSTxxxx-osc 1:lustre-OST0000_UUID 2:NID 238d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * 239d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao **/ 240d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taostatic int osc_on_mdt(char *obdname) 241d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao{ 242d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao char *ptr; 243d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 244d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao ptr = strrchr(obdname, '-'); 245d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao if (ptr == NULL) 246d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao return 0; 247d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 248d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao if (strncmp(ptr + 1, "MDT", 3) == 0) 249d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao return 1; 250d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 251d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao return 0; 252d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao} 253d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 254d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao/* Configure an RPC client OBD device. 255d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * 256d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * lcfg parameters: 257d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * 1 - client UUID 258d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * 2 - server UUID 259d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * 3 - inactive-on-startup 260d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao */ 261d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taoint client_obd_setup(struct obd_device *obddev, struct lustre_cfg *lcfg) 262d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao{ 263d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct client_obd *cli = &obddev->u.cli; 264d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct obd_import *imp; 265d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct obd_uuid server_uuid; 266d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao int rq_portal, rp_portal, connect_op; 267d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao char *name = obddev->obd_type->typ_name; 268d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao ldlm_ns_type_t ns_type = LDLM_NS_TYPE_UNKNOWN; 269d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao int rc; 270d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 271d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao /* In a more perfect world, we would hang a ptlrpc_client off of 272d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * obd_type and just use the values from there. */ 273a33105259f5e79a06e9e0a3f233991584b5320b2Mikhail Pershin if (!strcmp(name, LUSTRE_OSC_NAME)) { 274d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao rq_portal = OST_REQUEST_PORTAL; 275d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao rp_portal = OSC_REPLY_PORTAL; 276d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao connect_op = OST_CONNECT; 277d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao cli->cl_sp_me = LUSTRE_SP_CLI; 278d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao cli->cl_sp_to = LUSTRE_SP_OST; 279d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao ns_type = LDLM_NS_TYPE_OSC; 280d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao } else if (!strcmp(name, LUSTRE_MDC_NAME) || 281a33105259f5e79a06e9e0a3f233991584b5320b2Mikhail Pershin !strcmp(name, LUSTRE_LWP_NAME)) { 282d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao rq_portal = MDS_REQUEST_PORTAL; 283d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao rp_portal = MDC_REPLY_PORTAL; 284d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao connect_op = MDS_CONNECT; 285d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao cli->cl_sp_me = LUSTRE_SP_CLI; 286d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao cli->cl_sp_to = LUSTRE_SP_MDT; 287d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao ns_type = LDLM_NS_TYPE_MDC; 288a33105259f5e79a06e9e0a3f233991584b5320b2Mikhail Pershin } else if (!strcmp(name, LUSTRE_OSP_NAME)) { 289a33105259f5e79a06e9e0a3f233991584b5320b2Mikhail Pershin if (strstr(lustre_cfg_buf(lcfg, 1), "OST") == NULL) { 290a33105259f5e79a06e9e0a3f233991584b5320b2Mikhail Pershin /* OSP_on_MDT for other MDTs */ 291a33105259f5e79a06e9e0a3f233991584b5320b2Mikhail Pershin connect_op = MDS_CONNECT; 292a33105259f5e79a06e9e0a3f233991584b5320b2Mikhail Pershin cli->cl_sp_to = LUSTRE_SP_MDT; 293a33105259f5e79a06e9e0a3f233991584b5320b2Mikhail Pershin ns_type = LDLM_NS_TYPE_MDC; 294a33105259f5e79a06e9e0a3f233991584b5320b2Mikhail Pershin rq_portal = OUT_PORTAL; 295a33105259f5e79a06e9e0a3f233991584b5320b2Mikhail Pershin } else { 296a33105259f5e79a06e9e0a3f233991584b5320b2Mikhail Pershin /* OSP on MDT for OST */ 297a33105259f5e79a06e9e0a3f233991584b5320b2Mikhail Pershin connect_op = OST_CONNECT; 298a33105259f5e79a06e9e0a3f233991584b5320b2Mikhail Pershin cli->cl_sp_to = LUSTRE_SP_OST; 299a33105259f5e79a06e9e0a3f233991584b5320b2Mikhail Pershin ns_type = LDLM_NS_TYPE_OSC; 300a33105259f5e79a06e9e0a3f233991584b5320b2Mikhail Pershin rq_portal = OST_REQUEST_PORTAL; 301a33105259f5e79a06e9e0a3f233991584b5320b2Mikhail Pershin } 302a33105259f5e79a06e9e0a3f233991584b5320b2Mikhail Pershin rp_portal = OSC_REPLY_PORTAL; 303a33105259f5e79a06e9e0a3f233991584b5320b2Mikhail Pershin cli->cl_sp_me = LUSTRE_SP_CLI; 304d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao } else if (!strcmp(name, LUSTRE_MGC_NAME)) { 305d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao rq_portal = MGS_REQUEST_PORTAL; 306d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao rp_portal = MGC_REPLY_PORTAL; 307d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao connect_op = MGS_CONNECT; 308d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao cli->cl_sp_me = LUSTRE_SP_MGC; 309d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao cli->cl_sp_to = LUSTRE_SP_MGS; 310d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao cli->cl_flvr_mgc.sf_rpc = SPTLRPC_FLVR_INVALID; 311d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao ns_type = LDLM_NS_TYPE_MGC; 312d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao } else { 313d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao CERROR("unknown client OBD type \"%s\", can't setup\n", 314d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao name); 3150a3bdb00710bf253ba8ba8f645645f22297c7a04Greg Kroah-Hartman return -EINVAL; 316d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao } 317d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 318d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao if (LUSTRE_CFG_BUFLEN(lcfg, 1) < 1) { 319d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao CERROR("requires a TARGET UUID\n"); 3200a3bdb00710bf253ba8ba8f645645f22297c7a04Greg Kroah-Hartman return -EINVAL; 321d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao } 322d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 323d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao if (LUSTRE_CFG_BUFLEN(lcfg, 1) > 37) { 324d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao CERROR("client UUID must be less than 38 characters\n"); 3250a3bdb00710bf253ba8ba8f645645f22297c7a04Greg Kroah-Hartman return -EINVAL; 326d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao } 327d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 328d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao if (LUSTRE_CFG_BUFLEN(lcfg, 2) < 1) { 329d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao CERROR("setup requires a SERVER UUID\n"); 3300a3bdb00710bf253ba8ba8f645645f22297c7a04Greg Kroah-Hartman return -EINVAL; 331d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao } 332d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 333d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao if (LUSTRE_CFG_BUFLEN(lcfg, 2) > 37) { 334d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao CERROR("target UUID must be less than 38 characters\n"); 3350a3bdb00710bf253ba8ba8f645645f22297c7a04Greg Kroah-Hartman return -EINVAL; 336d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao } 337d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 338d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao init_rwsem(&cli->cl_sem); 3396246dab1d0d3a91614eb0360e51d9e98b919dbb1Dmitry Eremin mutex_init(&cli->cl_mgc_mutex); 340d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao cli->cl_conn_count = 0; 341d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao memcpy(server_uuid.uuid, lustre_cfg_buf(lcfg, 2), 342d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao min_t(unsigned int, LUSTRE_CFG_BUFLEN(lcfg, 2), 343d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao sizeof(server_uuid))); 344d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 345d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao cli->cl_dirty = 0; 346d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao cli->cl_avail_grant = 0; 347d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao /* FIXME: Should limit this for the sum of all cl_dirty_max. */ 348d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao cli->cl_dirty_max = OSC_MAX_DIRTY_DEFAULT * 1024 * 1024; 3494f6cc9ab5337879c4a79564b3aed4fa429d1cd12Peng Tao if (cli->cl_dirty_max >> PAGE_CACHE_SHIFT > totalram_pages / 8) 3504f6cc9ab5337879c4a79564b3aed4fa429d1cd12Peng Tao cli->cl_dirty_max = totalram_pages << (PAGE_CACHE_SHIFT - 3); 351d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao INIT_LIST_HEAD(&cli->cl_cache_waiters); 352d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao INIT_LIST_HEAD(&cli->cl_loi_ready_list); 353d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao INIT_LIST_HEAD(&cli->cl_loi_hp_ready_list); 354d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao INIT_LIST_HEAD(&cli->cl_loi_write_list); 355d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao INIT_LIST_HEAD(&cli->cl_loi_read_list); 356d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao client_obd_list_lock_init(&cli->cl_loi_list_lock); 357d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao atomic_set(&cli->cl_pending_w_pages, 0); 358d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao atomic_set(&cli->cl_pending_r_pages, 0); 359d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao cli->cl_r_in_flight = 0; 360d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao cli->cl_w_in_flight = 0; 361d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 362d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao spin_lock_init(&cli->cl_read_rpc_hist.oh_lock); 363d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao spin_lock_init(&cli->cl_write_rpc_hist.oh_lock); 364d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao spin_lock_init(&cli->cl_read_page_hist.oh_lock); 365d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao spin_lock_init(&cli->cl_write_page_hist.oh_lock); 366d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao spin_lock_init(&cli->cl_read_offset_hist.oh_lock); 367d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao spin_lock_init(&cli->cl_write_offset_hist.oh_lock); 368d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 369d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao /* lru for osc. */ 370d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao INIT_LIST_HEAD(&cli->cl_lru_osc); 371d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao atomic_set(&cli->cl_lru_shrinkers, 0); 372d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao atomic_set(&cli->cl_lru_busy, 0); 373d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao atomic_set(&cli->cl_lru_in_list, 0); 374d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao INIT_LIST_HEAD(&cli->cl_lru_list); 375d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao client_obd_list_lock_init(&cli->cl_lru_list_lock); 376d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 377d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao init_waitqueue_head(&cli->cl_destroy_waitq); 378d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao atomic_set(&cli->cl_destroy_in_flight, 0); 379d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao /* Turn on checksumming by default. */ 380d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao cli->cl_checksum = 1; 381d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao /* 382d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * The supported checksum types will be worked out at connect time 383d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * Set cl_chksum* to CRC32 for now to avoid returning screwed info 384d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * through procfs. 385d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao */ 386d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao cli->cl_cksum_type = cli->cl_supp_cksum_types = OBD_CKSUM_CRC32; 387d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao atomic_set(&cli->cl_resends, OSC_DEFAULT_RESENDS); 388d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 389d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao /* This value may be reduced at connect time in 390d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * ptlrpc_connect_interpret() . We initialize it to only 391d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * 1MB until we know what the performance looks like. 392d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * In the future this should likely be increased. LU-1431 */ 393d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao cli->cl_max_pages_per_rpc = min_t(int, PTLRPC_MAX_BRW_PAGES, 394d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao LNET_MTU >> PAGE_CACHE_SHIFT); 395d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 396d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao if (!strcmp(name, LUSTRE_MDC_NAME)) { 397d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao cli->cl_max_rpcs_in_flight = MDC_MAX_RIF_DEFAULT; 3984f6cc9ab5337879c4a79564b3aed4fa429d1cd12Peng Tao } else if (totalram_pages >> (20 - PAGE_CACHE_SHIFT) <= 128 /* MB */) { 399d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao cli->cl_max_rpcs_in_flight = 2; 4004f6cc9ab5337879c4a79564b3aed4fa429d1cd12Peng Tao } else if (totalram_pages >> (20 - PAGE_CACHE_SHIFT) <= 256 /* MB */) { 401d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao cli->cl_max_rpcs_in_flight = 3; 4024f6cc9ab5337879c4a79564b3aed4fa429d1cd12Peng Tao } else if (totalram_pages >> (20 - PAGE_CACHE_SHIFT) <= 512 /* MB */) { 403d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao cli->cl_max_rpcs_in_flight = 4; 404d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao } else { 405d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao if (osc_on_mdt(obddev->obd_name)) 406d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao cli->cl_max_rpcs_in_flight = MDS_OSC_MAX_RIF_DEFAULT; 407d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao else 408d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao cli->cl_max_rpcs_in_flight = OSC_MAX_RIF_DEFAULT; 409d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao } 410d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao rc = ldlm_get_ref(); 411d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao if (rc) { 412d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao CERROR("ldlm_get_ref failed: %d\n", rc); 413d1c0d446da8e0255a0edb348325cac293e9eff4cJulia Lawall goto err; 414d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao } 415d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 416d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao ptlrpc_init_client(rq_portal, rp_portal, name, 417d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao &obddev->obd_ldlm_client); 418d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 419d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao imp = class_new_import(obddev); 420d1c0d446da8e0255a0edb348325cac293e9eff4cJulia Lawall if (imp == NULL) { 421d1c0d446da8e0255a0edb348325cac293e9eff4cJulia Lawall rc = -ENOENT; 422d1c0d446da8e0255a0edb348325cac293e9eff4cJulia Lawall goto err_ldlm; 423d1c0d446da8e0255a0edb348325cac293e9eff4cJulia Lawall } 424d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao imp->imp_client = &obddev->obd_ldlm_client; 425d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao imp->imp_connect_op = connect_op; 426d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao memcpy(cli->cl_target_uuid.uuid, lustre_cfg_buf(lcfg, 1), 427d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao LUSTRE_CFG_BUFLEN(lcfg, 1)); 428d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao class_import_put(imp); 429d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 430d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao rc = client_import_add_conn(imp, &server_uuid, 1); 431d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao if (rc) { 432d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao CERROR("can't add initial connection\n"); 433d1c0d446da8e0255a0edb348325cac293e9eff4cJulia Lawall goto err_import; 434d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao } 435d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 436d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao cli->cl_import = imp; 437d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao /* cli->cl_max_mds_{easize,cookiesize} updated by mdc_init_ea_size() */ 438d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao cli->cl_max_mds_easize = sizeof(struct lov_mds_md_v3); 439d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao cli->cl_max_mds_cookiesize = sizeof(struct llog_cookie); 440d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 441d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao if (LUSTRE_CFG_BUFLEN(lcfg, 3) > 0) { 442d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao if (!strcmp(lustre_cfg_string(lcfg, 3), "inactive")) { 443d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao CDEBUG(D_HA, "marking %s %s->%s as inactive\n", 444d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao name, obddev->obd_name, 445d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao cli->cl_target_uuid.uuid); 446d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao spin_lock(&imp->imp_lock); 447d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao imp->imp_deactive = 1; 448d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao spin_unlock(&imp->imp_lock); 449d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao } 450d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao } 451d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 452d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao obddev->obd_namespace = ldlm_namespace_new(obddev, obddev->obd_name, 453d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao LDLM_NAMESPACE_CLIENT, 454d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao LDLM_NAMESPACE_GREEDY, 455d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao ns_type); 456d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao if (obddev->obd_namespace == NULL) { 457d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao CERROR("Unable to create client namespace - %s\n", 458d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao obddev->obd_name); 459d1c0d446da8e0255a0edb348325cac293e9eff4cJulia Lawall rc = -ENOMEM; 460d1c0d446da8e0255a0edb348325cac293e9eff4cJulia Lawall goto err_import; 461d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao } 462d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 463d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao cli->cl_qchk_stat = CL_NOT_QUOTACHECKED; 464d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 4650a3bdb00710bf253ba8ba8f645645f22297c7a04Greg Kroah-Hartman return rc; 466d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 467d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taoerr_import: 468d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao class_destroy_import(imp); 469d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taoerr_ldlm: 470d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao ldlm_put_ref(); 471d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taoerr: 4720a3bdb00710bf253ba8ba8f645645f22297c7a04Greg Kroah-Hartman return rc; 473d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 474d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao} 475d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng TaoEXPORT_SYMBOL(client_obd_setup); 476d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 477d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taoint client_obd_cleanup(struct obd_device *obddev) 478d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao{ 479d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao ldlm_namespace_free_post(obddev->obd_namespace); 480d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao obddev->obd_namespace = NULL; 481d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 482d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao LASSERT(obddev->u.cli.cl_import == NULL); 483d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 484d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao ldlm_put_ref(); 4850a3bdb00710bf253ba8ba8f645645f22297c7a04Greg Kroah-Hartman return 0; 486d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao} 487d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng TaoEXPORT_SYMBOL(client_obd_cleanup); 488d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 489d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao/* ->o_connect() method for client side (OSC and MDC and MGC) */ 490d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taoint client_connect_import(const struct lu_env *env, 491d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct obd_export **exp, 492d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct obd_device *obd, struct obd_uuid *cluuid, 493d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct obd_connect_data *data, void *localdata) 494d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao{ 495d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct client_obd *cli = &obd->u.cli; 496d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct obd_import *imp = cli->cl_import; 497d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct obd_connect_data *ocd; 498d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct lustre_handle conn = { 0 }; 499d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao int rc; 500d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 501d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao *exp = NULL; 502d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao down_write(&cli->cl_sem); 503d1c0d446da8e0255a0edb348325cac293e9eff4cJulia Lawall if (cli->cl_conn_count > 0) { 504d1c0d446da8e0255a0edb348325cac293e9eff4cJulia Lawall rc = -EALREADY; 505d1c0d446da8e0255a0edb348325cac293e9eff4cJulia Lawall goto out_sem; 506d1c0d446da8e0255a0edb348325cac293e9eff4cJulia Lawall } 507d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 508d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao rc = class_connect(&conn, obd, cluuid); 509d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao if (rc) 510d1c0d446da8e0255a0edb348325cac293e9eff4cJulia Lawall goto out_sem; 511d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 512d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao cli->cl_conn_count++; 513d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao *exp = class_conn2export(&conn); 514d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 515d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao LASSERT(obd->obd_namespace); 516d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 517d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao imp->imp_dlm_handle = conn; 518d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao rc = ptlrpc_init_import(imp); 519d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao if (rc != 0) 520d1c0d446da8e0255a0edb348325cac293e9eff4cJulia Lawall goto out_ldlm; 521d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 522d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao ocd = &imp->imp_connect_data; 523d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao if (data) { 524d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao *ocd = *data; 525d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao imp->imp_connect_flags_orig = data->ocd_connect_flags; 526d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao } 527d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 528d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao rc = ptlrpc_connect_import(imp); 529d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao if (rc != 0) { 53005dca37303c10c7fa5a58138e6f0c8fb6b5f4e17Anil Belur LASSERT(imp->imp_state == LUSTRE_IMP_DISCON); 531d1c0d446da8e0255a0edb348325cac293e9eff4cJulia Lawall goto out_ldlm; 532d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao } 533f85065e534fe8ba6de9b3443c4beacbc3a6ec32dDmitry Eremin LASSERT(*exp != NULL && (*exp)->exp_connection); 534d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 535d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao if (data) { 536d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao LASSERTF((ocd->ocd_connect_flags & data->ocd_connect_flags) == 53755f5a824b9e727eb159905475028d3cb52370276Greg Kroah-Hartman ocd->ocd_connect_flags, "old %#llx, new %#llx\n", 538d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao data->ocd_connect_flags, ocd->ocd_connect_flags); 539d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao data->ocd_connect_flags = ocd->ocd_connect_flags; 540d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao } 541d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 542d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao ptlrpc_pinger_add_import(imp); 543d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 544d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao if (rc) { 545d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taoout_ldlm: 546d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao cli->cl_conn_count--; 547d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao class_disconnect(*exp); 548d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao *exp = NULL; 549d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao } 550d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taoout_sem: 551d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao up_write(&cli->cl_sem); 552d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 553d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao return rc; 554d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao} 555d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng TaoEXPORT_SYMBOL(client_connect_import); 556d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 557d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taoint client_disconnect_export(struct obd_export *exp) 558d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao{ 559d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct obd_device *obd = class_exp2obd(exp); 560d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct client_obd *cli; 561d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct obd_import *imp; 562d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao int rc = 0, err; 563d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 564d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao if (!obd) { 56555f5a824b9e727eb159905475028d3cb52370276Greg Kroah-Hartman CERROR("invalid export for disconnect: exp %p cookie %#llx\n", 566d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao exp, exp ? exp->exp_handle.h_cookie : -1); 5670a3bdb00710bf253ba8ba8f645645f22297c7a04Greg Kroah-Hartman return -EINVAL; 568d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao } 569d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 570d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao cli = &obd->u.cli; 571d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao imp = cli->cl_import; 572d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 573d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao down_write(&cli->cl_sem); 574d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao CDEBUG(D_INFO, "disconnect %s - %d\n", obd->obd_name, 575d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao cli->cl_conn_count); 576d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 577d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao if (!cli->cl_conn_count) { 578d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao CERROR("disconnecting disconnected device (%s)\n", 579d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao obd->obd_name); 580d1c0d446da8e0255a0edb348325cac293e9eff4cJulia Lawall rc = -EINVAL; 581d1c0d446da8e0255a0edb348325cac293e9eff4cJulia Lawall goto out_disconnect; 582d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao } 583d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 584d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao cli->cl_conn_count--; 585d1c0d446da8e0255a0edb348325cac293e9eff4cJulia Lawall if (cli->cl_conn_count) { 586d1c0d446da8e0255a0edb348325cac293e9eff4cJulia Lawall rc = 0; 587d1c0d446da8e0255a0edb348325cac293e9eff4cJulia Lawall goto out_disconnect; 588d1c0d446da8e0255a0edb348325cac293e9eff4cJulia Lawall } 589d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 590d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao /* Mark import deactivated now, so we don't try to reconnect if any 591d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * of the cleanup RPCs fails (e.g. LDLM cancel, etc). We don't 592d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * fully deactivate the import, or that would drop all requests. */ 593d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao spin_lock(&imp->imp_lock); 594d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao imp->imp_deactive = 1; 595d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao spin_unlock(&imp->imp_lock); 596d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 597d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao /* Some non-replayable imports (MDS's OSCs) are pinged, so just 598d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * delete it regardless. (It's safe to delete an import that was 599d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * never added.) */ 600d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao (void)ptlrpc_pinger_del_import(imp); 601d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 602d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao if (obd->obd_namespace != NULL) { 603d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao /* obd_force == local only */ 604d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao ldlm_cli_cancel_unused(obd->obd_namespace, NULL, 605d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao obd->obd_force ? LCF_LOCAL : 0, NULL); 606d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao ldlm_namespace_free_prior(obd->obd_namespace, imp, obd->obd_force); 607d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao } 608d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 609d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao /* There's no need to hold sem while disconnecting an import, 610d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * and it may actually cause deadlock in GSS. */ 611d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao up_write(&cli->cl_sem); 612d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao rc = ptlrpc_disconnect_import(imp, 0); 613d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao down_write(&cli->cl_sem); 614d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 615d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao ptlrpc_invalidate_import(imp); 616d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 617d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taoout_disconnect: 618d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao /* Use server style - class_disconnect should be always called for 619d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * o_disconnect. */ 620d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao err = class_disconnect(exp); 621d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao if (!rc && err) 622d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao rc = err; 623d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 624d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao up_write(&cli->cl_sem); 625d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 6260a3bdb00710bf253ba8ba8f645645f22297c7a04Greg Kroah-Hartman return rc; 627d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao} 628d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng TaoEXPORT_SYMBOL(client_disconnect_export); 629d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 630d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 631d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao/** 632d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * Packs current SLV and Limit into \a req. 633d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao */ 634d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taoint target_pack_pool_reply(struct ptlrpc_request *req) 635d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao{ 636d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct obd_device *obd; 637d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 638d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao /* Check that we still have all structures alive as this may 639d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * be some late RPC at shutdown time. */ 640d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao if (unlikely(!req->rq_export || !req->rq_export->exp_obd || 641d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao !exp_connect_lru_resize(req->rq_export))) { 642d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao lustre_msg_set_slv(req->rq_repmsg, 0); 643d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao lustre_msg_set_limit(req->rq_repmsg, 0); 6440a3bdb00710bf253ba8ba8f645645f22297c7a04Greg Kroah-Hartman return 0; 645d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao } 646d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 647d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao /* OBD is alive here as export is alive, which we checked above. */ 648d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao obd = req->rq_export->exp_obd; 649d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 650d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao read_lock(&obd->obd_pool_lock); 651d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao lustre_msg_set_slv(req->rq_repmsg, obd->obd_pool_slv); 652d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao lustre_msg_set_limit(req->rq_repmsg, obd->obd_pool_limit); 653d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao read_unlock(&obd->obd_pool_lock); 654d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 6550a3bdb00710bf253ba8ba8f645645f22297c7a04Greg Kroah-Hartman return 0; 656d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao} 657d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng TaoEXPORT_SYMBOL(target_pack_pool_reply); 658d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 659d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taoint target_send_reply_msg(struct ptlrpc_request *req, int rc, int fail_id) 660d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao{ 661d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao if (OBD_FAIL_CHECK_ORSET(fail_id & ~OBD_FAIL_ONCE, OBD_FAIL_ONCE)) { 662d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao DEBUG_REQ(D_ERROR, req, "dropping reply"); 663fbe7c6c72a8f36e78cf3886573bbc0fdd0aa55b5Julia Lawall return -ECOMM; 664d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao } 665d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 666d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao if (unlikely(rc)) { 667d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao DEBUG_REQ(D_NET, req, "processing error (%d)", rc); 668d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao req->rq_status = rc; 669fbe7c6c72a8f36e78cf3886573bbc0fdd0aa55b5Julia Lawall return ptlrpc_send_error(req, 1); 670d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao } else { 671d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao DEBUG_REQ(D_NET, req, "sending reply"); 672d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao } 673d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 674fbe7c6c72a8f36e78cf3886573bbc0fdd0aa55b5Julia Lawall return ptlrpc_send_reply(req, PTLRPC_REPLY_MAYBE_DIFFICULT); 675d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao} 676d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 677d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taovoid target_send_reply(struct ptlrpc_request *req, int rc, int fail_id) 678d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao{ 679d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct ptlrpc_service_part *svcpt; 680d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao int netrc; 681d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct ptlrpc_reply_state *rs; 682d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct obd_export *exp; 683d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 684b7cfd6d4686a7b85aa3db2c40d53087fb1604969Anil Belur if (req->rq_no_reply) 685d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao return; 686d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 687d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao svcpt = req->rq_rqbd->rqbd_svcpt; 688d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao rs = req->rq_reply_state; 689d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao if (rs == NULL || !rs->rs_difficult) { 690d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao /* no notifiers */ 69105dca37303c10c7fa5a58138e6f0c8fb6b5f4e17Anil Belur target_send_reply_msg(req, rc, fail_id); 692d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao return; 693d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao } 694d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 695d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao /* must be an export if locks saved */ 69605dca37303c10c7fa5a58138e6f0c8fb6b5f4e17Anil Belur LASSERT(req->rq_export != NULL); 697d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao /* req/reply consistent */ 698d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao LASSERT(rs->rs_svcpt == svcpt); 699d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 700d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao /* "fresh" reply */ 70105dca37303c10c7fa5a58138e6f0c8fb6b5f4e17Anil Belur LASSERT(!rs->rs_scheduled); 70205dca37303c10c7fa5a58138e6f0c8fb6b5f4e17Anil Belur LASSERT(!rs->rs_scheduled_ever); 70305dca37303c10c7fa5a58138e6f0c8fb6b5f4e17Anil Belur LASSERT(!rs->rs_handled); 70405dca37303c10c7fa5a58138e6f0c8fb6b5f4e17Anil Belur LASSERT(!rs->rs_on_net); 70505dca37303c10c7fa5a58138e6f0c8fb6b5f4e17Anil Belur LASSERT(rs->rs_export == NULL); 70605dca37303c10c7fa5a58138e6f0c8fb6b5f4e17Anil Belur LASSERT(list_empty(&rs->rs_obd_list)); 70705dca37303c10c7fa5a58138e6f0c8fb6b5f4e17Anil Belur LASSERT(list_empty(&rs->rs_exp_list)); 70805dca37303c10c7fa5a58138e6f0c8fb6b5f4e17Anil Belur 70905dca37303c10c7fa5a58138e6f0c8fb6b5f4e17Anil Belur exp = class_export_get(req->rq_export); 710d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 711d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao /* disable reply scheduling while I'm setting up */ 712d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao rs->rs_scheduled = 1; 713d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao rs->rs_on_net = 1; 714d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao rs->rs_xid = req->rq_xid; 715d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao rs->rs_transno = req->rq_transno; 716d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao rs->rs_export = exp; 717d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao rs->rs_opc = lustre_msg_get_opc(req->rq_reqmsg); 718d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 719d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao spin_lock(&exp->exp_uncommitted_replies_lock); 720b0f5aad587ea1fc3563d056609ee54a961ee1256Greg Kroah-Hartman CDEBUG(D_NET, "rs transno = %llu, last committed = %llu\n", 721d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao rs->rs_transno, exp->exp_last_committed); 722d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao if (rs->rs_transno > exp->exp_last_committed) { 723d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao /* not committed already */ 724d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao list_add_tail(&rs->rs_obd_list, 725d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao &exp->exp_uncommitted_replies); 726d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao } 727d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao spin_unlock(&exp->exp_uncommitted_replies_lock); 728d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 729d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao spin_lock(&exp->exp_lock); 730d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao list_add_tail(&rs->rs_exp_list, &exp->exp_outstanding_replies); 731d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao spin_unlock(&exp->exp_lock); 732d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 733d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao netrc = target_send_reply_msg(req, rc, fail_id); 734d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 735d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao spin_lock(&svcpt->scp_rep_lock); 736d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 737d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao atomic_inc(&svcpt->scp_nreps_difficult); 738d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 739d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao if (netrc != 0) { 740d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao /* error sending: reply is off the net. Also we need +1 741d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * reply ref until ptlrpc_handle_rs() is done 742d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * with the reply state (if the send was successful, there 743d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * would have been +1 ref for the net, which 744d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * reply_out_callback leaves alone) */ 745d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao rs->rs_on_net = 0; 746d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao ptlrpc_rs_addref(rs); 747d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao } 748d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 749d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao spin_lock(&rs->rs_lock); 750d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao if (rs->rs_transno <= exp->exp_last_committed || 751d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao (!rs->rs_on_net && !rs->rs_no_ack) || 752d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao list_empty(&rs->rs_exp_list) || /* completed already */ 753d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao list_empty(&rs->rs_obd_list)) { 754d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao CDEBUG(D_HA, "Schedule reply immediately\n"); 755d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao ptlrpc_dispatch_difficult_reply(rs); 756d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao } else { 757d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao list_add(&rs->rs_list, &svcpt->scp_rep_active); 758d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao rs->rs_scheduled = 0; /* allow notifier to schedule */ 759d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao } 760d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao spin_unlock(&rs->rs_lock); 761d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao spin_unlock(&svcpt->scp_rep_lock); 762d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao} 763d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng TaoEXPORT_SYMBOL(target_send_reply); 764d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 765d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taoldlm_mode_t lck_compat_array[] = { 766805e517aae4a8d47f5a5069eabfded1f26e95343Emil Goode [LCK_EX] = LCK_COMPAT_EX, 767805e517aae4a8d47f5a5069eabfded1f26e95343Emil Goode [LCK_PW] = LCK_COMPAT_PW, 768805e517aae4a8d47f5a5069eabfded1f26e95343Emil Goode [LCK_PR] = LCK_COMPAT_PR, 769805e517aae4a8d47f5a5069eabfded1f26e95343Emil Goode [LCK_CW] = LCK_COMPAT_CW, 770805e517aae4a8d47f5a5069eabfded1f26e95343Emil Goode [LCK_CR] = LCK_COMPAT_CR, 771805e517aae4a8d47f5a5069eabfded1f26e95343Emil Goode [LCK_NL] = LCK_COMPAT_NL, 772805e517aae4a8d47f5a5069eabfded1f26e95343Emil Goode [LCK_GROUP] = LCK_COMPAT_GROUP, 773805e517aae4a8d47f5a5069eabfded1f26e95343Emil Goode [LCK_COS] = LCK_COMPAT_COS, 774d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao}; 775d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 776d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao/** 777d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * Rather arbitrary mapping from LDLM error codes to errno values. This should 778d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * not escape to the user level. 779d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao */ 780d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taoint ldlm_error2errno(ldlm_error_t error) 781d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao{ 782d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao int result; 783d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 784d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao switch (error) { 785d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao case ELDLM_OK: 786d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao result = 0; 787d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao break; 788d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao case ELDLM_LOCK_CHANGED: 789d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao result = -ESTALE; 790d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao break; 791d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao case ELDLM_LOCK_ABORTED: 792d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao result = -ENAVAIL; 793d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao break; 794d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao case ELDLM_LOCK_REPLACED: 795d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao result = -ESRCH; 796d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao break; 797d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao case ELDLM_NO_LOCK_DATA: 798d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao result = -ENOENT; 799d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao break; 800d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao case ELDLM_NAMESPACE_EXISTS: 801d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao result = -EEXIST; 802d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao break; 803d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao case ELDLM_BAD_NAMESPACE: 804d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao result = -EBADF; 805d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao break; 806d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao default: 807d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao if (((int)error) < 0) /* cast to signed type */ 808d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao result = error; /* as ldlm_error_t can be unsigned */ 809d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao else { 810d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao CERROR("Invalid DLM result code: %d\n", error); 811d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao result = -EPROTO; 812d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao } 813d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao } 814d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao return result; 815d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao} 816d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng TaoEXPORT_SYMBOL(ldlm_error2errno); 817d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 818d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao/** 819d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * Dual to ldlm_error2errno(): maps errno values back to ldlm_error_t. 820d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao */ 821d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taoldlm_error_t ldlm_errno2error(int err_no) 822d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao{ 823d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao int error; 824d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 825d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao switch (err_no) { 826d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao case 0: 827d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao error = ELDLM_OK; 828d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao break; 829d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao case -ESTALE: 830d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao error = ELDLM_LOCK_CHANGED; 831d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao break; 832d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao case -ENAVAIL: 833d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao error = ELDLM_LOCK_ABORTED; 834d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao break; 835d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao case -ESRCH: 836d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao error = ELDLM_LOCK_REPLACED; 837d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao break; 838d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao case -ENOENT: 839d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao error = ELDLM_NO_LOCK_DATA; 840d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao break; 841d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao case -EEXIST: 842d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao error = ELDLM_NAMESPACE_EXISTS; 843d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao break; 844d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao case -EBADF: 845d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao error = ELDLM_BAD_NAMESPACE; 846d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao break; 847d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao default: 848d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao error = err_no; 849d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao } 850d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao return error; 851d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao} 852d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng TaoEXPORT_SYMBOL(ldlm_errno2error); 853d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 854d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao#if LUSTRE_TRACKS_LOCK_EXP_REFS 855d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taovoid ldlm_dump_export_locks(struct obd_export *exp) 856d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao{ 857d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao spin_lock(&exp->exp_locks_list_guard); 858d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao if (!list_empty(&exp->exp_locks_list)) { 859d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao struct ldlm_lock *lock; 860d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao 861d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao CERROR("dumping locks for export %p," 862d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao "ignore if the unmount doesn't hang\n", exp); 863d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao list_for_each_entry(lock, &exp->exp_locks_list, 864d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao l_exp_refs_link) 865d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao LDLM_ERROR(lock, "lock:"); 866d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao } 867d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao spin_unlock(&exp->exp_locks_list_guard); 868d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao} 869d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao#endif 870