lvm-fs.c
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:18k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. /*
  2.  * kernel/lvm-fs.c
  3.  *
  4.  * Copyright (C) 2001-2002 Sistina Software
  5.  *
  6.  * January-May,December 2001
  7.  * May 2002
  8.  *
  9.  * LVM driver is free software; you can redistribute it and/or modify
  10.  * it under the terms of the GNU General Public License as published by
  11.  * the Free Software Foundation; either version 2, or (at your option)
  12.  * any later version.
  13.  *
  14.  * LVM driver is distributed in the hope that it will be useful,
  15.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  16.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  17.  * GNU General Public License for more details.
  18.  *
  19.  * You should have received a copy of the GNU General Public License
  20.  * along with GNU CC; see the file COPYING.  If not, write to
  21.  * the Free Software Foundation, 59 Temple Place - Suite 330,
  22.  * Boston, MA 02111-1307, USA.
  23.  *
  24.  */
  25. /*
  26.  * Changelog
  27.  *
  28.  *    11/01/2001 - First version (Joe Thornber)
  29.  *    21/03/2001 - added display of stripes and stripe size (HM)
  30.  *    04/10/2001 - corrected devfs_register() call in lvm_init_fs()
  31.  *    11/04/2001 - don't devfs_register("lvm") as user-space always does it
  32.  *    10/05/2001 - show more of PV name in /proc/lvm/global
  33.  *    16/12/2001 - fix devfs unregister order and prevent duplicate unreg (REG)
  34.  *
  35.  */
  36. #include <linux/config.h>
  37. #include <linux/version.h>
  38. #include <linux/kernel.h>
  39. #include <linux/vmalloc.h>
  40. #include <linux/smp_lock.h>
  41. #include <linux/devfs_fs_kernel.h>
  42. #include <linux/proc_fs.h>
  43. #include <linux/init.h>
  44. #include <linux/lvm.h>
  45. #include "lvm-internal.h"
  46. static int _proc_read_vg(char *page, char **start, off_t off,
  47.  int count, int *eof, void *data);
  48. static int _proc_read_lv(char *page, char **start, off_t off,
  49.  int count, int *eof, void *data);
  50. static int _proc_read_pv(char *page, char **start, off_t off,
  51.  int count, int *eof, void *data);
  52. static int _proc_read_global(char *page, char **start, off_t off,
  53.      int count, int *eof, void *data);
  54. static int _vg_info(vg_t *vg_ptr, char *buf);
  55. static int _lv_info(vg_t *vg_ptr, lv_t *lv_ptr, char *buf);
  56. static int _pv_info(pv_t *pv_ptr, char *buf);
  57. static void _show_uuid(const char *src, char *b, char *e);
  58. #if 0
  59. static devfs_handle_t lvm_devfs_handle;
  60. #endif
  61. static devfs_handle_t vg_devfs_handle[MAX_VG];
  62. static devfs_handle_t ch_devfs_handle[MAX_VG];
  63. static devfs_handle_t lv_devfs_handle[MAX_LV];
  64. static struct proc_dir_entry *lvm_proc_dir = NULL;
  65. static struct proc_dir_entry *lvm_proc_vg_subdir = NULL;
  66. /* inline functions */
  67. /* public interface */
  68. void __init lvm_init_fs() {
  69. struct proc_dir_entry *pde;
  70. /* User-space has already registered this */
  71. #if 0
  72. lvm_devfs_handle = devfs_register(
  73. 0 , "lvm", 0, LVM_CHAR_MAJOR, 0,
  74. S_IFCHR | S_IRUSR | S_IWUSR | S_IRGRP,
  75. &lvm_chr_fops, NULL);
  76. #endif
  77. lvm_proc_dir = create_proc_entry(LVM_DIR, S_IFDIR, &proc_root);
  78. if (lvm_proc_dir) {
  79. lvm_proc_vg_subdir = create_proc_entry(LVM_VG_SUBDIR, S_IFDIR,
  80.        lvm_proc_dir);
  81. pde = create_proc_entry(LVM_GLOBAL, S_IFREG, lvm_proc_dir);
  82. if ( pde != NULL) pde->read_proc = _proc_read_global;
  83. }
  84. }
  85. void lvm_fin_fs() {
  86. #if 0
  87. devfs_unregister (lvm_devfs_handle);
  88. #endif
  89. remove_proc_entry(LVM_GLOBAL, lvm_proc_dir);
  90. remove_proc_entry(LVM_VG_SUBDIR, lvm_proc_dir);
  91. remove_proc_entry(LVM_DIR, &proc_root);
  92. }
  93. void lvm_fs_create_vg(vg_t *vg_ptr) {
  94. struct proc_dir_entry *pde;
  95. if (!vg_ptr)
  96. return;
  97. vg_devfs_handle[vg_ptr->vg_number] =
  98. devfs_mk_dir(0, vg_ptr->vg_name, NULL);
  99. ch_devfs_handle[vg_ptr->vg_number] = devfs_register(
  100. vg_devfs_handle[vg_ptr->vg_number] , "group",
  101. DEVFS_FL_DEFAULT, LVM_CHAR_MAJOR, vg_ptr->vg_number,
  102. S_IFCHR | S_IRUSR | S_IWUSR | S_IRGRP,
  103. &lvm_chr_fops, NULL);
  104. vg_ptr->vg_dir_pde = create_proc_entry(vg_ptr->vg_name, S_IFDIR,
  105.        lvm_proc_vg_subdir);
  106. if((pde = create_proc_entry("group", S_IFREG, vg_ptr->vg_dir_pde))) {
  107. pde->read_proc = _proc_read_vg;
  108. pde->data = vg_ptr;
  109. }
  110. vg_ptr->lv_subdir_pde =
  111. create_proc_entry(LVM_LV_SUBDIR, S_IFDIR, vg_ptr->vg_dir_pde);
  112. vg_ptr->pv_subdir_pde =
  113. create_proc_entry(LVM_PV_SUBDIR, S_IFDIR, vg_ptr->vg_dir_pde);
  114. }
  115. void lvm_fs_remove_vg(vg_t *vg_ptr) {
  116. int i;
  117. if (!vg_ptr)
  118. return;
  119. devfs_unregister(ch_devfs_handle[vg_ptr->vg_number]);
  120. ch_devfs_handle[vg_ptr->vg_number] = NULL;
  121. /* remove lv's */
  122. for(i = 0; i < vg_ptr->lv_max; i++)
  123. if(vg_ptr->lv[i]) lvm_fs_remove_lv(vg_ptr, vg_ptr->lv[i]);
  124. /* must not remove directory before leaf nodes */
  125. devfs_unregister(vg_devfs_handle[vg_ptr->vg_number]);
  126. vg_devfs_handle[vg_ptr->vg_number] = NULL;
  127. /* remove pv's */
  128. for(i = 0; i < vg_ptr->pv_max; i++)
  129. if(vg_ptr->pv[i]) lvm_fs_remove_pv(vg_ptr, vg_ptr->pv[i]);
  130. if(vg_ptr->vg_dir_pde) {
  131. remove_proc_entry(LVM_LV_SUBDIR, vg_ptr->vg_dir_pde);
  132. vg_ptr->lv_subdir_pde = NULL;
  133. remove_proc_entry(LVM_PV_SUBDIR, vg_ptr->vg_dir_pde);
  134. vg_ptr->pv_subdir_pde = NULL;
  135. remove_proc_entry("group", vg_ptr->vg_dir_pde);
  136. vg_ptr->vg_dir_pde = NULL;
  137. remove_proc_entry(vg_ptr->vg_name, lvm_proc_vg_subdir);
  138. }
  139. }
  140. static inline const char *_basename(const char *str) {
  141. const char *name = strrchr(str, '/');
  142. name = name ? name + 1 : str;
  143. return name;
  144. }
  145. devfs_handle_t lvm_fs_create_lv(vg_t *vg_ptr, lv_t *lv) {
  146. struct proc_dir_entry *pde;
  147. const char *name;
  148. if (!vg_ptr || !lv)
  149. return NULL;
  150. name = _basename(lv->lv_name);
  151. lv_devfs_handle[MINOR(lv->lv_dev)] = devfs_register(
  152. vg_devfs_handle[vg_ptr->vg_number], name,
  153. DEVFS_FL_DEFAULT, LVM_BLK_MAJOR, MINOR(lv->lv_dev),
  154. S_IFBLK | S_IRUSR | S_IWUSR | S_IRGRP,
  155. &lvm_blk_dops, NULL);
  156. if(vg_ptr->lv_subdir_pde &&
  157.    (pde = create_proc_entry(name, S_IFREG, vg_ptr->lv_subdir_pde))) {
  158. pde->read_proc = _proc_read_lv;
  159. pde->data = lv;
  160. }
  161. return lv_devfs_handle[MINOR(lv->lv_dev)];
  162. }
  163. void lvm_fs_remove_lv(vg_t *vg_ptr, lv_t *lv) {
  164. if (!vg_ptr || !lv)
  165. return;
  166. devfs_unregister(lv_devfs_handle[MINOR(lv->lv_dev)]);
  167. lv_devfs_handle[MINOR(lv->lv_dev)] = NULL;
  168. if(vg_ptr->lv_subdir_pde) {
  169. const char *name = _basename(lv->lv_name);
  170. remove_proc_entry(name, vg_ptr->lv_subdir_pde);
  171. }
  172. }
  173. static inline void _make_pv_name(const char *src, char *b, char *e) {
  174. int offset = strlen(LVM_DIR_PREFIX);
  175. if(strncmp(src, LVM_DIR_PREFIX, offset))
  176. offset = 0;
  177. e--;
  178. src += offset;
  179. while(*src && (b != e)) {
  180. *b++ = (*src == '/') ? '_' : *src;
  181. src++;
  182. }
  183. *b = '';
  184. }
  185. void lvm_fs_create_pv(vg_t *vg_ptr, pv_t *pv) {
  186. struct proc_dir_entry *pde;
  187. char name[NAME_LEN];
  188. if (!vg_ptr || !pv)
  189. return;
  190. if(!vg_ptr->pv_subdir_pde)
  191. return;
  192. _make_pv_name(pv->pv_name, name, name + sizeof(name));
  193. if((pde = create_proc_entry(name, S_IFREG, vg_ptr->pv_subdir_pde))) {
  194. pde->read_proc = _proc_read_pv;
  195. pde->data = pv;
  196. }
  197. }
  198. void lvm_fs_remove_pv(vg_t *vg_ptr, pv_t *pv) {
  199. char name[NAME_LEN];
  200. if (!vg_ptr || !pv)
  201. return;
  202. if(!vg_ptr->pv_subdir_pde)
  203. return;
  204. _make_pv_name(pv->pv_name, name, name + sizeof(name));
  205. remove_proc_entry(name, vg_ptr->pv_subdir_pde);
  206. }
  207. static int _proc_read_vg(char *page, char **start, off_t off,
  208.   int count, int *eof, void *data) {
  209. int sz = 0;
  210. vg_t *vg_ptr = data;
  211. char uuid[NAME_LEN];
  212. sz += sprintf(page + sz, "name:         %sn", vg_ptr->vg_name);
  213. sz += sprintf(page + sz, "size:         %un",
  214.       vg_ptr->pe_total * vg_ptr->pe_size / 2);
  215. sz += sprintf(page + sz, "access:       %un", vg_ptr->vg_access);
  216. sz += sprintf(page + sz, "status:       %un", vg_ptr->vg_status);
  217. sz += sprintf(page + sz, "number:       %un", vg_ptr->vg_number);
  218. sz += sprintf(page + sz, "LV max:       %un", vg_ptr->lv_max);
  219. sz += sprintf(page + sz, "LV current:   %un", vg_ptr->lv_cur);
  220. sz += sprintf(page + sz, "LV open:      %un", vg_ptr->lv_open);
  221. sz += sprintf(page + sz, "PV max:       %un", vg_ptr->pv_max);
  222. sz += sprintf(page + sz, "PV current:   %un", vg_ptr->pv_cur);
  223. sz += sprintf(page + sz, "PV active:    %un", vg_ptr->pv_act);
  224. sz += sprintf(page + sz, "PE size:      %un", vg_ptr->pe_size / 2);
  225. sz += sprintf(page + sz, "PE total:     %un", vg_ptr->pe_total);
  226. sz += sprintf(page + sz, "PE allocated: %un", vg_ptr->pe_allocated);
  227. _show_uuid(vg_ptr->vg_uuid, uuid, uuid + sizeof(uuid));
  228. sz += sprintf(page + sz, "uuid:         %sn", uuid);
  229. return sz;
  230. }
  231. static int _proc_read_lv(char *page, char **start, off_t off,
  232.   int count, int *eof, void *data) {
  233. int sz = 0;
  234. lv_t *lv = data;
  235. sz += sprintf(page + sz, "name:         %sn", lv->lv_name);
  236. sz += sprintf(page + sz, "size:         %un", lv->lv_size);
  237. sz += sprintf(page + sz, "access:       %un", lv->lv_access);
  238. sz += sprintf(page + sz, "status:       %un", lv->lv_status);
  239. sz += sprintf(page + sz, "number:       %un", lv->lv_number);
  240. sz += sprintf(page + sz, "open:         %un", lv->lv_open);
  241. sz += sprintf(page + sz, "allocation:   %un", lv->lv_allocation);
  242. if(lv->lv_stripes > 1) {
  243. sz += sprintf(page + sz, "stripes:      %un",
  244.       lv->lv_stripes);
  245. sz += sprintf(page + sz, "stripesize:   %un",
  246.       lv->lv_stripesize);
  247. }
  248. sz += sprintf(page + sz, "device:       %02u:%02un",
  249.       MAJOR(lv->lv_dev), MINOR(lv->lv_dev));
  250. return sz;
  251. }
  252. static int _proc_read_pv(char *page, char **start, off_t off,
  253.  int count, int *eof, void *data) {
  254. int sz = 0;
  255. pv_t *pv = data;
  256. char uuid[NAME_LEN];
  257. sz += sprintf(page + sz, "name:         %sn", pv->pv_name);
  258. sz += sprintf(page + sz, "size:         %un", pv->pv_size);
  259. sz += sprintf(page + sz, "status:       %un", pv->pv_status);
  260. sz += sprintf(page + sz, "number:       %un", pv->pv_number);
  261. sz += sprintf(page + sz, "allocatable:  %un", pv->pv_allocatable);
  262. sz += sprintf(page + sz, "LV current:   %un", pv->lv_cur);
  263. sz += sprintf(page + sz, "PE size:      %un", pv->pe_size / 2);
  264. sz += sprintf(page + sz, "PE total:     %un", pv->pe_total);
  265. sz += sprintf(page + sz, "PE allocated: %un", pv->pe_allocated);
  266. sz += sprintf(page + sz, "device:       %02u:%02un",
  267.                       MAJOR(pv->pv_dev), MINOR(pv->pv_dev));
  268. _show_uuid(pv->pv_uuid, uuid, uuid + sizeof(uuid));
  269. sz += sprintf(page + sz, "uuid:         %sn", uuid);
  270. return sz;
  271. }
  272. static int _proc_read_global(char *page, char **start, off_t pos, int count,
  273.      int *eof, void *data) {
  274. #define  LVM_PROC_BUF   ( i == 0 ? dummy_buf : &buf[sz])
  275. int c, i, l, p, v, vg_counter, pv_counter, lv_counter, lv_open_counter,
  276. lv_open_total, pe_t_bytes, hash_table_bytes, lv_block_exception_t_bytes, seconds;
  277. static off_t sz;
  278. off_t sz_last;
  279. static char *buf = NULL;
  280. static char dummy_buf[160]; /* sized for 2 lines */
  281. vg_t *vg_ptr;
  282. lv_t *lv_ptr;
  283. pv_t *pv_ptr;
  284. #ifdef DEBUG_LVM_PROC_GET_INFO
  285. printk(KERN_DEBUG
  286.        "%s - lvm_proc_get_global_info CALLED  pos: %lu  count: %dn",
  287.        lvm_name, pos, count);
  288. #endif
  289. if(pos != 0 && buf != NULL)
  290. goto out;
  291. sz_last = vg_counter = pv_counter = lv_counter = lv_open_counter = 
  292. lv_open_total = pe_t_bytes = hash_table_bytes = 
  293. lv_block_exception_t_bytes = 0;
  294. /* get some statistics */
  295. for (v = 0; v < ABS_MAX_VG; v++) {
  296. if ((vg_ptr = vg[v]) != NULL) {
  297. vg_counter++;
  298. pv_counter += vg_ptr->pv_cur;
  299. lv_counter += vg_ptr->lv_cur;
  300. if (vg_ptr->lv_cur > 0) {
  301. for (l = 0; l < vg[v]->lv_max; l++) {
  302. if ((lv_ptr = vg_ptr->lv[l]) != NULL) {
  303. pe_t_bytes += lv_ptr->lv_allocated_le;
  304. hash_table_bytes += lv_ptr->lv_snapshot_hash_table_size;
  305. if (lv_ptr->lv_block_exception != NULL)
  306. lv_block_exception_t_bytes += lv_ptr->lv_remap_end;
  307. if (lv_ptr->lv_open > 0) {
  308. lv_open_counter++;
  309. lv_open_total += lv_ptr->lv_open;
  310. }
  311. }
  312. }
  313. }
  314. }
  315. }
  316. pe_t_bytes *= sizeof(pe_t);
  317. lv_block_exception_t_bytes *= sizeof(lv_block_exception_t);
  318. if (buf != NULL) {
  319. P_KFREE("%s -- vfree %dn", lvm_name, __LINE__);
  320. lock_kernel();
  321. vfree(buf);
  322. unlock_kernel();
  323. buf = NULL;
  324. }
  325. /* 2 times: first to get size to allocate buffer,
  326.    2nd to fill the malloced buffer */
  327. for (i = 0; i < 2; i++) {
  328. sz = 0;
  329. sz += sprintf(LVM_PROC_BUF,
  330.       "LVM "
  331. #ifdef MODULE
  332.       "module"
  333. #else
  334.       "driver"
  335. #endif
  336.       " %snn"
  337.       "Total:  %d VG%s  %d PV%s  %d LV%s ",
  338.       lvm_version,
  339.       vg_counter, vg_counter == 1 ? "" : "s",
  340.       pv_counter, pv_counter == 1 ? "" : "s",
  341.       lv_counter, lv_counter == 1 ? "" : "s");
  342. sz += sprintf(LVM_PROC_BUF,
  343.       "(%d LV%s open",
  344.       lv_open_counter,
  345.       lv_open_counter == 1 ? "" : "s");
  346. if (lv_open_total > 0)
  347. sz += sprintf(LVM_PROC_BUF,
  348.       " %d times)n",
  349.       lv_open_total);
  350. else
  351. sz += sprintf(LVM_PROC_BUF, ")");
  352. sz += sprintf(LVM_PROC_BUF,
  353.       "nGlobal: %lu bytes malloced   IOP version: %d   ",
  354.       vg_counter * sizeof(vg_t) +
  355.       pv_counter * sizeof(pv_t) +
  356.       lv_counter * sizeof(lv_t) +
  357.       pe_t_bytes + hash_table_bytes + lv_block_exception_t_bytes + sz_last,
  358.       lvm_iop_version);
  359. seconds = CURRENT_TIME - loadtime;
  360. if (seconds < 0)
  361. loadtime = CURRENT_TIME + seconds;
  362. if (seconds / 86400 > 0) {
  363. sz += sprintf(LVM_PROC_BUF, "%d day%s ",
  364.       seconds / 86400,
  365.       seconds / 86400 == 0 ||
  366.       seconds / 86400 > 1 ? "s" : "");
  367. }
  368. sz += sprintf(LVM_PROC_BUF, "%d:%02d:%02d activen",
  369.       (seconds % 86400) / 3600,
  370.       (seconds % 3600) / 60,
  371.       seconds % 60);
  372. if (vg_counter > 0) {
  373. for (v = 0; v < ABS_MAX_VG; v++) {
  374. /* volume group */
  375. if ((vg_ptr = vg[v]) != NULL) {
  376. sz += _vg_info(vg_ptr, LVM_PROC_BUF);
  377. /* physical volumes */
  378. sz += sprintf(LVM_PROC_BUF,
  379.       "n  PV%s ",
  380.       vg_ptr->pv_cur == 1 ? ": " : "s:");
  381. c = 0;
  382. for (p = 0; p < vg_ptr->pv_max; p++) {
  383. if ((pv_ptr = vg_ptr->pv[p]) != NULL) {
  384. sz += _pv_info(pv_ptr, LVM_PROC_BUF);
  385. c++;
  386. if (c < vg_ptr->pv_cur)
  387. sz += sprintf(LVM_PROC_BUF,
  388.       "n       ");
  389. }
  390. }
  391. /* logical volumes */
  392. sz += sprintf(LVM_PROC_BUF,
  393.       "n    LV%s ",
  394.       vg_ptr->lv_cur == 1 ? ": " : "s:");
  395. c = 0;
  396. for (l = 0; l < vg_ptr->lv_max; l++) {
  397. if ((lv_ptr = vg_ptr->lv[l]) != NULL) {
  398. sz += _lv_info(vg_ptr, lv_ptr, LVM_PROC_BUF);
  399. c++;
  400. if (c < vg_ptr->lv_cur)
  401. sz += sprintf(LVM_PROC_BUF,
  402.       "n         ");
  403. }
  404. }
  405. if (vg_ptr->lv_cur == 0) sz += sprintf(LVM_PROC_BUF, "none");
  406. sz += sprintf(LVM_PROC_BUF, "n");
  407. }
  408. }
  409. }
  410. if (buf == NULL) {
  411. lock_kernel();
  412. buf = vmalloc(sz);
  413. unlock_kernel();
  414. if (buf == NULL) {
  415. sz = 0;
  416. return sprintf(page, "%s - vmalloc error at line %dn",
  417.        lvm_name, __LINE__);
  418. }
  419. }
  420. sz_last = sz;
  421. }
  422.  out:
  423. if (pos > sz - 1) {
  424. lock_kernel();
  425. vfree(buf);
  426. unlock_kernel();
  427. buf = NULL;
  428. return 0;
  429. }
  430. *start = &buf[pos];
  431. if (sz - pos < count)
  432. return sz - pos;
  433. else
  434. return count;
  435. #undef LVM_PROC_BUF
  436. }
  437. /*
  438.  * provide VG info for proc filesystem use (global)
  439.  */
  440. static int _vg_info(vg_t *vg_ptr, char *buf) {
  441. int sz = 0;
  442. char inactive_flag = ' ';
  443. if (!(vg_ptr->vg_status & VG_ACTIVE)) inactive_flag = 'I';
  444. sz = sprintf(buf,
  445.      "nVG: %c%s  [%d PV, %d LV/%d open] "
  446.      " PE Size: %d KBn"
  447.      "  Usage [KB/PE]: %d /%d total  "
  448.      "%d /%d used  %d /%d free",
  449.      inactive_flag,
  450.      vg_ptr->vg_name,
  451.      vg_ptr->pv_cur,
  452.      vg_ptr->lv_cur,
  453.      vg_ptr->lv_open,
  454.            vg_ptr->pe_size >> 1,
  455.      vg_ptr->pe_size * vg_ptr->pe_total >> 1,
  456.      vg_ptr->pe_total,
  457.      vg_ptr->pe_allocated * vg_ptr->pe_size >> 1,
  458.            vg_ptr->pe_allocated,
  459.      (vg_ptr->pe_total - vg_ptr->pe_allocated) *
  460.            vg_ptr->pe_size >> 1,
  461.      vg_ptr->pe_total - vg_ptr->pe_allocated);
  462. return sz;
  463. }
  464. /*
  465.  * provide LV info for proc filesystem use (global)
  466.  */
  467. static int _lv_info(vg_t *vg_ptr, lv_t *lv_ptr, char *buf) {
  468. int sz = 0;
  469. char inactive_flag = 'A', allocation_flag = ' ',
  470. stripes_flag = ' ', rw_flag = ' ', *basename;
  471. if (!(lv_ptr->lv_status & LV_ACTIVE))
  472. inactive_flag = 'I';
  473. rw_flag = 'R';
  474. if (lv_ptr->lv_access & LV_WRITE)
  475. rw_flag = 'W';
  476. allocation_flag = 'D';
  477. if (lv_ptr->lv_allocation & LV_CONTIGUOUS)
  478. allocation_flag = 'C';
  479. stripes_flag = 'L';
  480. if (lv_ptr->lv_stripes > 1)
  481. stripes_flag = 'S';
  482. sz += sprintf(buf+sz,
  483.       "[%c%c%c%c",
  484.       inactive_flag,
  485.  rw_flag,
  486.       allocation_flag,
  487.       stripes_flag);
  488. if (lv_ptr->lv_stripes > 1)
  489. sz += sprintf(buf+sz, "%-2d",
  490.       lv_ptr->lv_stripes);
  491. else
  492. sz += sprintf(buf+sz, "  ");
  493. /* FIXME: use _basename */
  494. basename = strrchr(lv_ptr->lv_name, '/');
  495. if ( basename == 0) basename = lv_ptr->lv_name;
  496. else                basename++;
  497. sz += sprintf(buf+sz, "] %-25s", basename);
  498. if (strlen(basename) > 25)
  499. sz += sprintf(buf+sz,
  500.       "n                              ");
  501. sz += sprintf(buf+sz, "%9d /%-6d   ",
  502.       lv_ptr->lv_size >> 1,
  503.       lv_ptr->lv_size / vg_ptr->pe_size);
  504. if (lv_ptr->lv_open == 0)
  505. sz += sprintf(buf+sz, "close");
  506. else
  507. sz += sprintf(buf+sz, "%dx open",
  508.       lv_ptr->lv_open);
  509. return sz;
  510. }
  511. /*
  512.  * provide PV info for proc filesystem use (global)
  513.  */
  514. static int _pv_info(pv_t *pv, char *buf) {
  515. int sz = 0;
  516. char inactive_flag = 'A', allocation_flag = ' ';
  517. char *pv_name = NULL;
  518. if (!(pv->pv_status & PV_ACTIVE))
  519. inactive_flag = 'I';
  520. allocation_flag = 'A';
  521. if (!(pv->pv_allocatable & PV_ALLOCATABLE))
  522. allocation_flag = 'N';
  523. pv_name = strchr(pv->pv_name+1,'/');
  524. if ( pv_name == 0) pv_name = pv->pv_name;
  525. else               pv_name++;
  526. sz = sprintf(buf,
  527.      "[%c%c] %-21s %8d /%-6d  "
  528.      "%8d /%-6d  %8d /%-6d",
  529.      inactive_flag,
  530.      allocation_flag,
  531.      pv_name,
  532.      pv->pe_total * pv->pe_size >> 1,
  533.      pv->pe_total,
  534.      pv->pe_allocated * pv->pe_size >> 1,
  535.      pv->pe_allocated,
  536.      (pv->pe_total - pv->pe_allocated) *
  537.      pv->pe_size >> 1,
  538.      pv->pe_total - pv->pe_allocated);
  539. return sz;
  540. }
  541. static void _show_uuid(const char *src, char *b, char *e) {
  542. int i;
  543. e--;
  544. for(i = 0; *src && (b != e); i++) {
  545. if(i && !(i & 0x3))
  546. *b++ = '-';
  547. *b++ = *src++;
  548. }
  549. *b = '';
  550. }