blob: 4d9a92687cd1558a4956e38c94d929d5b0846e0b [file] [log] [blame]
/*
* Copyright (c) 2013 - 2014 Fusion-io, Inc. All rights reserved.
* Copyright (C) 2014 - 2018 Western Digital Corporation.
*
* Synchronization of persistent registration data with DLM lock value blocks.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation, version 2
* of the License.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*/
#ifndef __SCST_PRES_DLM_H
#define __SCST_PRES_DLM_H
#include <linux/dlm.h>
#include <linux/mutex.h>
#include <linux/workqueue.h>
#define SCST_DLM_LOCKSPACE_PFX "scst-"
/*
* DLM lock names
*/
#define PR_LOCK "pr"
#define PR_DATA_LOCK "pr_data"
#define PR_PRE_JOIN_LOCK "pr_pre_join_%d"
#define PR_POST_JOIN_LOCK "pr_post_join_%d"
#define PR_PRE_UPDATE_LOCK "pr_pre_%d"
#define PR_POST_UPDATE_LOCK "pr_post_%d"
#define PR_REG_LOCK "pr_reg_%02d"
/*
* Data members needed for managing PR data via the DLM.
*
* Lock order when using the DLM (from outer to inner):
* - scst_mutex;
* - ls_cr_mutex;
* - ls_mutex;
* - PR_LOCK;
* - PR_PRE_UPDATE_LOCK, PR_POST_UPDATE_LOCK, PR_PRE_JOIN_LOCK,
* PR_POST_JOIN_LOCK;
* - PR_DATA_LOCK;
* - PR_REG_LOCK;
* - dev_pr_mutex / dev_lock.
*/
struct scst_pr_dlm_data {
/* Backpointer to the SCST device. */
struct scst_device *dev;
/* Lockspace name suffix. */
const char *cl_dev_id;
/* Mutex that protects initialization of the lockspace pointer. */
struct mutex ls_cr_mutex;
/* Mutex that protects the lock status blocks. */
struct mutex ls_mutex;
/*
* Pointer to the DLM lockspace that contains the persistent
* reservation and SPC-2 reservation data for device @dev.
*/
dlm_lockspace_t *ls;
/* Time of the latest lockspace creation attempt. */
unsigned long latest_lscr_attempt;
/* Corosync node ID of the local node. */
uint32_t local_nodeid;
/* Number of elements in the nodeid array. */
int participants;
/* Corosync cluster node ID's. Protected by ls_mutex. */
uint32_t *nodeid;
/* Workqueue for copy_from_dlm_work. */
struct workqueue_struct *from_wq;
/* Workqueue for copy_to_dlm_work. */
struct workqueue_struct *to_wq;
/* Workqueue for lvb_upd_work. */
struct workqueue_struct *upd_wq;
struct work_struct pre_join_work;
struct work_struct pre_upd_work;
struct work_struct copy_from_dlm_work;
struct work_struct copy_to_dlm_work;
struct work_struct lvb_upd_work;
struct work_struct reread_lvb_work;
/*
* DLM lock IDs of the locks used for persistent reservation data and
* the associated notification protocol.
*/
struct scst_lksb pre_join_lksb;
struct scst_lksb post_join_lksb;
struct scst_lksb data_lksb;
struct scst_lksb pre_upd_lksb;
struct scst_lksb post_upd_lksb;
/* PR_DATA_LOCK LVB. */
uint8_t lvb[PR_DLM_LVB_LEN];
/* SPC-2 reservation state information. */
uint32_t reserved_by_nodeid;
};
/**
* struct pr_lvb - PR_DATA_LOCK LVB data format
* @nr_registrants: number of reservation keys that have been registered
* @pr_generation: persistent reservation generation
* @version: version of this structure
* @pr_is_set: whether the device has been reserved persistently
* @pr_type: persistent reservation type
* @pr_scope: persistent reservation scope
* @pr_aptpl: persistent reservation APTPL
* @reserved_by_nodeid: Corosync node ID of the node holding an SPC-2
* reservation. Zero if no SPC-2 reservation is held.
*/
struct pr_lvb {
__be32 nr_registrants;
__be32 pr_generation;
u8 version;
u8 pr_is_set;
u8 pr_type;
u8 pr_scope;
u8 pr_aptpl;
u8 reserved[3];
__be32 reserved_by_nodeid;
};
/**
* struct pr_reg_lvb - PR_REG_LOCK LVB data format
* @key: reservation key
* @rel_tgt_id: relative target id
* @version: version of this structure
* @is_holder: whether or not holding the reservation
* @tid: transport ID - up to 228 bytes for iSCSI
*/
struct pr_reg_lvb {
__be64 key;
__be16 rel_tgt_id;
u8 version;
u8 is_holder;
u8 tid[228];
};
#endif /* __SCST_PRES_DLM_H */