summaryrefslogtreecommitdiff
path: root/lib/cache/lvmetad.h
blob: 5820956f1508aa97c15c346dab5e0a963971aa04 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
/*
 * Copyright (C) 2012 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.
 *
 * You should have received a copy of the GNU Lesser General Public License
 * along with this program; if not, write to the Free Software Foundation,
 * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
 */

#ifndef _LVM_METAD_H
#define _LVM_METAD_H

#include "config-util.h"

struct volume_group;
struct cmd_context;
struct dm_config_tree;
enum activation_change;

typedef int (*activation_handler) (struct cmd_context *cmd,
				   const char *vgname, const char *vgid,
				   int partial, int changed,
				   enum activation_change activate);

#ifdef LVMETAD_SUPPORT
/*
 * Sets up a global handle for our process.
 */
void lvmetad_init(struct cmd_context *);

/*
 * Override the use of lvmetad for retrieving scan results and metadata.
 */
void lvmetad_set_active(struct cmd_context *, int);

/*
 * Configure the socket that lvmetad_init will use to connect to the daemon.
 */
void lvmetad_set_socket(const char *);

/*
 * Check whether lvmetad is used.
 */
int lvmetad_used(void);

/*
 * Check if lvmetad socket is present (either the one set by lvmetad_set_socket
 * or the default one if not set). For example, this may be used before calling
 * lvmetad_active() check that does connect to the socket - this would produce
 * various connection errors if the socket is not present.
 */
int lvmetad_socket_present(void);

/*
 * Check whether lvmetad is active (where active means both that it is running
 * and that we have a working connection with it). It opens new connection
 * with lvmetad in the process when lvmetad is supposed to be used and the
 * connection is not open yet.
 */
int lvmetad_active(void);

/* 
 * Connect to lvmetad unless the connection is already open or lvmetad is
 * not configured to be used.  If we fail to connect, print a warning.
 */
void lvmetad_connect_or_warn(void);

/*
 * Drop connection to lvmetad. A subsequent lvmetad_connect_or_warn or
 * lvmetad_active will re-establish the connection (possibly at a
 * different socket path).
 */
void lvmetad_disconnect(void);

/*
 * Set the "lvmetad validity token" (currently only consists of the lvmetad
 * filter. See lvm.conf.
 */
void lvmetad_set_token(const struct dm_config_value *filter);

/*
 * Release allocated token.
 */
void lvmetad_release_token(void);

// FIXME What's described here doesn't appear to be implemented yet.
/*
 * Send a new version of VG metadata to lvmetad. This is normally called after
 * vg_write but before vg_commit. After vg_commit, lvmetad_vg_commit is called
 * to seal the transaction. The result of lvmetad_vg_update is that the new
 * metadata is stored tentatively in lvmetad, but it is not used until
 * lvmetad_vg_commit. The request is validated immediately and lvmetad_vg_commit
 * only constitutes a pointer update.
 */
int lvmetad_vg_update(struct volume_group *vg);

/*
 * Inform lvmetad that a VG has been removed. This is not entirely safe, but is
 * only needed during vgremove, which does not wipe PV labels and therefore
 * cannot mark the PVs as gone.
 */
int lvmetad_vg_remove(struct volume_group *vg);

/*
 * Notify lvmetad that a PV has been found. It is not an error if the PV is
 * already marked as present in lvmetad. If a non-NULL vg pointer is supplied,
 * it is taken to represent the metadata read from the MDA(s) present on that
 * PV. It *is* an error if: the VG is already known to lvmetad, the sequence
 * number on the cached and on the discovered PV match but the metadata content
 * does not.
 */
int lvmetad_pv_found(const struct id *pvid, struct device *dev,
		     const struct format_type *fmt, uint64_t label_sector,
		     struct volume_group *vg, activation_handler handler);

/*
 * Inform the daemon that the device no longer exists.
 */
int lvmetad_pv_gone(dev_t devno, const char *pv_name, activation_handler handler);
int lvmetad_pv_gone_by_dev(struct device *dev, activation_handler handler);

