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