OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2001 Sistina Software (UK) Limited. | 2 * Copyright (C) 2001 Sistina Software (UK) Limited. |
3 * Copyright (C) 2004-2008 Red Hat, Inc. All rights reserved. | 3 * Copyright (C) 2004-2008 Red Hat, Inc. All rights reserved. |
4 * | 4 * |
5 * This file is released under the GPL. | 5 * This file is released under the GPL. |
6 */ | 6 */ |
7 | 7 |
8 #include "dm.h" | 8 #include "dm.h" |
9 | 9 |
10 #include <linux/module.h> | 10 #include <linux/module.h> |
11 #include <linux/vmalloc.h> | 11 #include <linux/vmalloc.h> |
12 #include <linux/blkdev.h> | 12 #include <linux/blkdev.h> |
13 #include <linux/namei.h> | 13 #include <linux/namei.h> |
| 14 #include <linux/mount.h> |
14 #include <linux/ctype.h> | 15 #include <linux/ctype.h> |
15 #include <linux/slab.h> | 16 #include <linux/slab.h> |
16 #include <linux/interrupt.h> | 17 #include <linux/interrupt.h> |
17 #include <linux/mutex.h> | 18 #include <linux/mutex.h> |
18 #include <linux/delay.h> | 19 #include <linux/delay.h> |
19 #include <asm/atomic.h> | 20 #include <asm/atomic.h> |
20 | 21 |
21 #define DM_MSG_PREFIX "table" | 22 #define DM_MSG_PREFIX "table" |
22 | 23 |
23 #define MAX_DEPTH 16 | 24 #define MAX_DEPTH 16 |
(...skipping 870 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
894 indexes += (KEYS_PER_NODE * t->counts[i]); | 895 indexes += (KEYS_PER_NODE * t->counts[i]); |
895 setup_btree_index(i, t); | 896 setup_btree_index(i, t); |
896 } | 897 } |
897 | 898 |
898 return 0; | 899 return 0; |
899 } | 900 } |
900 | 901 |
901 /* | 902 /* |
902 * Builds the btree to index the map. | 903 * Builds the btree to index the map. |
903 */ | 904 */ |
904 int dm_table_complete(struct dm_table *t) | 905 int dm_table_build_index(struct dm_table *t) |
905 { | 906 { |
906 int r = 0; | 907 int r = 0; |
907 unsigned int leaf_nodes; | 908 unsigned int leaf_nodes; |
908 | 909 |
909 /* how many indexes will the btree have ? */ | 910 /* how many indexes will the btree have ? */ |
910 leaf_nodes = dm_div_up(t->num_targets, KEYS_PER_NODE); | 911 leaf_nodes = dm_div_up(t->num_targets, KEYS_PER_NODE); |
911 t->depth = 1 + int_log(leaf_nodes, CHILDREN_PER_NODE); | 912 t->depth = 1 + int_log(leaf_nodes, CHILDREN_PER_NODE); |
912 | 913 |
913 /* leaf layer has already been set up */ | 914 /* leaf layer has already been set up */ |
914 t->counts[t->depth - 1] = leaf_nodes; | 915 t->counts[t->depth - 1] = leaf_nodes; |
915 t->index[t->depth - 1] = t->highs; | 916 t->index[t->depth - 1] = t->highs; |
916 | 917 |
917 if (t->depth >= 2) | 918 if (t->depth >= 2) |
918 r = setup_indexes(t); | 919 r = setup_indexes(t); |
919 | 920 |
920 return r; | 921 return r; |
921 } | 922 } |
922 | 923 |
| 924 /* |
| 925 * Register the mapped device for blk_integrity support if |
| 926 * the underlying devices support it. |
| 927 */ |
| 928 static int dm_table_prealloc_integrity(struct dm_table *t, |
| 929 struct mapped_device *md) |
| 930 { |
| 931 struct list_head *devices = dm_table_get_devices(t); |
| 932 struct dm_dev_internal *dd; |
| 933 |
| 934 list_for_each_entry(dd, devices, list) |
| 935 if (bdev_get_integrity(dd->dm_dev.bdev)) |
| 936 return blk_integrity_register(dm_disk(md), NULL); |
| 937 |
| 938 return 0; |
| 939 } |
| 940 |
| 941 /* |
| 942 * Prepares the table for use by building the indices, |
| 943 * setting the type, and allocating mempools. |
| 944 */ |
| 945 int dm_table_complete(struct dm_table *t) |
| 946 { |
| 947 int r = 0; |
| 948 r = dm_table_set_type(t); |
| 949 if (r) { |
| 950 DMERR("unable to set table type"); |
| 951 return r; |
| 952 } |
| 953 |
| 954 r = dm_table_build_index(t); |
| 955 if (r) { |
| 956 DMERR("unable to build btrees"); |
| 957 return r; |
| 958 } |
| 959 |
| 960 r = dm_table_prealloc_integrity(t, t->md); |
| 961 if (r) { |
| 962 DMERR("could not register integrity profile."); |
| 963 return r; |
| 964 } |
| 965 |
| 966 r = dm_table_alloc_md_mempools(t); |
| 967 if (r) |
| 968 DMERR("unable to allocate mempools"); |
| 969 return r; |
| 970 } |
| 971 |
923 static DEFINE_MUTEX(_event_lock); | 972 static DEFINE_MUTEX(_event_lock); |
924 void dm_table_event_callback(struct dm_table *t, | 973 void dm_table_event_callback(struct dm_table *t, |
925 void (*fn)(void *), void *context) | 974 void (*fn)(void *), void *context) |
926 { | 975 { |
927 mutex_lock(&_event_lock); | 976 mutex_lock(&_event_lock); |
928 t->event_fn = fn; | 977 t->event_fn = fn; |
929 t->event_context = context; | 978 t->event_context = context; |
930 mutex_unlock(&_event_lock); | 979 mutex_unlock(&_event_lock); |
931 } | 980 } |
932 | 981 |
(...skipping 305 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1238 EXPORT_SYMBOL(dm_vcalloc); | 1287 EXPORT_SYMBOL(dm_vcalloc); |
1239 EXPORT_SYMBOL(dm_get_device); | 1288 EXPORT_SYMBOL(dm_get_device); |
1240 EXPORT_SYMBOL(dm_put_device); | 1289 EXPORT_SYMBOL(dm_put_device); |
1241 EXPORT_SYMBOL(dm_table_event); | 1290 EXPORT_SYMBOL(dm_table_event); |
1242 EXPORT_SYMBOL(dm_table_get_size); | 1291 EXPORT_SYMBOL(dm_table_get_size); |
1243 EXPORT_SYMBOL(dm_table_get_mode); | 1292 EXPORT_SYMBOL(dm_table_get_mode); |
1244 EXPORT_SYMBOL(dm_table_get_md); | 1293 EXPORT_SYMBOL(dm_table_get_md); |
1245 EXPORT_SYMBOL(dm_table_put); | 1294 EXPORT_SYMBOL(dm_table_put); |
1246 EXPORT_SYMBOL(dm_table_get); | 1295 EXPORT_SYMBOL(dm_table_get); |
1247 EXPORT_SYMBOL(dm_table_unplug_all); | 1296 EXPORT_SYMBOL(dm_table_unplug_all); |
OLD | NEW |