/*
 * Request a list of all PVs available to lvmetad. If requested, this will also
 * read labels off all the PVs to populate lvmcache.
 */
int lvmetad_pv_list_to_lvmcache(struct cmd_context *cmd);

/*
 * Lookup an individual PV.
 * If found is not NULL, it is set according to whether or not the PV is found,
 * otherwise if the PV is not found an error is returned.
 */
int lvmetad_pv_lookup(struct cmd_context *cmd, struct id pvid, int *found);
int lvmetad_pv_lookup_by_dev(struct cmd_context *cmd, struct device *dev, int *found);

/*
 * Request a list of all VGs available to lvmetad and use it to fill in
 * lvmcache..
 */
int lvmetad_vg_list_to_lvmcache(struct cmd_context *cmd);

/*
 * Request a list of vgid/vgname pairs for all VGs known to lvmetad.
 * Does not do vg_lookup's on each VG, and does not populate lvmcache.
 */
int lvmetad_get_vgnameids(struct cmd_context *cmd, struct dm_list *vgnameids);

/*
 * Find a VG by its ID or its name in the lvmetad cache. Gives NULL if the VG is
 * not found.
 */
struct volume_group *lvmetad_vg_lookup(struct cmd_context *cmd,
				       const char *vgname, const char *vgid);

/*
 * Scan a single device and update lvmetad with the result(s).
 */
int lvmetad_pvscan_single(struct cmd_context *cmd, struct device *dev,
			  activation_handler handler, int ignore_obsolete);

int lvmetad_pvscan_all_devs(struct cmd_context *cmd, activation_handler handler, int do_wait);
int lvmetad_pvscan_foreign_vgs(struct cmd_context *cmd, activation_handler handler);

int lvmetad_vg_clear_outdated_pvs(struct volume_group *vg);
void lvmetad_validate_global_cache(struct cmd_context *cmd, int force);
int lvmetad_token_matches(struct cmd_context *cmd);

int lvmetad_vg_is_foreign(struct cmd_context *cmd, const char *vgname, const char *vgid);

#  else		/* LVMETAD_SUPPORT */

#    define lvmetad_init(cmd)	do { } while (0)
#    define lvmetad_disconnect()	do { } while (0)
#    define lvmetad_set_active(cmd, a)	do { } while (0)
#    define lvmetad_set_socket(a)	do { } while (0)
#    define lvmetad_used()	(0)
#    define lvmetad_socket_present()	(0)
#    define lvmetad_active()	(0)
#    define lvmetad_connect_or_warn()	do { } while (0)
#    define lvmetad_set_token(a)	do { } while (0)
#    define lvmetad_release_token()	do { } while (0)
#    define lvmetad_vg_update(vg)	(1)
#    define lvmetad_vg_remove(vg)	(1)
#    define lvmetad_pv_found(pvid, dev, fmt, label_sector, vg, handler)	(1)
#    define lvmetad_pv_gone(devno, pv_name, handler)	(1)
#    define lvmetad_pv_gone_by_dev(dev, handler)	(1)
#    define lvmetad_pv_list_to_lvmcache(cmd)	(1)
#    define lvmetad_pv_lookup(cmd, pvid, found)	(0)
#    define lvmetad_pv_lookup_by_dev(cmd, dev, found)	(0)
#    define lvmetad_vg_list_to_lvmcache(cmd)	(1)
#    define lvmetad_get_vgnameids(cmd, vgnameids)       do { } while (0)
#    define lvmetad_vg_lookup(cmd, vgname, vgid)	(NULL)
#    define lvmetad_pvscan_single(cmd, dev, handler, ignore_obsolete)	(0)
#    define lvmetad_pvscan_all_devs(cmd, handler, do_wait)	(0)
#    define lvmetad_pvscan_foreign_vgs(cmd, handler)	(0)
#    define lvmetad_vg_clear_outdated_pvs(vg)           (1)
#    define lvmetad_validate_global_cache(cmd, force)	do { } while (0)
#    define lvmetad_vg_is_foreign(cmd, vgname, vgid) (0)
#    define lvmetad_token_matches(cmd) (1)

#  endif	/* LVMETAD_SUPPORT */

#endif