Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

pnfsblock: remove device operations

Signed-off-by: Jim Rees <rees@umich.edu>
Signed-off-by: Fred Isaman <iisaman@citi.umich.edu>
Signed-off-by: Benny Halevy <bhalevy@panasas.com>
Signed-off-by: Benny Halevy <bhalevy@tonian.com>
[upcall bugfixes]
Signed-off-by: Peng Tao <peng_tao@emc.com>
Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>

authored by

Jim Rees and committed by
Trond Myklebust
025a70ed fe0a9b74

+115 -1
+1 -1
fs/nfs/blocklayout/Makefile
··· 2 2 # Makefile for the pNFS block layout driver kernel module 3 3 # 4 4 obj-$(CONFIG_PNFS_BLOCK) += blocklayoutdriver.o 5 - blocklayoutdriver-objs := blocklayout.o extents.o blocklayoutdev.o 5 + blocklayoutdriver-objs := blocklayout.o extents.o blocklayoutdev.o blocklayoutdm.o
+3
fs/nfs/blocklayout/blocklayout.h
··· 128 128 int nfs4_blk_process_layoutget(struct pnfs_layout_hdr *lo, 129 129 struct nfs4_layoutget_res *lgr, gfp_t gfp_flags); 130 130 131 + /* blocklayoutdm.c */ 132 + void bl_free_block_dev(struct pnfs_block_dev *bdev); 133 + 131 134 void bl_put_extent(struct pnfs_block_extent *be); 132 135 #endif /* FS_NFS_NFS4BLOCKLAYOUT_H */
+111
fs/nfs/blocklayout/blocklayoutdm.c
··· 1 + /* 2 + * linux/fs/nfs/blocklayout/blocklayoutdm.c 3 + * 4 + * Module for the NFSv4.1 pNFS block layout driver. 5 + * 6 + * Copyright (c) 2007 The Regents of the University of Michigan. 7 + * All rights reserved. 8 + * 9 + * Fred Isaman <iisaman@umich.edu> 10 + * Andy Adamson <andros@citi.umich.edu> 11 + * 12 + * permission is granted to use, copy, create derivative works and 13 + * redistribute this software and such derivative works for any purpose, 14 + * so long as the name of the university of michigan is not used in 15 + * any advertising or publicity pertaining to the use or distribution 16 + * of this software without specific, written prior authorization. if 17 + * the above copyright notice or any other identification of the 18 + * university of michigan is included in any copy of any portion of 19 + * this software, then the disclaimer below must also be included. 20 + * 21 + * this software is provided as is, without representation from the 22 + * university of michigan as to its fitness for any purpose, and without 23 + * warranty by the university of michigan of any kind, either express 24 + * or implied, including without limitation the implied warranties of 25 + * merchantability and fitness for a particular purpose. the regents 26 + * of the university of michigan shall not be liable for any damages, 27 + * including special, indirect, incidental, or consequential damages, 28 + * with respect to any claim arising out or in connection with the use 29 + * of the software, even if it has been or is hereafter advised of the 30 + * possibility of such damages. 31 + */ 32 + 33 + #include <linux/genhd.h> /* gendisk - used in a dprintk*/ 34 + #include <linux/sched.h> 35 + #include <linux/hash.h> 36 + 37 + #include "blocklayout.h" 38 + 39 + #define NFSDBG_FACILITY NFSDBG_PNFS_LD 40 + 41 + static void dev_remove(dev_t dev) 42 + { 43 + struct rpc_pipe_msg msg; 44 + struct bl_dev_msg bl_umount_request; 45 + struct bl_msg_hdr bl_msg = { 46 + .type = BL_DEVICE_UMOUNT, 47 + .totallen = sizeof(bl_umount_request), 48 + }; 49 + uint8_t *dataptr; 50 + DECLARE_WAITQUEUE(wq, current); 51 + 52 + dprintk("Entering %s\n", __func__); 53 + 54 + memset(&msg, 0, sizeof(msg)); 55 + msg.data = kzalloc(1 + sizeof(bl_umount_request), GFP_NOFS); 56 + if (!msg.data) 57 + goto out; 58 + 59 + memset(&bl_umount_request, 0, sizeof(bl_umount_request)); 60 + bl_umount_request.major = MAJOR(dev); 61 + bl_umount_request.minor = MINOR(dev); 62 + 63 + memcpy(msg.data, &bl_msg, sizeof(bl_msg)); 64 + dataptr = (uint8_t *) msg.data; 65 + memcpy(&dataptr[sizeof(bl_msg)], &bl_umount_request, sizeof(bl_umount_request)); 66 + msg.len = sizeof(bl_msg) + bl_msg.totallen; 67 + 68 + add_wait_queue(&bl_wq, &wq); 69 + if (rpc_queue_upcall(bl_device_pipe->d_inode, &msg) < 0) { 70 + remove_wait_queue(&bl_wq, &wq); 71 + goto out; 72 + } 73 + 74 + set_current_state(TASK_UNINTERRUPTIBLE); 75 + schedule(); 76 + __set_current_state(TASK_RUNNING); 77 + remove_wait_queue(&bl_wq, &wq); 78 + 79 + out: 80 + kfree(msg.data); 81 + } 82 + 83 + /* 84 + * Release meta device 85 + */ 86 + static void nfs4_blk_metadev_release(struct pnfs_block_dev *bdev) 87 + { 88 + int rv; 89 + 90 + dprintk("%s Releasing\n", __func__); 91 + rv = nfs4_blkdev_put(bdev->bm_mdev); 92 + if (rv) 93 + printk(KERN_ERR "%s nfs4_blkdev_put returns %d\n", 94 + __func__, rv); 95 + 96 + dev_remove(bdev->bm_mdev->bd_dev); 97 + } 98 + 99 + void bl_free_block_dev(struct pnfs_block_dev *bdev) 100 + { 101 + if (bdev) { 102 + if (bdev->bm_mdev) { 103 + dprintk("%s Removing DM device: %d:%d\n", 104 + __func__, 105 + MAJOR(bdev->bm_mdev->bd_dev), 106 + MINOR(bdev->bm_mdev->bd_dev)); 107 + nfs4_blk_metadev_release(bdev); 108 + } 109 + kfree(bdev); 110 + } 111 + }