linux/drivers/md/dm.h
<<
>>
Prefs
   1/*
   2 * Internal header file for device mapper
   3 *
   4 * Copyright (C) 2001, 2002 Sistina Software
   5 * Copyright (C) 2004-2006 Red Hat, Inc. All rights reserved.
   6 *
   7 * This file is released under the LGPL.
   8 */
   9
  10#ifndef DM_INTERNAL_H
  11#define DM_INTERNAL_H
  12
  13#include <linux/fs.h>
  14#include <linux/device-mapper.h>
  15#include <linux/list.h>
  16#include <linux/blkdev.h>
  17#include <linux/hdreg.h>
  18
  19#define DM_NAME "device-mapper"
  20
  21#define DMERR(f, arg...) \
  22        printk(KERN_ERR DM_NAME ": " DM_MSG_PREFIX ": " f "\n", ## arg)
  23#define DMERR_LIMIT(f, arg...) \
  24        do { \
  25                if (printk_ratelimit()) \
  26                        printk(KERN_ERR DM_NAME ": " DM_MSG_PREFIX ": " \
  27                               f "\n", ## arg); \
  28        } while (0)
  29
  30#define DMWARN(f, arg...) \
  31        printk(KERN_WARNING DM_NAME ": " DM_MSG_PREFIX ": " f "\n", ## arg)
  32#define DMWARN_LIMIT(f, arg...) \
  33        do { \
  34                if (printk_ratelimit()) \
  35                        printk(KERN_WARNING DM_NAME ": " DM_MSG_PREFIX ": " \
  36                               f "\n", ## arg); \
  37        } while (0)
  38
  39#define DMINFO(f, arg...) \
  40        printk(KERN_INFO DM_NAME ": " DM_MSG_PREFIX ": " f "\n", ## arg)
  41#define DMINFO_LIMIT(f, arg...) \
  42        do { \
  43                if (printk_ratelimit()) \
  44                        printk(KERN_INFO DM_NAME ": " DM_MSG_PREFIX ": " f \
  45                               "\n", ## arg); \
  46        } while (0)
  47
  48#ifdef CONFIG_DM_DEBUG
  49#  define DMDEBUG(f, arg...) \
  50        printk(KERN_DEBUG DM_NAME ": " DM_MSG_PREFIX " DEBUG: " f "\n", ## arg)
  51#  define DMDEBUG_LIMIT(f, arg...) \
  52        do { \
  53                if (printk_ratelimit()) \
  54                        printk(KERN_DEBUG DM_NAME ": " DM_MSG_PREFIX ": " f \
  55                               "\n", ## arg); \
  56        } while (0)
  57#else
  58#  define DMDEBUG(f, arg...) do {} while (0)
  59#  define DMDEBUG_LIMIT(f, arg...) do {} while (0)
  60#endif
  61
  62#define DMEMIT(x...) sz += ((sz >= maxlen) ? \
  63                          0 : scnprintf(result + sz, maxlen - sz, x))
  64
  65#define SECTOR_SHIFT 9
  66
  67/*
  68 * Definitions of return values from target end_io function.
  69 */
  70#define DM_ENDIO_INCOMPLETE     1
  71#define DM_ENDIO_REQUEUE        2
  72
  73/*
  74 * Definitions of return values from target map function.
  75 */
  76#define DM_MAPIO_SUBMITTED      0
  77#define DM_MAPIO_REMAPPED       1
  78#define DM_MAPIO_REQUEUE        DM_ENDIO_REQUEUE
  79
  80/*
  81 * Suspend feature flags
  82 */
  83#define DM_SUSPEND_LOCKFS_FLAG          (1 << 0)
  84#define DM_SUSPEND_NOFLUSH_FLAG         (1 << 1)
  85
  86/*
  87 * List of devices that a metadevice uses and should open/close.
  88 */
  89struct dm_dev {
  90        struct list_head list;
  91
  92        atomic_t count;
  93        int mode;
  94        struct block_device *bdev;
  95        char name[16];
  96};
  97
  98struct dm_table;
  99
 100/*-----------------------------------------------------------------
 101 * Internal table functions.
 102 *---------------------------------------------------------------*/
 103void dm_table_event_callback(struct dm_table *t,
 104                             void (*fn)(void *), void *context);
 105struct dm_target *dm_table_get_target(struct dm_table *t, unsigned int index);
 106struct dm_target *dm_table_find_target(struct dm_table *t, sector_t sector);
 107void dm_table_set_restrictions(struct dm_table *t, struct request_queue *q);
 108struct list_head *dm_table_get_devices(struct dm_table *t);
 109void dm_table_presuspend_targets(struct dm_table *t);
 110void dm_table_postsuspend_targets(struct dm_table *t);
 111int dm_table_resume_targets(struct dm_table *t);
 112int dm_table_any_congested(struct dm_table *t, int bdi_bits);
 113void dm_table_unplug_all(struct dm_table *t);
 114
 115/*
 116 * To check the return value from dm_table_find_target().
 117 */
 118#define dm_target_is_valid(t) ((t)->table)
 119
 120/*-----------------------------------------------------------------
 121 * A registry of target types.
 122 *---------------------------------------------------------------*/
 123int dm_target_init(void);
 124void dm_target_exit(void);
 125struct target_type *dm_get_target_type(const char *name);
 126void dm_put_target_type(struct target_type *t);
 127int dm_target_iterate(void (*iter_func)(struct target_type *tt,
 128                                        void *param), void *param);
 129
 130/*-----------------------------------------------------------------
 131 * Useful inlines.
 132 *---------------------------------------------------------------*/
 133static inline int array_too_big(unsigned long fixed, unsigned long obj,
 134                                unsigned long num)
 135{
 136        return (num > (ULONG_MAX - fixed) / obj);
 137}
 138
 139/*
 140 * Ceiling(n / sz)
 141 */
 142#define dm_div_up(n, sz) (((n) + (sz) - 1) / (sz))
 143
 144#define dm_sector_div_up(n, sz) ( \
 145{ \
 146        sector_t _r = ((n) + (sz) - 1); \
 147        sector_div(_r, (sz)); \
 148        _r; \
 149} \
 150)
 151
 152/*
 153 * ceiling(n / size) * size
 154 */
 155#define dm_round_up(n, sz) (dm_div_up((n), (sz)) * (sz))
 156
 157static inline sector_t to_sector(unsigned long n)
 158{
 159        return (n >> 9);
 160}
 161
 162static inline unsigned long to_bytes(sector_t n)
 163{
 164        return (n << 9);
 165}
 166
 167int dm_split_args(int *argc, char ***argvp, char *input);
 168
 169/*
 170 * The device-mapper can be driven through one of two interfaces;
 171 * ioctl or filesystem, depending which patch you have applied.
 172 */
 173int dm_interface_init(void);
 174void dm_interface_exit(void);
 175
 176/*
 177 * Targets for linear and striped mappings
 178 */
 179int dm_linear_init(void);
 180void dm_linear_exit(void);
 181
 182int dm_stripe_init(void);
 183void dm_stripe_exit(void);
 184
 185void *dm_vcalloc(unsigned long nmemb, unsigned long elem_size);
 186union map_info *dm_get_mapinfo(struct bio *bio);
 187int dm_open_count(struct mapped_device *md);
 188int dm_lock_for_deletion(struct mapped_device *md);
 189
 190void dm_kobject_uevent(struct mapped_device *md);
 191
 192#endif
 193