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

嵌入式Linux

开发平台:

Unix_Linux

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