1*86d7f5d3SJohn Marino /* $NetBSD: lvm_lv.c,v 1.1.1.1 2009/12/02 00:26:15 haad Exp $ */
2*86d7f5d3SJohn Marino
3*86d7f5d3SJohn Marino /*
4*86d7f5d3SJohn Marino * Copyright (C) 2008,2009 Red Hat, Inc. All rights reserved.
5*86d7f5d3SJohn Marino *
6*86d7f5d3SJohn Marino * This file is part of LVM2.
7*86d7f5d3SJohn Marino *
8*86d7f5d3SJohn Marino * This copyrighted material is made available to anyone wishing to use,
9*86d7f5d3SJohn Marino * modify, copy, or redistribute it subject to the terms and conditions
10*86d7f5d3SJohn Marino * of the GNU Lesser General Public License v.2.1.
11*86d7f5d3SJohn Marino *
12*86d7f5d3SJohn Marino * You should have received a copy of the GNU Lesser General Public License
13*86d7f5d3SJohn Marino * along with this program; if not, write to the Free Software Foundation,
14*86d7f5d3SJohn Marino * Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
15*86d7f5d3SJohn Marino */
16*86d7f5d3SJohn Marino
17*86d7f5d3SJohn Marino #include "lib.h"
18*86d7f5d3SJohn Marino #include "lvm2app.h"
19*86d7f5d3SJohn Marino #include "metadata-exported.h"
20*86d7f5d3SJohn Marino #include "lvm-string.h"
21*86d7f5d3SJohn Marino #include "defaults.h"
22*86d7f5d3SJohn Marino #include "segtype.h"
23*86d7f5d3SJohn Marino #include "locking.h"
24*86d7f5d3SJohn Marino #include "activate.h"
25*86d7f5d3SJohn Marino
26*86d7f5d3SJohn Marino #include <string.h>
27*86d7f5d3SJohn Marino
28*86d7f5d3SJohn Marino /* FIXME: have lib/report/report.c _disp function call lv_size()? */
lvm_lv_get_size(const lv_t lv)29*86d7f5d3SJohn Marino uint64_t lvm_lv_get_size(const lv_t lv)
30*86d7f5d3SJohn Marino {
31*86d7f5d3SJohn Marino return lv_size(lv);
32*86d7f5d3SJohn Marino }
33*86d7f5d3SJohn Marino
lvm_lv_get_uuid(const lv_t lv)34*86d7f5d3SJohn Marino char *lvm_lv_get_uuid(const lv_t lv)
35*86d7f5d3SJohn Marino {
36*86d7f5d3SJohn Marino char uuid[64] __attribute((aligned(8)));
37*86d7f5d3SJohn Marino
38*86d7f5d3SJohn Marino if (!id_write_format(&lv->lvid.id[1], uuid, sizeof(uuid))) {
39*86d7f5d3SJohn Marino log_error("Internal error converting uuid");
40*86d7f5d3SJohn Marino return NULL;
41*86d7f5d3SJohn Marino }
42*86d7f5d3SJohn Marino return strndup((const char *)uuid, 64);
43*86d7f5d3SJohn Marino }
44*86d7f5d3SJohn Marino
lvm_lv_get_name(const lv_t lv)45*86d7f5d3SJohn Marino char *lvm_lv_get_name(const lv_t lv)
46*86d7f5d3SJohn Marino {
47*86d7f5d3SJohn Marino char *name;
48*86d7f5d3SJohn Marino
49*86d7f5d3SJohn Marino name = dm_malloc(NAME_LEN + 1);
50*86d7f5d3SJohn Marino strncpy(name, (const char *)lv->name, NAME_LEN);
51*86d7f5d3SJohn Marino name[NAME_LEN] = '\0';
52*86d7f5d3SJohn Marino return name;
53*86d7f5d3SJohn Marino }
54*86d7f5d3SJohn Marino
lvm_lv_is_active(const lv_t lv)55*86d7f5d3SJohn Marino uint64_t lvm_lv_is_active(const lv_t lv)
56*86d7f5d3SJohn Marino {
57*86d7f5d3SJohn Marino struct lvinfo info;
58*86d7f5d3SJohn Marino if (lv_info(lv->vg->cmd, lv, &info, 1, 0) &&
59*86d7f5d3SJohn Marino info.exists && info.live_table)
60*86d7f5d3SJohn Marino return 1;
61*86d7f5d3SJohn Marino return 0;
62*86d7f5d3SJohn Marino }
63*86d7f5d3SJohn Marino
lvm_lv_is_suspended(const lv_t lv)64*86d7f5d3SJohn Marino uint64_t lvm_lv_is_suspended(const lv_t lv)
65*86d7f5d3SJohn Marino {
66*86d7f5d3SJohn Marino struct lvinfo info;
67*86d7f5d3SJohn Marino if (lv_info(lv->vg->cmd, lv, &info, 1, 0) &&
68*86d7f5d3SJohn Marino info.exists && info.suspended)
69*86d7f5d3SJohn Marino return 1;
70*86d7f5d3SJohn Marino return 0;
71*86d7f5d3SJohn Marino }
72*86d7f5d3SJohn Marino
73*86d7f5d3SJohn Marino /* Set defaults for non-segment specific LV parameters */
_lv_set_default_params(struct lvcreate_params * lp,vg_t vg,const char * lvname,uint64_t extents)74*86d7f5d3SJohn Marino static void _lv_set_default_params(struct lvcreate_params *lp,
75*86d7f5d3SJohn Marino vg_t vg, const char *lvname,
76*86d7f5d3SJohn Marino uint64_t extents)
77*86d7f5d3SJohn Marino {
78*86d7f5d3SJohn Marino lp->zero = 1;
79*86d7f5d3SJohn Marino lp->major = -1;
80*86d7f5d3SJohn Marino lp->minor = -1;
81*86d7f5d3SJohn Marino lp->vg_name = vg->name;
82*86d7f5d3SJohn Marino lp->lv_name = lvname; /* FIXME: check this for safety */
83*86d7f5d3SJohn Marino lp->pvh = &vg->pvs;
84*86d7f5d3SJohn Marino
85*86d7f5d3SJohn Marino lp->extents = extents;
86*86d7f5d3SJohn Marino lp->permission = LVM_READ | LVM_WRITE;
87*86d7f5d3SJohn Marino lp->read_ahead = DM_READ_AHEAD_NONE;
88*86d7f5d3SJohn Marino lp->alloc = ALLOC_INHERIT;
89*86d7f5d3SJohn Marino lp->tag = NULL;
90*86d7f5d3SJohn Marino }
91*86d7f5d3SJohn Marino
92*86d7f5d3SJohn Marino /* Set default for linear segment specific LV parameters */
_lv_set_default_linear_params(struct cmd_context * cmd,struct lvcreate_params * lp)93*86d7f5d3SJohn Marino static void _lv_set_default_linear_params(struct cmd_context *cmd,
94*86d7f5d3SJohn Marino struct lvcreate_params *lp)
95*86d7f5d3SJohn Marino {
96*86d7f5d3SJohn Marino lp->segtype = get_segtype_from_string(cmd, "striped");
97*86d7f5d3SJohn Marino lp->stripes = 1;
98*86d7f5d3SJohn Marino lp->stripe_size = DEFAULT_STRIPESIZE * 2;
99*86d7f5d3SJohn Marino }
100*86d7f5d3SJohn Marino
101*86d7f5d3SJohn Marino /*
102*86d7f5d3SJohn Marino * FIXME: This function should probably not commit to disk but require calling
103*86d7f5d3SJohn Marino * lvm_vg_write. However, this appears to be non-trivial change until
104*86d7f5d3SJohn Marino * lv_create_single is refactored by segtype.
105*86d7f5d3SJohn Marino */
lvm_vg_create_lv_linear(vg_t vg,const char * name,uint64_t size)106*86d7f5d3SJohn Marino lv_t lvm_vg_create_lv_linear(vg_t vg, const char *name, uint64_t size)
107*86d7f5d3SJohn Marino {
108*86d7f5d3SJohn Marino struct lvcreate_params lp;
109*86d7f5d3SJohn Marino uint64_t extents;
110*86d7f5d3SJohn Marino struct lv_list *lvl;
111*86d7f5d3SJohn Marino
112*86d7f5d3SJohn Marino if (vg_read_error(vg))
113*86d7f5d3SJohn Marino return NULL;
114*86d7f5d3SJohn Marino if (!vg_check_write_mode(vg))
115*86d7f5d3SJohn Marino return NULL;
116*86d7f5d3SJohn Marino memset(&lp, 0, sizeof(lp));
117*86d7f5d3SJohn Marino extents = extents_from_size(vg->cmd, size, vg->extent_size);
118*86d7f5d3SJohn Marino _lv_set_default_params(&lp, vg, name, extents);
119*86d7f5d3SJohn Marino _lv_set_default_linear_params(vg->cmd, &lp);
120*86d7f5d3SJohn Marino if (!lv_create_single(vg, &lp))
121*86d7f5d3SJohn Marino return NULL;
122*86d7f5d3SJohn Marino lvl = find_lv_in_vg(vg, name);
123*86d7f5d3SJohn Marino if (!lvl)
124*86d7f5d3SJohn Marino return NULL;
125*86d7f5d3SJohn Marino return (lv_t) lvl->lv;
126*86d7f5d3SJohn Marino }
127*86d7f5d3SJohn Marino
128*86d7f5d3SJohn Marino /*
129*86d7f5d3SJohn Marino * FIXME: This function should probably not commit to disk but require calling
130*86d7f5d3SJohn Marino * lvm_vg_write.
131*86d7f5d3SJohn Marino */
lvm_vg_remove_lv(lv_t lv)132*86d7f5d3SJohn Marino int lvm_vg_remove_lv(lv_t lv)
133*86d7f5d3SJohn Marino {
134*86d7f5d3SJohn Marino if (!lv || !lv->vg || vg_read_error(lv->vg))
135*86d7f5d3SJohn Marino return -1;
136*86d7f5d3SJohn Marino if (!vg_check_write_mode(lv->vg))
137*86d7f5d3SJohn Marino return -1;
138*86d7f5d3SJohn Marino if (!lv_remove_single(lv->vg->cmd, lv, DONT_PROMPT))
139*86d7f5d3SJohn Marino return -1;
140*86d7f5d3SJohn Marino return 0;
141*86d7f5d3SJohn Marino }
142*86d7f5d3SJohn Marino
lvm_lv_activate(lv_t lv)143*86d7f5d3SJohn Marino int lvm_lv_activate(lv_t lv)
144*86d7f5d3SJohn Marino {
145*86d7f5d3SJohn Marino if (!lv || !lv->vg || vg_read_error(lv->vg) || !lv->vg->cmd)
146*86d7f5d3SJohn Marino return -1;
147*86d7f5d3SJohn Marino
148*86d7f5d3SJohn Marino /* FIXME: handle pvmove stuff later */
149*86d7f5d3SJohn Marino if (lv->status & LOCKED) {
150*86d7f5d3SJohn Marino log_error("Unable to activate locked LV");
151*86d7f5d3SJohn Marino return -1;
152*86d7f5d3SJohn Marino }
153*86d7f5d3SJohn Marino
154*86d7f5d3SJohn Marino /* FIXME: handle lvconvert stuff later */
155*86d7f5d3SJohn Marino if (lv->status & CONVERTING) {
156*86d7f5d3SJohn Marino log_error("Unable to activate LV with in-progress lvconvert");
157*86d7f5d3SJohn Marino return -1;
158*86d7f5d3SJohn Marino }
159*86d7f5d3SJohn Marino
160*86d7f5d3SJohn Marino if (lv_is_origin(lv)) {
161*86d7f5d3SJohn Marino log_verbose("Activating logical volume \"%s\" "
162*86d7f5d3SJohn Marino "exclusively", lv->name);
163*86d7f5d3SJohn Marino if (!activate_lv_excl(lv->vg->cmd, lv)) {
164*86d7f5d3SJohn Marino log_error("Activate exclusive failed.");
165*86d7f5d3SJohn Marino return -1;
166*86d7f5d3SJohn Marino }
167*86d7f5d3SJohn Marino } else {
168*86d7f5d3SJohn Marino log_verbose("Activating logical volume \"%s\"",
169*86d7f5d3SJohn Marino lv->name);
170*86d7f5d3SJohn Marino if (!activate_lv(lv->vg->cmd, lv)) {
171*86d7f5d3SJohn Marino log_error("Activate failed.");
172*86d7f5d3SJohn Marino return -1;
173*86d7f5d3SJohn Marino }
174*86d7f5d3SJohn Marino }
175*86d7f5d3SJohn Marino return 0;
176*86d7f5d3SJohn Marino }
177*86d7f5d3SJohn Marino
lvm_lv_deactivate(lv_t lv)178*86d7f5d3SJohn Marino int lvm_lv_deactivate(lv_t lv)
179*86d7f5d3SJohn Marino {
180*86d7f5d3SJohn Marino if (!lv || !lv->vg || vg_read_error(lv->vg) || !lv->vg->cmd)
181*86d7f5d3SJohn Marino return -1;
182*86d7f5d3SJohn Marino
183*86d7f5d3SJohn Marino log_verbose("Deactivating logical volume \"%s\"", lv->name);
184*86d7f5d3SJohn Marino if (!deactivate_lv(lv->vg->cmd, lv)) {
185*86d7f5d3SJohn Marino log_error("Deactivate failed.");
186*86d7f5d3SJohn Marino return -1;
187*86d7f5d3SJohn Marino }
188*86d7f5d3SJohn Marino return 0;
189*86d7f5d3SJohn Marino }
190*86d7f5d3SJohn Marino
lvm_lv_resize(const lv_t lv,uint64_t new_size)191*86d7f5d3SJohn Marino int lvm_lv_resize(const lv_t lv, uint64_t new_size)
192*86d7f5d3SJohn Marino {
193*86d7f5d3SJohn Marino /* FIXME: add lv resize code here */
194*86d7f5d3SJohn Marino log_error("NOT IMPLEMENTED YET");
195*86d7f5d3SJohn Marino return -1;
196*86d7f5d3SJohn Marino }
197