dlmast.c revision 29004858a76ba9e26393dd8a85e653f105a33753
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/slab.h> 326714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel#include <linux/highmem.h> 336714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel#include <linux/utsname.h> 346714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel#include <linux/init.h> 356714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel#include <linux/sysctl.h> 366714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel#include <linux/random.h> 376714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel#include <linux/blkdev.h> 386714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel#include <linux/socket.h> 396714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel#include <linux/inet.h> 406714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel#include <linux/spinlock.h> 416714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel 426714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel 436714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel#include "cluster/heartbeat.h" 446714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel#include "cluster/nodemanager.h" 456714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel#include "cluster/tcp.h" 466714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel#include "cluster/endian.h" 476714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel 486714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel#include "dlmapi.h" 496714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel#include "dlmcommon.h" 506714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel 516714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel#define MLOG_MASK_PREFIX ML_DLM 526714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel#include "cluster/masklog.h" 536714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel 546714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackelstatic void dlm_update_lvb(struct dlm_ctxt *dlm, struct dlm_lock_resource *res, 556714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel struct dlm_lock *lock); 566714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackelstatic int dlm_should_cancel_bast(struct dlm_ctxt *dlm, struct dlm_lock *lock); 576714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel 586714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel/* Should be called as an ast gets queued to see if the new 596714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel * lock level will obsolete a pending bast. 606714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel * For example, if dlm_thread queued a bast for an EX lock that 616714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel * was blocking another EX, but before sending the bast the 626714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel * lock owner downconverted to NL, the bast is now obsolete. 636714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel * Only the ast should be sent. 646714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel * This is needed because the lock and convert paths can queue 656714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel * asts out-of-band (not waiting for dlm_thread) in order to 666714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel * allow for LKM_NOQUEUE to get immediate responses. */ 676714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackelstatic int dlm_should_cancel_bast(struct dlm_ctxt *dlm, struct dlm_lock *lock) 686714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel{ 696714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel assert_spin_locked(&dlm->ast_lock); 706714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel assert_spin_locked(&lock->spinlock); 716714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel 726714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel if (lock->ml.highest_blocked == LKM_IVMODE) 736714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel return 0; 746714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel BUG_ON(lock->ml.highest_blocked == LKM_NLMODE); 756714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel 766714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel if (lock->bast_pending && 776714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel list_empty(&lock->bast_list)) 786714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel /* old bast already sent, ok */ 796714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel return 0; 806714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel 816714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel if (lock->ml.type == LKM_EXMODE) 826714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel /* EX blocks anything left, any bast still valid */ 836714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel return 0; 846714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel else if (lock->ml.type == LKM_NLMODE) 856714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel /* NL blocks nothing, no reason to send any bast, cancel it */ 866714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel return 1; 876714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel else if (lock->ml.highest_blocked != LKM_EXMODE) 886714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel /* PR only blocks EX */ 896714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel return 1; 906714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel 916714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel return 0; 926714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel} 936714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel 946714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackelstatic void __dlm_queue_ast(struct dlm_ctxt *dlm, struct dlm_lock *lock) 956714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel{ 966714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel mlog_entry_void(); 976714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel 986714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel BUG_ON(!dlm); 996714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel BUG_ON(!lock); 1006714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel 1016714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel assert_spin_locked(&dlm->ast_lock); 1026714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel if (!list_empty(&lock->ast_list)) { 1036714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel mlog(ML_ERROR, "ast list not empty!! pending=%d, newlevel=%d\n", 1046714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel lock->ast_pending, lock->ml.type); 1056714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel BUG(); 1066714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel } 1076714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel BUG_ON(!list_empty(&lock->ast_list)); 1086714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel if (lock->ast_pending) 1096714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel mlog(0, "lock has an ast getting flushed right now\n"); 1106714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel 1116714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel /* putting lock on list, add a ref */ 1126714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel dlm_lock_get(lock); 1136714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel spin_lock(&lock->spinlock); 1146714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel 1156714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel /* check to see if this ast obsoletes the bast */ 1166714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel if (dlm_should_cancel_bast(dlm, lock)) { 1176714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel struct dlm_lock_resource *res = lock->lockres; 1186714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel mlog(0, "%s: cancelling bast for %.*s\n", 1196714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel dlm->name, res->lockname.len, res->lockname.name); 1206714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel lock->bast_pending = 0; 1216714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel list_del_init(&lock->bast_list); 1226714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel lock->ml.highest_blocked = LKM_IVMODE; 1236714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel /* removing lock from list, remove a ref. guaranteed 1246714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel * this won't be the last ref because of the get above, 1256714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel * so res->spinlock will not be taken here */ 1266714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel dlm_lock_put(lock); 1276714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel /* free up the reserved bast that we are cancelling. 1286714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel * guaranteed that this will not be the last reserved 1296714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel * ast because *both* an ast and a bast were reserved 1306714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel * to get to this point. the res->spinlock will not be 1316714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel * taken here */ 1326714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel dlm_lockres_release_ast(dlm, res); 1336714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel } 1346714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel list_add_tail(&lock->ast_list, &dlm->pending_asts); 1356714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel lock->ast_pending = 1; 1366714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel spin_unlock(&lock->spinlock); 1376714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel} 1386714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel 1396714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackelvoid dlm_queue_ast(struct dlm_ctxt *dlm, struct dlm_lock *lock) 1406714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel{ 1416714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel mlog_entry_void(); 1426714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel 1436714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel BUG_ON(!dlm); 1446714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel BUG_ON(!lock); 1456714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel 1466714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel spin_lock(&dlm->ast_lock); 1476714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel __dlm_queue_ast(dlm, lock); 1486714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel spin_unlock(&dlm->ast_lock); 1496714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel} 1506714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel 1516714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel 1526714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackelstatic void __dlm_queue_bast(struct dlm_ctxt *dlm, struct dlm_lock *lock) 1536714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel{ 1546714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel mlog_entry_void(); 1556714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel 1566714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel BUG_ON(!dlm); 1576714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel BUG_ON(!lock); 1586714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel assert_spin_locked(&dlm->ast_lock); 1596714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel 1606714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel BUG_ON(!list_empty(&lock->bast_list)); 1616714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel if (lock->bast_pending) 1626714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel mlog(0, "lock has a bast getting flushed right now\n"); 1636714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel 1646714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel /* putting lock on list, add a ref */ 1656714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel dlm_lock_get(lock); 1666714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel spin_lock(&lock->spinlock); 1676714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel list_add_tail(&lock->bast_list, &dlm->pending_basts); 1686714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel lock->bast_pending = 1; 1696714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel spin_unlock(&lock->spinlock); 1706714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel} 1716714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel 1726714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackelvoid dlm_queue_bast(struct dlm_ctxt *dlm, struct dlm_lock *lock) 1736714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel{ 1746714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel mlog_entry_void(); 1756714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel 1766714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel BUG_ON(!dlm); 1776714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel BUG_ON(!lock); 1786714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel 1796714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel spin_lock(&dlm->ast_lock); 1806714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel __dlm_queue_bast(dlm, lock); 1816714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel spin_unlock(&dlm->ast_lock); 1826714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel} 1836714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel 1846714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackelstatic void dlm_update_lvb(struct dlm_ctxt *dlm, struct dlm_lock_resource *res, 1856714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel struct dlm_lock *lock) 1866714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel{ 1876714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel struct dlm_lockstatus *lksb = lock->lksb; 1886714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel BUG_ON(!lksb); 1896714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel 1906714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel /* only updates if this node masters the lockres */ 1916714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel if (res->owner == dlm->node_num) { 1926714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel 1936714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel spin_lock(&res->spinlock); 1946714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel /* check the lksb flags for the direction */ 1956714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel if (lksb->flags & DLM_LKSB_GET_LVB) { 1966714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel mlog(0, "getting lvb from lockres for %s node\n", 1976714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel lock->ml.node == dlm->node_num ? "master" : 1986714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel "remote"); 1996714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel memcpy(lksb->lvb, res->lvb, DLM_LVB_LEN); 2006714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel } else if (lksb->flags & DLM_LKSB_PUT_LVB) { 2016714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel mlog(0, "setting lvb from lockres for %s node\n", 2026714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel lock->ml.node == dlm->node_num ? "master" : 2036714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel "remote"); 2046714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel memcpy(res->lvb, lksb->lvb, DLM_LVB_LEN); 2056714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel } 2066714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel spin_unlock(&res->spinlock); 2076714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel } 2086714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel 2096714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel /* reset any lvb flags on the lksb */ 2106714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel lksb->flags &= ~(DLM_LKSB_PUT_LVB|DLM_LKSB_GET_LVB); 2116714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel} 2126714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel 2136714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackelvoid dlm_do_local_ast(struct dlm_ctxt *dlm, struct dlm_lock_resource *res, 2146714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel struct dlm_lock *lock) 2156714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel{ 2166714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel dlm_astlockfunc_t *fn; 2176714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel struct dlm_lockstatus *lksb; 2186714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel 2196714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel mlog_entry_void(); 2206714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel 2216714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel lksb = lock->lksb; 2226714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel fn = lock->ast; 2236714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel BUG_ON(lock->ml.node != dlm->node_num); 2246714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel 2256714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel dlm_update_lvb(dlm, res, lock); 2266714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel (*fn)(lock->astdata); 2276714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel} 2286714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel 2296714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel 2306714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackelint dlm_do_remote_ast(struct dlm_ctxt *dlm, struct dlm_lock_resource *res, 2316714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel struct dlm_lock *lock) 2326714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel{ 2336714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel int ret; 2346714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel struct dlm_lockstatus *lksb; 2356714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel int lksbflags; 2366714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel 2376714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel mlog_entry_void(); 2386714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel 2396714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel lksb = lock->lksb; 2406714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel BUG_ON(lock->ml.node == dlm->node_num); 2416714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel 2426714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel lksbflags = lksb->flags; 2436714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel dlm_update_lvb(dlm, res, lock); 2446714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel 2456714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel /* lock request came from another node 2466714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel * go do the ast over there */ 2476714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel ret = dlm_send_proxy_ast(dlm, res, lock, lksbflags); 2486714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel return ret; 2496714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel} 2506714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel 2516714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackelvoid dlm_do_local_bast(struct dlm_ctxt *dlm, struct dlm_lock_resource *res, 2526714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel struct dlm_lock *lock, int blocked_type) 2536714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel{ 2546714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel dlm_bastlockfunc_t *fn = lock->bast; 2556714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel 2566714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel mlog_entry_void(); 2576714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel BUG_ON(lock->ml.node != dlm->node_num); 2586714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel 2596714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel (*fn)(lock->astdata, blocked_type); 2606714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel} 2616714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel 2626714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel 2636714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel 2646714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackelint dlm_proxy_ast_handler(struct o2net_msg *msg, u32 len, void *data) 2656714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel{ 2666714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel int ret; 2676714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel unsigned int locklen; 2686714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel struct dlm_ctxt *dlm = data; 2696714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel struct dlm_lock_resource *res = NULL; 2706714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel struct dlm_lock *lock = NULL; 2716714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel struct dlm_proxy_ast *past = (struct dlm_proxy_ast *) msg->buf; 2726714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel char *name; 2736714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel struct list_head *iter, *head=NULL; 2746714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel u64 cookie; 2756714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel u32 flags; 2766714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel 2776714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel if (!dlm_grab(dlm)) { 2786714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel dlm_error(DLM_REJECTED); 2796714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel return DLM_REJECTED; 2806714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel } 2816714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel 2826714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel mlog_bug_on_msg(!dlm_domain_fully_joined(dlm), 2836714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel "Domain %s not fully joined!\n", dlm->name); 2846714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel 2856714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel name = past->name; 2866714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel locklen = past->namelen; 2876714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel cookie = be64_to_cpu(past->cookie); 2886714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel flags = be32_to_cpu(past->flags); 2896714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel 2906714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel if (locklen > DLM_LOCKID_NAME_MAX) { 2916714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel ret = DLM_IVBUFLEN; 2926714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel mlog(ML_ERROR, "Invalid name length in proxy ast handler!\n"); 2936714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel goto leave; 2946714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel } 2956714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel 2966714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel if ((flags & (LKM_PUT_LVB|LKM_GET_LVB)) == 2976714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel (LKM_PUT_LVB|LKM_GET_LVB)) { 2986714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel mlog(ML_ERROR, "both PUT and GET lvb specified\n"); 2996714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel ret = DLM_BADARGS; 3006714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel goto leave; 3016714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel } 3026714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel 3036714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel mlog(0, "lvb: %s\n", flags & LKM_PUT_LVB ? "put lvb" : 3046714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel (flags & LKM_GET_LVB ? "get lvb" : "none")); 3056714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel 3066714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel mlog(0, "type=%d, blocked_type=%d\n", past->type, past->blocked_type); 3076714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel 3086714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel if (past->type != DLM_AST && 3096714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel past->type != DLM_BAST) { 31029004858a76ba9e26393dd8a85e653f105a33753Kurt Hackel mlog(ML_ERROR, "Unknown ast type! %d, cookie=%u:%llu" 31129004858a76ba9e26393dd8a85e653f105a33753Kurt Hackel "name=%.*s\n", past->type, 31229004858a76ba9e26393dd8a85e653f105a33753Kurt Hackel dlm_get_lock_cookie_node(cookie), 31329004858a76ba9e26393dd8a85e653f105a33753Kurt Hackel dlm_get_lock_cookie_seq(cookie), 31429004858a76ba9e26393dd8a85e653f105a33753Kurt Hackel locklen, name); 3156714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel ret = DLM_IVLOCKID; 3166714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel goto leave; 3176714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel } 3186714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel 3196714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel res = dlm_lookup_lockres(dlm, name, locklen); 3206714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel if (!res) { 3216714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel mlog(ML_ERROR, "got %sast for unknown lockres! " 32229004858a76ba9e26393dd8a85e653f105a33753Kurt Hackel "cookie=%u:%llu, name=%.*s, namelen=%u\n", 3236714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel past->type == DLM_AST ? "" : "b", 32429004858a76ba9e26393dd8a85e653f105a33753Kurt Hackel dlm_get_lock_cookie_node(cookie), 32529004858a76ba9e26393dd8a85e653f105a33753Kurt Hackel dlm_get_lock_cookie_seq(cookie), 32629004858a76ba9e26393dd8a85e653f105a33753Kurt Hackel locklen, name, locklen); 3276714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel ret = DLM_IVLOCKID; 3286714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel goto leave; 3296714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel } 3306714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel 3316714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel /* cannot get a proxy ast message if this node owns it */ 3326714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel BUG_ON(res->owner == dlm->node_num); 3336714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel 3346714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel mlog(0, "lockres %.*s\n", res->lockname.len, res->lockname.name); 3356714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel 3366714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel spin_lock(&res->spinlock); 3376714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel if (res->state & DLM_LOCK_RES_RECOVERING) { 3386714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel mlog(0, "responding with DLM_RECOVERING!\n"); 3396714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel ret = DLM_RECOVERING; 3406714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel goto unlock_out; 3416714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel } 3426714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel if (res->state & DLM_LOCK_RES_MIGRATING) { 3436714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel mlog(0, "responding with DLM_MIGRATING!\n"); 3446714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel ret = DLM_MIGRATING; 3456714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel goto unlock_out; 3466714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel } 3476714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel /* try convert queue for both ast/bast */ 3486714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel head = &res->converting; 3496714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel lock = NULL; 3506714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel list_for_each(iter, head) { 3516714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel lock = list_entry (iter, struct dlm_lock, list); 3526714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel if (be64_to_cpu(lock->ml.cookie) == cookie) 3536714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel goto do_ast; 3546714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel } 3556714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel 3566714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel /* if not on convert, try blocked for ast, granted for bast */ 3576714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel if (past->type == DLM_AST) 3586714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel head = &res->blocked; 3596714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel else 3606714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel head = &res->granted; 3616714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel 3626714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel list_for_each(iter, head) { 3636714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel lock = list_entry (iter, struct dlm_lock, list); 3646714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel if (be64_to_cpu(lock->ml.cookie) == cookie) 3656714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel goto do_ast; 3666714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel } 3676714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel 36829004858a76ba9e26393dd8a85e653f105a33753Kurt Hackel mlog(ML_ERROR, "got %sast for unknown lock! cookie=%u:%llu, " 36929004858a76ba9e26393dd8a85e653f105a33753Kurt Hackel "name=%.*s, namelen=%u\n", 37029004858a76ba9e26393dd8a85e653f105a33753Kurt Hackel past->type == DLM_AST ? "" : "b", 37129004858a76ba9e26393dd8a85e653f105a33753Kurt Hackel dlm_get_lock_cookie_node(cookie), 37229004858a76ba9e26393dd8a85e653f105a33753Kurt Hackel dlm_get_lock_cookie_seq(cookie), 37329004858a76ba9e26393dd8a85e653f105a33753Kurt Hackel locklen, name, locklen); 3746714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel 3756714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel ret = DLM_NORMAL; 3766714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackelunlock_out: 3776714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel spin_unlock(&res->spinlock); 3786714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel goto leave; 3796714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel 3806714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackeldo_ast: 3816714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel ret = DLM_NORMAL; 3826714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel if (past->type == DLM_AST) { 3836714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel /* do not alter lock refcount. switching lists. */ 3846714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel list_del_init(&lock->list); 3856714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel list_add_tail(&lock->list, &res->granted); 3866714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel mlog(0, "ast: adding to granted list... type=%d, " 3876714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel "convert_type=%d\n", lock->ml.type, lock->ml.convert_type); 3886714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel if (lock->ml.convert_type != LKM_IVMODE) { 3896714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel lock->ml.type = lock->ml.convert_type; 3906714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel lock->ml.convert_type = LKM_IVMODE; 3916714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel } else { 3926714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel // should already be there.... 3936714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel } 3946714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel 3956714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel lock->lksb->status = DLM_NORMAL; 3966714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel 3976714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel /* if we requested the lvb, fetch it into our lksb now */ 3986714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel if (flags & LKM_GET_LVB) { 3996714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel BUG_ON(!(lock->lksb->flags & DLM_LKSB_GET_LVB)); 4006714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel memcpy(lock->lksb->lvb, past->lvb, DLM_LVB_LEN); 4016714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel } 4026714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel } 4036714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel spin_unlock(&res->spinlock); 4046714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel 4056714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel if (past->type == DLM_AST) 4066714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel dlm_do_local_ast(dlm, res, lock); 4076714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel else 4086714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel dlm_do_local_bast(dlm, res, lock, past->blocked_type); 4096714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel 4106714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackelleave: 4116714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel 4126714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel if (res) 4136714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel dlm_lockres_put(res); 4146714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel 4156714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel dlm_put(dlm); 4166714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel return ret; 4176714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel} 4186714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel 4196714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel 4206714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel 4216714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackelint dlm_send_proxy_ast_msg(struct dlm_ctxt *dlm, struct dlm_lock_resource *res, 4226714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel struct dlm_lock *lock, int msg_type, 4236714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel int blocked_type, int flags) 4246714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel{ 4256714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel int ret = 0; 4266714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel struct dlm_proxy_ast past; 4276714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel struct kvec vec[2]; 4286714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel size_t veclen = 1; 4296714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel int status; 4306714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel 4316714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel mlog_entry("res %.*s, to=%u, type=%d, blocked_type=%d\n", 4326714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel res->lockname.len, res->lockname.name, lock->ml.node, 4336714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel msg_type, blocked_type); 4346714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel 4356714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel memset(&past, 0, sizeof(struct dlm_proxy_ast)); 4366714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel past.node_idx = dlm->node_num; 4376714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel past.type = msg_type; 4386714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel past.blocked_type = blocked_type; 4396714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel past.namelen = res->lockname.len; 4406714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel memcpy(past.name, res->lockname.name, past.namelen); 4416714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel past.cookie = lock->ml.cookie; 4426714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel 4436714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel vec[0].iov_len = sizeof(struct dlm_proxy_ast); 4446714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel vec[0].iov_base = &past; 4456714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel if (flags & DLM_LKSB_GET_LVB) { 4466714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel mlog(0, "returning requested LVB data\n"); 4476714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel be32_add_cpu(&past.flags, LKM_GET_LVB); 4486714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel vec[1].iov_len = DLM_LVB_LEN; 4496714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel vec[1].iov_base = lock->lksb->lvb; 4506714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel veclen++; 4516714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel } 4526714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel 4536714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel ret = o2net_send_message_vec(DLM_PROXY_AST_MSG, dlm->key, vec, veclen, 4546714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel lock->ml.node, &status); 4556714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel if (ret < 0) 4566714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel mlog_errno(ret); 4576714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel else { 4586714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel if (status == DLM_RECOVERING) { 4596714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel mlog(ML_ERROR, "sent AST to node %u, it thinks this " 4606714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel "node is dead!\n", lock->ml.node); 4616714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel BUG(); 4626714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel } else if (status == DLM_MIGRATING) { 4636714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel mlog(ML_ERROR, "sent AST to node %u, it returned " 4646714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel "DLM_MIGRATING!\n", lock->ml.node); 4656714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel BUG(); 4666714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel } else if (status != DLM_NORMAL) { 4676714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel mlog(ML_ERROR, "AST to node %u returned %d!\n", 4686714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel lock->ml.node, status); 4696714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel /* ignore it */ 4706714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel } 4716714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel ret = 0; 4726714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel } 4736714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel return ret; 4746714d8e86bf443f6f7af50f9d432025649f091f5Kurt Hackel} 475