]>
sourceware.org Git - lvm2.git/blob - tools/pvscan.c
2 * Copyright (C) 2001 Sistina Software
4 * LVM is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; either version 2, or (at your option)
9 * LVM is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
14 * You should have received a copy of the GNU General Public License
15 * along with LVM; see the file COPYING. If not, write to
16 * the Free Software Foundation, 59 Temple Place - Suite 330,
17 * Boston, MA 02111-1307, USA.
23 void pvscan_display_single(struct physical_volume
*pv
);
25 int pv_max_name_len
= 0;
26 int vg_max_name_len
= 0;
28 int pvscan(int argc
, char **argv
)
30 int new_pvs_found
= 0;
34 struct list_head
*pvs
;
35 struct list_head
*pvh
;
37 struct physical_volume
*pv
;
39 uint64_t size_total
= 0;
40 uint64_t size_new
= 0;
46 if (arg_count(novolumegroup_ARG
) && arg_count(exported_ARG
)) {
47 log_error("Options -e and -n are incompatible");
48 return EINVALID_CMD_LINE
;
51 if (arg_count(exported_ARG
) || arg_count(novolumegroup_ARG
))
52 log_print("WARNING: only considering physical volumes %s",
53 arg_count(exported_ARG
) ?
54 "of exported volume group(s)" : "in no volume group");
56 log_verbose("Wiping cache of LVM-capable devices");
57 persistent_filter_wipe(ios
->filter
);
59 log_verbose("Walking through all physical volumes");
60 if (!(pvs
= ios
->get_pvs(ios
)))
63 /* eliminate exported/new if required */
64 list_for_each(pvh
, pvs
) {
65 pvl
= list_entry(pvh
, struct pv_list
, list
);
68 if ((arg_count(exported_ARG
) && !(pv
->status
& EXPORTED_VG
))
69 || (arg_count(novolumegroup_ARG
) && (*pv
->vg_name
))) {
74 /* Also check for MD use? */
76 if (MAJOR(pv_create_kdev_t(pv[p]->pv_name)) != MD_MAJOR) {
78 ("WARNING: physical volume \"%s\" belongs to a meta device",
81 if (MAJOR(pv[p]->pv_dev) != MD_MAJOR)
90 size_total
+= pv
->size
;
92 size_total
+= (pv
->pe_count
- pv
->pe_allocated
)
96 /* find maximum pv name length */
97 pv_max_name_len
= vg_max_name_len
= 0;
98 list_for_each(pvh
, pvs
) {
99 pv
= &list_entry(pvh
, struct pv_list
, list
)->pv
;
100 len
= strlen(pv
->dev
->name
);
101 if (pv_max_name_len
< len
)
102 pv_max_name_len
= len
;
103 len
= strlen(pv
->vg_name
);
104 if (vg_max_name_len
< len
)
105 vg_max_name_len
= len
;
107 pv_max_name_len
+= 2;
108 vg_max_name_len
+= 2;
110 list_for_each(pvh
, pvs
)
111 pvscan_display_single(&list_entry(pvh
, struct pv_list
, list
)->pv
);
114 log_print("No matching physical volumes found");
118 log_print("Total: %d [%s] / in use: %d [%s] / in no VG: %d [%s]",
120 (s1
= display_size(size_total
/ 2, SIZE_SHORT
)),
121 pvs_found
- new_pvs_found
,
123 display_size((size_total
- size_new
) / 2, SIZE_SHORT
)),
124 new_pvs_found
, (s3
= display_size(size_new
/ 2, SIZE_SHORT
)));
132 void pvscan_display_single(struct physical_volume
*pv
)
136 const char *active_str
;
140 char pv_tmp_name
[NAME_LEN
] = { 0, };
141 char vg_tmp_name
[NAME_LEN
] = { 0, };
142 char vg_name_this
[NAME_LEN
] = { 0, };
145 if (arg_count(short_ARG
) > 0) {
146 log_print("%s", pv
->dev
->name
);
150 if (arg_count(verbose_ARG
) > 1) {
151 /* FIXME As per pv_display! Drop through for now. */
154 log_print("System Id %s", pv
->exported
);
156 /* log_print(" "); */
160 memset(pv_tmp_name
, 0, sizeof (pv_tmp_name
));
162 active_str
= (pv
->status
& ACTIVE
) ? "ACTIVE " : "Inactive";
164 vg_name_len
= strlen(pv
->vg_name
) - sizeof (EXPORTED_TAG
) + 1;
166 if (arg_count(uuid_ARG
)) {
170 pv
->dev
->name
, display_uuid(pv
->id
.uuid
));
172 sprintf(pv_tmp_name
, "%s", pv
->dev
->name
);
176 log_print("%s PV %-*s is in no VG %-*s [%s]", active_str
,
177 pv_max_name_len
, pv_tmp_name
,
178 vg_max_name_len
- 6, " ",
179 (s1
= display_size(pv
->size
/ 2, SIZE_SHORT
)));
184 if (strcmp(&pv
->vg_name
[vg_name_len
], EXPORTED_TAG
) == 0) {
185 strncpy(vg_name_this
, pv
->vg_name
, vg_name_len
);
186 log_print("%s PV %-*s is in EXPORTED VG %s [%s / %s free]",
187 active_str
, pv_max_name_len
, pv_tmp_name
,
189 display_size(pv
->pe_count
*
192 (s2
= display_size((pv
->pe_count
- pv
->pe_allocated
)
193 * pv
->pe_size
/ 2, SIZE_SHORT
)));
199 sprintf(vg_tmp_name
, "%s", pv
->vg_name
);
201 ("%s PV %-*s of VG %-*s [%s / %s free]", active_str
, pv_max_name_len
,
202 pv_tmp_name
, vg_max_name_len
, vg_tmp_name
,
203 (s1
= display_size(pv
->pe_count
* pv
->pe_size
/ 2, SIZE_SHORT
)),
205 display_size((pv
->pe_count
- pv
->pe_allocated
) * pv
->pe_size
/ 2,
This page took 0.063495 seconds and 6 git commands to generate.