mirror of
git://sourceware.org/git/lvm2.git
synced 2024-12-22 17:35:59 +03:00
b40ccdd57c
When changing an existing VG to lock_type sanlock, make the sanlock lv large enough to hold all the locks needed for existing LVs.
248 lines
6.5 KiB
C
248 lines
6.5 KiB
C
/*
|
|
* Copyright (C) 2014-2015 Red Hat, Inc.
|
|
*
|
|
* This file is part of LVM2.
|
|
*
|
|
* This copyrighted material is made available to anyone wishing to use,
|
|
* modify, copy, or redistribute it subject to the terms and conditions
|
|
* of the GNU Lesser General Public License v.2.1.
|
|
*/
|
|
|
|
#ifndef _LVMLOCKD_H
|
|
#define _LVMLOCKD_H
|
|
|
|
#include "config-util.h"
|
|
#include "daemon-client.h"
|
|
|
|
#define LOCKD_SANLOCK_LV_NAME "lvmlock"
|
|
|
|
/* lockd_gl flags */
|
|
#define LDGL_SKIP_CACHE_VALIDATE 0x00000001
|
|
#define LDGL_UPDATE_NAMES 0x00000002
|
|
|
|
/* lockd_lv flags */
|
|
#define LDLV_MODE_NO_SH 0x00000001
|
|
#define LDLV_PERSISTENT 0x00000002
|
|
|
|
/* lvmlockd result flags */
|
|
#define LD_RF_NO_LOCKSPACES 0x00000001
|
|
#define LD_RF_NO_GL_LS 0x00000002
|
|
#define LD_RF_WARN_GL_REMOVED 0x00000004
|
|
#define LD_RF_DUP_GL_LS 0x00000008
|
|
#define LD_RF_INACTIVE_LS 0x00000010
|
|
#define LD_RF_ADD_LS_ERROR 0x00000020
|
|
|
|
/* lockd_state flags */
|
|
#define LDST_EX 0x00000001
|
|
#define LDST_SH 0x00000002
|
|
#define LDST_FAIL_REQUEST 0x00000004
|
|
#define LDST_FAIL_NOLS 0x00000008
|
|
#define LDST_FAIL_STARTING 0x00000010
|
|
#define LDST_FAIL_OTHER 0x00000020
|
|
#define LDST_FAIL (LDST_FAIL_REQUEST | LDST_FAIL_NOLS | LDST_FAIL_STARTING | LDST_FAIL_OTHER)
|
|
|
|
#ifdef LVMLOCKD_SUPPORT
|
|
|
|
/* lvmlockd connection and communication */
|
|
|
|
void lvmlockd_set_socket(const char *sock);
|
|
void lvmlockd_set_use(int use);
|
|
int lvmlockd_use(void);
|
|
void lvmlockd_init(struct cmd_context *cmd);
|
|
void lvmlockd_connect(void);
|
|
void lvmlockd_disconnect(void);
|
|
|
|
/* vgcreate/vgremove use init/free */
|
|
|
|
int lockd_init_vg(struct cmd_context *cmd, struct volume_group *vg, const char *lock_type, int lv_lock_count);
|
|
int lockd_free_vg_before(struct cmd_context *cmd, struct volume_group *vg);
|
|
void lockd_free_vg_final(struct cmd_context *cmd, struct volume_group *vg);
|
|
|
|
/* vgrename */
|
|
|
|
int lockd_rename_vg_before(struct cmd_context *cmd, struct volume_group *vg);
|
|
int lockd_rename_vg_final(struct cmd_context *cmd, struct volume_group *vg, int success);
|
|
|
|
/* start and stop the lockspace for a vg */
|
|
|
|
int lockd_start_vg(struct cmd_context *cmd, struct volume_group *vg);
|
|
int lockd_stop_vg(struct cmd_context *cmd, struct volume_group *vg);
|
|
int lockd_start_wait(struct cmd_context *cmd);
|
|
|
|
/* locking */
|
|
|
|
int lockd_gl_create(struct cmd_context *cmd, const char *def_mode, const char *vg_lock_type);
|
|
int lockd_gl(struct cmd_context *cmd, const char *def_mode, uint32_t flags);
|
|
int lockd_vg(struct cmd_context *cmd, const char *vg_name, const char *def_mode,
|
|
uint32_t flags, uint32_t *lockd_state);
|
|
int lockd_vg_update(struct volume_group *vg);
|
|
|
|
int lockd_lv_name(struct cmd_context *cmd, struct volume_group *vg,
|
|
const char *lv_name, struct id *lv_id,
|
|
const char *lock_args, const char *def_mode, uint32_t flags);
|
|
int lockd_lv(struct cmd_context *cmd, struct logical_volume *lv,
|
|
const char *def_mode, uint32_t flags);
|
|
|
|
/* lvcreate/lvremove use init/free */
|
|
|
|
int lockd_init_lv(struct cmd_context *cmd, struct volume_group *vg, struct logical_volume *lv,
|
|
struct lvcreate_params *lp);
|
|
int lockd_init_lv_args(struct cmd_context *cmd, struct volume_group *vg,
|
|
struct logical_volume *lv, const char *lock_type, const char **lock_args);
|
|
int lockd_free_lv(struct cmd_context *cmd, struct volume_group *vg,
|
|
const char *lv_name, struct id *lv_id, const char *lock_args);
|
|
|
|
const char *lockd_running_lock_type(struct cmd_context *cmd);
|
|
|
|
int handle_sanlock_lv(struct cmd_context *cmd, struct volume_group *vg);
|
|
|
|
int lockd_lv_uses_lock(struct logical_volume *lv);
|
|
|
|
#else /* LVMLOCKD_SUPPORT */
|
|
|
|
static inline void lvmlockd_set_socket(const char *sock)
|
|
{
|
|
}
|
|
|
|
static inline void lvmlockd_set_use(int use)
|
|
{
|
|
}
|
|
|
|
static inline void lvmlockd_init(struct cmd_context *cmd)
|
|
{
|
|
}
|
|
|
|
static inline void lvmlockd_disconnect(void)
|
|
{
|
|
}
|
|
|
|
static inline void lvmlockd_connect(void)
|
|
{
|
|
}
|
|
|
|
static inline int lvmlockd_use(void)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
static inline int lockd_init_vg(struct cmd_context *cmd, struct volume_group *vg, const char *lock_type, int lv_lock_count)
|
|
{
|
|
return 1;
|
|
}
|
|
|
|
static inline int lockd_free_vg_before(struct cmd_context *cmd, struct volume_group *vg)
|
|
{
|
|
return 1;
|
|
}
|
|
|
|
static inline void lockd_free_vg_final(struct cmd_context *cmd, struct volume_group *vg)
|
|
{
|
|
return;
|
|
}
|
|
|
|
static inline int lockd_rename_vg_before(struct cmd_context *cmd, struct volume_group *vg)
|
|
{
|
|
return 1;
|
|
}
|
|
|
|
static inline int lockd_rename_vg_final(struct cmd_context *cmd, struct volume_group *vg, int success)
|
|
{
|
|
return 1;
|
|
}
|
|
|
|
static inline int lockd_start_vg(struct cmd_context *cmd, struct volume_group *vg)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
static inline int lockd_stop_vg(struct cmd_context *cmd, struct volume_group *vg)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
static inline int lockd_start_wait(struct cmd_context *cmd)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
static inline int lockd_gl_create(struct cmd_context *cmd, const char *def_mode, const char *vg_lock_type)
|
|
{
|
|
/*
|
|
* When lvm is built without lvmlockd support, creating a VG with
|
|
* a shared lock type should fail.
|
|
*/
|
|
if (is_lockd_type(vg_lock_type)) {
|
|
log_error("Using a shared lock type requires lvmlockd.");
|
|
return 0;
|
|
}
|
|
return 1;
|
|
}
|
|
|
|
static inline int lockd_gl(struct cmd_context *cmd, const char *def_mode, uint32_t flags)
|
|
{
|
|
return 1;
|
|
}
|
|
|
|
static inline int lockd_vg(struct cmd_context *cmd, const char *vg_name, const char *def_mode,
|
|
uint32_t flags, uint32_t *lockd_state)
|
|
{
|
|
*lockd_state = 0;
|
|
return 1;
|
|
}
|
|
|
|
static inline int lockd_vg_update(struct volume_group *vg)
|
|
{
|
|
return 1;
|
|
}
|
|
|
|
static inline int lockd_lv_name(struct cmd_context *cmd, struct volume_group *vg,
|
|
const char *lv_name, struct id *lv_id,
|
|
const char *lock_args, const char *def_mode, uint32_t flags)
|
|
{
|
|
return 1;
|
|
}
|
|
|
|
static inline int lockd_lv(struct cmd_context *cmd, struct logical_volume *lv,
|
|
const char *def_mode, uint32_t flags)
|
|
{
|
|
return 1;
|
|
}
|
|
|
|
static inline int lockd_init_lv(struct cmd_context *cmd, struct volume_group *vg,
|
|
struct logical_volume *lv, struct lvcreate_params *lp)
|
|
{
|
|
return 1;
|
|
}
|
|
|
|
static inline int lockd_init_lv_args(struct cmd_context *cmd, struct volume_group *vg,
|
|
struct logical_volume *lv, const char *lock_type, const char **lock_args)
|
|
{
|
|
return 1;
|
|
}
|
|
|
|
static inline int lockd_free_lv(struct cmd_context *cmd, struct volume_group *vg,
|
|
const char *lv_name, struct id *lv_id, const char *lock_args)
|
|
{
|
|
return 1;
|
|
}
|
|
|
|
static inline const char *lockd_running_lock_type(struct cmd_context *cmd)
|
|
{
|
|
log_error("Using a shared lock type requires lvmlockd.");
|
|
return NULL;
|
|
}
|
|
|
|
static inline int handle_sanlock_lv(struct cmd_context *cmd, struct volume_group *vg)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
static inline int lockd_lv_uses_lock(struct logical_volume *lv)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
#endif /* LVMLOCKD_SUPPORT */
|
|
|
|
#endif /* _LVMLOCKD_H */
|