dlmast.c revision 8e17d16f401f7c60908726e070bfa5cbdf31e2f3
16714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel/* -*- mode: c; c-basic-offset: 8; -*- 26714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel * vim: noexpandtab sw=8 ts=8 sts=0: 36714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel * 46714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel * dlmast.c 56714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel * 66714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel * AST and BAST functionality for local and remote nodes 76714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel * 86714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel * Copyright (C) 2004 Oracle. All rights reserved. 96714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel * 106714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel * This program is free software; you can redistribute it and/or 116714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel * modify it under the terms of the GNU General Public 126714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel * License as published by the Free Software Foundation; either 136714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel * version 2 of the License, or (at your option) any later version. 146714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel * 156714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel * This program is distributed in the hope that it will be useful, 166714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel * but WITHOUT ANY WARRANTY; without even the implied warranty of 176714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 186714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel * General Public License for more details. 196714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel * 206714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel * You should have received a copy of the GNU General Public 216714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel * License along with this program; if not, write to the 226714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel * Free Software Foundation, Inc., 59 Temple Place - Suite 330, 236714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel * Boston, MA 021110-1307, USA. 246714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel * 256714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel */ 266714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel 276714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel 286714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel#include <linux/module.h> 296714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel#include <linux/fs.h> 306714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel#include <linux/types.h> 316714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel#include <linux/highmem.h> 326714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel#include <linux/init.h> 336714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel#include <linux/sysctl.h> 346714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel#include <linux/random.h> 356714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel#include <linux/blkdev.h> 366714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel#include <linux/socket.h> 376714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel#include <linux/inet.h> 386714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel#include <linux/spinlock.h> 396714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel 406714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel 416714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel#include "cluster/heartbeat.h" 426714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel#include "cluster/nodemanager.h" 436714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel#include "cluster/tcp.h" 446714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel 456714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel#include "dlmapi.h" 466714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel#include "dlmcommon.h" 476714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel 486714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel#define MLOG_MASK_PREFIX ML_DLM 496714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel#include "cluster/masklog.h" 506714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel 516714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackelstatic void dlm_update_lvb(struct dlm_ctxt *dlm, struct dlm_lock_resource *res, 526714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel struct dlm_lock *lock); 536714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackelstatic int dlm_should_cancel_bast(struct dlm_ctxt *dlm, struct dlm_lock *lock); 546714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel 556714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel/* Should be called as an ast gets queued to see if the new 566714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel * lock level will obsolete a pending bast. 576714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel * For example, if dlm_thread queued a bast for an EX lock that 586714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel * was blocking another EX, but before sending the bast the 596714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel * lock owner downconverted to NL, the bast is now obsolete. 606714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel * Only the ast should be sent. 616714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel * This is needed because the lock and convert paths can queue 626714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel * asts out-of-band (not waiting for dlm_thread) in order to 636714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel * allow for LKM_NOQUEUE to get immediate responses. */ 646714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackelstatic int dlm_should_cancel_bast(struct dlm_ctxt *dlm, struct dlm_lock *lock) 656714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel{ 666714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel assert_spin_locked(&dlm->ast_lock); 676714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel assert_spin_locked(&lock->spinlock); 686714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel 696714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel if (lock->ml.highest_blocked == LKM_IVMODE) 706714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel return 0; 716714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel BUG_ON(lock->ml.highest_blocked == LKM_NLMODE); 726714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel 736714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel if (lock->bast_pending && 746714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel list_empty(&lock->bast_list)) 756714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel /* old bast already sent, ok */ 766714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel return 0; 776714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel 786714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel if (lock->ml.type == LKM_EXMODE) 796714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel /* EX blocks anything left, any bast still valid */ 806714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel return 0; 816714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel else if (lock->ml.type == LKM_NLMODE) 826714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel /* NL blocks nothing, no reason to send any bast, cancel it */ 836714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel return 1; 846714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel else if (lock->ml.highest_blocked != LKM_EXMODE) 856714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel /* PR only blocks EX */ 866714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel return 1; 876714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel 886714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel return 0; 896714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel} 906714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel 91d9ef75221a6247b758e1d7e18edb661996e4b7cfWengang Wangvoid __dlm_queue_ast(struct dlm_ctxt *dlm, struct dlm_lock *lock) 926714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel{ 938e17d16f401f7c60908726e070bfa5cbdf31e2f3Sunil Mushran struct dlm_lock_resource *res; 946714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel 956714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel BUG_ON(!dlm); 966714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel BUG_ON(!lock); 976714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel 988e17d16f401f7c60908726e070bfa5cbdf31e2f3Sunil Mushran res = lock->lockres; 998e17d16f401f7c60908726e070bfa5cbdf31e2f3Sunil Mushran 1006714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel assert_spin_locked(&dlm->ast_lock); 1018e17d16f401f7c60908726e070bfa5cbdf31e2f3Sunil Mushran 1026714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel if (!list_empty(&lock->ast_list)) { 1038e17d16f401f7c60908726e070bfa5cbdf31e2f3Sunil Mushran mlog(ML_ERROR, "%s: res %.*s, lock %u:%llu, " 1048e17d16f401f7c60908726e070bfa5cbdf31e2f3Sunil Mushran "AST list not empty, pending %d, newlevel %d\n", 1058e17d16f401f7c60908726e070bfa5cbdf31e2f3Sunil Mushran dlm->name, res->lockname.len, res->lockname.name, 1068e17d16f401f7c60908726e070bfa5cbdf31e2f3Sunil Mushran dlm_get_lock_cookie_node(be64_to_cpu(lock->ml.cookie)), 1078e17d16f401f7c60908726e070bfa5cbdf31e2f3Sunil Mushran dlm_get_lock_cookie_seq(be64_to_cpu(lock->ml.cookie)), 1086714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel lock->ast_pending, lock->ml.type); 1096714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel BUG(); 1106714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel } 1116714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel if (lock->ast_pending) 1128e17d16f401f7c60908726e070bfa5cbdf31e2f3Sunil Mushran mlog(0, "%s: res %.*s, lock %u:%llu, AST getting flushed\n", 1138e17d16f401f7c60908726e070bfa5cbdf31e2f3Sunil Mushran dlm->name, res->lockname.len, res->lockname.name, 1148e17d16f401f7c60908726e070bfa5cbdf31e2f3Sunil Mushran dlm_get_lock_cookie_node(be64_to_cpu(lock->ml.cookie)), 1158e17d16f401f7c60908726e070bfa5cbdf31e2f3Sunil Mushran dlm_get_lock_cookie_seq(be64_to_cpu(lock->ml.cookie))); 1166714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel 1176714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel /* putting lock on list, add a ref */ 1186714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel dlm_lock_get(lock); 1196714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel spin_lock(&lock->spinlock); 1206714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel 1216714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel /* check to see if this ast obsoletes the bast */ 1226714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel if (dlm_should_cancel_bast(dlm, lock)) { 1238e17d16f401f7c60908726e070bfa5cbdf31e2f3Sunil Mushran mlog(0, "%s: res %.*s, lock %u:%llu, Cancelling BAST\n", 1248e17d16f401f7c60908726e070bfa5cbdf31e2f3Sunil Mushran dlm->name, res->lockname.len, res->lockname.name, 1258e17d16f401f7c60908726e070bfa5cbdf31e2f3Sunil Mushran dlm_get_lock_cookie_node(be64_to_cpu(lock->ml.cookie)), 1268e17d16f401f7c60908726e070bfa5cbdf31e2f3Sunil Mushran dlm_get_lock_cookie_seq(be64_to_cpu(lock->ml.cookie))); 1276714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel lock->bast_pending = 0; 1286714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel list_del_init(&lock->bast_list); 1296714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel lock->ml.highest_blocked = LKM_IVMODE; 1306714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel /* removing lock from list, remove a ref. guaranteed 1316714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel * this won't be the last ref because of the get above, 1326714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel * so res->spinlock will not be taken here */ 1336714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel dlm_lock_put(lock); 1346714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel /* free up the reserved bast that we are cancelling. 1356714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel * guaranteed that this will not be the last reserved 1362bd632165c1f783888bd4cbed95f2f304829159bSunil Mushran * ast because *both* an ast and a bast were reserved 1376714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel * to get to this point. the res->spinlock will not be 1386714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel * taken here */ 1396714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel dlm_lockres_release_ast(dlm, res); 1406714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel } 1416714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel list_add_tail(&lock->ast_list, &dlm->pending_asts); 1426714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel lock->ast_pending = 1; 1436714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel spin_unlock(&lock->spinlock); 1446714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel} 1456714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel 1466714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackelvoid dlm_queue_ast(struct dlm_ctxt *dlm, struct dlm_lock *lock) 1476714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel{ 1486714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel BUG_ON(!dlm); 1496714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel BUG_ON(!lock); 1506714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel 1516714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel spin_lock(&dlm->ast_lock); 1526714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel __dlm_queue_ast(dlm, lock); 1536714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel spin_unlock(&dlm->ast_lock); 1546714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel} 1556714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel 1566714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel 157d9ef75221a6247b758e1d7e18edb661996e4b7cfWengang Wangvoid __dlm_queue_bast(struct dlm_ctxt *dlm, struct dlm_lock *lock) 1586714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel{ 1598e17d16f401f7c60908726e070bfa5cbdf31e2f3Sunil Mushran struct dlm_lock_resource *res; 1606714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel 1616714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel BUG_ON(!dlm); 1626714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel BUG_ON(!lock); 1638e17d16f401f7c60908726e070bfa5cbdf31e2f3Sunil Mushran 1646714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel assert_spin_locked(&dlm->ast_lock); 1656714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel 1668e17d16f401f7c60908726e070bfa5cbdf31e2f3Sunil Mushran res = lock->lockres; 1678e17d16f401f7c60908726e070bfa5cbdf31e2f3Sunil Mushran 1686714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel BUG_ON(!list_empty(&lock->bast_list)); 1696714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel if (lock->bast_pending) 1708e17d16f401f7c60908726e070bfa5cbdf31e2f3Sunil Mushran mlog(0, "%s: res %.*s, lock %u:%llu, BAST getting flushed\n", 1718e17d16f401f7c60908726e070bfa5cbdf31e2f3Sunil Mushran dlm->name, res->lockname.len, res->lockname.name, 1728e17d16f401f7c60908726e070bfa5cbdf31e2f3Sunil Mushran dlm_get_lock_cookie_node(be64_to_cpu(lock->ml.cookie)), 1738e17d16f401f7c60908726e070bfa5cbdf31e2f3Sunil Mushran dlm_get_lock_cookie_seq(be64_to_cpu(lock->ml.cookie))); 1746714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel 1756714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel /* putting lock on list, add a ref */ 1766714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel dlm_lock_get(lock); 1776714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel spin_lock(&lock->spinlock); 1786714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel list_add_tail(&lock->bast_list, &dlm->pending_basts); 1796714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel lock->bast_pending = 1; 1806714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel spin_unlock(&lock->spinlock); 1816714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel} 1826714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel 1836714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackelvoid dlm_queue_bast(struct dlm_ctxt *dlm, struct dlm_lock *lock) 1846714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel{ 1856714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel BUG_ON(!dlm); 1866714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel BUG_ON(!lock); 1876714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel 1886714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel spin_lock(&dlm->ast_lock); 1896714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel __dlm_queue_bast(dlm, lock); 1906714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel spin_unlock(&dlm->ast_lock); 1916714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel} 1926714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel 1936714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackelstatic void dlm_update_lvb(struct dlm_ctxt *dlm, struct dlm_lock_resource *res, 1946714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel struct dlm_lock *lock) 1956714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel{ 1966714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel struct dlm_lockstatus *lksb = lock->lksb; 1976714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel BUG_ON(!lksb); 1986714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel 1996714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel /* only updates if this node masters the lockres */ 200428257f8870f0e72e85ce782d091fa1f366de7dfWengang Wang spin_lock(&res->spinlock); 2016714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel if (res->owner == dlm->node_num) { 2026714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel /* check the lksb flags for the direction */ 2036714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel if (lksb->flags & DLM_LKSB_GET_LVB) { 2046714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel mlog(0, "getting lvb from lockres for %s node\n", 2056714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel lock->ml.node == dlm->node_num ? "master" : 2066714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel "remote"); 2076714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel memcpy(lksb->lvb, res->lvb, DLM_LVB_LEN); 2086714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel } 209c0a8520c7333dd62624683772f31864c7f9c46d9Mark Fasheh /* Do nothing for lvb put requests - they should be done in 210c0a8520c7333dd62624683772f31864c7f9c46d9Mark Fasheh * place when the lock is downconverted - otherwise we risk 211c0a8520c7333dd62624683772f31864c7f9c46d9Mark Fasheh * racing gets and puts which could result in old lvb data 212c0a8520c7333dd62624683772f31864c7f9c46d9Mark Fasheh * being propagated. We leave the put flag set and clear it 213c0a8520c7333dd62624683772f31864c7f9c46d9Mark Fasheh * here. In the future we might want to clear it at the time 214c0a8520c7333dd62624683772f31864c7f9c46d9Mark Fasheh * the put is actually done. 215c0a8520c7333dd62624683772f31864c7f9c46d9Mark Fasheh */ 2166714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel } 217428257f8870f0e72e85ce782d091fa1f366de7dfWengang Wang spin_unlock(&res->spinlock); 2186714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel 2196714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel /* reset any lvb flags on the lksb */ 2206714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel lksb->flags &= ~(DLM_LKSB_PUT_LVB|DLM_LKSB_GET_LVB); 2216714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel} 2226714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel 2236714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackelvoid dlm_do_local_ast(struct dlm_ctxt *dlm, struct dlm_lock_resource *res, 2246714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel struct dlm_lock *lock) 2256714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel{ 2266714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel dlm_astlockfunc_t *fn; 2276714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel struct dlm_lockstatus *lksb; 2286714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel 2298e17d16f401f7c60908726e070bfa5cbdf31e2f3Sunil Mushran mlog(0, "%s: res %.*s, lock %u:%llu, Local AST\n", dlm->name, 2308e17d16f401f7c60908726e070bfa5cbdf31e2f3Sunil Mushran res->lockname.len, res->lockname.name, 2318e17d16f401f7c60908726e070bfa5cbdf31e2f3Sunil Mushran dlm_get_lock_cookie_node(be64_to_cpu(lock->ml.cookie)), 2328e17d16f401f7c60908726e070bfa5cbdf31e2f3Sunil Mushran dlm_get_lock_cookie_seq(be64_to_cpu(lock->ml.cookie))); 2336714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel 2346714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel lksb = lock->lksb; 2356714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel fn = lock->ast; 2366714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel BUG_ON(lock->ml.node != dlm->node_num); 2376714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel 2386714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel dlm_update_lvb(dlm, res, lock); 2396714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel (*fn)(lock->astdata); 2406714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel} 2416714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel 2426714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel 2436714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackelint dlm_do_remote_ast(struct dlm_ctxt *dlm, struct dlm_lock_resource *res, 2446714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel struct dlm_lock *lock) 2456714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel{ 2466714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel int ret; 2476714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel struct dlm_lockstatus *lksb; 2486714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel int lksbflags; 2496714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel 2508e17d16f401f7c60908726e070bfa5cbdf31e2f3Sunil Mushran mlog(0, "%s: res %.*s, lock %u:%llu, Remote AST\n", dlm->name, 2518e17d16f401f7c60908726e070bfa5cbdf31e2f3Sunil Mushran res->lockname.len, res->lockname.name, 2528e17d16f401f7c60908726e070bfa5cbdf31e2f3Sunil Mushran dlm_get_lock_cookie_node(be64_to_cpu(lock->ml.cookie)), 2538e17d16f401f7c60908726e070bfa5cbdf31e2f3Sunil Mushran dlm_get_lock_cookie_seq(be64_to_cpu(lock->ml.cookie))); 2546714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel 2556714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel lksb = lock->lksb; 2566714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel BUG_ON(lock->ml.node == dlm->node_num); 2576714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel 2586714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel lksbflags = lksb->flags; 2596714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel dlm_update_lvb(dlm, res, lock); 2606714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel 2616714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel /* lock request came from another node 2626714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel * go do the ast over there */ 2636714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel ret = dlm_send_proxy_ast(dlm, res, lock, lksbflags); 2646714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel return ret; 2656714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel} 2666714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel 2676714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackelvoid dlm_do_local_bast(struct dlm_ctxt *dlm, struct dlm_lock_resource *res, 2686714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel struct dlm_lock *lock, int blocked_type) 2696714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel{ 2706714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel dlm_bastlockfunc_t *fn = lock->bast; 2716714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel 2726714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel BUG_ON(lock->ml.node != dlm->node_num); 2736714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel 2748e17d16f401f7c60908726e070bfa5cbdf31e2f3Sunil Mushran mlog(0, "%s: res %.*s, lock %u:%llu, Local BAST, blocked %d\n", 2758e17d16f401f7c60908726e070bfa5cbdf31e2f3Sunil Mushran dlm->name, res->lockname.len, res->lockname.name, 2768e17d16f401f7c60908726e070bfa5cbdf31e2f3Sunil Mushran dlm_get_lock_cookie_node(be64_to_cpu(lock->ml.cookie)), 2778e17d16f401f7c60908726e070bfa5cbdf31e2f3Sunil Mushran dlm_get_lock_cookie_seq(be64_to_cpu(lock->ml.cookie)), 2788e17d16f401f7c60908726e070bfa5cbdf31e2f3Sunil Mushran blocked_type); 2798e17d16f401f7c60908726e070bfa5cbdf31e2f3Sunil Mushran 2806714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel (*fn)(lock->astdata, blocked_type); 2816714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel} 2826714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel 2836714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel 2846714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel 285d74c9803a90d733f5fb7270475aa6d14b45796c6Kurt Hackelint dlm_proxy_ast_handler(struct o2net_msg *msg, u32 len, void *data, 286d74c9803a90d733f5fb7270475aa6d14b45796c6Kurt Hackel void **ret_data) 2876714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel{ 2886714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel int ret; 2896714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel unsigned int locklen; 2906714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel struct dlm_ctxt *dlm = data; 2916714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel struct dlm_lock_resource *res = NULL; 2926714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel struct dlm_lock *lock = NULL; 2936714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel struct dlm_proxy_ast *past = (struct dlm_proxy_ast *) msg->buf; 2946714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel char *name; 2956714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel struct list_head *iter, *head=NULL; 2966714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel u64 cookie; 2976714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel u32 flags; 29857dff2676eb68d805883a2204faaa5339ac44e03Sunil Mushran u8 node; 2996714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel 3006714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel if (!dlm_grab(dlm)) { 3016714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel dlm_error(DLM_REJECTED); 3026714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel return DLM_REJECTED; 3036714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel } 3046714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel 3056714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel mlog_bug_on_msg(!dlm_domain_fully_joined(dlm), 3066714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel "Domain %s not fully joined!\n", dlm->name); 3076714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel 3086714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel name = past->name; 3096714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel locklen = past->namelen; 31057dff2676eb68d805883a2204faaa5339ac44e03Sunil Mushran cookie = past->cookie; 3116714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel flags = be32_to_cpu(past->flags); 31257dff2676eb68d805883a2204faaa5339ac44e03Sunil Mushran node = past->node_idx; 3136714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel 3146714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel if (locklen > DLM_LOCKID_NAME_MAX) { 3156714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel ret = DLM_IVBUFLEN; 31657dff2676eb68d805883a2204faaa5339ac44e03Sunil Mushran mlog(ML_ERROR, "Invalid name length (%d) in proxy ast " 31757dff2676eb68d805883a2204faaa5339ac44e03Sunil Mushran "handler!\n", locklen); 3186714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel goto leave; 3196714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel } 3206714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel 3216714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel if ((flags & (LKM_PUT_LVB|LKM_GET_LVB)) == 3226714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel (LKM_PUT_LVB|LKM_GET_LVB)) { 32357dff2676eb68d805883a2204faaa5339ac44e03Sunil Mushran mlog(ML_ERROR, "Both PUT and GET lvb specified, (0x%x)\n", 32457dff2676eb68d805883a2204faaa5339ac44e03Sunil Mushran flags); 3256714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel ret = DLM_BADARGS; 3266714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel goto leave; 3276714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel } 3286714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel 3296714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel mlog(0, "lvb: %s\n", flags & LKM_PUT_LVB ? "put lvb" : 3306714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel (flags & LKM_GET_LVB ? "get lvb" : "none")); 3316714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel 3326714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel mlog(0, "type=%d, blocked_type=%d\n", past->type, past->blocked_type); 3336714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel 3346714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel if (past->type != DLM_AST && 3356714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel past->type != DLM_BAST) { 33629004858a76ba9e26393dd8a85e653f105a33753Kurt Hackel mlog(ML_ERROR, "Unknown ast type! %d, cookie=%u:%llu" 33757dff2676eb68d805883a2204faaa5339ac44e03Sunil Mushran "name=%.*s, node=%u\n", past->type, 33857dff2676eb68d805883a2204faaa5339ac44e03Sunil Mushran dlm_get_lock_cookie_node(be64_to_cpu(cookie)), 33957dff2676eb68d805883a2204faaa5339ac44e03Sunil Mushran dlm_get_lock_cookie_seq(be64_to_cpu(cookie)), 34057dff2676eb68d805883a2204faaa5339ac44e03Sunil Mushran locklen, name, node); 3416714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel ret = DLM_IVLOCKID; 3426714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel goto leave; 3436714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel } 3446714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel 3456714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel res = dlm_lookup_lockres(dlm, name, locklen); 3466714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel if (!res) { 34757dff2676eb68d805883a2204faaa5339ac44e03Sunil Mushran mlog(0, "Got %sast for unknown lockres! cookie=%u:%llu, " 34857dff2676eb68d805883a2204faaa5339ac44e03Sunil Mushran "name=%.*s, node=%u\n", (past->type == DLM_AST ? "" : "b"), 34957dff2676eb68d805883a2204faaa5339ac44e03Sunil Mushran dlm_get_lock_cookie_node(be64_to_cpu(cookie)), 35057dff2676eb68d805883a2204faaa5339ac44e03Sunil Mushran dlm_get_lock_cookie_seq(be64_to_cpu(cookie)), 35157dff2676eb68d805883a2204faaa5339ac44e03Sunil Mushran locklen, name, node); 3526714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel ret = DLM_IVLOCKID; 3536714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel goto leave; 3546714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel } 3556714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel 3566714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel /* cannot get a proxy ast message if this node owns it */ 3576714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel BUG_ON(res->owner == dlm->node_num); 3586714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel 3598e17d16f401f7c60908726e070bfa5cbdf31e2f3Sunil Mushran mlog(0, "%s: res %.*s\n", dlm->name, res->lockname.len, 3608e17d16f401f7c60908726e070bfa5cbdf31e2f3Sunil Mushran res->lockname.name); 3616714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel 3626714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel spin_lock(&res->spinlock); 3636714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel if (res->state & DLM_LOCK_RES_RECOVERING) { 36457dff2676eb68d805883a2204faaa5339ac44e03Sunil Mushran mlog(0, "Responding with DLM_RECOVERING!\n"); 3656714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel ret = DLM_RECOVERING; 3666714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel goto unlock_out; 3676714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel } 3686714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel if (res->state & DLM_LOCK_RES_MIGRATING) { 36957dff2676eb68d805883a2204faaa5339ac44e03Sunil Mushran mlog(0, "Responding with DLM_MIGRATING!\n"); 3706714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel ret = DLM_MIGRATING; 3716714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel goto unlock_out; 3726714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel } 3736714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel /* try convert queue for both ast/bast */ 3746714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel head = &res->converting; 3756714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel lock = NULL; 3766714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel list_for_each(iter, head) { 3776714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel lock = list_entry (iter, struct dlm_lock, list); 37857dff2676eb68d805883a2204faaa5339ac44e03Sunil Mushran if (lock->ml.cookie == cookie) 3796714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel goto do_ast; 3806714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel } 3816714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel 3826714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel /* if not on convert, try blocked for ast, granted for bast */ 3836714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel if (past->type == DLM_AST) 3846714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel head = &res->blocked; 3856714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel else 3866714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel head = &res->granted; 3876714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel 3886714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel list_for_each(iter, head) { 3896714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel lock = list_entry (iter, struct dlm_lock, list); 39057dff2676eb68d805883a2204faaa5339ac44e03Sunil Mushran if (lock->ml.cookie == cookie) 3916714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel goto do_ast; 3926714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel } 3936714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel 39457dff2676eb68d805883a2204faaa5339ac44e03Sunil Mushran mlog(0, "Got %sast for unknown lock! cookie=%u:%llu, name=%.*s, " 39557dff2676eb68d805883a2204faaa5339ac44e03Sunil Mushran "node=%u\n", past->type == DLM_AST ? "" : "b", 39657dff2676eb68d805883a2204faaa5339ac44e03Sunil Mushran dlm_get_lock_cookie_node(be64_to_cpu(cookie)), 39757dff2676eb68d805883a2204faaa5339ac44e03Sunil Mushran dlm_get_lock_cookie_seq(be64_to_cpu(cookie)), 39857dff2676eb68d805883a2204faaa5339ac44e03Sunil Mushran locklen, name, node); 3996714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel 4006714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel ret = DLM_NORMAL; 4016714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackelunlock_out: 4026714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel spin_unlock(&res->spinlock); 4036714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel goto leave; 4046714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel 4056714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackeldo_ast: 4066714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel ret = DLM_NORMAL; 4076714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel if (past->type == DLM_AST) { 4086714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel /* do not alter lock refcount. switching lists. */ 409f116629d03655adaf7832b93b03c99391d09d4a7Akinobu Mita list_move_tail(&lock->list, &res->granted); 4108e17d16f401f7c60908726e070bfa5cbdf31e2f3Sunil Mushran mlog(0, "%s: res %.*s, lock %u:%llu, Granted type %d => %d\n", 4118e17d16f401f7c60908726e070bfa5cbdf31e2f3Sunil Mushran dlm->name, res->lockname.len, res->lockname.name, 4128e17d16f401f7c60908726e070bfa5cbdf31e2f3Sunil Mushran dlm_get_lock_cookie_node(be64_to_cpu(cookie)), 4138e17d16f401f7c60908726e070bfa5cbdf31e2f3Sunil Mushran dlm_get_lock_cookie_seq(be64_to_cpu(cookie)), 4148e17d16f401f7c60908726e070bfa5cbdf31e2f3Sunil Mushran lock->ml.type, lock->ml.convert_type); 4158e17d16f401f7c60908726e070bfa5cbdf31e2f3Sunil Mushran 4166714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel if (lock->ml.convert_type != LKM_IVMODE) { 4176714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel lock->ml.type = lock->ml.convert_type; 4186714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel lock->ml.convert_type = LKM_IVMODE; 4196714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel } else { 4206714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel // should already be there.... 4216714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel } 4226714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel 4236714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel lock->lksb->status = DLM_NORMAL; 4246714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel 4256714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel /* if we requested the lvb, fetch it into our lksb now */ 4266714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel if (flags & LKM_GET_LVB) { 4276714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel BUG_ON(!(lock->lksb->flags & DLM_LKSB_GET_LVB)); 4286714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel memcpy(lock->lksb->lvb, past->lvb, DLM_LVB_LEN); 4296714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel } 4306714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel } 4316714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel spin_unlock(&res->spinlock); 4326714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel 4336714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel if (past->type == DLM_AST) 4346714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel dlm_do_local_ast(dlm, res, lock); 4356714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel else 4366714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel dlm_do_local_bast(dlm, res, lock, past->blocked_type); 4376714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel 4386714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackelleave: 4396714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel if (res) 4406714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel dlm_lockres_put(res); 4416714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel 4426714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel dlm_put(dlm); 4436714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel return ret; 4446714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel} 4456714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel 4466714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel 4476714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel 4486714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackelint dlm_send_proxy_ast_msg(struct dlm_ctxt *dlm, struct dlm_lock_resource *res, 4496714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel struct dlm_lock *lock, int msg_type, 4506714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel int blocked_type, int flags) 4516714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel{ 4526714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel int ret = 0; 4536714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel struct dlm_proxy_ast past; 4546714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel struct kvec vec[2]; 4556714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel size_t veclen = 1; 4566714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel int status; 4576714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel 4588e17d16f401f7c60908726e070bfa5cbdf31e2f3Sunil Mushran mlog(0, "%s: res %.*s, to %u, type %d, blocked_type %d\n", dlm->name, 4598e17d16f401f7c60908726e070bfa5cbdf31e2f3Sunil Mushran res->lockname.len, res->lockname.name, lock->ml.node, msg_type, 4608e17d16f401f7c60908726e070bfa5cbdf31e2f3Sunil Mushran blocked_type); 4616714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel 4626714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel memset(&past, 0, sizeof(struct dlm_proxy_ast)); 4636714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel past.node_idx = dlm->node_num; 4646714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel past.type = msg_type; 4656714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel past.blocked_type = blocked_type; 4666714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel past.namelen = res->lockname.len; 4676714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel memcpy(past.name, res->lockname.name, past.namelen); 4686714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel past.cookie = lock->ml.cookie; 4696714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel 4706714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel vec[0].iov_len = sizeof(struct dlm_proxy_ast); 4716714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel vec[0].iov_base = &past; 4726714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel if (flags & DLM_LKSB_GET_LVB) { 4736714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel be32_add_cpu(&past.flags, LKM_GET_LVB); 4746714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel vec[1].iov_len = DLM_LVB_LEN; 4756714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel vec[1].iov_base = lock->lksb->lvb; 4766714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel veclen++; 4776714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel } 4786714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel 4796714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel ret = o2net_send_message_vec(DLM_PROXY_AST_MSG, dlm->key, vec, veclen, 4806714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel lock->ml.node, &status); 4816714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel if (ret < 0) 4828e17d16f401f7c60908726e070bfa5cbdf31e2f3Sunil Mushran mlog(ML_ERROR, "%s: res %.*s, error %d send AST to node %u\n", 4838e17d16f401f7c60908726e070bfa5cbdf31e2f3Sunil Mushran dlm->name, res->lockname.len, res->lockname.name, ret, 484a5196ec5ef80309fd390191c548ee1f2e8a327eeWengang Wang lock->ml.node); 4856714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel else { 4866714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel if (status == DLM_RECOVERING) { 4876714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel mlog(ML_ERROR, "sent AST to node %u, it thinks this " 4886714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel "node is dead!\n", lock->ml.node); 4896714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel BUG(); 4906714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel } else if (status == DLM_MIGRATING) { 4916714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel mlog(ML_ERROR, "sent AST to node %u, it returned " 4926714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel "DLM_MIGRATING!\n", lock->ml.node); 4936714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel BUG(); 494e2c73698af3dac89328eef2b55f6746e0507d2bcMark Fasheh } else if (status != DLM_NORMAL && status != DLM_IVLOCKID) { 4956714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel mlog(ML_ERROR, "AST to node %u returned %d!\n", 4966714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel lock->ml.node, status); 4976714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel /* ignore it */ 4986714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel } 4996714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel ret = 0; 5006714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel } 5016714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel return ret; 5026714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel} 503