lvm-fs.c
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:17k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

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