linux/fs/nfs/blocklayout/blocklayoutdm.c
<<
>>
Prefs
   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
  41static void dev_remove(struct net *net, dev_t dev)
  42{
  43        struct bl_pipe_msg bl_pipe_msg;
  44        struct rpc_pipe_msg *msg = &bl_pipe_msg.msg;
  45        struct bl_dev_msg bl_umount_request;
  46        struct bl_msg_hdr bl_msg = {
  47                .type = BL_DEVICE_UMOUNT,
  48                .totallen = sizeof(bl_umount_request),
  49        };
  50        uint8_t *dataptr;
  51        DECLARE_WAITQUEUE(wq, current);
  52        struct nfs_net *nn = net_generic(net, nfs_net_id);
  53
  54        dprintk("Entering %s\n", __func__);
  55
  56        bl_pipe_msg.bl_wq = &nn->bl_wq;
  57        memset(msg, 0, sizeof(*msg));
  58        msg->len = sizeof(bl_msg) + bl_msg.totallen;
  59        msg->data = kzalloc(msg->len, GFP_NOFS);
  60        if (!msg->data)
  61                goto out;
  62
  63        memset(&bl_umount_request, 0, sizeof(bl_umount_request));
  64        bl_umount_request.major = MAJOR(dev);
  65        bl_umount_request.minor = MINOR(dev);
  66
  67        memcpy(msg->data, &bl_msg, sizeof(bl_msg));
  68        dataptr = (uint8_t *) msg->data;
  69        memcpy(&dataptr[sizeof(bl_msg)], &bl_umount_request, sizeof(bl_umount_request));
  70
  71        add_wait_queue(&nn->bl_wq, &wq);
  72        if (rpc_queue_upcall(nn->bl_device_pipe, msg) < 0) {
  73                remove_wait_queue(&nn->bl_wq, &wq);
  74                goto out;
  75        }
  76
  77        set_current_state(TASK_UNINTERRUPTIBLE);
  78        schedule();
  79        __set_current_state(TASK_RUNNING);
  80        remove_wait_queue(&nn->bl_wq, &wq);
  81
  82out:
  83        kfree(msg->data);
  84}
  85
  86/*
  87 * Release meta device
  88 */
  89static void nfs4_blk_metadev_release(struct pnfs_block_dev *bdev)
  90{
  91        dprintk("%s Releasing\n", __func__);
  92        nfs4_blkdev_put(bdev->bm_mdev);
  93        dev_remove(bdev->net, bdev->bm_mdev->bd_dev);
  94}
  95
  96void bl_free_block_dev(struct pnfs_block_dev *bdev)
  97{
  98        if (bdev) {
  99                if (bdev->bm_mdev) {
 100                        dprintk("%s Removing DM device: %d:%d\n",
 101                                __func__,
 102                                MAJOR(bdev->bm_mdev->bd_dev),
 103                                MINOR(bdev->bm_mdev->bd_dev));
 104                        nfs4_blk_metadev_release(bdev);
 105                }
 106                kfree(bdev);
 107        }
 108}
 109