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

Linux/Unix编程

开发平台:

Unix_Linux

  1. /*
  2.  * kernel/lvm.c
  3.  *
  4.  * Copyright (C) 1997 - 2002  Heinz Mauelshagen, Sistina Software
  5.  *
  6.  * February-November 1997
  7.  * April-May,July-August,November 1998
  8.  * January-March,May,July,September,October 1999
  9.  * January,February,July,September-November 2000
  10.  * January-May,June,October 2001
  11.  * May-July 2002
  12.  *
  13.  *
  14.  * LVM driver is free software; you can redistribute it and/or modify
  15.  * it under the terms of the GNU General Public License as published by
  16.  * the Free Software Foundation; either version 2, or (at your option)
  17.  * any later version.
  18.  *
  19.  * LVM driver is distributed in the hope that it will be useful,
  20.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  21.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  22.  * GNU General Public License for more details.
  23.  *
  24.  * You should have received a copy of the GNU General Public License
  25.  * along with GNU CC; see the file COPYING.  If not, write to
  26.  * the Free Software Foundation, 59 Temple Place - Suite 330,
  27.  * Boston, MA 02111-1307, USA.
  28.  *
  29.  */
  30. /*
  31.  * Changelog
  32.  *
  33.  *    09/11/1997 - added chr ioctls VG_STATUS_GET_COUNT
  34.  *                 and VG_STATUS_GET_NAMELIST
  35.  *    18/01/1998 - change lvm_chr_open/close lock handling
  36.  *    30/04/1998 - changed LV_STATUS ioctl to LV_STATUS_BYNAME and
  37.  *               - added   LV_STATUS_BYINDEX ioctl
  38.  *               - used lvm_status_byname_req_t and
  39.  *                      lvm_status_byindex_req_t vars
  40.  *    04/05/1998 - added multiple device support
  41.  *    08/05/1998 - added support to set/clear extendable flag in volume group
  42.  *    09/05/1998 - changed output of lvm_proc_get_global_info() because of
  43.  *                 support for free (eg. longer) logical volume names
  44.  *    12/05/1998 - added spin_locks (thanks to Pascal van Dam
  45.  *                 <pascal@ramoth.xs4all.nl>)
  46.  *    25/05/1998 - fixed handling of locked PEs in lvm_map() and
  47.  *                 lvm_chr_ioctl()
  48.  *    26/05/1998 - reactivated verify_area by access_ok
  49.  *    07/06/1998 - used vmalloc/vfree instead of kmalloc/kfree to go
  50.  *                 beyond 128/256 KB max allocation limit per call
  51.  *               - #ifdef blocked spin_lock calls to avoid compile errors
  52.  *                 with 2.0.x
  53.  *    11/06/1998 - another enhancement to spinlock code in lvm_chr_open()
  54.  *                 and use of LVM_VERSION_CODE instead of my own macros
  55.  *                 (thanks to  Michael Marxmeier <mike@msede.com>)
  56.  *    07/07/1998 - added statistics in lvm_map()
  57.  *    08/07/1998 - saved statistics in lvm_do_lv_extend_reduce()
  58.  *    25/07/1998 - used __initfunc macro
  59.  *    02/08/1998 - changes for official char/block major numbers
  60.  *    07/08/1998 - avoided init_module() and cleanup_module() to be static
  61.  *    30/08/1998 - changed VG lv_open counter from sum of LV lv_open counters
  62.  *                 to sum of LVs open (no matter how often each is)
  63.  *    01/09/1998 - fixed lvm_gendisk.part[] index error
  64.  *    07/09/1998 - added copying of lv_current_pe-array
  65.  *                 in LV_STATUS_BYINDEX ioctl
  66.  *    17/11/1998 - added KERN_* levels to printk
  67.  *    13/01/1999 - fixed LV index bug in lvm_do_lv_create() which hit lvrename
  68.  *    07/02/1999 - fixed spinlock handling bug in case of LVM_RESET
  69.  *                 by moving spinlock code from lvm_chr_open()
  70.  *                 to lvm_chr_ioctl()
  71.  *               - added LVM_LOCK_LVM ioctl to lvm_chr_ioctl()
  72.  *               - allowed LVM_RESET and retrieval commands to go ahead;
  73.  *                 only other update ioctls are blocked now
  74.  *               - fixed pv->pe to NULL for pv_status
  75.  *               - using lv_req structure in lvm_chr_ioctl() now
  76.  *               - fixed NULL ptr reference bug in lvm_do_lv_extend_reduce()
  77.  *                 caused by uncontiguous PV array in lvm_chr_ioctl(VG_REDUCE)
  78.  *    09/02/1999 - changed BLKRASET and BLKRAGET in lvm_chr_ioctl() to
  79.  *                 handle lgoical volume private read ahead sector
  80.  *               - implemented LV read_ahead handling with lvm_blk_read()
  81.  *                 and lvm_blk_write()
  82.  *    10/02/1999 - implemented 2.[12].* support function lvm_hd_name()
  83.  *                 to be used in drivers/block/genhd.c by disk_name()
  84.  *    12/02/1999 - fixed index bug in lvm_blk_ioctl(), HDIO_GETGEO
  85.  *               - enhanced gendisk insert/remove handling
  86.  *    16/02/1999 - changed to dynamic block minor number allocation to
  87.  *                 have as much as 99 volume groups with 256 logical volumes
  88.  *                 as the grand total; this allows having 1 volume group with
  89.  *                 up to 256 logical volumes in it
  90.  *    21/02/1999 - added LV open count information to proc filesystem
  91.  *               - substituted redundant LVM_RESET code by calls
  92.  *                 to lvm_do_vg_remove()
  93.  *    22/02/1999 - used schedule_timeout() to be more responsive
  94.  *                 in case of lvm_do_vg_remove() with lots of logical volumes
  95.  *    19/03/1999 - fixed NULL pointer bug in module_init/lvm_init
  96.  *    17/05/1999 - used DECLARE_WAIT_QUEUE_HEAD macro (>2.3.0)
  97.  *               - enhanced lvm_hd_name support
  98.  *    03/07/1999 - avoided use of KERNEL_VERSION macro based ifdefs and
  99.  *                 memcpy_tofs/memcpy_fromfs macro redefinitions
  100.  *    06/07/1999 - corrected reads/writes statistic counter copy in case
  101.  *                 of striped logical volume
  102.  *    28/07/1999 - implemented snapshot logical volumes
  103.  *                 - lvm_chr_ioctl
  104.  *                   - LV_STATUS_BYINDEX
  105.  *                   - LV_STATUS_BYNAME
  106.  *                 - lvm_do_lv_create
  107.  *                 - lvm_do_lv_remove
  108.  *                 - lvm_map
  109.  *                 - new lvm_snapshot_remap_block
  110.  *                 - new lvm_snapshot_remap_new_block
  111.  *    08/10/1999 - implemented support for multiple snapshots per
  112.  *                 original logical volume
  113.  *    12/10/1999 - support for 2.3.19
  114.  *    11/11/1999 - support for 2.3.28
  115.  *    21/11/1999 - changed lvm_map() interface to buffer_head based
  116.  *    19/12/1999 - support for 2.3.33
  117.  *    01/01/2000 - changed locking concept in lvm_map(),
  118.  *                 lvm_do_vg_create() and lvm_do_lv_remove()
  119.  *    15/01/2000 - fixed PV_FLUSH bug in lvm_chr_ioctl()
  120.  *    24/01/2000 - ported to 2.3.40 including Alan Cox's pointer changes etc.
  121.  *    29/01/2000 - used kmalloc/kfree again for all small structures
  122.  *    20/01/2000 - cleaned up lvm_chr_ioctl by moving code
  123.  *                 to seperated functions
  124.  *               - avoided "/dev/" in proc filesystem output
  125.  *               - avoided inline strings functions lvm_strlen etc.
  126.  *    14/02/2000 - support for 2.3.43
  127.  *               - integrated Andrea Arcagneli's snapshot code
  128.  *    25/06/2000 - james (chip) , IKKHAYD! roffl
  129.  *    26/06/2000 - enhanced lv_extend_reduce for snapshot logical volume
  130.  *                 support
  131.  *    06/09/2000 - added devfs support
  132.  *    07/09/2000 - changed IOP version to 9
  133.  *               - started to add new char ioctl LV_STATUS_BYDEV_T to support
  134.  *                 getting an lv_t based on the dev_t of the Logical Volume
  135.  *    14/09/2000 - enhanced lvm_do_lv_create to upcall VFS functions
  136.  *                 to sync and lock, activate snapshot and unlock the FS
  137.  *                 (to support journaled filesystems)
  138.  *    18/09/2000 - hardsector size support
  139.  *    27/09/2000 - implemented lvm_do_lv_rename() and lvm_do_vg_rename()
  140.  *    30/10/2000 - added Andi Kleen's LV_BMAP ioctl to support LILO
  141.  *    01/11/2000 - added memory information on hash tables to
  142.  *                 lvm_proc_get_global_info()
  143.  *    02/11/2000 - implemented /proc/lvm/ hierarchy
  144.  *    22/11/2000 - changed lvm_do_create_proc_entry_of_pv () to work
  145.  *                 with devfs
  146.  *    26/11/2000 - corrected #ifdef locations for PROC_FS
  147.  *    28/11/2000 - fixed lvm_do_vg_extend() NULL pointer BUG
  148.  *               - fixed lvm_do_create_proc_entry_of_pv() buffer tampering BUG
  149.  *    08/01/2001 - Removed conditional compiles related to PROC_FS,
  150.  *                 procfs is always supported now. (JT)
  151.  *    12/01/2001 - avoided flushing logical volume in case of shrinking
  152.  *                 because of unecessary overhead in case of heavy updates
  153.  *    25/01/2001 - Allow RO open of an inactive LV so it can be reactivated.
  154.  *    31/01/2001 - removed blk_init_queue/blk_cleanup_queue queueing will be
  155.  *                 handled by the proper devices.
  156.  *               - If you try and BMAP a snapshot you now get an -EPERM
  157.  *    01/01/2001 - lvm_map() now calls buffer_IO_error on error for 2.4
  158.  *               - factored __remap_snapshot out of lvm_map
  159.  *    12/02/2001 - move devfs code to create VG before LVs
  160.  *    13/02/2001 - allow VG_CREATE on /dev/lvm
  161.  *    14/02/2001 - removed modversions.h
  162.  *               - tidied device defines for blk.h
  163.  *               - tidied debug statements
  164.  *               - bug: vg[] member not set back to NULL if activation fails
  165.  *               - more lvm_map tidying
  166.  *    15/02/2001 - register /dev/lvm with devfs correctly (major/minor
  167.  *                 were swapped)
  168.  *    19/02/2001 - preallocated buffer_heads for rawio when using
  169.  *                 snapshots [JT]
  170.  *    28/02/2001 - introduced the P_DEV macro and changed some internel
  171.  *                 functions to be static [AD]
  172.  *    28/02/2001 - factored lvm_get_snapshot_use_rate out of blk_ioctl [AD]
  173.  *               - fixed user address accessing bug in lvm_do_lv_create()
  174.  *                 where the check for an existing LV takes place right at
  175.  *                 the beginning
  176.  *    01/03/2001 - Add VG_CREATE_OLD for IOP 10 compatibility
  177.  *    02/03/2001 - Don't destroy usermode pointers in lv_t structures duing
  178.  *                 LV_STATUS_BYxxx
  179.  *                 and remove redundant lv_t variables from same.
  180.  *               - avoid compilation of lvm_dummy_device_request in case of
  181.  *                 Linux >= 2.3.0 to avoid a warning
  182.  *               - added lvm_name argument to printk in buffer allocation
  183.  *                 in order to avoid a warning
  184.  *    04/03/2001 - moved linux/version.h above first use of KERNEL_VERSION
  185.  *                 macros
  186.  *    05/03/2001 - restore copying pe_t array in lvm_do_lv_status_byname. For
  187.  *                 lvdisplay -v (PC)
  188.  *               - restore copying pe_t array in lvm_do_lv_status_byindex (HM)
  189.  *               - added copying pe_t array in lvm_do_lv_status_bydev (HM)
  190.  *               - enhanced lvm_do_lv_status_by{name,index,dev} to be capable
  191.  *                 to copy the lv_block_exception_t array to userspace (HM)
  192.  *    08/03/2001 - initialize new lv_ptr->lv_COW_table_iobuf for snapshots;
  193.  *                 removed obsolete lv_ptr->lv_COW_table_page initialization
  194.  *               - factored lvm_do_pv_flush out of lvm_chr_ioctl (HM)
  195.  *    09/03/2001 - Added _lock_open_count to ensure we only drop the lock
  196.  *                 when the locking process closes.
  197.  *    05/04/2001 - Defer writes to an extent that is being moved [JT]
  198.  *    05/04/2001 - use b_rdev and b_rsector rather than b_dev and b_blocknr in
  199.  *                 lvm_map() in order to make stacking devices more happy (HM)
  200.  *    11/04/2001 - cleaned up the pvmove queue code. I no longer retain the
  201.  *                 rw flag, instead WRITEA's are just dropped [JT]
  202.  *    30/04/2001 - added KERNEL_VERSION > 2.4.3 get_hardsect_size() rather
  203.  *                 than get_hardblocksize() call
  204.  *    03/05/2001 - Use copy_to/from_user to preserve pointers in
  205.  *                 lvm_do_status_by*
  206.  *    11/05/2001 - avoid accesses to inactive snapshot data in
  207.  *                 __update_hardsectsize() and lvm_do_lv_extend_reduce() (JW)
  208.  *    28/05/2001 - implemented missing BLKSSZGET ioctl
  209.  *    05/06/2001 - Move _pe_lock out of fast path for lvm_map when no PEs
  210.  *                 locked.  Make buffer queue flush not need locking.
  211.  *                 Fix lvm_user_bmap() to set b_rsector for new lvm_map(). [AED]
  212.  *    30/06/2001 - Speed up __update_hardsectsize() by checking if PVs have
  213.  *                 the same hardsectsize (very likely) before scanning all LEs
  214.  *                 in the LV each time.  [AED]
  215.  *    12/10/2001 - Use add/del_gendisk() routines in 2.4.10+
  216.  *    01/11/2001 - Backport read_ahead change from Linus kernel [AED]
  217.  *    24/05/2002 - fixed locking bug in lvm_do_le_remap() introduced with 1.0.4
  218.  *    13/06/2002 - use blk_ioctl() to support various standard block ioctls
  219.  *               - support HDIO_GETGEO_BIG ioctl
  220.  *    05/07/2002 - fixed OBO error on vg array access [benh@kernel.crashing.org]
  221.  *    22/07/2002 - streamlined blk_ioctl() call
  222.  *
  223.  */
  224. #include <linux/version.h>
  225. #define MAJOR_NR LVM_BLK_MAJOR
  226. #define DEVICE_OFF(device)
  227. #define LOCAL_END_REQUEST
  228. /* lvm_do_lv_create calls fsync_dev_lockfs()/unlockfs() */
  229. /* #define LVM_VFS_ENHANCEMENT */
  230. #include <linux/config.h>
  231. #include <linux/module.h>
  232. #include <linux/kernel.h>
  233. #include <linux/vmalloc.h>
  234. #include <linux/slab.h>
  235. #include <linux/init.h>
  236. #include <linux/hdreg.h>
  237. #include <linux/stat.h>
  238. #include <linux/fs.h>
  239. #include <linux/proc_fs.h>
  240. #include <linux/blkdev.h>
  241. #include <linux/genhd.h>
  242. #include <linux/locks.h>
  243. #include <linux/devfs_fs_kernel.h>
  244. #include <linux/smp_lock.h>
  245. #include <asm/ioctl.h>
  246. #include <asm/segment.h>
  247. #include <asm/uaccess.h>
  248. #ifdef CONFIG_KERNELD
  249. #include <linux/kerneld.h>
  250. #endif
  251. #include <linux/blk.h>
  252. #include <linux/blkpg.h>
  253. #include <linux/errno.h>
  254. #include <linux/lvm.h>
  255. #include "lvm-internal.h"
  256. #define LVM_CORRECT_READ_AHEAD(a)
  257. do {
  258. if ((a) < LVM_MIN_READ_AHEAD ||
  259.     (a) > LVM_MAX_READ_AHEAD)
  260. (a) = LVM_DEFAULT_READ_AHEAD;
  261. read_ahead[MAJOR_NR] = (a);
  262. } while(0)
  263. #ifndef WRITEA
  264. #  define WRITEA WRITE
  265. #endif
  266. /*
  267.  * External function prototypes
  268.  */
  269. static int lvm_make_request_fn(request_queue_t*, int, struct buffer_head*);
  270. static int lvm_blk_ioctl(struct inode *, struct file *, uint, ulong);
  271. static int lvm_blk_open(struct inode *, struct file *);
  272. static int lvm_blk_close(struct inode *, struct file *);
  273. static int lvm_get_snapshot_use_rate(lv_t *lv_ptr, void *arg);
  274. static int lvm_user_bmap(struct inode *, struct lv_bmap *);
  275. static int lvm_chr_open(struct inode *, struct file *);
  276. static int lvm_chr_close(struct inode *, struct file *);
  277. static int lvm_chr_ioctl(struct inode *, struct file *, uint, ulong);
  278. /* End external function prototypes */
  279. /*
  280.  * Internal function prototypes
  281.  */
  282. static void lvm_cleanup(void);
  283. static void lvm_init_vars(void);
  284. #ifdef LVM_HD_NAME
  285. extern void (*lvm_hd_name_ptr) (char *, int);
  286. #endif
  287. static int lvm_map(struct buffer_head *, int);
  288. static int lvm_do_lock_lvm(void);
  289. static int lvm_do_le_remap(vg_t *, void *);
  290. static int lvm_do_pv_create(pv_t *, vg_t *, ulong);
  291. static int lvm_do_pv_remove(vg_t *, ulong);
  292. static int lvm_do_lv_create(int, char *, lv_t *);
  293. static int lvm_do_lv_extend_reduce(int, char *, lv_t *);
  294. static int lvm_do_lv_remove(int, char *, int);
  295. static int lvm_do_lv_rename(vg_t *, lv_req_t *, lv_t *);
  296. static int lvm_do_lv_status_byname(vg_t *r, void *);
  297. static int lvm_do_lv_status_byindex(vg_t *, void *);
  298. static int lvm_do_lv_status_bydev(vg_t *, void *);
  299. static int lvm_do_pe_lock_unlock(vg_t *r, void *);
  300. static int lvm_do_pv_change(vg_t*, void*);
  301. static int lvm_do_pv_status(vg_t *, void *);
  302. static int lvm_do_pv_flush(void *);
  303. static int lvm_do_vg_create(void *, int minor);
  304. static int lvm_do_vg_extend(vg_t *, void *);
  305. static int lvm_do_vg_reduce(vg_t *, void *);
  306. static int lvm_do_vg_rename(vg_t *, void *);
  307. static int lvm_do_vg_remove(int);
  308. static void lvm_geninit(struct gendisk *);
  309. static void __update_hardsectsize(lv_t *lv);
  310. static void _queue_io(struct buffer_head *bh, int rw);
  311. static struct buffer_head *_dequeue_io(void);
  312. static void _flush_io(struct buffer_head *bh);
  313. static int _open_pv(pv_t *pv);
  314. static void _close_pv(pv_t *pv);
  315. static unsigned long _sectors_to_k(unsigned long sect);
  316. #ifdef LVM_HD_NAME
  317. void lvm_hd_name(char *, int);
  318. #endif
  319. /* END Internal function prototypes */
  320. /* variables */
  321. char *lvm_version = "LVM version "LVM_RELEASE_NAME"("LVM_RELEASE_DATE")";
  322. ushort lvm_iop_version = LVM_DRIVER_IOP_VERSION;
  323. int loadtime = 0;
  324. const char *const lvm_name = LVM_NAME;
  325. /* volume group descriptor area pointers */
  326. vg_t *vg[ABS_MAX_VG + 1];
  327. /* map from block minor number to VG and LV numbers */
  328. static struct {
  329. int vg_number;
  330. int lv_number;
  331. } vg_lv_map[ABS_MAX_LV];
  332. /* Request structures (lvm_chr_ioctl()) */
  333. static pv_change_req_t pv_change_req;
  334. static pv_status_req_t pv_status_req;
  335. volatile static pe_lock_req_t pe_lock_req;
  336. static le_remap_req_t le_remap_req;
  337. static lv_req_t lv_req;
  338. #ifdef LVM_TOTAL_RESET
  339. static int lvm_reset_spindown = 0;
  340. #endif
  341. static char pv_name[NAME_LEN];
  342. /* static char rootvg[NAME_LEN] = { 0, }; */
  343. static int lock = 0;
  344. static int _lock_open_count = 0;
  345. static uint vg_count = 0;
  346. static long lvm_chr_open_count = 0;
  347. static DECLARE_WAIT_QUEUE_HEAD(lvm_wait);
  348. static spinlock_t lvm_lock = SPIN_LOCK_UNLOCKED;
  349. static spinlock_t lvm_snapshot_lock = SPIN_LOCK_UNLOCKED;
  350. static struct buffer_head *_pe_requests;
  351. static DECLARE_RWSEM(_pe_lock);
  352. struct file_operations lvm_chr_fops = {
  353. owner: THIS_MODULE,
  354. open: lvm_chr_open,
  355. release: lvm_chr_close,
  356. ioctl: lvm_chr_ioctl,
  357. };
  358. /* block device operations structure needed for 2.3.38? and above */
  359. struct block_device_operations lvm_blk_dops =
  360. {
  361. owner: THIS_MODULE,
  362. open: lvm_blk_open,
  363. release: lvm_blk_close,
  364. ioctl: lvm_blk_ioctl,
  365. };
  366. /* gendisk structures */
  367. static struct hd_struct lvm_hd_struct[MAX_LV];
  368. static int lvm_blocksizes[MAX_LV];
  369. static int lvm_hardsectsizes[MAX_LV];
  370. static int lvm_size[MAX_LV];
  371. static struct gendisk lvm_gendisk =
  372. {
  373. major: MAJOR_NR,
  374. major_name: LVM_NAME,
  375. minor_shift: 0,
  376. max_p: 1,
  377. part: lvm_hd_struct,
  378. sizes: lvm_size,
  379. nr_real: MAX_LV,
  380. };
  381. /*
  382.  * Driver initialization...
  383.  */
  384. int lvm_init(void)
  385. {
  386. if (devfs_register_chrdev(LVM_CHAR_MAJOR,
  387.   lvm_name, &lvm_chr_fops) < 0) {
  388. printk(KERN_ERR "%s -- devfs_register_chrdev failedn",
  389.        lvm_name);
  390. return -EIO;
  391. }
  392. if (devfs_register_blkdev(MAJOR_NR, lvm_name, &lvm_blk_dops) < 0)
  393. {
  394. printk("%s -- devfs_register_blkdev failedn", lvm_name);
  395. if (devfs_unregister_chrdev(LVM_CHAR_MAJOR, lvm_name) < 0)
  396. printk(KERN_ERR
  397.        "%s -- devfs_unregister_chrdev failedn",
  398.        lvm_name);
  399. return -EIO;
  400. }
  401. lvm_init_fs();
  402. lvm_init_vars();
  403. lvm_geninit(&lvm_gendisk);
  404. /* insert our gendisk at the corresponding major */
  405. add_gendisk(&lvm_gendisk);
  406. #ifdef LVM_HD_NAME
  407. /* reference from drivers/block/genhd.c */
  408. lvm_hd_name_ptr = lvm_hd_name;
  409. #endif
  410. blk_queue_make_request(BLK_DEFAULT_QUEUE(MAJOR_NR), lvm_make_request_fn);
  411. /* initialise the pe lock */
  412. pe_lock_req.lock = UNLOCK_PE;
  413. /* optional read root VGDA */
  414. /*
  415.    if ( *rootvg != 0) vg_read_with_pv_and_lv ( rootvg, &vg);
  416. */
  417. #ifdef MODULE
  418. printk(KERN_INFO "%s module loadedn", lvm_version);
  419. #else
  420. printk(KERN_INFO "%sn", lvm_version);
  421. #endif
  422. return 0;
  423. } /* lvm_init() */
  424. /*
  425.  * cleanup...
  426.  */
  427. static void lvm_cleanup(void)
  428. {
  429. if (devfs_unregister_chrdev(LVM_CHAR_MAJOR, lvm_name) < 0)
  430. printk(KERN_ERR "%s -- devfs_unregister_chrdev failedn",
  431.        lvm_name);
  432. if (devfs_unregister_blkdev(MAJOR_NR, lvm_name) < 0)
  433. printk(KERN_ERR "%s -- devfs_unregister_blkdev failedn",
  434.        lvm_name);
  435. /* delete our gendisk from chain */
  436. del_gendisk(&lvm_gendisk);
  437. blk_size[MAJOR_NR] = NULL;
  438. blksize_size[MAJOR_NR] = NULL;
  439. hardsect_size[MAJOR_NR] = NULL;
  440. #ifdef LVM_HD_NAME
  441. /* reference from linux/drivers/block/genhd.c */
  442. lvm_hd_name_ptr = NULL;
  443. #endif
  444. /* unregister with procfs and devfs */
  445. lvm_fin_fs();
  446. #ifdef MODULE
  447. printk(KERN_INFO "%s -- Module successfully deactivatedn", lvm_name);
  448. #endif
  449. return;
  450. } /* lvm_cleanup() */
  451. /*
  452.  * support function to initialize lvm variables
  453.  */
  454. static void __init lvm_init_vars(void)
  455. {
  456. int v;
  457. loadtime = CURRENT_TIME;
  458. lvm_lock = lvm_snapshot_lock = SPIN_LOCK_UNLOCKED;
  459. pe_lock_req.lock = UNLOCK_PE;
  460. pe_lock_req.data.lv_dev = 0;
  461. pe_lock_req.data.pv_dev = 0;
  462. pe_lock_req.data.pv_offset = 0;
  463. /* Initialize VG pointers */
  464. for (v = 0; v < ABS_MAX_VG + 1; v++)
  465. vg[v] = NULL;
  466. /* Initialize LV -> VG association */
  467. for (v = 0; v < ABS_MAX_LV; v++) {
  468. /* index ABS_MAX_VG never used for real VG */
  469. vg_lv_map[v].vg_number = ABS_MAX_VG;
  470. vg_lv_map[v].lv_number = -1;
  471. }
  472. return;
  473. } /* lvm_init_vars() */
  474. /********************************************************************
  475.  *
  476.  * Character device functions
  477.  *
  478.  ********************************************************************/
  479. #define MODE_TO_STR(mode) (mode) & FMODE_READ ? "READ" : "", 
  480.   (mode) & FMODE_WRITE ? "WRITE" : ""
  481. /*
  482.  * character device open routine
  483.  */
  484. static int lvm_chr_open(struct inode *inode, struct file *file)
  485. {
  486. int minor = MINOR(inode->i_rdev);
  487. P_DEV("chr_open MINOR: %d  VG#: %d  mode: %s%s  lock: %dn",
  488.       minor, VG_CHR(minor), MODE_TO_STR(file->f_mode), lock);
  489. /* super user validation */
  490. if (!capable(CAP_SYS_ADMIN)) return -EACCES;
  491. /* Group special file open */
  492. if (VG_CHR(minor) > MAX_VG) return -ENXIO;
  493. spin_lock(&lvm_lock);
  494. if(lock == current->pid)
  495. _lock_open_count++;
  496. spin_unlock(&lvm_lock);
  497. lvm_chr_open_count++;
  498. MOD_INC_USE_COUNT;
  499. return 0;
  500. } /* lvm_chr_open() */
  501. /*
  502.  * character device i/o-control routine
  503.  *
  504.  * Only one changing process can do changing ioctl at one time,
  505.  * others will block.
  506.  *
  507.  */
  508. static int lvm_chr_ioctl(struct inode *inode, struct file *file,
  509.  uint command, ulong a)
  510. {
  511. int minor = MINOR(inode->i_rdev);
  512. uint extendable, l, v;
  513. void *arg = (void *) a;
  514. lv_t lv;
  515. vg_t* vg_ptr = vg[VG_CHR(minor)];
  516. /* otherwise cc will complain about unused variables */
  517. (void) lvm_lock;
  518. P_IOCTL("chr MINOR: %d  command: 0x%X  arg: %p  VG#: %d  mode: %s%sn",
  519. minor, command, arg, VG_CHR(minor), MODE_TO_STR(file->f_mode));
  520. #ifdef LVM_TOTAL_RESET
  521. if (lvm_reset_spindown > 0) return -EACCES;
  522. #endif
  523. /* Main command switch */
  524. switch (command) {
  525. case LVM_LOCK_LVM:
  526. /* lock the LVM */
  527. return lvm_do_lock_lvm();
  528. case LVM_GET_IOP_VERSION:
  529. /* check lvm version to ensure driver/tools+lib
  530.    interoperability */
  531. if (copy_to_user(arg, &lvm_iop_version, sizeof(ushort)) != 0)
  532. return -EFAULT;
  533. return 0;
  534. #ifdef LVM_TOTAL_RESET
  535. case LVM_RESET:
  536. /* lock reset function */
  537. lvm_reset_spindown = 1;
  538. for (v = 0; v < ABS_MAX_VG; v++) {
  539. if (vg[v] != NULL) lvm_do_vg_remove(v);
  540. }
  541. #ifdef MODULE
  542. while (GET_USE_COUNT(&__this_module) < 1)
  543. MOD_INC_USE_COUNT;
  544. while (GET_USE_COUNT(&__this_module) > 1)
  545. MOD_DEC_USE_COUNT;
  546. #endif /* MODULE */
  547. lock = 0; /* release lock */
  548. wake_up_interruptible(&lvm_wait);
  549. return 0;
  550. #endif /* LVM_TOTAL_RESET */
  551. case LE_REMAP:
  552. /* remap a logical extent (after moving the physical extent) */
  553. return lvm_do_le_remap(vg_ptr,arg);
  554. case PE_LOCK_UNLOCK:
  555. /* lock/unlock i/o to a physical extent to move it to another
  556.    physical volume (move's done in user space's pvmove) */
  557. return lvm_do_pe_lock_unlock(vg_ptr,arg);
  558. case VG_CREATE_OLD:
  559. /* create a VGDA */
  560. return lvm_do_vg_create(arg, minor);
  561. case VG_CREATE:
  562.         /* create a VGDA, assume VG number is filled in */
  563. return lvm_do_vg_create(arg, -1);
  564. case VG_EXTEND:
  565. /* extend a volume group */
  566. return lvm_do_vg_extend(vg_ptr, arg);
  567. case VG_REDUCE:
  568. /* reduce a volume group */
  569. return lvm_do_vg_reduce(vg_ptr, arg);
  570. case VG_RENAME:
  571. /* rename a volume group */
  572. return lvm_do_vg_rename(vg_ptr, arg);
  573. case VG_REMOVE:
  574. /* remove an inactive VGDA */
  575. return lvm_do_vg_remove(minor);
  576. case VG_SET_EXTENDABLE:
  577. /* set/clear extendability flag of volume group */
  578. if (vg_ptr == NULL) return -ENXIO;
  579. if (copy_from_user(&extendable, arg, sizeof(extendable)) != 0)
  580. return -EFAULT;
  581. if (extendable == VG_EXTENDABLE ||
  582.     extendable == ~VG_EXTENDABLE) {
  583. if (extendable == VG_EXTENDABLE)
  584. vg_ptr->vg_status |= VG_EXTENDABLE;
  585. else
  586. vg_ptr->vg_status &= ~VG_EXTENDABLE;
  587. } else return -EINVAL;
  588. return 0;
  589. case VG_STATUS:
  590. /* get volume group data (only the vg_t struct) */
  591. if (vg_ptr == NULL) return -ENXIO;
  592. if (copy_to_user(arg, vg_ptr, sizeof(vg_t)) != 0)
  593. return -EFAULT;
  594. return 0;
  595. case VG_STATUS_GET_COUNT:
  596. /* get volume group count */
  597. if (copy_to_user(arg, &vg_count, sizeof(vg_count)) != 0)
  598. return -EFAULT;
  599. return 0;
  600. case VG_STATUS_GET_NAMELIST:
  601. /* get volume group names */
  602. for (l = v = 0; v < ABS_MAX_VG; v++) {
  603. if (vg[v] != NULL) {
  604. if (copy_to_user(arg + l * NAME_LEN,
  605.  vg[v]->vg_name,
  606.  NAME_LEN) != 0)
  607. return -EFAULT;
  608. l++;
  609. }
  610. }
  611. return 0;
  612. case LV_CREATE:
  613. case LV_EXTEND:
  614. case LV_REDUCE:
  615. case LV_REMOVE:
  616. case LV_RENAME:
  617. /* create, extend, reduce, remove or rename a logical volume */
  618. if (vg_ptr == NULL) return -ENXIO;
  619. if (copy_from_user(&lv_req, arg, sizeof(lv_req)) != 0)
  620. return -EFAULT;
  621. if (command != LV_REMOVE) {
  622. if (copy_from_user(&lv, lv_req.lv, sizeof(lv_t)) != 0)
  623. return -EFAULT;
  624. }
  625. switch (command) {
  626. case LV_CREATE:
  627. return lvm_do_lv_create(minor, lv_req.lv_name, &lv);
  628. case LV_EXTEND:
  629. case LV_REDUCE:
  630. return lvm_do_lv_extend_reduce(minor, lv_req.lv_name, &lv);
  631. case LV_REMOVE:
  632. return lvm_do_lv_remove(minor, lv_req.lv_name, -1);
  633. case LV_RENAME:
  634. return lvm_do_lv_rename(vg_ptr, &lv_req, &lv);
  635. }
  636. case LV_STATUS_BYNAME:
  637. /* get status of a logical volume by name */
  638. return lvm_do_lv_status_byname(vg_ptr, arg);
  639. case LV_STATUS_BYINDEX:
  640. /* get status of a logical volume by index */
  641. return lvm_do_lv_status_byindex(vg_ptr, arg);
  642. case LV_STATUS_BYDEV:
  643. /* get status of a logical volume by device */
  644. return lvm_do_lv_status_bydev(vg_ptr, arg);
  645. case PV_CHANGE:
  646. /* change a physical volume */
  647. return lvm_do_pv_change(vg_ptr,arg);
  648. case PV_STATUS:
  649. /* get physical volume data (pv_t structure only) */
  650. return lvm_do_pv_status(vg_ptr,arg);
  651. case PV_FLUSH:
  652. /* physical volume buffer flush/invalidate */
  653. return lvm_do_pv_flush(arg);
  654. default:
  655. printk(KERN_WARNING
  656.        "%s -- lvm_chr_ioctl: unknown command 0x%xn",
  657.        lvm_name, command);
  658. return -ENOTTY;
  659. }
  660. return 0;
  661. } /* lvm_chr_ioctl */
  662. /*
  663.  * character device close routine
  664.  */
  665. static int lvm_chr_close(struct inode *inode, struct file *file)
  666. {
  667. P_DEV("chr_close MINOR: %d  VG#: %dn",
  668.       MINOR(inode->i_rdev), VG_CHR(MINOR(inode->i_rdev)));
  669. #ifdef LVM_TOTAL_RESET
  670. if (lvm_reset_spindown > 0) {
  671. lvm_reset_spindown = 0;
  672. lvm_chr_open_count = 0;
  673. }
  674. #endif
  675. if (lvm_chr_open_count > 0) lvm_chr_open_count--;
  676. spin_lock(&lvm_lock);
  677. if(lock == current->pid) {
  678. if(!_lock_open_count) {
  679. P_DEV("chr_close: unlocking LVM for pid %dn", lock);
  680. lock = 0;
  681. wake_up_interruptible(&lvm_wait);
  682. } else
  683. _lock_open_count--;
  684. }
  685. spin_unlock(&lvm_lock);
  686. MOD_DEC_USE_COUNT;
  687. return 0;
  688. } /* lvm_chr_close() */
  689. /********************************************************************
  690.  *
  691.  * Block device functions
  692.  *
  693.  ********************************************************************/
  694. /*
  695.  * block device open routine
  696.  */
  697. static int lvm_blk_open(struct inode *inode, struct file *file)
  698. {
  699. int minor = MINOR(inode->i_rdev);
  700. lv_t *lv_ptr;
  701. vg_t *vg_ptr = vg[VG_BLK(minor)];
  702. P_DEV("blk_open MINOR: %d  VG#: %d  LV#: %d  mode: %s%sn",
  703.       minor, VG_BLK(minor), LV_BLK(minor), MODE_TO_STR(file->f_mode));
  704. #ifdef LVM_TOTAL_RESET
  705. if (lvm_reset_spindown > 0)
  706. return -EPERM;
  707. #endif
  708. if (vg_ptr != NULL &&
  709.     (vg_ptr->vg_status & VG_ACTIVE) &&
  710.     (lv_ptr = vg_ptr->lv[LV_BLK(minor)]) != NULL &&
  711.     LV_BLK(minor) >= 0 &&
  712.     LV_BLK(minor) < vg_ptr->lv_max) {
  713. /* Check parallel LV spindown (LV remove) */
  714. if (lv_ptr->lv_status & LV_SPINDOWN) return -EPERM;
  715. /* Check inactive LV and open for read/write */
  716. /* We need to be able to "read" an inactive LV
  717.    to re-activate it again */
  718. if ((file->f_mode & FMODE_WRITE) &&
  719.     (!(lv_ptr->lv_status & LV_ACTIVE)))
  720.     return -EPERM;
  721. if (!(lv_ptr->lv_access & LV_WRITE) &&
  722.     (file->f_mode & FMODE_WRITE))
  723. return -EACCES;
  724.                 /* be sure to increment VG counter */
  725. if (lv_ptr->lv_open == 0) vg_ptr->lv_open++;
  726. lv_ptr->lv_open++;
  727. MOD_INC_USE_COUNT;
  728. P_DEV("blk_open OK, LV size %dn", lv_ptr->lv_size);
  729. return 0;
  730. }
  731. return -ENXIO;
  732. } /* lvm_blk_open() */
  733. /* Deliver "hard disk geometry" */
  734. static int _hdio_getgeo(ulong a, lv_t *lv_ptr, int what)
  735. {
  736. int ret = 0;
  737. uchar heads = 128;
  738. uchar sectors = 128;
  739. ulong start = 0;
  740. uint cylinders;
  741. while ( heads * sectors > lv_ptr->lv_size) {
  742. heads >>= 1;
  743. sectors >>= 1;
  744. }
  745. cylinders = lv_ptr->lv_size / heads / sectors;
  746. switch (what) {
  747. case 0:
  748. {
  749. struct hd_geometry *hd = (struct hd_geometry *) a;
  750. if (put_user(heads, &hd->heads) ||
  751.          put_user(sectors, &hd->sectors) ||
  752.          put_user((ushort) cylinders, &hd->cylinders) ||
  753.     put_user(start, &hd->start))
  754. return -EFAULT;
  755. break;
  756. }
  757. #ifdef HDIO_GETGEO_BIG
  758. case 1:
  759. {
  760. struct hd_big_geometry *hd =
  761. (struct hd_big_geometry *) a;
  762. if (put_user(heads, &hd->heads) ||
  763.          put_user(sectors, &hd->sectors) ||
  764.          put_user(cylinders, &hd->cylinders) ||
  765.     put_user(start, &hd->start))
  766. return -EFAULT;
  767. break;
  768. }
  769. #endif
  770. }
  771. P_IOCTL("%s -- lvm_blk_ioctl -- cylinders: %dn",
  772. lvm_name, cylinders);
  773. return ret;
  774. }
  775. /*
  776.  * block device i/o-control routine
  777.  */
  778. static int lvm_blk_ioctl(struct inode *inode, struct file *file,
  779.  uint cmd, ulong a)
  780. {
  781. kdev_t dev = inode->i_rdev;
  782. int minor = MINOR(dev), ret;
  783. vg_t *vg_ptr = vg[VG_BLK(minor)];
  784. lv_t *lv_ptr = vg_ptr->lv[LV_BLK(minor)];
  785. void *arg = (void *) a;
  786. P_IOCTL("blk MINOR: %d  cmd: 0x%X  arg: %p  VG#: %d  LV#: %d  "
  787. "mode: %s%sn", minor, cmd, arg, VG_BLK(minor),
  788. LV_BLK(minor), MODE_TO_STR(file->f_mode));
  789. switch (cmd) {
  790. case BLKRASET:
  791. /* set read ahead for block device */
  792. ret = blk_ioctl(dev, cmd, a);
  793. if (ret)
  794. return ret;
  795. lv_ptr->lv_read_ahead = (long) a;
  796. LVM_CORRECT_READ_AHEAD(lv_ptr->lv_read_ahead);
  797. break;
  798. case HDIO_GETGEO:
  799. #ifdef HDIO_GETGEO_BIG
  800. case HDIO_GETGEO_BIG:
  801. #endif
  802. /* get disk geometry */
  803. P_IOCTL("%s -- lvm_blk_ioctl -- HDIO_GETGEOn",
  804. lvm_name);
  805. if (!a)
  806. return -EINVAL;
  807. switch (cmd) {
  808. case HDIO_GETGEO:
  809. return _hdio_getgeo(a, lv_ptr, 0);
  810. #ifdef HDIO_GETGEO_BIG
  811. case HDIO_GETGEO_BIG:
  812. return _hdio_getgeo(a, lv_ptr, 1);
  813. #endif
  814. }
  815. case LV_BMAP:
  816. /* turn logical block into (dev_t, block). non privileged. */
  817. /* don't bmap a snapshot, since the mapping can change */
  818. if (lv_ptr->lv_access & LV_SNAPSHOT)
  819. return -EPERM;
  820. return lvm_user_bmap(inode, (struct lv_bmap *) arg);
  821. case LV_SET_ACCESS:
  822. /* set access flags of a logical volume */
  823. if (!capable(CAP_SYS_ADMIN)) return -EACCES;
  824. down_write(&lv_ptr->lv_lock);
  825. lv_ptr->lv_access = (ulong) arg;
  826. up_write(&lv_ptr->lv_lock);
  827. if ( lv_ptr->lv_access & LV_WRITE)
  828. set_device_ro(lv_ptr->lv_dev, 0);
  829. else
  830. set_device_ro(lv_ptr->lv_dev, 1);
  831. break;
  832. case LV_SET_ALLOCATION:
  833. /* set allocation flags of a logical volume */
  834. if (!capable(CAP_SYS_ADMIN)) return -EACCES;
  835. down_write(&lv_ptr->lv_lock);
  836. lv_ptr->lv_allocation = (ulong) arg;
  837. up_write(&lv_ptr->lv_lock);
  838. break;
  839. case LV_SET_STATUS:
  840. /* set status flags of a logical volume */
  841. if (!capable(CAP_SYS_ADMIN)) return -EACCES;
  842. if (!((ulong) arg & LV_ACTIVE) && lv_ptr->lv_open > 1)
  843. return -EPERM;
  844. down_write(&lv_ptr->lv_lock);
  845. lv_ptr->lv_status = (ulong) arg;
  846. up_write(&lv_ptr->lv_lock);
  847. break;
  848. case LV_SNAPSHOT_USE_RATE:
  849. return lvm_get_snapshot_use_rate(lv_ptr, arg);
  850. default:
  851. /* Handle rest here */
  852. ret = blk_ioctl(dev, cmd, a);
  853. if (ret)
  854. printk(KERN_WARNING
  855.        "%s -- lvm_blk_ioctl: unknown "
  856.        "cmd 0x%xn",
  857.        lvm_name, cmd);
  858. return ret;
  859. }
  860. return 0;
  861. } /* lvm_blk_ioctl() */
  862. /*
  863.  * block device close routine
  864.  */
  865. static int lvm_blk_close(struct inode *inode, struct file *file)
  866. {
  867. int minor = MINOR(inode->i_rdev);
  868. vg_t *vg_ptr = vg[VG_BLK(minor)];
  869. lv_t *lv_ptr = vg_ptr->lv[LV_BLK(minor)];
  870. P_DEV("blk_close MINOR: %d  VG#: %d  LV#: %dn",
  871.       minor, VG_BLK(minor), LV_BLK(minor));
  872. if (lv_ptr->lv_open == 1) vg_ptr->lv_open--;
  873. lv_ptr->lv_open--;
  874. MOD_DEC_USE_COUNT;
  875. return 0;
  876. } /* lvm_blk_close() */
  877. static int lvm_get_snapshot_use_rate(lv_t *lv, void *arg)
  878. {
  879. lv_snapshot_use_rate_req_t lv_rate_req;
  880. down_read(&lv->lv_lock);
  881. if (!(lv->lv_access & LV_SNAPSHOT)) {
  882. up_read(&lv->lv_lock);
  883. return -EPERM;
  884. }
  885. up_read(&lv->lv_lock);
  886. if (copy_from_user(&lv_rate_req, arg, sizeof(lv_rate_req)))
  887. return -EFAULT;
  888. if (lv_rate_req.rate < 0 || lv_rate_req.rate > 100)
  889. return -EINVAL;
  890. switch (lv_rate_req.block) {
  891. case 0:
  892. down_write(&lv->lv_lock);
  893. lv->lv_snapshot_use_rate = lv_rate_req.rate;
  894. up_write(&lv->lv_lock);
  895. down_read(&lv->lv_lock);
  896. if (lv->lv_remap_ptr * 100 / lv->lv_remap_end <
  897.     lv->lv_snapshot_use_rate) {
  898. up_read(&lv->lv_lock);
  899. interruptible_sleep_on(&lv->lv_snapshot_wait);
  900. down_read(&lv->lv_lock);
  901. }
  902. up_read(&lv->lv_lock);
  903. break;
  904. case O_NONBLOCK:
  905. break;
  906. default:
  907. return -EINVAL;
  908. }
  909. down_read(&lv->lv_lock);
  910. lv_rate_req.rate = lv->lv_remap_ptr * 100 / lv->lv_remap_end;
  911. up_read(&lv->lv_lock);
  912. return copy_to_user(arg, &lv_rate_req,
  913.     sizeof(lv_rate_req)) ? -EFAULT : 0;
  914. }
  915. static int lvm_user_bmap(struct inode *inode, struct lv_bmap *user_result)
  916. {
  917. struct buffer_head bh;
  918. unsigned long block;
  919. int err;
  920. if (get_user(block, &user_result->lv_block))
  921. return -EFAULT;
  922. memset(&bh,0,sizeof bh);
  923. bh.b_blocknr = block;
  924. bh.b_dev = bh.b_rdev = inode->i_rdev;
  925. bh.b_size = lvm_get_blksize(bh.b_dev);
  926. bh.b_rsector = block * (bh.b_size >> 9);
  927. bh.b_end_io = NULL;
  928. if ((err = lvm_map(&bh, READ)) < 0)  {
  929. printk("lvm map failed: %dn", err);
  930. return -EINVAL;
  931. }
  932. return put_user(kdev_t_to_nr(bh.b_rdev), &user_result->lv_dev) ||
  933.        put_user(bh.b_rsector/(bh.b_size>>9), &user_result->lv_block) ?
  934. -EFAULT : 0;
  935. }
  936. /*
  937.  * block device support function for /usr/src/linux/drivers/block/ll_rw_blk.c
  938.  * (see init_module/lvm_init)
  939.  */
  940. static void __remap_snapshot(kdev_t rdev, ulong rsector,
  941.     ulong pe_start, lv_t *lv, vg_t *vg) {
  942. /* copy a chunk from the origin to a snapshot device */
  943. down_write(&lv->lv_lock);
  944. /* we must redo lvm_snapshot_remap_block in order to avoid a
  945.    race condition in the gap where no lock was held */
  946. if (!lvm_snapshot_remap_block(&rdev, &rsector, pe_start, lv) &&
  947.     !lvm_snapshot_COW(rdev, rsector, pe_start, rsector, vg, lv))
  948. lvm_write_COW_table_block(vg, lv);
  949. up_write(&lv->lv_lock);
  950. }
  951. static inline void _remap_snapshot(kdev_t rdev, ulong rsector,
  952.    ulong pe_start, lv_t *lv, vg_t *vg) {
  953. int r;
  954. /* check to see if this chunk is already in the snapshot */
  955. down_read(&lv->lv_lock);
  956. r = lvm_snapshot_remap_block(&rdev, &rsector, pe_start, lv);
  957. up_read(&lv->lv_lock);
  958. if (!r)
  959. /* we haven't yet copied this block to the snapshot */
  960. __remap_snapshot(rdev, rsector, pe_start, lv, vg);
  961. }
  962. /*
  963.  * extents destined for a pe that is on the move should be deferred
  964.  */
  965. static inline int _should_defer(kdev_t pv, ulong sector, uint32_t pe_size) {
  966. return ((pe_lock_req.lock == LOCK_PE) &&
  967. (pv == pe_lock_req.data.pv_dev) &&
  968. (sector >= pe_lock_req.data.pv_offset) &&
  969. (sector < (pe_lock_req.data.pv_offset + pe_size)));
  970. }
  971. static inline int _defer_extent(struct buffer_head *bh, int rw,
  972. kdev_t pv, ulong sector, uint32_t pe_size)
  973. {
  974. if (pe_lock_req.lock == LOCK_PE) {
  975. down_read(&_pe_lock);
  976. if (_should_defer(pv, sector, pe_size)) {
  977. up_read(&_pe_lock);
  978. down_write(&_pe_lock);
  979. if (_should_defer(pv, sector, pe_size))
  980. _queue_io(bh, rw);
  981. up_write(&_pe_lock);
  982. return 1;
  983. }
  984. up_read(&_pe_lock);
  985. }
  986. return 0;
  987. }
  988. static int lvm_map(struct buffer_head *bh, int rw)
  989. {
  990. int minor = MINOR(bh->b_rdev);
  991. ulong index;
  992. ulong pe_start;
  993. ulong size = bh->b_size >> 9;
  994. ulong rsector_org = bh->b_rsector;
  995. ulong rsector_map;
  996. kdev_t rdev_map;
  997. vg_t *vg_this = vg[VG_BLK(minor)];
  998. lv_t *lv = vg_this->lv[LV_BLK(minor)];
  999. down_read(&lv->lv_lock);
  1000. if (!(lv->lv_status & LV_ACTIVE)) {
  1001. printk(KERN_ALERT
  1002.        "%s - lvm_map: ll_rw_blk for inactive LV %sn",
  1003.        lvm_name, lv->lv_name);
  1004. goto bad;
  1005. }
  1006. if ((rw == WRITE || rw == WRITEA) &&
  1007.     !(lv->lv_access & LV_WRITE)) {
  1008. printk(KERN_CRIT
  1009.        "%s - lvm_map: ll_rw_blk write for readonly LV %sn",
  1010.        lvm_name, lv->lv_name);
  1011. goto bad;
  1012. }
  1013. P_MAP("%s - lvm_map minor: %d  *rdev: %s  *rsector: %lu  size:%lun",
  1014.       lvm_name, minor,
  1015.       kdevname(bh->b_rdev),
  1016.       rsector_org, size);
  1017. if (rsector_org + size > lv->lv_size) {
  1018. printk(KERN_ALERT
  1019.        "%s - lvm_map access beyond end of device; *rsector: "
  1020.                        "%lu or size: %lu wrong for minor: %2dn",
  1021.                        lvm_name, rsector_org, size, minor);
  1022. goto bad;
  1023. }
  1024. if (lv->lv_stripes < 2) { /* linear mapping */
  1025. /* get the index */
  1026. index = rsector_org / vg_this->pe_size;
  1027. pe_start = lv->lv_current_pe[index].pe;
  1028. rsector_map = lv->lv_current_pe[index].pe +
  1029. (rsector_org % vg_this->pe_size);
  1030. rdev_map = lv->lv_current_pe[index].dev;
  1031. P_MAP("lv_current_pe[%ld].pe: %d  rdev: %s  rsector:%ldn",
  1032.       index, lv->lv_current_pe[index].pe,
  1033.       kdevname(rdev_map), rsector_map);
  1034. } else { /* striped mapping */
  1035. ulong stripe_index;
  1036. ulong stripe_length;
  1037. stripe_length = vg_this->pe_size * lv->lv_stripes;
  1038. stripe_index = (rsector_org % stripe_length) /
  1039. lv->lv_stripesize;
  1040. index = rsector_org / stripe_length +
  1041. (stripe_index % lv->lv_stripes) *
  1042. (lv->lv_allocated_le / lv->lv_stripes);
  1043. pe_start = lv->lv_current_pe[index].pe;
  1044. rsector_map = lv->lv_current_pe[index].pe +
  1045. (rsector_org % stripe_length) -
  1046. (stripe_index % lv->lv_stripes) * lv->lv_stripesize -
  1047. stripe_index / lv->lv_stripes *
  1048. (lv->lv_stripes - 1) * lv->lv_stripesize;
  1049. rdev_map = lv->lv_current_pe[index].dev;
  1050. P_MAP("lv_current_pe[%ld].pe: %d  rdev: %s  rsector:%ldn"
  1051.       "stripe_length: %ld  stripe_index: %ldn",
  1052.       index, lv->lv_current_pe[index].pe, kdevname(rdev_map),
  1053.       rsector_map, stripe_length, stripe_index);
  1054. }
  1055. /*
  1056.  * Queue writes to physical extents on the move until move completes.
  1057.  * Don't get _pe_lock until there is a reasonable expectation that
  1058.  * we need to queue this request, because this is in the fast path.
  1059.  */
  1060. if (rw == WRITE || rw == WRITEA) {
  1061. if(_defer_extent(bh, rw, rdev_map,
  1062.  rsector_map, vg_this->pe_size)) {
  1063. up_read(&lv->lv_lock);
  1064. return 0;
  1065. }
  1066. lv->lv_current_pe[index].writes++; /* statistic */
  1067. } else
  1068. lv->lv_current_pe[index].reads++; /* statistic */
  1069. /* snapshot volume exception handling on physical device address base */
  1070. if (!(lv->lv_access & (LV_SNAPSHOT|LV_SNAPSHOT_ORG)))
  1071. goto out;
  1072. if (lv->lv_access & LV_SNAPSHOT) { /* remap snapshot */
  1073. if (lvm_snapshot_remap_block(&rdev_map, &rsector_map,
  1074.      pe_start, lv) < 0)
  1075. goto bad;
  1076. } else if (rw == WRITE || rw == WRITEA) { /* snapshot origin */
  1077. lv_t *snap;
  1078. /* start with first snapshot and loop through all of
  1079.    them */
  1080. for (snap = lv->lv_snapshot_next; snap;
  1081.      snap = snap->lv_snapshot_next) {
  1082. /* Check for inactive snapshot */
  1083. if (!(snap->lv_status & LV_ACTIVE))
  1084. continue;
  1085. /* Serializes the COW with the accesses to the
  1086.    snapshot device */
  1087. _remap_snapshot(rdev_map, rsector_map,
  1088.  pe_start, snap, vg_this);
  1089. }
  1090. }
  1091.  out:
  1092. bh->b_rdev = rdev_map;
  1093. bh->b_rsector = rsector_map;
  1094. up_read(&lv->lv_lock);
  1095. return 1;
  1096.  bad:
  1097. if (bh->b_end_io)
  1098. buffer_IO_error(bh);
  1099. up_read(&lv->lv_lock);
  1100. return -1;
  1101. } /* lvm_map() */
  1102. /*
  1103.  * internal support functions
  1104.  */
  1105. #ifdef LVM_HD_NAME
  1106. /*
  1107.  * generate "hard disk" name
  1108.  */
  1109. void lvm_hd_name(char *buf, int minor)
  1110. {
  1111. int len = 0;
  1112. lv_t *lv_ptr;
  1113. if (vg[VG_BLK(minor)] == NULL ||
  1114.     (lv_ptr = vg[VG_BLK(minor)]->lv[LV_BLK(minor)]) == NULL)
  1115. return;
  1116. len = strlen(lv_ptr->lv_name) - 5;
  1117. memcpy(buf, &lv_ptr->lv_name[5], len);
  1118. buf[len] = 0;
  1119. return;
  1120. }
  1121. #endif
  1122. /*
  1123.  * make request function
  1124.  */
  1125. static int lvm_make_request_fn(request_queue_t *q,
  1126.        int rw,
  1127.        struct buffer_head *bh)
  1128. {
  1129. return (lvm_map(bh, rw) <= 0) ? 0 : 1;
  1130. }
  1131. /********************************************************************
  1132.  *
  1133.  * Character device support functions
  1134.  *
  1135.  ********************************************************************/
  1136. /*
  1137.  * character device support function logical volume manager lock
  1138.  */
  1139. static int lvm_do_lock_lvm(void)
  1140. {
  1141. lock_try_again:
  1142. spin_lock(&lvm_lock);
  1143. if (lock != 0 && lock != current->pid) {
  1144. P_DEV("lvm_do_lock_lvm: locked by pid %d ...n", lock);
  1145. spin_unlock(&lvm_lock);
  1146. interruptible_sleep_on(&lvm_wait);
  1147. if (current->sigpending != 0)
  1148. return -EINTR;
  1149. #ifdef LVM_TOTAL_RESET
  1150. if (lvm_reset_spindown > 0)
  1151. return -EACCES;
  1152. #endif
  1153. goto lock_try_again;
  1154. }
  1155. lock = current->pid;
  1156. P_DEV("lvm_do_lock_lvm: locking LVM for pid %dn", lock);
  1157. spin_unlock(&lvm_lock);
  1158. return 0;
  1159. } /* lvm_do_lock_lvm */
  1160. /*
  1161.  * character device support function lock/unlock physical extend
  1162.  */
  1163. static int lvm_do_pe_lock_unlock(vg_t *vg_ptr, void *arg)
  1164. {
  1165. pe_lock_req_t new_lock;
  1166. struct buffer_head *bh;
  1167. uint p;
  1168. if (vg_ptr == NULL) return -ENXIO;
  1169. if (copy_from_user(&new_lock, arg, sizeof(new_lock)) != 0)
  1170. return -EFAULT;
  1171. switch (new_lock.lock) {
  1172. case LOCK_PE:
  1173. for (p = 0; p < vg_ptr->pv_max; p++) {
  1174. if (vg_ptr->pv[p] != NULL &&
  1175.     new_lock.data.pv_dev == vg_ptr->pv[p]->pv_dev)
  1176. break;
  1177. }
  1178. if (p == vg_ptr->pv_max) return -ENXIO;
  1179. /*
  1180.  * this sync releaves memory pressure to lessen the
  1181.  * likelyhood of pvmove being paged out - resulting in
  1182.  * deadlock.
  1183.  *
  1184.  * This method of doing a pvmove is broken
  1185.  */
  1186. fsync_dev(pe_lock_req.data.lv_dev);
  1187. down_write(&_pe_lock);
  1188. if (pe_lock_req.lock == LOCK_PE) {
  1189. up_write(&_pe_lock);
  1190. return -EBUSY;
  1191. }
  1192. /* Should we do to_kdev_t() on the pv_dev and lv_dev??? */
  1193. pe_lock_req.lock = LOCK_PE;
  1194. pe_lock_req.data.lv_dev = new_lock.data.lv_dev;
  1195. pe_lock_req.data.pv_dev = new_lock.data.pv_dev;
  1196. pe_lock_req.data.pv_offset = new_lock.data.pv_offset;
  1197. up_write(&_pe_lock);
  1198. /* some requests may have got through since the fsync */
  1199. fsync_dev(pe_lock_req.data.pv_dev);
  1200. break;
  1201. case UNLOCK_PE:
  1202. down_write(&_pe_lock);
  1203. pe_lock_req.lock = UNLOCK_PE;
  1204. pe_lock_req.data.lv_dev = 0;
  1205. pe_lock_req.data.pv_dev = 0;
  1206. pe_lock_req.data.pv_offset = 0;
  1207. bh = _dequeue_io();
  1208. up_write(&_pe_lock);
  1209. /* handle all deferred io for this PE */
  1210. _flush_io(bh);
  1211. break;
  1212. default:
  1213. return -EINVAL;
  1214. }
  1215. return 0;
  1216. }
  1217. /*
  1218.  * character device support function logical extend remap
  1219.  */
  1220. static int lvm_do_le_remap(vg_t *vg_ptr, void *arg)
  1221. {
  1222. uint l, le;
  1223. lv_t *lv_ptr;
  1224. if (vg_ptr == NULL) return -ENXIO;
  1225. if (copy_from_user(&le_remap_req, arg,
  1226.    sizeof(le_remap_req_t)) != 0)
  1227. return -EFAULT;
  1228. for (l = 0; l < vg_ptr->lv_max; l++) {
  1229. lv_ptr = vg_ptr->lv[l];
  1230. if (!lv_ptr)
  1231. continue;
  1232. if (strcmp(lv_ptr->lv_name, le_remap_req.lv_name) == 0) {
  1233. down_write(&lv_ptr->lv_lock);
  1234. for (le = 0; le < lv_ptr->lv_allocated_le; le++) {
  1235. if (lv_ptr->lv_current_pe[le].dev ==
  1236.     le_remap_req.old_dev &&
  1237.     lv_ptr->lv_current_pe[le].pe ==
  1238.     le_remap_req.old_pe) {
  1239. lv_ptr->lv_current_pe[le].dev =
  1240.     le_remap_req.new_dev;
  1241. lv_ptr->lv_current_pe[le].pe =
  1242.     le_remap_req.new_pe;
  1243. __update_hardsectsize(lv_ptr);
  1244. up_write(&lv_ptr->lv_lock);
  1245. return 0;
  1246. }
  1247. }
  1248. up_write(&lv_ptr->lv_lock);
  1249. return -EINVAL;
  1250. }
  1251. }
  1252. return -ENXIO;
  1253. } /* lvm_do_le_remap() */
  1254. /*
  1255.  * character device support function VGDA create
  1256.  */
  1257. static int lvm_do_vg_create(void *arg, int minor)
  1258. {
  1259. int ret = 0;
  1260. ulong l, ls = 0, p, size;
  1261. lv_t lv;
  1262. vg_t *vg_ptr;
  1263. lv_t **snap_lv_ptr;
  1264. if ((vg_ptr = kmalloc(sizeof(vg_t),GFP_KERNEL)) == NULL) {
  1265. printk(KERN_CRIT
  1266.        "%s -- VG_CREATE: kmalloc error VG at line %dn",
  1267.        lvm_name, __LINE__);
  1268. return -ENOMEM;
  1269. }
  1270. /* get the volume group structure */
  1271. if (copy_from_user(vg_ptr, arg, sizeof(vg_t)) != 0) {
  1272. P_IOCTL("lvm_do_vg_create ERROR: copy VG ptr %p (%d bytes)n",
  1273. arg, sizeof(vg_t));
  1274. kfree(vg_ptr);
  1275. return -EFAULT;
  1276. }
  1277. /* VG_CREATE now uses minor number in VG structure */
  1278. if (minor == -1)
  1279. minor = vg_ptr->vg_number;
  1280. /* check limits */
  1281. if (minor >= ABS_MAX_VG)
  1282. return -EFAULT;
  1283. /* Validate it */
  1284. if (vg[VG_CHR(minor)] != NULL) {
  1285. P_IOCTL("lvm_do_vg_create ERROR: VG %d in usen", minor);
  1286. kfree(vg_ptr);
  1287. return -EPERM;
  1288. }
  1289. /* we are not that active so far... */
  1290. vg_ptr->vg_status &= ~VG_ACTIVE;
  1291. vg_ptr->pe_allocated = 0;
  1292. if (vg_ptr->pv_max > ABS_MAX_PV) {
  1293. printk(KERN_WARNING
  1294.        "%s -- Can't activate VG: ABS_MAX_PV too smalln",
  1295.        lvm_name);
  1296. kfree(vg_ptr);
  1297. return -EPERM;
  1298. }
  1299. if (vg_ptr->lv_max > ABS_MAX_LV) {
  1300. printk(KERN_WARNING
  1301. "%s -- Can't activate VG: ABS_MAX_LV too small for %un",
  1302.        lvm_name, vg_ptr->lv_max);
  1303. kfree(vg_ptr);
  1304. return -EPERM;
  1305. }
  1306. /* create devfs and procfs entries */
  1307. lvm_fs_create_vg(vg_ptr);
  1308. vg[VG_CHR(minor)] = vg_ptr;
  1309. /* get the physical volume structures */
  1310. vg_ptr->pv_act = vg_ptr->pv_cur = 0;
  1311. for (p = 0; p < vg_ptr->pv_max; p++) {
  1312. pv_t *pvp;
  1313. /* user space address */
  1314. if ((pvp = vg_ptr->pv[p]) != NULL) {
  1315. ret = lvm_do_pv_create(pvp, vg_ptr, p);
  1316. if ( ret != 0) {
  1317. lvm_do_vg_remove(minor);
  1318. return ret;
  1319. }
  1320. }
  1321. }
  1322. size = vg_ptr->lv_max * sizeof(lv_t *);
  1323. if ((snap_lv_ptr = vmalloc ( size)) == NULL) {
  1324. printk(KERN_CRIT
  1325.        "%s -- VG_CREATE: vmalloc error snapshot LVs at line %dn",
  1326.        lvm_name, __LINE__);
  1327. lvm_do_vg_remove(minor);
  1328. return -EFAULT;
  1329. }
  1330. memset(snap_lv_ptr, 0, size);
  1331. /* get the logical volume structures */
  1332. vg_ptr->lv_cur = 0;
  1333. for (l = 0; l < vg_ptr->lv_max; l++) {
  1334. lv_t *lvp;
  1335. /* user space address */
  1336. if ((lvp = vg_ptr->lv[l]) != NULL) {
  1337. if (copy_from_user(&lv, lvp, sizeof(lv_t)) != 0) {
  1338. P_IOCTL("ERROR: copying LV ptr %p (%d bytes)n",
  1339. lvp, sizeof(lv_t));
  1340. lvm_do_vg_remove(minor);
  1341. return -EFAULT;
  1342. }
  1343. if ( lv.lv_access & LV_SNAPSHOT) {
  1344. snap_lv_ptr[ls] = lvp;
  1345. vg_ptr->lv[l] = NULL;
  1346. ls++;
  1347. continue;
  1348. }
  1349. vg_ptr->lv[l] = NULL;
  1350. /* only create original logical volumes for now */
  1351. if (lvm_do_lv_create(minor, lv.lv_name, &lv) != 0) {
  1352. lvm_do_vg_remove(minor);
  1353. return -EFAULT;
  1354. }
  1355. }
  1356. }
  1357. /* Second path to correct snapshot logical volumes which are not
  1358.    in place during first path above */
  1359. for (l = 0; l < ls; l++) {
  1360. lv_t *lvp = snap_lv_ptr[l];
  1361. if (copy_from_user(&lv, lvp, sizeof(lv_t)) != 0) {
  1362. lvm_do_vg_remove(minor);
  1363. return -EFAULT;
  1364. }
  1365. if (lvm_do_lv_create(minor, lv.lv_name, &lv) != 0) {
  1366. lvm_do_vg_remove(minor);
  1367. return -EFAULT;
  1368. }
  1369. }
  1370. vfree(snap_lv_ptr);
  1371. vg_count++;
  1372. MOD_INC_USE_COUNT;
  1373. /* let's go active */
  1374. vg_ptr->vg_status |= VG_ACTIVE;
  1375. return 0;
  1376. } /* lvm_do_vg_create() */
  1377. /*
  1378.  * character device support function VGDA extend
  1379.  */
  1380. static int lvm_do_vg_extend(vg_t *vg_ptr, void *arg)
  1381. {
  1382. int ret = 0;
  1383. uint p;
  1384. pv_t *pv_ptr;
  1385. if (vg_ptr == NULL) return -ENXIO;
  1386. if (vg_ptr->pv_cur < vg_ptr->pv_max) {
  1387. for (p = 0; p < vg_ptr->pv_max; p++) {
  1388. if ( ( pv_ptr = vg_ptr->pv[p]) == NULL) {
  1389. ret = lvm_do_pv_create(arg, vg_ptr, p);
  1390. if ( ret != 0) return ret;
  1391. pv_ptr = vg_ptr->pv[p];
  1392. vg_ptr->pe_total += pv_ptr->pe_total;
  1393. return 0;
  1394. }
  1395. }
  1396. }
  1397. return -EPERM;
  1398. } /* lvm_do_vg_extend() */
  1399. /*
  1400.  * character device support function VGDA reduce
  1401.  */
  1402. static int lvm_do_vg_reduce(vg_t *vg_ptr, void *arg) {
  1403. uint p;
  1404. pv_t *pv_ptr;
  1405. if (vg_ptr == NULL) return -ENXIO;
  1406. if (copy_from_user(pv_name, arg, sizeof(pv_name)) != 0)
  1407. return -EFAULT;
  1408. for (p = 0; p < vg_ptr->pv_max; p++) {
  1409. pv_ptr = vg_ptr->pv[p];
  1410. if (pv_ptr != NULL &&
  1411.     strcmp(pv_ptr->pv_name,
  1412.        pv_name) == 0) {
  1413. if (pv_ptr->lv_cur > 0) return -EPERM;
  1414. lvm_do_pv_remove(vg_ptr, p);
  1415. /* Make PV pointer array contiguous */
  1416. for (; p < vg_ptr->pv_max - 1; p++)
  1417. vg_ptr->pv[p] = vg_ptr->pv[p + 1];
  1418. vg_ptr->pv[p + 1] = NULL;
  1419. return 0;
  1420. }
  1421. }
  1422. return -ENXIO;
  1423. } /* lvm_do_vg_reduce */
  1424. /*
  1425.  * character device support function VG rename
  1426.  */
  1427. static int lvm_do_vg_rename(vg_t *vg_ptr, void *arg)
  1428. {
  1429. int l = 0, p = 0, len = 0;
  1430. char vg_name[NAME_LEN] = { 0,};
  1431. char lv_name[NAME_LEN] = { 0,};
  1432. char *ptr = NULL;
  1433. lv_t *lv_ptr = NULL;
  1434. pv_t *pv_ptr = NULL;
  1435. /* If the VG doesn't exist in the kernel then just exit */
  1436. if (!vg_ptr) return 0;
  1437. if (copy_from_user(vg_name, arg, sizeof(vg_name)) != 0)
  1438. return -EFAULT;
  1439. lvm_fs_remove_vg(vg_ptr);
  1440. strncpy ( vg_ptr->vg_name, vg_name, sizeof ( vg_name)-1);
  1441. for ( l = 0; l < vg_ptr->lv_max; l++)
  1442. {
  1443. if ((lv_ptr = vg_ptr->lv[l]) == NULL) continue;
  1444. memset (lv_ptr->vg_name, 0, sizeof (*vg_name));
  1445. strncpy(lv_ptr->vg_name, vg_name, sizeof ( vg_name));
  1446. ptr = strrchr(lv_ptr->lv_name, '/');
  1447. ptr = ptr ? ptr + 1 : lv_ptr->lv_name;
  1448. strncpy(lv_name, ptr, sizeof ( lv_name));
  1449. len = sizeof(LVM_DIR_PREFIX);
  1450. strcpy(lv_ptr->lv_name, LVM_DIR_PREFIX);
  1451. strncat(lv_ptr->lv_name, vg_name, NAME_LEN - len);
  1452. strcat (lv_ptr->lv_name, "/");
  1453. len += strlen(vg_name) + 1;
  1454. strncat(lv_ptr->lv_name, lv_name, NAME_LEN - len);
  1455. }
  1456. for ( p = 0; p < vg_ptr->pv_max; p++)
  1457. {
  1458. if ( (pv_ptr = vg_ptr->pv[p]) == NULL) continue;
  1459. strncpy(pv_ptr->vg_name, vg_name, NAME_LEN);
  1460. }
  1461. lvm_fs_create_vg(vg_ptr);
  1462. /* Need to add PV entries */
  1463. for ( p = 0; p < vg_ptr->pv_act; p++) {
  1464. pv_t *pv_ptr = vg_ptr->pv[p];
  1465. if (pv_ptr)
  1466. lvm_fs_create_pv(vg_ptr, pv_ptr);
  1467. }
  1468. /* Need to add LV entries */
  1469.         for ( l = 0; l < vg_ptr->lv_max; l++) {
  1470. lv_t *lv_ptr = vg_ptr->lv[l];
  1471. if (!lv_ptr)
  1472. continue;
  1473. lvm_gendisk.part[MINOR(lv_ptr->lv_dev)].de =
  1474.      lvm_fs_create_lv(vg_ptr, lv_ptr);
  1475. }
  1476. return 0;
  1477. } /* lvm_do_vg_rename */
  1478. /*
  1479.  * character device support function VGDA remove
  1480.  */
  1481. static int lvm_do_vg_remove(int minor)
  1482. {
  1483. int i;
  1484. vg_t *vg_ptr = vg[VG_CHR(minor)];
  1485. pv_t *pv_ptr;
  1486. if (vg_ptr == NULL) return -ENXIO;
  1487. #ifdef LVM_TOTAL_RESET
  1488. if (vg_ptr->lv_open > 0 && lvm_reset_spindown == 0)
  1489. #else
  1490. if (vg_ptr->lv_open > 0)
  1491. #endif
  1492. return -EPERM;
  1493. /* let's go inactive */
  1494. vg_ptr->vg_status &= ~VG_ACTIVE;
  1495. /* remove from procfs and devfs */
  1496. lvm_fs_remove_vg(vg_ptr);
  1497. /* free LVs */
  1498. /* first free snapshot logical volumes */
  1499. for (i = 0; i < vg_ptr->lv_max; i++) {
  1500. if (vg_ptr->lv[i] != NULL &&
  1501.     vg_ptr->lv[i]->lv_access & LV_SNAPSHOT) {
  1502. lvm_do_lv_remove(minor, NULL, i);
  1503. current->state = TASK_UNINTERRUPTIBLE;
  1504. schedule_timeout(1);
  1505. }
  1506. }
  1507. /* then free the rest of the LVs */
  1508. for (i = 0; i < vg_ptr->lv_max; i++) {
  1509. if (vg_ptr->lv[i] != NULL) {
  1510. lvm_do_lv_remove(minor, NULL, i);
  1511. current->state = TASK_UNINTERRUPTIBLE;
  1512. schedule_timeout(1);
  1513. }
  1514. }
  1515. /* free PVs */
  1516. for (i = 0; i < vg_ptr->pv_max; i++) {
  1517. if ((pv_ptr = vg_ptr->pv[i]) != NULL) {
  1518. P_KFREE("%s -- kfree %dn", lvm_name, __LINE__);
  1519. lvm_do_pv_remove(vg_ptr, i);
  1520. }
  1521. }
  1522. P_KFREE("%s -- kfree %dn", lvm_name, __LINE__);
  1523. kfree(vg_ptr);
  1524. vg[VG_CHR(minor)] = NULL;
  1525. vg_count--;
  1526. MOD_DEC_USE_COUNT;
  1527. return 0;
  1528. } /* lvm_do_vg_remove() */
  1529. /*
  1530.  * character device support function physical volume create
  1531.  */
  1532. static int lvm_do_pv_create(pv_t *pvp, vg_t *vg_ptr, ulong p) {
  1533. pv_t *pv;
  1534. int err;
  1535. if (!vg_ptr)
  1536. return -ENXIO;
  1537. pv = kmalloc(sizeof(pv_t),GFP_KERNEL);
  1538. if (pv == NULL) {
  1539. printk(KERN_CRIT
  1540.        "%s -- PV_CREATE: kmalloc error PV at line %dn",
  1541.        lvm_name, __LINE__);
  1542. return -ENOMEM;
  1543. }
  1544. memset(pv, 0, sizeof(*pv));
  1545. if (copy_from_user(pv, pvp, sizeof(pv_t)) != 0) {
  1546. P_IOCTL("lvm_do_pv_create ERROR: copy PV ptr %p (%d bytes)n",
  1547. pvp, sizeof(pv_t));
  1548. kfree(pv);
  1549. return -EFAULT;
  1550. }
  1551. if ((err = _open_pv(pv))) {
  1552. kfree(pv);
  1553. return err;
  1554. }
  1555. /* We don't need the PE list
  1556.    in kernel space as with LVs pe_t list (see below) */
  1557. pv->pe = NULL;
  1558. pv->pe_allocated = 0;
  1559. pv->pv_status = PV_ACTIVE;
  1560. vg_ptr->pv_act++;
  1561. vg_ptr->pv_cur++;
  1562. lvm_fs_create_pv(vg_ptr, pv);
  1563. vg_ptr->pv[p] = pv;
  1564. return 0;
  1565. } /* lvm_do_pv_create() */
  1566. /*
  1567.  * character device support function physical volume remove
  1568.  */
  1569. static int lvm_do_pv_remove(vg_t *vg_ptr, ulong p) {
  1570. pv_t *pv = vg_ptr->pv[p];
  1571. lvm_fs_remove_pv(vg_ptr, pv);
  1572. vg_ptr->pe_total -= pv->pe_total;
  1573. vg_ptr->pv_cur--;
  1574. vg_ptr->pv_act--;
  1575. _close_pv(pv);
  1576. kfree(pv);
  1577. vg_ptr->pv[p] = NULL;
  1578. return 0;
  1579. }
  1580. static void __update_hardsectsize(lv_t *lv)
  1581. {
  1582. int max_hardsectsize = 0, hardsectsize = 0;
  1583. int p;
  1584. /* Check PVs first to see if they all have same sector size */
  1585. for (p = 0; p < lv->vg->pv_cur; p++) {
  1586. pv_t *pv = lv->vg->pv[p];
  1587. if (pv && (hardsectsize = lvm_sectsize(pv->pv_dev))) {
  1588. if (max_hardsectsize == 0)
  1589. max_hardsectsize = hardsectsize;
  1590. else if (hardsectsize != max_hardsectsize) {
  1591. P_DEV("%s PV[%d] (%s) sector size %d, not %dn",
  1592.       lv->lv_name, p, kdevname(pv->pv_dev),
  1593.       hardsectsize, max_hardsectsize);
  1594. break;
  1595. }
  1596. }
  1597. }
  1598. /* PVs have different block size, need to check each LE sector size */
  1599. if (hardsectsize != max_hardsectsize) {
  1600. int le;
  1601. for (le = 0; le < lv->lv_allocated_le; le++) {
  1602. hardsectsize = lvm_sectsize(lv->lv_current_pe[le].dev);
  1603. if (hardsectsize > max_hardsectsize) {
  1604. P_DEV("%s LE[%d] (%s) blocksize %d not %dn",
  1605.       lv->lv_name, le,
  1606.       kdevname(lv->lv_current_pe[le].dev),
  1607.       hardsectsize, max_hardsectsize);
  1608. max_hardsectsize = hardsectsize;
  1609. }
  1610. }
  1611. /* only perform this operation on active snapshots */
  1612. if ((lv->lv_access & LV_SNAPSHOT) &&
  1613.     (lv->lv_status & LV_ACTIVE)) {
  1614. int e;
  1615. for (e = 0; e < lv->lv_remap_end; e++) {
  1616. hardsectsize = lvm_sectsize(lv->lv_block_exception[e].rdev_new);
  1617. if (hardsectsize > max_hardsectsize)
  1618. max_hardsectsize = hardsectsize;
  1619. }
  1620. }
  1621. }
  1622. if (max_hardsectsize == 0)
  1623. max_hardsectsize = SECTOR_SIZE;
  1624. P_DEV("hardblocksize for LV %s is %dn",
  1625.       kdevname(lv->lv_dev), max_hardsectsize);
  1626. lvm_hardsectsizes[MINOR(lv->lv_dev)] = max_hardsectsize;
  1627. }
  1628. /*
  1629.  * character device support function logical volume create
  1630.  */
  1631. static int lvm_do_lv_create(int minor, char *lv_name, lv_t *lv)
  1632. {
  1633. int e, ret, l, le, l_new, p, size, activate = 1;
  1634. ulong lv_status_save;
  1635. lv_block_exception_t *lvbe = lv->lv_block_exception;
  1636. vg_t *vg_ptr = vg[VG_CHR(minor)];
  1637. lv_t *lv_ptr = NULL;
  1638. pe_t *pep;
  1639. if (!(pep = lv->lv_current_pe))
  1640. return -EINVAL;
  1641. if (_sectors_to_k(lv->lv_chunk_size) > LVM_SNAPSHOT_MAX_CHUNK)
  1642. return -EINVAL;
  1643. for (l = 0; l < vg_ptr->lv_cur; l++) {
  1644. if (vg_ptr->lv[l] != NULL &&
  1645.     strcmp(vg_ptr->lv[l]->lv_name, lv_name) == 0)
  1646. return -EEXIST;
  1647. }
  1648. /* in case of lv_remove(), lv_create() pair */
  1649. l_new = -1;
  1650. if (vg_ptr->lv[lv->lv_number] == NULL)
  1651. l_new = lv->lv_number;
  1652. else {
  1653. for (l = 0; l < vg_ptr->lv_max; l++) {
  1654. if (vg_ptr->lv[l] == NULL)
  1655. if (l_new == -1) l_new = l;
  1656. }
  1657. }
  1658. if (l_new == -1) return -EPERM;
  1659. else             l = l_new;
  1660. if ((lv_ptr = kmalloc(sizeof(lv_t),GFP_KERNEL)) == NULL) {;
  1661. printk(KERN_CRIT "%s -- LV_CREATE: kmalloc error LV at line %dn",
  1662.        lvm_name, __LINE__);
  1663. return -ENOMEM;
  1664. }
  1665. /* copy preloaded LV */
  1666. memcpy((char *) lv_ptr, (char *) lv, sizeof(lv_t));
  1667. lv_status_save = lv_ptr->lv_status;
  1668. lv_ptr->lv_status &= ~LV_ACTIVE;
  1669. lv_ptr->lv_snapshot_org = NULL;
  1670. lv_ptr->lv_snapshot_prev = NULL;
  1671. lv_ptr->lv_snapshot_next = NULL;
  1672. lv_ptr->lv_block_exception = NULL;
  1673. lv_ptr->lv_iobuf = NULL;
  1674. lv_ptr->lv_COW_table_iobuf = NULL;
  1675. lv_ptr->lv_snapshot_hash_table = NULL;
  1676. lv_ptr->lv_snapshot_hash_table_size = 0;
  1677. lv_ptr->lv_snapshot_hash_mask = 0;
  1678. init_rwsem(&lv_ptr->lv_lock);
  1679. lv_ptr->lv_snapshot_use_rate = 0;
  1680. vg_ptr->lv[l] = lv_ptr;
  1681. /* get the PE structures from user space if this
  1682.    is not a snapshot logical volume */
  1683. if (!(lv_ptr->lv_access & LV_SNAPSHOT)) {
  1684. size = lv_ptr->lv_allocated_le * sizeof(pe_t);
  1685. if ((lv_ptr->lv_current_pe = vmalloc(size)) == NULL) {
  1686. printk(KERN_CRIT
  1687.        "%s -- LV_CREATE: vmalloc error LV_CURRENT_PE of %d Byte "
  1688.        "at line %dn",
  1689.        lvm_name, size, __LINE__);
  1690. P_KFREE("%s -- kfree %dn", lvm_name, __LINE__);
  1691. kfree(lv_ptr);
  1692. vg_ptr->lv[l] = NULL;
  1693. return -ENOMEM;
  1694. }
  1695. if (copy_from_user(lv_ptr->lv_current_pe, pep, size)) {
  1696. P_IOCTL("ERROR: copying PE ptr %p (%d bytes)n",
  1697. pep, sizeof(size));
  1698. vfree(lv_ptr->lv_current_pe);
  1699. kfree(lv_ptr);
  1700. vg_ptr->lv[l] = NULL;
  1701. return -EFAULT;
  1702. }
  1703. /* correct the PE count in PVs */
  1704. for (le = 0; le < lv_ptr->lv_allocated_le; le++) {
  1705. vg_ptr->pe_allocated++;
  1706. for (p = 0; p < vg_ptr->pv_cur; p++) {
  1707. if (vg_ptr->pv[p]->pv_dev ==
  1708.     lv_ptr->lv_current_pe[le].dev)
  1709. vg_ptr->pv[p]->pe_allocated++;
  1710. }
  1711. }
  1712. } else {
  1713. /* Get snapshot exception data and block list */
  1714. if (lvbe != NULL) {
  1715. lv_ptr->lv_snapshot_org =
  1716.     vg_ptr->lv[LV_BLK(lv_ptr->lv_snapshot_minor)];
  1717. if (lv_ptr->lv_snapshot_org != NULL) {
  1718. size = lv_ptr->lv_remap_end * sizeof(lv_block_exception_t);
  1719. if (!size) {
  1720. printk(KERN_WARNING
  1721.        "%s -- zero length exception table requestedn",
  1722.        lvm_name);
  1723. kfree(lv_ptr);
  1724. return -EINVAL;
  1725. }
  1726. if ((lv_ptr->lv_block_exception = vmalloc(size)) == NULL) {
  1727. printk(KERN_CRIT
  1728.        "%s -- lvm_do_lv_create: vmalloc error LV_BLOCK_EXCEPTION "
  1729.        "of %d byte at line %dn",
  1730.        lvm_name, size, __LINE__);
  1731. P_KFREE("%s -- kfree %dn", lvm_name,
  1732. __LINE__);
  1733. kfree(lv_ptr);
  1734. vg_ptr->lv[l] = NULL;
  1735. return -ENOMEM;
  1736. }
  1737. if (copy_from_user(lv_ptr->lv_block_exception, lvbe, size)) {
  1738. vfree(lv_ptr->lv_block_exception);
  1739. kfree(lv_ptr);
  1740. vg_ptr->lv[l] = NULL;
  1741. return -EFAULT;
  1742. }
  1743. if(lv_ptr->lv_block_exception[0].rsector_org ==
  1744.    LVM_SNAPSHOT_DROPPED_SECTOR)
  1745. {
  1746. printk(KERN_WARNING
  1747.    "%s -- lvm_do_lv_create: snapshot has been dropped and will not be activatedn",
  1748.        lvm_name);
  1749. activate = 0;
  1750. }
  1751. /* point to the original logical volume */
  1752. lv_ptr = lv_ptr->lv_snapshot_org;
  1753. lv_ptr->lv_snapshot_minor = 0;
  1754. lv_ptr->lv_snapshot_org = lv_ptr;
  1755. /* our new one now back points to the previous last in the chain
  1756.    which can be the original logical volume */
  1757. lv_ptr = vg_ptr->lv[l];
  1758. /* now lv_ptr points to our new last snapshot logical volume */
  1759. lv_ptr->lv_current_pe = lv_ptr->lv_snapshot_org->lv_current_pe;
  1760. lv_ptr->lv_allocated_snapshot_le = lv_ptr->lv_allocated_le;
  1761. lv_ptr->lv_allocated_le = lv_ptr->lv_snapshot_org->lv_allocated_le;
  1762. lv_ptr->lv_current_le = lv_ptr->lv_snapshot_org->lv_current_le;
  1763. lv_ptr->lv_size = lv_ptr->lv_snapshot_org->lv_size;
  1764. lv_ptr->lv_stripes = lv_ptr->lv_snapshot_org->lv_stripes;
  1765. lv_ptr->lv_stripesize = lv_ptr->lv_snapshot_org->lv_stripesize;
  1766. /* Update the VG PE(s) used by snapshot reserve space. */
  1767. vg_ptr->pe_allocated += lv_ptr->lv_allocated_snapshot_le;
  1768. if ((ret = lvm_snapshot_alloc(lv_ptr)) != 0)
  1769. {
  1770. vfree(lv_ptr->lv_block_exception);
  1771. kfree(lv_ptr);
  1772. vg_ptr->lv[l] = NULL;
  1773. return ret;
  1774. }
  1775. for ( e = 0; e < lv_ptr->lv_remap_ptr; e++)
  1776. lvm_hash_link (lv_ptr->lv_block_exception + e,
  1777.        lv_ptr->lv_block_exception[e].rdev_org,
  1778.        lv_ptr->lv_block_exception[e].rsector_org, lv_ptr);
  1779. /* need to fill the COW exception table data
  1780.    into the page for disk i/o */
  1781. if(lvm_snapshot_fill_COW_page(vg_ptr, lv_ptr)) {
  1782. kfree(lv_ptr);
  1783. vg_ptr->lv[l] = NULL;
  1784. return -EINVAL;
  1785. }
  1786. init_waitqueue_head(&lv_ptr->lv_snapshot_wait);
  1787. } else {
  1788. kfree(lv_ptr);
  1789. vg_ptr->lv[l] = NULL;
  1790. return -EFAULT;
  1791. }
  1792. } else {
  1793. kfree(vg_ptr->lv[l]);
  1794. vg_ptr->lv[l] = NULL;
  1795. return -EINVAL;
  1796. }
  1797. } /* if ( vg[VG_CHR(minor)]->lv[l]->lv_access & LV_SNAPSHOT) */
  1798. lv_ptr = vg_ptr->lv[l];
  1799. lvm_gendisk.part[MINOR(lv_ptr->lv_dev)].start_sect = 0;
  1800. lvm_gendisk.part[MINOR(lv_ptr->lv_dev)].nr_sects = lv_ptr->lv_size;
  1801. lvm_size[MINOR(lv_ptr->lv_dev)] = lv_ptr->lv_size >> 1;
  1802. vg_lv_map[MINOR(lv_ptr->lv_dev)].vg_number = vg_ptr->vg_number;
  1803. vg_lv_map[MINOR(lv_ptr->lv_dev)].lv_number = lv_ptr->lv_number;
  1804. LVM_CORRECT_READ_AHEAD(lv_ptr->lv_read_ahead);
  1805. vg_ptr->lv_cur++;
  1806. lv_ptr->lv_status = lv_status_save;
  1807. lv_ptr->vg = vg_ptr;
  1808. __update_hardsectsize(lv_ptr);
  1809. /* optionally add our new snapshot LV */
  1810. if (lv_ptr->lv_access & LV_SNAPSHOT) {
  1811. lv_t *org = lv_ptr->lv_snapshot_org, *last;
  1812. /* sync the original logical volume */
  1813. fsync_dev(org->lv_dev);
  1814. #ifdef LVM_VFS_ENHANCEMENT
  1815. /* VFS function call to sync and lock the filesystem */
  1816. fsync_dev_lockfs(org->lv_dev);
  1817. #endif
  1818. down_write(&org->lv_lock);
  1819. org->lv_access |= LV_SNAPSHOT_ORG;
  1820. lv_ptr->lv_access &= ~LV_SNAPSHOT_ORG; /* this can only hide an userspace bug */
  1821. /* Link in the list of snapshot volumes */
  1822. for (last = org; last->lv_snapshot_next; last = last->lv_snapshot_next);
  1823. lv_ptr->lv_snapshot_prev = last;
  1824. last->lv_snapshot_next = lv_ptr;
  1825. up_write(&org->lv_lock);
  1826. }
  1827. /* activate the logical volume */
  1828. if(activate)
  1829. lv_ptr->lv_status |= LV_ACTIVE;
  1830. else
  1831. lv_ptr->lv_status &= ~LV_ACTIVE;
  1832. if ( lv_ptr->lv_access & LV_WRITE)
  1833. set_device_ro(lv_ptr->lv_dev, 0);
  1834. else
  1835. set_device_ro(lv_ptr->lv_dev, 1);
  1836. #ifdef LVM_VFS_ENHANCEMENT
  1837. /* VFS function call to unlock the filesystem */
  1838. if (lv_ptr->lv_access & LV_SNAPSHOT)
  1839. unlockfs(lv_ptr->lv_snapshot_org->lv_dev);
  1840. #endif
  1841. lvm_gendisk.part[MINOR(lv_ptr->lv_dev)].de =
  1842.     lvm_fs_create_lv(vg_ptr, lv_ptr);
  1843. return 0;
  1844. } /* lvm_do_lv_create() */
  1845. /*
  1846.  * character device support function logical volume remove
  1847.  */
  1848. static int lvm_do_lv_remove(int minor, char *lv_name, int l)
  1849. {
  1850. uint le, p;
  1851. vg_t *vg_ptr = vg[VG_CHR(minor)];
  1852. lv_t *lv_ptr;
  1853. if (!vg_ptr)
  1854. return -ENXIO;
  1855. if (l == -1) {
  1856. for (l = 0; l < vg_ptr->lv_max; l++) {
  1857. if (vg_ptr->lv[l] != NULL &&
  1858.     strcmp(vg_ptr->lv[l]->lv_name, lv_name) == 0) {
  1859. break;
  1860. }
  1861. }
  1862. }
  1863. if (l == vg_ptr->lv_max) return -ENXIO;
  1864. lv_ptr = vg_ptr->lv[l];
  1865. #ifdef LVM_TOTAL_RESET
  1866. if (lv_ptr->lv_open > 0 && lvm_reset_spindown == 0)
  1867. #else
  1868. if (lv_ptr->lv_open > 0)
  1869. #endif
  1870. return -EBUSY;
  1871. /* check for deletion of snapshot source while
  1872.    snapshot volume still exists */
  1873. if ((lv_ptr->lv_access & LV_SNAPSHOT_ORG) &&
  1874.     lv_ptr->lv_snapshot_next != NULL)
  1875. return -EPERM;
  1876. lvm_fs_remove_lv(vg_ptr, lv_ptr);
  1877. if (lv_ptr->lv_access & LV_SNAPSHOT) {
  1878. /*
  1879.  * Atomically make the the snapshot invisible
  1880.  * to the original lv before playing with it.
  1881.  */
  1882. lv_t * org = lv_ptr->lv_snapshot_org;
  1883. down_write(&org->lv_lock);
  1884. /* remove this snapshot logical volume from the chain */
  1885. lv_ptr->lv_snapshot_prev->lv_snapshot_next = lv_ptr->lv_snapshot_next;
  1886. if (lv_ptr->lv_snapshot_next != NULL) {
  1887. lv_ptr->lv_snapshot_next->lv_snapshot_prev =
  1888.     lv_ptr->lv_snapshot_prev;
  1889. }
  1890. /* no more snapshots? */
  1891. if (!org->lv_snapshot_next) {
  1892. org->lv_access &= ~LV_SNAPSHOT_ORG;
  1893. }
  1894. up_write(&org->lv_lock);
  1895. lvm_snapshot_release(lv_ptr);
  1896. /* Update the VG PE(s) used by snapshot reserve space. */
  1897. vg_ptr->pe_allocated -= lv_ptr->lv_allocated_snapshot_le;
  1898. }
  1899. lv_ptr->lv_status |= LV_SPINDOWN;
  1900. /* sync the buffers */
  1901. fsync_dev(lv_ptr->lv_dev);
  1902. lv_ptr->lv_status &= ~LV_ACTIVE;
  1903. /* invalidate the buffers */
  1904. invalidate_buffers(lv_ptr->lv_dev);
  1905. /* reset generic hd */
  1906. lvm_gendisk.part[MINOR(lv_ptr->lv_dev)].start_sect = -1;
  1907. lvm_gendisk.part[MINOR(lv_ptr->lv_dev)].nr_sects = 0;
  1908. lvm_gendisk.part[MINOR(lv_ptr->lv_dev)].de = 0;
  1909. lvm_size[MINOR(lv_ptr->lv_dev)] = 0;
  1910. /* reset VG/LV mapping */
  1911. vg_lv_map[MINOR(lv_ptr->lv_dev)].vg_number = ABS_MAX_VG;
  1912. vg_lv_map[MINOR(lv_ptr->lv_dev)].lv_number = -1;
  1913. /* correct the PE count in PVs if this is not a snapshot
  1914.            logical volume */
  1915. if (!(lv_ptr->lv_access & LV_SNAPSHOT)) {
  1916. /* only if this is no snapshot logical volume because
  1917.    we share the lv_current_pe[] structs with the
  1918.    original logical volume */
  1919. for (le = 0; le < lv_ptr->lv_allocated_le; le++) {
  1920. vg_ptr->pe_allocated--;
  1921. for (p = 0; p < vg_ptr->pv_cur; p++) {
  1922. if (vg_ptr->pv[p]->pv_dev ==
  1923.     lv_ptr->lv_current_pe[le].dev)
  1924. vg_ptr->pv[p]->pe_allocated--;
  1925. }
  1926. }
  1927. vfree(lv_ptr->lv_current_pe);
  1928. }
  1929. P_KFREE("%s -- kfree %dn", lvm_name, __LINE__);
  1930. kfree(lv_ptr);
  1931. vg_ptr->lv[l] = NULL;
  1932. vg_ptr->lv_cur--;
  1933. return 0;
  1934. } /* lvm_do_lv_remove() */
  1935. /*
  1936.  * logical volume extend / reduce
  1937.  */
  1938. static int __extend_reduce_snapshot(vg_t *vg_ptr, lv_t *old_lv, lv_t *new_lv) {
  1939. ulong size;
  1940. lv_block_exception_t *lvbe;
  1941. if (!new_lv->lv_block_exception)
  1942. return -ENXIO;
  1943. size = new_lv->lv_remap_end * sizeof(lv_block_exception_t);
  1944. if ((lvbe = vmalloc(size)) == NULL) {
  1945. printk(KERN_CRIT
  1946.        "%s -- lvm_do_lv_extend_reduce: vmalloc "
  1947.        "error LV_BLOCK_EXCEPTION of %lu Byte at line %dn",
  1948.        lvm_name, size, __LINE__);
  1949. return -ENOMEM;
  1950. }
  1951. if ((new_lv->lv_remap_end > old_lv->lv_remap_end) &&
  1952.     (copy_from_user(lvbe, new_lv->lv_block_exception, size))) {
  1953. vfree(lvbe);
  1954. return -EFAULT;
  1955. }
  1956. new_lv->lv_block_exception = lvbe;
  1957. if (lvm_snapshot_alloc_hash_table(new_lv)) {
  1958. vfree(new_lv->lv_block_exception);
  1959. return -ENOMEM;
  1960. }
  1961. return 0;
  1962. }
  1963. static int __extend_reduce(vg_t *vg_ptr, lv_t *old_lv, lv_t *new_lv) {
  1964. ulong size, l, p, end;
  1965. pe_t *pe;
  1966. /* allocate space for new pe structures */
  1967. size = new_lv->lv_current_le * sizeof(pe_t);
  1968. if ((pe = vmalloc(size)) == NULL) {
  1969. printk(KERN_CRIT
  1970.        "%s -- lvm_do_lv_extend_reduce: "
  1971.        "vmalloc error LV_CURRENT_PE of %lu Byte at line %dn",
  1972.        lvm_name, size, __LINE__);
  1973. return -ENOMEM;
  1974. }
  1975. /* get the PE structures from user space */
  1976. if (copy_from_user(pe, new_lv->lv_current_pe, size)) {
  1977. if(old_lv->lv_access & LV_SNAPSHOT)
  1978. vfree(new_lv->lv_snapshot_hash_table);
  1979. vfree(pe);
  1980. return -EFAULT;
  1981. }
  1982. new_lv->lv_current_pe = pe;
  1983. /* reduce allocation counters on PV(s) */
  1984. for (l = 0; l < old_lv->lv_allocated_le; l++) {
  1985. vg_ptr->pe_allocated--;
  1986. for (p = 0; p < vg_ptr->pv_cur; p++) {
  1987. if (vg_ptr->pv[p]->pv_dev ==
  1988.     old_lv->lv_current_pe[l].dev) {
  1989. vg_ptr->pv[p]->pe_allocated--;
  1990. break;
  1991. }
  1992. }
  1993. }
  1994. /* extend the PE count in PVs */
  1995. for (l = 0; l < new_lv->lv_allocated_le; l++) {
  1996. vg_ptr->pe_allocated++;
  1997. for (p = 0; p < vg_ptr->pv_cur; p++) {
  1998. if (vg_ptr->pv[p]->pv_dev ==
  1999.                             new_lv->lv_current_pe[l].dev) {
  2000. vg_ptr->pv[p]->pe_allocated++;
  2001. break;
  2002. }
  2003. }
  2004. }
  2005. /* save availiable i/o statistic data */
  2006. if (old_lv->lv_stripes < 2) { /* linear logical volume */
  2007. end = min(old_lv->lv_current_le, new_lv->lv_current_le);
  2008. for (l = 0; l < end; l++) {
  2009. new_lv->lv_current_pe[l].reads +=
  2010. old_lv->lv_current_pe[l].reads;
  2011. new_lv->lv_current_pe[l].writes +=
  2012. old_lv->lv_current_pe[l].writes;
  2013. }
  2014. } else { /* striped logical volume */
  2015. uint i, j, source, dest, end, old_stripe_size, new_stripe_size;
  2016. old_stripe_size = old_lv->lv_allocated_le / old_lv->lv_stripes;
  2017. new_stripe_size = new_lv->lv_allocated_le / new_lv->lv_stripes;
  2018. end = min(old_stripe_size, new_stripe_size);
  2019. for (i = source = dest = 0; i < new_lv->lv_stripes; i++) {
  2020. for (j = 0; j < end; j++) {
  2021. new_lv->lv_current_pe[dest + j].reads +=
  2022.     old_lv->lv_current_pe[source + j].reads;
  2023. new_lv->lv_current_pe[dest + j].writes +=
  2024.     old_lv->lv_current_pe[source + j].writes;
  2025. }
  2026. source += old_stripe_size;
  2027. dest += new_stripe_size;
  2028. }
  2029. }
  2030. return 0;
  2031. }
  2032. static int lvm_do_lv_extend_reduce(int minor, char *lv_name, lv_t *new_lv)
  2033. {
  2034. int r;
  2035. ulong l, e, size;
  2036. vg_t *vg_ptr = vg[VG_CHR(minor)];
  2037. lv_t *old_lv;
  2038. pe_t *pe;
  2039. if (!vg_ptr)
  2040. return -ENXIO;
  2041. if ((pe = new_lv->lv_current_pe) == NULL)
  2042. return -EINVAL;
  2043. for (l = 0; l < vg_ptr->lv_max; l++)
  2044. if (vg_ptr->lv[l] && !strcmp(vg_ptr->lv[l]->lv_name, lv_name))
  2045. break;
  2046. if (l == vg_ptr->lv_max)
  2047. return -ENXIO;
  2048. old_lv = vg_ptr->lv[l];
  2049. if (old_lv->lv_access & LV_SNAPSHOT) {
  2050. /* only perform this operation on active snapshots */
  2051. if (old_lv->lv_status & LV_ACTIVE)
  2052. r = __extend_reduce_snapshot(vg_ptr, old_lv, new_lv);
  2053. else
  2054. r = -EPERM;
  2055. } else
  2056. r = __extend_reduce(vg_ptr, old_lv, new_lv);
  2057. if(r)
  2058. return r;
  2059. /* copy relevent fields */
  2060. down_write(&old_lv->lv_lock);
  2061. if(new_lv->lv_access & LV_SNAPSHOT) {
  2062. size = (new_lv->lv_remap_end > old_lv->lv_remap_end) ?
  2063. old_lv->lv_remap_ptr : new_lv->lv_remap_end;
  2064. size *= sizeof(lv_block_exception_t);
  2065. memcpy(new_lv->lv_block_exception,
  2066.        old_lv->lv_block_exception, size);
  2067. old_lv->lv_remap_end = new_lv->lv_remap_end;
  2068. old_lv->lv_block_exception = new_lv->lv_block_exception;
  2069. old_lv->lv_snapshot_hash_table =
  2070. new_lv->lv_snapshot_hash_table;
  2071. old_lv->lv_snapshot_hash_table_size =
  2072. new_lv->lv_snapshot_hash_table_size;
  2073. old_lv->lv_snapshot_hash_mask =
  2074. new_lv->lv_snapshot_hash_mask;
  2075. for (e = 0; e < new_lv->lv_remap_ptr; e++)
  2076. lvm_hash_link(new_lv->lv_block_exception + e,
  2077.       new_lv->lv_block_exception[e].rdev_org,
  2078.       new_lv->lv_block_exception[e].rsector_org,
  2079.       new_lv);
  2080. } else {
  2081. vfree(old_lv->lv_current_pe);
  2082. vfree(old_lv->lv_snapshot_hash_table);
  2083. old_lv->lv_size = new_lv->lv_size;
  2084. old_lv->lv_allocated_le = new_lv->lv_allocated_le;
  2085. old_lv->lv_current_le = new_lv->lv_current_le;
  2086. old_lv->lv_current_pe = new_lv->lv_current_pe;
  2087. lvm_gendisk.part[MINOR(old_lv->lv_dev)].nr_sects =
  2088. old_lv->lv_size;
  2089. lvm_size[MINOR(old_lv->lv_dev)] = old_lv->lv_size >> 1;
  2090. if (old_lv->lv_access & LV_SNAPSHOT_ORG) {
  2091. lv_t *snap;
  2092. for(snap = old_lv->lv_snapshot_next; snap;
  2093.     snap = snap->lv_snapshot_next) {
  2094. down_write(&snap->lv_lock);
  2095. snap->lv_current_pe = old_lv->lv_current_pe;
  2096. snap->lv_allocated_le =
  2097. old_lv->lv_allocated_le;
  2098. snap->lv_current_le = old_lv->lv_current_le;
  2099. snap->lv_size = old_lv->lv_size;
  2100. lvm_gendisk.part[MINOR(snap->lv_dev)].nr_sects
  2101. = old_lv->lv_size;
  2102. lvm_size[MINOR(snap->lv_dev)] =
  2103. old_lv->lv_size >> 1;
  2104. __update_hardsectsize(snap);
  2105. up_write(&snap->lv_lock);
  2106. }
  2107. }
  2108. }
  2109. __update_hardsectsize(old_lv);
  2110. up_write(&old_lv->lv_lock);
  2111. return 0;
  2112. } /* lvm_do_lv_extend_reduce() */
  2113. /*
  2114.  * character device support function logical volume status by name
  2115.  */
  2116. static int lvm_do_lv_status_byname(vg_t *vg_ptr, void *arg)
  2117. {
  2118. uint l;
  2119. lv_status_byname_req_t lv_status_byname_req;
  2120. void *saved_ptr1;
  2121. void *saved_ptr2;
  2122. lv_t *lv_ptr;
  2123. if (vg_ptr == NULL) return -ENXIO;
  2124. if (copy_from_user(&lv_status_byname_req, arg,
  2125.    sizeof(lv_status_byname_req_t)) != 0)
  2126. return -EFAULT;
  2127. if (lv_status_byname_req.lv == NULL) return -EINVAL;
  2128. for (l = 0; l < vg_ptr->lv_max; l++) {
  2129. if ((lv_ptr = vg_ptr->lv[l]) != NULL &&
  2130.     strcmp(lv_ptr->lv_name,
  2131.    lv_status_byname_req.lv_name) == 0) {
  2132.         /* Save usermode pointers */
  2133.         if (copy_from_user(&saved_ptr1, &lv_status_byname_req.lv->lv_current_pe, sizeof(void*)) != 0)
  2134. return -EFAULT;
  2135. if (copy_from_user(&saved_ptr2, &lv_status_byname_req.lv->lv_block_exception, sizeof(void*)) != 0)
  2136.         return -EFAULT;
  2137.         if (copy_to_user(lv_status_byname_req.lv,
  2138.  lv_ptr,
  2139.  sizeof(lv_t)) != 0)
  2140. return -EFAULT;
  2141. if (saved_ptr1 != NULL) {
  2142. if (copy_to_user(saved_ptr1,
  2143.  lv_ptr->lv_current_pe,
  2144.  lv_ptr->lv_allocated_le *
  2145.          sizeof(pe_t)) != 0)
  2146. return -EFAULT;
  2147. }
  2148. /* Restore usermode pointers */
  2149. if (copy_to_user(&lv_status_byname_req.lv->lv_current_pe, &saved_ptr1, sizeof(void*)) != 0)
  2150.         return -EFAULT;
  2151. return 0;
  2152. }
  2153. }
  2154. return -ENXIO;
  2155. } /* lvm_do_lv_status_byname() */
  2156. /*
  2157.  * character device support function logical volume status by index
  2158.  */
  2159. static int lvm_do_lv_status_byindex(vg_t *vg_ptr,void *arg)
  2160. {
  2161. lv_status_byindex_req_t lv_status_byindex_req;
  2162. void *saved_ptr1;
  2163. void *saved_ptr2;
  2164. lv_t *lv_ptr;
  2165. if (vg_ptr == NULL) return -ENXIO;
  2166. if (copy_from_user(&lv_status_byindex_req, arg,
  2167.    sizeof(lv_status_byindex_req)) != 0)
  2168. return -EFAULT;
  2169. if (lv_status_byindex_req.lv == NULL)
  2170. return -EINVAL;
  2171. if ( ( lv_ptr = vg_ptr->lv[lv_status_byindex_req.lv_index]) == NULL)
  2172. return -ENXIO;
  2173. /* Save usermode pointers */
  2174. if (copy_from_user(&saved_ptr1, &lv_status_byindex_req.lv->lv_current_pe, sizeof(void*)) != 0)
  2175.         return -EFAULT;
  2176. if (copy_from_user(&saved_ptr2, &lv_status_byindex_req.lv->lv_block_exception, sizeof(void*)) != 0)
  2177.         return -EFAULT;
  2178. if (copy_to_user(lv_status_byindex_req.lv, lv_ptr, sizeof(lv_t)) != 0)
  2179. return -EFAULT;
  2180. if (saved_ptr1 != NULL) {
  2181. if (copy_to_user(saved_ptr1,
  2182.  lv_ptr->lv_current_pe,
  2183.  lv_ptr->lv_allocated_le *
  2184.          sizeof(pe_t)) != 0)
  2185. return -EFAULT;
  2186. }
  2187. /* Restore usermode pointers */
  2188. if (copy_to_user(&lv_status_byindex_req.lv->lv_current_pe, &saved_ptr1, sizeof(void *)) != 0)
  2189.         return -EFAULT;
  2190. return 0;
  2191. } /* lvm_do_lv_status_byindex() */
  2192. /*
  2193.  * character device support function logical volume status by device number
  2194.  */
  2195. static int lvm_do_lv_status_bydev(vg_t * vg_ptr, void * arg) {
  2196. int l;
  2197. lv_status_bydev_req_t lv_status_bydev_req;
  2198. void *saved_ptr1;
  2199. void *saved_ptr2;
  2200. lv_t *lv_ptr;
  2201. if (vg_ptr == NULL) return -ENXIO;
  2202. if (copy_from_user(&lv_status_bydev_req, arg,
  2203.    sizeof(lv_status_bydev_req)) != 0)
  2204. return -EFAULT;
  2205. for ( l = 0; l < vg_ptr->lv_max; l++) {
  2206. if ( vg_ptr->lv[l] == NULL) continue;
  2207. if ( vg_ptr->lv[l]->lv_dev == lv_status_bydev_req.dev) break;
  2208. }
  2209. if ( l == vg_ptr->lv_max) return -ENXIO;
  2210. lv_ptr = vg_ptr->lv[l];
  2211. /* Save usermode pointers */
  2212. if (copy_from_user(&saved_ptr1, &lv_status_bydev_req.lv->lv_current_pe, sizeof(void*)) != 0)
  2213.         return -EFAULT;
  2214. if (copy_from_user(&saved_ptr2, &lv_status_bydev_req.lv->lv_block_exception, sizeof(void*)) != 0)
  2215.         return -EFAULT;
  2216. if (copy_to_user(lv_status_bydev_req.lv, lv_ptr, sizeof(lv_t)) != 0)
  2217. return -EFAULT;
  2218. if (saved_ptr1 != NULL) {
  2219. if (copy_to_user(saved_ptr1,
  2220.  lv_ptr->lv_current_pe,
  2221.  lv_ptr->lv_allocated_le *
  2222.          sizeof(pe_t)) != 0)
  2223. return -EFAULT;
  2224. }
  2225. /* Restore usermode pointers */
  2226. if (copy_to_user(&lv_status_bydev_req.lv->lv_current_pe, &saved_ptr1, sizeof(void *)) != 0)
  2227.         return -EFAULT;
  2228. return 0;
  2229. } /* lvm_do_lv_status_bydev() */
  2230. /*
  2231.  * character device support function rename a logical volume
  2232.  */
  2233. static int lvm_do_lv_rename(vg_t *vg_ptr, lv_req_t *lv_req, lv_t *lv)
  2234. {
  2235. int l = 0;
  2236. int ret = 0;
  2237. lv_t *lv_ptr = NULL;
  2238. if (!vg_ptr)
  2239. return -ENXIO;
  2240. for (l = 0; l < vg_ptr->lv_max; l++)
  2241. {
  2242. if ( (lv_ptr = vg_ptr->lv[l]) == NULL) continue;
  2243. if (lv_ptr->lv_dev == lv->lv_dev)
  2244. {
  2245. lvm_fs_remove_lv(vg_ptr, lv_ptr);
  2246. strncpy(lv_ptr->lv_name, lv_req->lv_name, NAME_LEN);
  2247. lvm_fs_create_lv(vg_ptr, lv_ptr);
  2248. break;
  2249. }
  2250. }
  2251. if (l == vg_ptr->lv_max) ret = -ENODEV;
  2252. return ret;
  2253. } /* lvm_do_lv_rename */
  2254. /*
  2255.  * character device support function physical volume change
  2256.  */
  2257. static int lvm_do_pv_change(vg_t *vg_ptr, void *arg)
  2258. {
  2259. uint p;
  2260. pv_t *pv_ptr;
  2261. struct block_device *bd;
  2262. if (vg_ptr == NULL) return -ENXIO;
  2263. if (copy_from_user(&pv_change_req, arg,
  2264.    sizeof(pv_change_req)) != 0)
  2265. return -EFAULT;
  2266. for (p = 0; p < vg_ptr->pv_max; p++) {
  2267. pv_ptr = vg_ptr->pv[p];
  2268. if (pv_ptr != NULL &&
  2269.     strcmp(pv_ptr->pv_name,
  2270.        pv_change_req.pv_name) == 0) {
  2271. bd = pv_ptr->bd;
  2272. if (copy_from_user(pv_ptr,
  2273.    pv_change_req.pv,
  2274.    sizeof(pv_t)) != 0)
  2275. return -EFAULT;
  2276. pv_ptr->bd = bd;
  2277. /* We don't need the PE list
  2278.    in kernel space as with LVs pe_t list */
  2279. pv_ptr->pe = NULL;
  2280. return 0;
  2281. }
  2282. }
  2283. return -ENXIO;
  2284. } /* lvm_do_pv_change() */
  2285. /*
  2286.  * character device support function get physical volume status
  2287.  */
  2288. static int lvm_do_pv_status(vg_t *vg_ptr, void *arg)
  2289. {
  2290. uint p;
  2291. pv_t *pv_ptr;
  2292. if (vg_ptr == NULL) return -ENXIO;
  2293. if (copy_from_user(&pv_status_req, arg,
  2294.    sizeof(pv_status_req)) != 0)
  2295. return -EFAULT;
  2296. for (p = 0; p < vg_ptr->pv_max; p++) {
  2297. pv_ptr = vg_ptr->pv[p];
  2298. if (pv_ptr != NULL &&
  2299.     strcmp(pv_ptr->pv_name,
  2300.        pv_status_req.pv_name) == 0) {
  2301. if (copy_to_user(pv_status_req.pv,
  2302.  pv_ptr,
  2303.          sizeof(pv_t)) != 0)
  2304. return -EFAULT;
  2305. return 0;
  2306. }
  2307. }
  2308. return -ENXIO;
  2309. } /* lvm_do_pv_status() */
  2310. /*
  2311.  * character device support function flush and invalidate all buffers of a PV
  2312.  */
  2313. static int lvm_do_pv_flush(void *arg)
  2314. {
  2315. pv_flush_req_t pv_flush_req;
  2316. if (copy_from_user(&pv_flush_req, arg, sizeof(pv_flush_req)) != 0)
  2317. return -EFAULT;
  2318. fsync_dev(pv_flush_req.pv_dev);
  2319. invalidate_buffers(pv_flush_req.pv_dev);
  2320. return 0;
  2321. }
  2322. /*
  2323.  * support function initialize gendisk variables
  2324.  */
  2325. static void __init lvm_geninit(struct gendisk *lvm_gdisk)
  2326. {
  2327. int i = 0;
  2328. #ifdef DEBUG_GENDISK
  2329. printk(KERN_DEBUG "%s -- lvm_gendiskn", lvm_name);
  2330. #endif
  2331. for (i = 0; i < MAX_LV; i++) {
  2332. lvm_gendisk.part[i].start_sect = -1; /* avoid partition check */
  2333. lvm_size[i] = lvm_gendisk.part[i].nr_sects = 0;
  2334. lvm_blocksizes[i] = BLOCK_SIZE;
  2335. }
  2336. blk_size[MAJOR_NR] = lvm_size;
  2337. blksize_size[MAJOR_NR] = lvm_blocksizes;
  2338. hardsect_size[MAJOR_NR] = lvm_hardsectsizes;
  2339. return;
  2340. } /* lvm_gen_init() */
  2341. /* Must have down_write(_pe_lock) when we enqueue buffers */
  2342. static void _queue_io(struct buffer_head *bh, int rw) {
  2343. if (bh->b_reqnext) BUG();
  2344. bh->b_reqnext = _pe_requests;
  2345. _pe_requests = bh;
  2346. }
  2347. /* Must have down_write(_pe_lock) when we dequeue buffers */
  2348. static struct buffer_head *_dequeue_io(void)
  2349. {
  2350. struct buffer_head *bh = _pe_requests;
  2351. _pe_requests = NULL;
  2352. return bh;
  2353. }
  2354. /*
  2355.  * We do not need to hold _pe_lock to flush buffers.  bh should be taken from
  2356.  * _pe_requests under down_write(_pe_lock), and then _pe_requests can be set
  2357.  * NULL and we drop _pe_lock.  Any new buffers defered at this time will be
  2358.  * added to a new list, and the old buffers can have their I/O restarted
  2359.  * asynchronously.
  2360.  *
  2361.  * If, for some reason, the same PE is locked again before all of these writes
  2362.  * have finished, then these buffers will just be re-queued (i.e. no danger).
  2363.  */
  2364. static void _flush_io(struct buffer_head *bh)
  2365. {
  2366. while (bh) {
  2367. struct buffer_head *next = bh->b_reqnext;
  2368. bh->b_reqnext = NULL;
  2369. /* resubmit this buffer head */
  2370. generic_make_request(WRITE, bh);
  2371. bh = next;
  2372. }
  2373. }
  2374. /*
  2375.  * we must open the pv's before we use them
  2376.  */
  2377. static int _open_pv(pv_t *pv) {
  2378. int err;
  2379. struct block_device *bd;
  2380. if (!(bd = bdget(kdev_t_to_nr(pv->pv_dev))))
  2381. return -ENOMEM;
  2382. err = blkdev_get(bd, FMODE_READ|FMODE_WRITE, 0, BDEV_FILE);
  2383. if (err)
  2384. return err;
  2385. pv->bd = bd;
  2386. return 0;
  2387. }
  2388. static void _close_pv(pv_t *pv) {
  2389. if (pv) {
  2390. struct block_device *bdev = pv->bd;
  2391. pv->bd = NULL;
  2392. if (bdev)
  2393. blkdev_put(bdev, BDEV_FILE);
  2394. }
  2395. }
  2396. static unsigned long _sectors_to_k(unsigned long sect)
  2397. {
  2398. if(SECTOR_SIZE > 1024) {
  2399. return sect * (SECTOR_SIZE / 1024);
  2400. }
  2401. return sect / (1024 / SECTOR_SIZE);
  2402. }
  2403. MODULE_AUTHOR("Heinz Mauelshagen, Sistina Software");
  2404. MODULE_DESCRIPTION("Logical Volume Manager");
  2405. #ifdef MODULE_LICENSE
  2406. MODULE_LICENSE("GPL");
  2407. #endif
  2408. module_init(lvm_init);
  2409. module_exit(lvm_cleanup);