dm-thin-metadata.c 48 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /*
  3. * Copyright (C) 2011-2012 Red Hat, Inc.
  4. *
  5. * This file is released under the GPL.
  6. */
  7. #include "dm-thin-metadata.h"
  8. #include "persistent-data/dm-btree.h"
  9. #include "persistent-data/dm-space-map.h"
  10. #include "persistent-data/dm-space-map-disk.h"
  11. #include "persistent-data/dm-transaction-manager.h"
  12. #include <linux/list.h>
  13. #include <linux/device-mapper.h>
  14. #include <linux/workqueue.h>
  15. /*
  16. *--------------------------------------------------------------------------
  17. * As far as the metadata goes, there is:
  18. *
  19. * - A superblock in block zero, taking up fewer than 512 bytes for
  20. * atomic writes.
  21. *
  22. * - A space map managing the metadata blocks.
  23. *
  24. * - A space map managing the data blocks.
  25. *
  26. * - A btree mapping our internal thin dev ids onto struct disk_device_details.
  27. *
  28. * - A hierarchical btree, with 2 levels which effectively maps (thin
  29. * dev id, virtual block) -> block_time. Block time is a 64-bit
  30. * field holding the time in the low 24 bits, and block in the top 40
  31. * bits.
  32. *
  33. * BTrees consist solely of btree_nodes, that fill a block. Some are
  34. * internal nodes, as such their values are a __le64 pointing to other
  35. * nodes. Leaf nodes can store data of any reasonable size (ie. much
  36. * smaller than the block size). The nodes consist of the header,
  37. * followed by an array of keys, followed by an array of values. We have
  38. * to binary search on the keys so they're all held together to help the
  39. * cpu cache.
  40. *
  41. * Space maps have 2 btrees:
  42. *
  43. * - One maps a uint64_t onto a struct index_entry. Which points to a
  44. * bitmap block, and has some details about how many free entries there
  45. * are etc.
  46. *
  47. * - The bitmap blocks have a header (for the checksum). Then the rest
  48. * of the block is pairs of bits. With the meaning being:
  49. *
  50. * 0 - ref count is 0
  51. * 1 - ref count is 1
  52. * 2 - ref count is 2
  53. * 3 - ref count is higher than 2
  54. *
  55. * - If the count is higher than 2 then the ref count is entered in a
  56. * second btree that directly maps the block_address to a uint32_t ref
  57. * count.
  58. *
  59. * The space map metadata variant doesn't have a bitmaps btree. Instead
  60. * it has one single blocks worth of index_entries. This avoids
  61. * recursive issues with the bitmap btree needing to allocate space in
  62. * order to insert. With a small data block size such as 64k the
  63. * metadata support data devices that are hundreds of terrabytes.
  64. *
  65. * The space maps allocate space linearly from front to back. Space that
  66. * is freed in a transaction is never recycled within that transaction.
  67. * To try and avoid fragmenting _free_ space the allocator always goes
  68. * back and fills in gaps.
  69. *
  70. * All metadata io is in THIN_METADATA_BLOCK_SIZE sized/aligned chunks
  71. * from the block manager.
  72. *--------------------------------------------------------------------------
  73. */
  74. #define DM_MSG_PREFIX "thin metadata"
  75. #define THIN_SUPERBLOCK_MAGIC 27022010
  76. #define THIN_SUPERBLOCK_LOCATION 0
  77. #define THIN_VERSION 2
  78. #define SECTOR_TO_BLOCK_SHIFT 3
  79. /*
  80. * For btree insert:
  81. * 3 for btree insert +
  82. * 2 for btree lookup used within space map
  83. * For btree remove:
  84. * 2 for shadow spine +
  85. * 4 for rebalance 3 child node
  86. */
  87. #define THIN_MAX_CONCURRENT_LOCKS 6
  88. /* This should be plenty */
  89. #define SPACE_MAP_ROOT_SIZE 128
  90. /*
  91. * Little endian on-disk superblock and device details.
  92. */
  93. struct thin_disk_superblock {
  94. __le32 csum; /* Checksum of superblock except for this field. */
  95. __le32 flags;
  96. __le64 blocknr; /* This block number, dm_block_t. */
  97. __u8 uuid[16];
  98. __le64 magic;
  99. __le32 version;
  100. __le32 time;
  101. __le64 trans_id;
  102. /*
  103. * Root held by userspace transactions.
  104. */
  105. __le64 held_root;
  106. __u8 data_space_map_root[SPACE_MAP_ROOT_SIZE];
  107. __u8 metadata_space_map_root[SPACE_MAP_ROOT_SIZE];
  108. /*
  109. * 2-level btree mapping (dev_id, (dev block, time)) -> data block
  110. */
  111. __le64 data_mapping_root;
  112. /*
  113. * Device detail root mapping dev_id -> device_details
  114. */
  115. __le64 device_details_root;
  116. __le32 data_block_size; /* In 512-byte sectors. */
  117. __le32 metadata_block_size; /* In 512-byte sectors. */
  118. __le64 metadata_nr_blocks;
  119. __le32 compat_flags;
  120. __le32 compat_ro_flags;
  121. __le32 incompat_flags;
  122. } __packed;
  123. struct disk_device_details {
  124. __le64 mapped_blocks;
  125. __le64 transaction_id; /* When created. */
  126. __le32 creation_time;
  127. __le32 snapshotted_time;
  128. } __packed;
  129. struct dm_pool_metadata {
  130. struct hlist_node hash;
  131. struct block_device *bdev;
  132. struct dm_block_manager *bm;
  133. struct dm_space_map *metadata_sm;
  134. struct dm_space_map *data_sm;
  135. struct dm_transaction_manager *tm;
  136. struct dm_transaction_manager *nb_tm;
  137. /*
  138. * Two-level btree.
  139. * First level holds thin_dev_t.
  140. * Second level holds mappings.
  141. */
  142. struct dm_btree_info info;
  143. /*
  144. * Non-blocking version of the above.
  145. */
  146. struct dm_btree_info nb_info;
  147. /*
  148. * Just the top level for deleting whole devices.
  149. */
  150. struct dm_btree_info tl_info;
  151. /*
  152. * Just the bottom level for creating new devices.
  153. */
  154. struct dm_btree_info bl_info;
  155. /*
  156. * Describes the device details btree.
  157. */
  158. struct dm_btree_info details_info;
  159. struct rw_semaphore root_lock;
  160. uint32_t time;
  161. dm_block_t root;
  162. dm_block_t details_root;
  163. struct list_head thin_devices;
  164. uint64_t trans_id;
  165. unsigned long flags;
  166. sector_t data_block_size;
  167. /*
  168. * Pre-commit callback.
  169. *
  170. * This allows the thin provisioning target to run a callback before
  171. * the metadata are committed.
  172. */
  173. dm_pool_pre_commit_fn pre_commit_fn;
  174. void *pre_commit_context;
  175. /*
  176. * We reserve a section of the metadata for commit overhead.
  177. * All reported space does *not* include this.
  178. */
  179. dm_block_t metadata_reserve;
  180. /*
  181. * Set if a transaction has to be aborted but the attempt to roll back
  182. * to the previous (good) transaction failed. The only pool metadata
  183. * operation possible in this state is the closing of the device.
  184. */
  185. bool fail_io:1;
  186. /*
  187. * Set once a thin-pool has been accessed through one of the interfaces
  188. * that imply the pool is in-service (e.g. thin devices created/deleted,
  189. * thin-pool message, metadata snapshots, etc).
  190. */
  191. bool in_service:1;
  192. /*
  193. * Reading the space map roots can fail, so we read it into these
  194. * buffers before the superblock is locked and updated.
  195. */
  196. __u8 data_space_map_root[SPACE_MAP_ROOT_SIZE];
  197. __u8 metadata_space_map_root[SPACE_MAP_ROOT_SIZE];
  198. };
  199. struct dm_thin_device {
  200. struct list_head list;
  201. struct dm_pool_metadata *pmd;
  202. dm_thin_id id;
  203. int open_count;
  204. bool changed:1;
  205. bool aborted_with_changes:1;
  206. uint64_t mapped_blocks;
  207. uint64_t transaction_id;
  208. uint32_t creation_time;
  209. uint32_t snapshotted_time;
  210. };
  211. /*
  212. *--------------------------------------------------------------
  213. * superblock validator
  214. *--------------------------------------------------------------
  215. */
  216. #define SUPERBLOCK_CSUM_XOR 160774
  217. static void sb_prepare_for_write(const struct dm_block_validator *v,
  218. struct dm_block *b,
  219. size_t block_size)
  220. {
  221. struct thin_disk_superblock *disk_super = dm_block_data(b);
  222. disk_super->blocknr = cpu_to_le64(dm_block_location(b));
  223. disk_super->csum = cpu_to_le32(dm_bm_checksum(&disk_super->flags,
  224. block_size - sizeof(__le32),
  225. SUPERBLOCK_CSUM_XOR));
  226. }
  227. static int sb_check(const struct dm_block_validator *v,
  228. struct dm_block *b,
  229. size_t block_size)
  230. {
  231. struct thin_disk_superblock *disk_super = dm_block_data(b);
  232. __le32 csum_le;
  233. if (dm_block_location(b) != le64_to_cpu(disk_super->blocknr)) {
  234. DMERR("%s failed: blocknr %llu: wanted %llu",
  235. __func__, le64_to_cpu(disk_super->blocknr),
  236. (unsigned long long)dm_block_location(b));
  237. return -ENOTBLK;
  238. }
  239. if (le64_to_cpu(disk_super->magic) != THIN_SUPERBLOCK_MAGIC) {
  240. DMERR("%s failed: magic %llu: wanted %llu",
  241. __func__, le64_to_cpu(disk_super->magic),
  242. (unsigned long long)THIN_SUPERBLOCK_MAGIC);
  243. return -EILSEQ;
  244. }
  245. csum_le = cpu_to_le32(dm_bm_checksum(&disk_super->flags,
  246. block_size - sizeof(__le32),
  247. SUPERBLOCK_CSUM_XOR));
  248. if (csum_le != disk_super->csum) {
  249. DMERR("%s failed: csum %u: wanted %u",
  250. __func__, le32_to_cpu(csum_le), le32_to_cpu(disk_super->csum));
  251. return -EILSEQ;
  252. }
  253. return 0;
  254. }
  255. static const struct dm_block_validator sb_validator = {
  256. .name = "superblock",
  257. .prepare_for_write = sb_prepare_for_write,
  258. .check = sb_check
  259. };
  260. /*
  261. *--------------------------------------------------------------
  262. * Methods for the btree value types
  263. *--------------------------------------------------------------
  264. */
  265. static uint64_t pack_block_time(dm_block_t b, uint32_t t)
  266. {
  267. return (b << 24) | t;
  268. }
  269. static void unpack_block_time(uint64_t v, dm_block_t *b, uint32_t *t)
  270. {
  271. *b = v >> 24;
  272. *t = v & ((1 << 24) - 1);
  273. }
  274. /*
  275. * It's more efficient to call dm_sm_{inc,dec}_blocks as few times as
  276. * possible. 'with_runs' reads contiguous runs of blocks, and calls the
  277. * given sm function.
  278. */
  279. typedef int (*run_fn)(struct dm_space_map *, dm_block_t, dm_block_t);
  280. static void with_runs(struct dm_space_map *sm, const __le64 *value_le, unsigned int count, run_fn fn)
  281. {
  282. uint64_t b, begin, end;
  283. uint32_t t;
  284. bool in_run = false;
  285. unsigned int i;
  286. for (i = 0; i < count; i++, value_le++) {
  287. /* We know value_le is 8 byte aligned */
  288. unpack_block_time(le64_to_cpu(*value_le), &b, &t);
  289. if (in_run) {
  290. if (b == end) {
  291. end++;
  292. } else {
  293. fn(sm, begin, end);
  294. begin = b;
  295. end = b + 1;
  296. }
  297. } else {
  298. in_run = true;
  299. begin = b;
  300. end = b + 1;
  301. }
  302. }
  303. if (in_run)
  304. fn(sm, begin, end);
  305. }
  306. static void data_block_inc(void *context, const void *value_le, unsigned int count)
  307. {
  308. with_runs((struct dm_space_map *) context,
  309. (const __le64 *) value_le, count, dm_sm_inc_blocks);
  310. }
  311. static void data_block_dec(void *context, const void *value_le, unsigned int count)
  312. {
  313. with_runs((struct dm_space_map *) context,
  314. (const __le64 *) value_le, count, dm_sm_dec_blocks);
  315. }
  316. static int data_block_equal(void *context, const void *value1_le, const void *value2_le)
  317. {
  318. __le64 v1_le, v2_le;
  319. uint64_t b1, b2;
  320. uint32_t t;
  321. memcpy(&v1_le, value1_le, sizeof(v1_le));
  322. memcpy(&v2_le, value2_le, sizeof(v2_le));
  323. unpack_block_time(le64_to_cpu(v1_le), &b1, &t);
  324. unpack_block_time(le64_to_cpu(v2_le), &b2, &t);
  325. return b1 == b2;
  326. }
  327. static void subtree_inc(void *context, const void *value, unsigned int count)
  328. {
  329. struct dm_btree_info *info = context;
  330. const __le64 *root_le = value;
  331. unsigned int i;
  332. for (i = 0; i < count; i++, root_le++)
  333. dm_tm_inc(info->tm, le64_to_cpu(*root_le));
  334. }
  335. static void subtree_dec(void *context, const void *value, unsigned int count)
  336. {
  337. struct dm_btree_info *info = context;
  338. const __le64 *root_le = value;
  339. unsigned int i;
  340. for (i = 0; i < count; i++, root_le++)
  341. if (dm_btree_del(info, le64_to_cpu(*root_le)))
  342. DMERR("btree delete failed");
  343. }
  344. static int subtree_equal(void *context, const void *value1_le, const void *value2_le)
  345. {
  346. __le64 v1_le, v2_le;
  347. memcpy(&v1_le, value1_le, sizeof(v1_le));
  348. memcpy(&v2_le, value2_le, sizeof(v2_le));
  349. return v1_le == v2_le;
  350. }
  351. /*----------------------------------------------------------------*/
  352. /*
  353. * Variant that is used for in-core only changes or code that
  354. * shouldn't put the pool in service on its own (e.g. commit).
  355. */
  356. static inline void pmd_write_lock_in_core(struct dm_pool_metadata *pmd)
  357. __acquires(pmd->root_lock)
  358. {
  359. down_write(&pmd->root_lock);
  360. }
  361. static inline void pmd_write_lock(struct dm_pool_metadata *pmd)
  362. {
  363. pmd_write_lock_in_core(pmd);
  364. if (unlikely(!pmd->in_service))
  365. pmd->in_service = true;
  366. }
  367. static inline void pmd_write_unlock(struct dm_pool_metadata *pmd)
  368. __releases(pmd->root_lock)
  369. {
  370. up_write(&pmd->root_lock);
  371. }
  372. /*----------------------------------------------------------------*/
  373. static int superblock_lock_zero(struct dm_pool_metadata *pmd,
  374. struct dm_block **sblock)
  375. {
  376. return dm_bm_write_lock_zero(pmd->bm, THIN_SUPERBLOCK_LOCATION,
  377. &sb_validator, sblock);
  378. }
  379. static int superblock_lock(struct dm_pool_metadata *pmd,
  380. struct dm_block **sblock)
  381. {
  382. return dm_bm_write_lock(pmd->bm, THIN_SUPERBLOCK_LOCATION,
  383. &sb_validator, sblock);
  384. }
  385. static int __superblock_all_zeroes(struct dm_block_manager *bm, int *result)
  386. {
  387. int r;
  388. unsigned int i;
  389. struct dm_block *b;
  390. __le64 *data_le, zero = cpu_to_le64(0);
  391. unsigned int block_size = dm_bm_block_size(bm) / sizeof(__le64);
  392. /*
  393. * We can't use a validator here - it may be all zeroes.
  394. */
  395. r = dm_bm_read_lock(bm, THIN_SUPERBLOCK_LOCATION, NULL, &b);
  396. if (r)
  397. return r;
  398. data_le = dm_block_data(b);
  399. *result = 1;
  400. for (i = 0; i < block_size; i++) {
  401. if (data_le[i] != zero) {
  402. *result = 0;
  403. break;
  404. }
  405. }
  406. dm_bm_unlock(b);
  407. return 0;
  408. }
  409. static void __setup_btree_details(struct dm_pool_metadata *pmd)
  410. {
  411. pmd->info.tm = pmd->tm;
  412. pmd->info.levels = 2;
  413. pmd->info.value_type.context = pmd->data_sm;
  414. pmd->info.value_type.size = sizeof(__le64);
  415. pmd->info.value_type.inc = data_block_inc;
  416. pmd->info.value_type.dec = data_block_dec;
  417. pmd->info.value_type.equal = data_block_equal;
  418. memcpy(&pmd->nb_info, &pmd->info, sizeof(pmd->nb_info));
  419. pmd->nb_info.tm = pmd->nb_tm;
  420. pmd->tl_info.tm = pmd->tm;
  421. pmd->tl_info.levels = 1;
  422. pmd->tl_info.value_type.context = &pmd->bl_info;
  423. pmd->tl_info.value_type.size = sizeof(__le64);
  424. pmd->tl_info.value_type.inc = subtree_inc;
  425. pmd->tl_info.value_type.dec = subtree_dec;
  426. pmd->tl_info.value_type.equal = subtree_equal;
  427. pmd->bl_info.tm = pmd->tm;
  428. pmd->bl_info.levels = 1;
  429. pmd->bl_info.value_type.context = pmd->data_sm;
  430. pmd->bl_info.value_type.size = sizeof(__le64);
  431. pmd->bl_info.value_type.inc = data_block_inc;
  432. pmd->bl_info.value_type.dec = data_block_dec;
  433. pmd->bl_info.value_type.equal = data_block_equal;
  434. pmd->details_info.tm = pmd->tm;
  435. pmd->details_info.levels = 1;
  436. pmd->details_info.value_type.context = NULL;
  437. pmd->details_info.value_type.size = sizeof(struct disk_device_details);
  438. pmd->details_info.value_type.inc = NULL;
  439. pmd->details_info.value_type.dec = NULL;
  440. pmd->details_info.value_type.equal = NULL;
  441. }
  442. static int save_sm_roots(struct dm_pool_metadata *pmd)
  443. {
  444. int r;
  445. size_t len;
  446. r = dm_sm_root_size(pmd->metadata_sm, &len);
  447. if (r < 0)
  448. return r;
  449. r = dm_sm_copy_root(pmd->metadata_sm, &pmd->metadata_space_map_root, len);
  450. if (r < 0)
  451. return r;
  452. r = dm_sm_root_size(pmd->data_sm, &len);
  453. if (r < 0)
  454. return r;
  455. return dm_sm_copy_root(pmd->data_sm, &pmd->data_space_map_root, len);
  456. }
  457. static void copy_sm_roots(struct dm_pool_metadata *pmd,
  458. struct thin_disk_superblock *disk)
  459. {
  460. memcpy(&disk->metadata_space_map_root,
  461. &pmd->metadata_space_map_root,
  462. sizeof(pmd->metadata_space_map_root));
  463. memcpy(&disk->data_space_map_root,
  464. &pmd->data_space_map_root,
  465. sizeof(pmd->data_space_map_root));
  466. }
  467. static int __write_initial_superblock(struct dm_pool_metadata *pmd)
  468. {
  469. int r;
  470. struct dm_block *sblock;
  471. struct thin_disk_superblock *disk_super;
  472. sector_t bdev_size = bdev_nr_sectors(pmd->bdev);
  473. if (bdev_size > THIN_METADATA_MAX_SECTORS)
  474. bdev_size = THIN_METADATA_MAX_SECTORS;
  475. r = dm_sm_commit(pmd->data_sm);
  476. if (r < 0)
  477. return r;
  478. r = dm_tm_pre_commit(pmd->tm);
  479. if (r < 0)
  480. return r;
  481. r = save_sm_roots(pmd);
  482. if (r < 0)
  483. return r;
  484. r = superblock_lock_zero(pmd, &sblock);
  485. if (r)
  486. return r;
  487. disk_super = dm_block_data(sblock);
  488. disk_super->flags = 0;
  489. memset(disk_super->uuid, 0, sizeof(disk_super->uuid));
  490. disk_super->magic = cpu_to_le64(THIN_SUPERBLOCK_MAGIC);
  491. disk_super->version = cpu_to_le32(THIN_VERSION);
  492. disk_super->time = 0;
  493. disk_super->trans_id = 0;
  494. disk_super->held_root = 0;
  495. copy_sm_roots(pmd, disk_super);
  496. disk_super->data_mapping_root = cpu_to_le64(pmd->root);
  497. disk_super->device_details_root = cpu_to_le64(pmd->details_root);
  498. disk_super->metadata_block_size = cpu_to_le32(THIN_METADATA_BLOCK_SIZE);
  499. disk_super->metadata_nr_blocks = cpu_to_le64(bdev_size >> SECTOR_TO_BLOCK_SHIFT);
  500. disk_super->data_block_size = cpu_to_le32(pmd->data_block_size);
  501. return dm_tm_commit(pmd->tm, sblock);
  502. }
  503. static int __format_metadata(struct dm_pool_metadata *pmd)
  504. {
  505. int r;
  506. r = dm_tm_create_with_sm(pmd->bm, THIN_SUPERBLOCK_LOCATION,
  507. &pmd->tm, &pmd->metadata_sm);
  508. if (r < 0) {
  509. pmd->tm = NULL;
  510. pmd->metadata_sm = NULL;
  511. DMERR("tm_create_with_sm failed");
  512. return r;
  513. }
  514. pmd->data_sm = dm_sm_disk_create(pmd->tm, 0);
  515. if (IS_ERR(pmd->data_sm)) {
  516. DMERR("sm_disk_create failed");
  517. r = PTR_ERR(pmd->data_sm);
  518. pmd->data_sm = NULL;
  519. goto bad_cleanup_tm;
  520. }
  521. pmd->nb_tm = dm_tm_create_non_blocking_clone(pmd->tm);
  522. if (!pmd->nb_tm) {
  523. DMERR("could not create non-blocking clone tm");
  524. r = -ENOMEM;
  525. goto bad_cleanup_data_sm;
  526. }
  527. __setup_btree_details(pmd);
  528. r = dm_btree_empty(&pmd->info, &pmd->root);
  529. if (r < 0)
  530. goto bad_cleanup_nb_tm;
  531. r = dm_btree_empty(&pmd->details_info, &pmd->details_root);
  532. if (r < 0) {
  533. DMERR("couldn't create devices root");
  534. goto bad_cleanup_nb_tm;
  535. }
  536. r = __write_initial_superblock(pmd);
  537. if (r)
  538. goto bad_cleanup_nb_tm;
  539. return 0;
  540. bad_cleanup_nb_tm:
  541. dm_tm_destroy(pmd->nb_tm);
  542. pmd->nb_tm = NULL;
  543. bad_cleanup_data_sm:
  544. dm_sm_destroy(pmd->data_sm);
  545. pmd->data_sm = NULL;
  546. bad_cleanup_tm:
  547. dm_tm_destroy(pmd->tm);
  548. pmd->tm = NULL;
  549. dm_sm_destroy(pmd->metadata_sm);
  550. pmd->metadata_sm = NULL;
  551. return r;
  552. }
  553. static int __check_incompat_features(struct thin_disk_superblock *disk_super,
  554. struct dm_pool_metadata *pmd)
  555. {
  556. uint32_t features;
  557. features = le32_to_cpu(disk_super->incompat_flags) & ~THIN_FEATURE_INCOMPAT_SUPP;
  558. if (features) {
  559. DMERR("could not access metadata due to unsupported optional features (%lx).",
  560. (unsigned long)features);
  561. return -EINVAL;
  562. }
  563. /*
  564. * Check for read-only metadata to skip the following RDWR checks.
  565. */
  566. if (bdev_read_only(pmd->bdev))
  567. return 0;
  568. features = le32_to_cpu(disk_super->compat_ro_flags) & ~THIN_FEATURE_COMPAT_RO_SUPP;
  569. if (features) {
  570. DMERR("could not access metadata RDWR due to unsupported optional features (%lx).",
  571. (unsigned long)features);
  572. return -EINVAL;
  573. }
  574. return 0;
  575. }
  576. static int __open_metadata(struct dm_pool_metadata *pmd)
  577. {
  578. int r;
  579. struct dm_block *sblock;
  580. struct thin_disk_superblock *disk_super;
  581. r = dm_bm_read_lock(pmd->bm, THIN_SUPERBLOCK_LOCATION,
  582. &sb_validator, &sblock);
  583. if (r < 0) {
  584. DMERR("couldn't read superblock");
  585. return r;
  586. }
  587. disk_super = dm_block_data(sblock);
  588. /* Verify the data block size hasn't changed */
  589. if (le32_to_cpu(disk_super->data_block_size) != pmd->data_block_size) {
  590. DMERR("changing the data block size (from %u to %llu) is not supported",
  591. le32_to_cpu(disk_super->data_block_size),
  592. (unsigned long long)pmd->data_block_size);
  593. r = -EINVAL;
  594. goto bad_unlock_sblock;
  595. }
  596. r = __check_incompat_features(disk_super, pmd);
  597. if (r < 0)
  598. goto bad_unlock_sblock;
  599. r = dm_tm_open_with_sm(pmd->bm, THIN_SUPERBLOCK_LOCATION,
  600. disk_super->metadata_space_map_root,
  601. sizeof(disk_super->metadata_space_map_root),
  602. &pmd->tm, &pmd->metadata_sm);
  603. if (r < 0) {
  604. pmd->tm = NULL;
  605. pmd->metadata_sm = NULL;
  606. DMERR("tm_open_with_sm failed");
  607. goto bad_unlock_sblock;
  608. }
  609. pmd->data_sm = dm_sm_disk_open(pmd->tm, disk_super->data_space_map_root,
  610. sizeof(disk_super->data_space_map_root));
  611. if (IS_ERR(pmd->data_sm)) {
  612. DMERR("sm_disk_open failed");
  613. r = PTR_ERR(pmd->data_sm);
  614. pmd->data_sm = NULL;
  615. goto bad_cleanup_tm;
  616. }
  617. pmd->nb_tm = dm_tm_create_non_blocking_clone(pmd->tm);
  618. if (!pmd->nb_tm) {
  619. DMERR("could not create non-blocking clone tm");
  620. r = -ENOMEM;
  621. goto bad_cleanup_data_sm;
  622. }
  623. /*
  624. * For pool metadata opening process, root setting is redundant
  625. * because it will be set again in __begin_transaction(). But dm
  626. * pool aborting process really needs to get last transaction's
  627. * root to avoid accessing broken btree.
  628. */
  629. pmd->root = le64_to_cpu(disk_super->data_mapping_root);
  630. pmd->details_root = le64_to_cpu(disk_super->device_details_root);
  631. __setup_btree_details(pmd);
  632. dm_bm_unlock(sblock);
  633. return 0;
  634. bad_cleanup_data_sm:
  635. dm_sm_destroy(pmd->data_sm);
  636. pmd->data_sm = NULL;
  637. bad_cleanup_tm:
  638. dm_tm_destroy(pmd->tm);
  639. pmd->tm = NULL;
  640. dm_sm_destroy(pmd->metadata_sm);
  641. pmd->metadata_sm = NULL;
  642. bad_unlock_sblock:
  643. dm_bm_unlock(sblock);
  644. return r;
  645. }
  646. static int __open_or_format_metadata(struct dm_pool_metadata *pmd, bool format_device)
  647. {
  648. int r, unformatted;
  649. r = __superblock_all_zeroes(pmd->bm, &unformatted);
  650. if (r)
  651. return r;
  652. if (unformatted)
  653. return format_device ? __format_metadata(pmd) : -EPERM;
  654. return __open_metadata(pmd);
  655. }
  656. static int __create_persistent_data_objects(struct dm_pool_metadata *pmd, bool format_device)
  657. {
  658. int r;
  659. pmd->bm = dm_block_manager_create(pmd->bdev, THIN_METADATA_BLOCK_SIZE << SECTOR_SHIFT,
  660. THIN_MAX_CONCURRENT_LOCKS);
  661. if (IS_ERR(pmd->bm)) {
  662. DMERR("could not create block manager");
  663. r = PTR_ERR(pmd->bm);
  664. pmd->bm = NULL;
  665. return r;
  666. }
  667. r = __open_or_format_metadata(pmd, format_device);
  668. if (r) {
  669. dm_block_manager_destroy(pmd->bm);
  670. pmd->bm = NULL;
  671. }
  672. return r;
  673. }
  674. static void __destroy_persistent_data_objects(struct dm_pool_metadata *pmd,
  675. bool destroy_bm)
  676. {
  677. dm_sm_destroy(pmd->data_sm);
  678. pmd->data_sm = NULL;
  679. dm_sm_destroy(pmd->metadata_sm);
  680. pmd->metadata_sm = NULL;
  681. dm_tm_destroy(pmd->nb_tm);
  682. pmd->nb_tm = NULL;
  683. dm_tm_destroy(pmd->tm);
  684. pmd->tm = NULL;
  685. if (destroy_bm)
  686. dm_block_manager_destroy(pmd->bm);
  687. }
  688. static int __begin_transaction(struct dm_pool_metadata *pmd)
  689. {
  690. int r;
  691. struct thin_disk_superblock *disk_super;
  692. struct dm_block *sblock;
  693. /*
  694. * We re-read the superblock every time. Shouldn't need to do this
  695. * really.
  696. */
  697. r = dm_bm_read_lock(pmd->bm, THIN_SUPERBLOCK_LOCATION,
  698. &sb_validator, &sblock);
  699. if (r)
  700. return r;
  701. disk_super = dm_block_data(sblock);
  702. pmd->time = le32_to_cpu(disk_super->time);
  703. pmd->root = le64_to_cpu(disk_super->data_mapping_root);
  704. pmd->details_root = le64_to_cpu(disk_super->device_details_root);
  705. pmd->trans_id = le64_to_cpu(disk_super->trans_id);
  706. pmd->flags = le32_to_cpu(disk_super->flags);
  707. pmd->data_block_size = le32_to_cpu(disk_super->data_block_size);
  708. dm_bm_unlock(sblock);
  709. return 0;
  710. }
  711. static int __write_changed_details(struct dm_pool_metadata *pmd)
  712. {
  713. int r;
  714. struct dm_thin_device *td, *tmp;
  715. struct disk_device_details details;
  716. uint64_t key;
  717. list_for_each_entry_safe(td, tmp, &pmd->thin_devices, list) {
  718. if (!td->changed)
  719. continue;
  720. key = td->id;
  721. details.mapped_blocks = cpu_to_le64(td->mapped_blocks);
  722. details.transaction_id = cpu_to_le64(td->transaction_id);
  723. details.creation_time = cpu_to_le32(td->creation_time);
  724. details.snapshotted_time = cpu_to_le32(td->snapshotted_time);
  725. __dm_bless_for_disk(&details);
  726. r = dm_btree_insert(&pmd->details_info, pmd->details_root,
  727. &key, &details, &pmd->details_root);
  728. if (r)
  729. return r;
  730. if (td->open_count)
  731. td->changed = false;
  732. else {
  733. list_del(&td->list);
  734. kfree(td);
  735. }
  736. }
  737. return 0;
  738. }
  739. static int __commit_transaction(struct dm_pool_metadata *pmd)
  740. {
  741. int r;
  742. struct thin_disk_superblock *disk_super;
  743. struct dm_block *sblock;
  744. /*
  745. * We need to know if the thin_disk_superblock exceeds a 512-byte sector.
  746. */
  747. BUILD_BUG_ON(sizeof(struct thin_disk_superblock) > 512);
  748. BUG_ON(!rwsem_is_locked(&pmd->root_lock));
  749. if (unlikely(!pmd->in_service))
  750. return 0;
  751. if (pmd->pre_commit_fn) {
  752. r = pmd->pre_commit_fn(pmd->pre_commit_context);
  753. if (r < 0) {
  754. DMERR("pre-commit callback failed");
  755. return r;
  756. }
  757. }
  758. r = __write_changed_details(pmd);
  759. if (r < 0)
  760. return r;
  761. r = dm_sm_commit(pmd->data_sm);
  762. if (r < 0)
  763. return r;
  764. r = dm_tm_pre_commit(pmd->tm);
  765. if (r < 0)
  766. return r;
  767. r = save_sm_roots(pmd);
  768. if (r < 0)
  769. return r;
  770. r = superblock_lock(pmd, &sblock);
  771. if (r)
  772. return r;
  773. disk_super = dm_block_data(sblock);
  774. disk_super->time = cpu_to_le32(pmd->time);
  775. disk_super->data_mapping_root = cpu_to_le64(pmd->root);
  776. disk_super->device_details_root = cpu_to_le64(pmd->details_root);
  777. disk_super->trans_id = cpu_to_le64(pmd->trans_id);
  778. disk_super->flags = cpu_to_le32(pmd->flags);
  779. copy_sm_roots(pmd, disk_super);
  780. return dm_tm_commit(pmd->tm, sblock);
  781. }
  782. static void __set_metadata_reserve(struct dm_pool_metadata *pmd)
  783. {
  784. int r;
  785. dm_block_t total;
  786. dm_block_t max_blocks = 4096; /* 16M */
  787. r = dm_sm_get_nr_blocks(pmd->metadata_sm, &total);
  788. if (r) {
  789. DMERR("could not get size of metadata device");
  790. pmd->metadata_reserve = max_blocks;
  791. } else
  792. pmd->metadata_reserve = min(max_blocks, div_u64(total, 10));
  793. }
  794. struct dm_pool_metadata *dm_pool_metadata_open(struct block_device *bdev,
  795. sector_t data_block_size,
  796. bool format_device)
  797. {
  798. int r;
  799. struct dm_pool_metadata *pmd;
  800. pmd = kmalloc_obj(*pmd);
  801. if (!pmd) {
  802. DMERR("could not allocate metadata struct");
  803. return ERR_PTR(-ENOMEM);
  804. }
  805. init_rwsem(&pmd->root_lock);
  806. pmd->time = 0;
  807. INIT_LIST_HEAD(&pmd->thin_devices);
  808. pmd->fail_io = false;
  809. pmd->in_service = false;
  810. pmd->bdev = bdev;
  811. pmd->data_block_size = data_block_size;
  812. pmd->pre_commit_fn = NULL;
  813. pmd->pre_commit_context = NULL;
  814. r = __create_persistent_data_objects(pmd, format_device);
  815. if (r) {
  816. kfree(pmd);
  817. return ERR_PTR(r);
  818. }
  819. r = __begin_transaction(pmd);
  820. if (r < 0) {
  821. if (dm_pool_metadata_close(pmd) < 0)
  822. DMWARN("%s: dm_pool_metadata_close() failed.", __func__);
  823. return ERR_PTR(r);
  824. }
  825. __set_metadata_reserve(pmd);
  826. return pmd;
  827. }
  828. int dm_pool_metadata_close(struct dm_pool_metadata *pmd)
  829. {
  830. int r;
  831. unsigned int open_devices = 0;
  832. struct dm_thin_device *td, *tmp;
  833. down_read(&pmd->root_lock);
  834. list_for_each_entry_safe(td, tmp, &pmd->thin_devices, list) {
  835. if (td->open_count)
  836. open_devices++;
  837. else {
  838. list_del(&td->list);
  839. kfree(td);
  840. }
  841. }
  842. up_read(&pmd->root_lock);
  843. if (open_devices) {
  844. DMERR("attempt to close pmd when %u device(s) are still open",
  845. open_devices);
  846. return -EBUSY;
  847. }
  848. pmd_write_lock_in_core(pmd);
  849. if (!pmd->fail_io && !dm_bm_is_read_only(pmd->bm)) {
  850. r = __commit_transaction(pmd);
  851. if (r < 0)
  852. DMWARN("%s: __commit_transaction() failed, error = %d",
  853. __func__, r);
  854. }
  855. pmd_write_unlock(pmd);
  856. __destroy_persistent_data_objects(pmd, true);
  857. kfree(pmd);
  858. return 0;
  859. }
  860. /*
  861. * __open_device: Returns @td corresponding to device with id @dev,
  862. * creating it if @create is set and incrementing @td->open_count.
  863. * On failure, @td is undefined.
  864. */
  865. static int __open_device(struct dm_pool_metadata *pmd,
  866. dm_thin_id dev, int create,
  867. struct dm_thin_device **td)
  868. {
  869. int r, changed = 0;
  870. struct dm_thin_device *td2;
  871. uint64_t key = dev;
  872. struct disk_device_details details_le;
  873. /*
  874. * If the device is already open, return it.
  875. */
  876. list_for_each_entry(td2, &pmd->thin_devices, list)
  877. if (td2->id == dev) {
  878. /*
  879. * May not create an already-open device.
  880. */
  881. if (create)
  882. return -EEXIST;
  883. td2->open_count++;
  884. *td = td2;
  885. return 0;
  886. }
  887. /*
  888. * Check the device exists.
  889. */
  890. r = dm_btree_lookup(&pmd->details_info, pmd->details_root,
  891. &key, &details_le);
  892. if (r) {
  893. if (r != -ENODATA || !create)
  894. return r;
  895. /*
  896. * Create new device.
  897. */
  898. changed = 1;
  899. details_le.mapped_blocks = 0;
  900. details_le.transaction_id = cpu_to_le64(pmd->trans_id);
  901. details_le.creation_time = cpu_to_le32(pmd->time);
  902. details_le.snapshotted_time = cpu_to_le32(pmd->time);
  903. }
  904. *td = kmalloc_obj(**td, GFP_NOIO);
  905. if (!*td)
  906. return -ENOMEM;
  907. (*td)->pmd = pmd;
  908. (*td)->id = dev;
  909. (*td)->open_count = 1;
  910. (*td)->changed = changed;
  911. (*td)->aborted_with_changes = false;
  912. (*td)->mapped_blocks = le64_to_cpu(details_le.mapped_blocks);
  913. (*td)->transaction_id = le64_to_cpu(details_le.transaction_id);
  914. (*td)->creation_time = le32_to_cpu(details_le.creation_time);
  915. (*td)->snapshotted_time = le32_to_cpu(details_le.snapshotted_time);
  916. list_add(&(*td)->list, &pmd->thin_devices);
  917. return 0;
  918. }
  919. static void __close_device(struct dm_thin_device *td)
  920. {
  921. --td->open_count;
  922. }
  923. static int __create_thin(struct dm_pool_metadata *pmd,
  924. dm_thin_id dev)
  925. {
  926. int r;
  927. dm_block_t dev_root;
  928. uint64_t key = dev;
  929. struct dm_thin_device *td;
  930. __le64 value;
  931. r = dm_btree_lookup(&pmd->details_info, pmd->details_root,
  932. &key, NULL);
  933. if (!r)
  934. return -EEXIST;
  935. /*
  936. * Create an empty btree for the mappings.
  937. */
  938. r = dm_btree_empty(&pmd->bl_info, &dev_root);
  939. if (r)
  940. return r;
  941. /*
  942. * Insert it into the main mapping tree.
  943. */
  944. value = cpu_to_le64(dev_root);
  945. __dm_bless_for_disk(&value);
  946. r = dm_btree_insert(&pmd->tl_info, pmd->root, &key, &value, &pmd->root);
  947. if (r) {
  948. dm_btree_del(&pmd->bl_info, dev_root);
  949. return r;
  950. }
  951. r = __open_device(pmd, dev, 1, &td);
  952. if (r) {
  953. dm_btree_remove(&pmd->tl_info, pmd->root, &key, &pmd->root);
  954. dm_btree_del(&pmd->bl_info, dev_root);
  955. return r;
  956. }
  957. __close_device(td);
  958. return r;
  959. }
  960. int dm_pool_create_thin(struct dm_pool_metadata *pmd, dm_thin_id dev)
  961. {
  962. int r = -EINVAL;
  963. pmd_write_lock(pmd);
  964. if (!pmd->fail_io)
  965. r = __create_thin(pmd, dev);
  966. pmd_write_unlock(pmd);
  967. return r;
  968. }
  969. static int __set_snapshot_details(struct dm_pool_metadata *pmd,
  970. struct dm_thin_device *snap,
  971. dm_thin_id origin, uint32_t time)
  972. {
  973. int r;
  974. struct dm_thin_device *td;
  975. r = __open_device(pmd, origin, 0, &td);
  976. if (r)
  977. return r;
  978. td->changed = true;
  979. td->snapshotted_time = time;
  980. snap->mapped_blocks = td->mapped_blocks;
  981. snap->snapshotted_time = time;
  982. __close_device(td);
  983. return 0;
  984. }
  985. static int __create_snap(struct dm_pool_metadata *pmd,
  986. dm_thin_id dev, dm_thin_id origin)
  987. {
  988. int r;
  989. dm_block_t origin_root;
  990. uint64_t key = origin, dev_key = dev;
  991. struct dm_thin_device *td;
  992. __le64 value;
  993. /* check this device is unused */
  994. r = dm_btree_lookup(&pmd->details_info, pmd->details_root,
  995. &dev_key, NULL);
  996. if (!r)
  997. return -EEXIST;
  998. /* find the mapping tree for the origin */
  999. r = dm_btree_lookup(&pmd->tl_info, pmd->root, &key, &value);
  1000. if (r)
  1001. return r;
  1002. origin_root = le64_to_cpu(value);
  1003. /* clone the origin, an inc will do */
  1004. dm_tm_inc(pmd->tm, origin_root);
  1005. /* insert into the main mapping tree */
  1006. value = cpu_to_le64(origin_root);
  1007. __dm_bless_for_disk(&value);
  1008. key = dev;
  1009. r = dm_btree_insert(&pmd->tl_info, pmd->root, &key, &value, &pmd->root);
  1010. if (r) {
  1011. dm_tm_dec(pmd->tm, origin_root);
  1012. return r;
  1013. }
  1014. pmd->time++;
  1015. r = __open_device(pmd, dev, 1, &td);
  1016. if (r)
  1017. goto bad;
  1018. r = __set_snapshot_details(pmd, td, origin, pmd->time);
  1019. __close_device(td);
  1020. if (r)
  1021. goto bad;
  1022. return 0;
  1023. bad:
  1024. dm_btree_remove(&pmd->tl_info, pmd->root, &key, &pmd->root);
  1025. dm_btree_remove(&pmd->details_info, pmd->details_root,
  1026. &key, &pmd->details_root);
  1027. return r;
  1028. }
  1029. int dm_pool_create_snap(struct dm_pool_metadata *pmd,
  1030. dm_thin_id dev,
  1031. dm_thin_id origin)
  1032. {
  1033. int r = -EINVAL;
  1034. pmd_write_lock(pmd);
  1035. if (!pmd->fail_io)
  1036. r = __create_snap(pmd, dev, origin);
  1037. pmd_write_unlock(pmd);
  1038. return r;
  1039. }
  1040. static int __delete_device(struct dm_pool_metadata *pmd, dm_thin_id dev)
  1041. {
  1042. int r;
  1043. uint64_t key = dev;
  1044. struct dm_thin_device *td;
  1045. /* TODO: failure should mark the transaction invalid */
  1046. r = __open_device(pmd, dev, 0, &td);
  1047. if (r)
  1048. return r;
  1049. if (td->open_count > 1) {
  1050. __close_device(td);
  1051. return -EBUSY;
  1052. }
  1053. list_del(&td->list);
  1054. kfree(td);
  1055. r = dm_btree_remove(&pmd->details_info, pmd->details_root,
  1056. &key, &pmd->details_root);
  1057. if (r)
  1058. return r;
  1059. r = dm_btree_remove(&pmd->tl_info, pmd->root, &key, &pmd->root);
  1060. if (r)
  1061. return r;
  1062. return 0;
  1063. }
  1064. int dm_pool_delete_thin_device(struct dm_pool_metadata *pmd,
  1065. dm_thin_id dev)
  1066. {
  1067. int r = -EINVAL;
  1068. pmd_write_lock(pmd);
  1069. if (!pmd->fail_io)
  1070. r = __delete_device(pmd, dev);
  1071. pmd_write_unlock(pmd);
  1072. return r;
  1073. }
  1074. int dm_pool_set_metadata_transaction_id(struct dm_pool_metadata *pmd,
  1075. uint64_t current_id,
  1076. uint64_t new_id)
  1077. {
  1078. int r = -EINVAL;
  1079. pmd_write_lock(pmd);
  1080. if (pmd->fail_io)
  1081. goto out;
  1082. if (pmd->trans_id != current_id) {
  1083. DMERR("mismatched transaction id");
  1084. goto out;
  1085. }
  1086. pmd->trans_id = new_id;
  1087. r = 0;
  1088. out:
  1089. pmd_write_unlock(pmd);
  1090. return r;
  1091. }
  1092. int dm_pool_get_metadata_transaction_id(struct dm_pool_metadata *pmd,
  1093. uint64_t *result)
  1094. {
  1095. int r = -EINVAL;
  1096. down_read(&pmd->root_lock);
  1097. if (!pmd->fail_io) {
  1098. *result = pmd->trans_id;
  1099. r = 0;
  1100. }
  1101. up_read(&pmd->root_lock);
  1102. return r;
  1103. }
  1104. static int __reserve_metadata_snap(struct dm_pool_metadata *pmd)
  1105. {
  1106. int r, inc;
  1107. struct thin_disk_superblock *disk_super;
  1108. struct dm_block *copy, *sblock;
  1109. dm_block_t held_root;
  1110. /*
  1111. * We commit to ensure the btree roots which we increment in a
  1112. * moment are up to date.
  1113. */
  1114. r = __commit_transaction(pmd);
  1115. if (r < 0) {
  1116. DMWARN("%s: __commit_transaction() failed, error = %d",
  1117. __func__, r);
  1118. return r;
  1119. }
  1120. /*
  1121. * Copy the superblock.
  1122. */
  1123. dm_sm_inc_block(pmd->metadata_sm, THIN_SUPERBLOCK_LOCATION);
  1124. r = dm_tm_shadow_block(pmd->tm, THIN_SUPERBLOCK_LOCATION,
  1125. &sb_validator, &copy, &inc);
  1126. if (r)
  1127. return r;
  1128. BUG_ON(!inc);
  1129. held_root = dm_block_location(copy);
  1130. disk_super = dm_block_data(copy);
  1131. if (le64_to_cpu(disk_super->held_root)) {
  1132. DMWARN("Pool metadata snapshot already exists: release this before taking another.");
  1133. dm_tm_dec(pmd->tm, held_root);
  1134. dm_tm_unlock(pmd->tm, copy);
  1135. return -EBUSY;
  1136. }
  1137. /*
  1138. * Wipe the spacemap since we're not publishing this.
  1139. */
  1140. memset(&disk_super->data_space_map_root, 0,
  1141. sizeof(disk_super->data_space_map_root));
  1142. memset(&disk_super->metadata_space_map_root, 0,
  1143. sizeof(disk_super->metadata_space_map_root));
  1144. /*
  1145. * Increment the data structures that need to be preserved.
  1146. */
  1147. dm_tm_inc(pmd->tm, le64_to_cpu(disk_super->data_mapping_root));
  1148. dm_tm_inc(pmd->tm, le64_to_cpu(disk_super->device_details_root));
  1149. dm_tm_unlock(pmd->tm, copy);
  1150. /*
  1151. * Write the held root into the superblock.
  1152. */
  1153. r = superblock_lock(pmd, &sblock);
  1154. if (r) {
  1155. dm_tm_dec(pmd->tm, held_root);
  1156. return r;
  1157. }
  1158. disk_super = dm_block_data(sblock);
  1159. disk_super->held_root = cpu_to_le64(held_root);
  1160. dm_bm_unlock(sblock);
  1161. return 0;
  1162. }
  1163. int dm_pool_reserve_metadata_snap(struct dm_pool_metadata *pmd)
  1164. {
  1165. int r = -EINVAL;
  1166. pmd_write_lock(pmd);
  1167. if (!pmd->fail_io)
  1168. r = __reserve_metadata_snap(pmd);
  1169. pmd_write_unlock(pmd);
  1170. return r;
  1171. }
  1172. static int __release_metadata_snap(struct dm_pool_metadata *pmd)
  1173. {
  1174. int r;
  1175. struct thin_disk_superblock *disk_super;
  1176. struct dm_block *sblock, *copy;
  1177. dm_block_t held_root;
  1178. r = superblock_lock(pmd, &sblock);
  1179. if (r)
  1180. return r;
  1181. disk_super = dm_block_data(sblock);
  1182. held_root = le64_to_cpu(disk_super->held_root);
  1183. disk_super->held_root = cpu_to_le64(0);
  1184. dm_bm_unlock(sblock);
  1185. if (!held_root) {
  1186. DMWARN("No pool metadata snapshot found: nothing to release.");
  1187. return -EINVAL;
  1188. }
  1189. r = dm_tm_read_lock(pmd->tm, held_root, &sb_validator, &copy);
  1190. if (r)
  1191. return r;
  1192. disk_super = dm_block_data(copy);
  1193. dm_btree_del(&pmd->info, le64_to_cpu(disk_super->data_mapping_root));
  1194. dm_btree_del(&pmd->details_info, le64_to_cpu(disk_super->device_details_root));
  1195. dm_sm_dec_block(pmd->metadata_sm, held_root);
  1196. dm_tm_unlock(pmd->tm, copy);
  1197. return 0;
  1198. }
  1199. int dm_pool_release_metadata_snap(struct dm_pool_metadata *pmd)
  1200. {
  1201. int r = -EINVAL;
  1202. pmd_write_lock(pmd);
  1203. if (!pmd->fail_io)
  1204. r = __release_metadata_snap(pmd);
  1205. pmd_write_unlock(pmd);
  1206. return r;
  1207. }
  1208. static int __get_metadata_snap(struct dm_pool_metadata *pmd,
  1209. dm_block_t *result)
  1210. {
  1211. int r;
  1212. struct thin_disk_superblock *disk_super;
  1213. struct dm_block *sblock;
  1214. r = dm_bm_read_lock(pmd->bm, THIN_SUPERBLOCK_LOCATION,
  1215. &sb_validator, &sblock);
  1216. if (r)
  1217. return r;
  1218. disk_super = dm_block_data(sblock);
  1219. *result = le64_to_cpu(disk_super->held_root);
  1220. dm_bm_unlock(sblock);
  1221. return 0;
  1222. }
  1223. int dm_pool_get_metadata_snap(struct dm_pool_metadata *pmd,
  1224. dm_block_t *result)
  1225. {
  1226. int r = -EINVAL;
  1227. down_read(&pmd->root_lock);
  1228. if (!pmd->fail_io)
  1229. r = __get_metadata_snap(pmd, result);
  1230. up_read(&pmd->root_lock);
  1231. return r;
  1232. }
  1233. int dm_pool_open_thin_device(struct dm_pool_metadata *pmd, dm_thin_id dev,
  1234. struct dm_thin_device **td)
  1235. {
  1236. int r = -EINVAL;
  1237. pmd_write_lock_in_core(pmd);
  1238. if (!pmd->fail_io)
  1239. r = __open_device(pmd, dev, 0, td);
  1240. pmd_write_unlock(pmd);
  1241. return r;
  1242. }
  1243. int dm_pool_close_thin_device(struct dm_thin_device *td)
  1244. {
  1245. pmd_write_lock_in_core(td->pmd);
  1246. __close_device(td);
  1247. pmd_write_unlock(td->pmd);
  1248. return 0;
  1249. }
  1250. dm_thin_id dm_thin_dev_id(struct dm_thin_device *td)
  1251. {
  1252. return td->id;
  1253. }
  1254. /*
  1255. * Check whether @time (of block creation) is older than @td's last snapshot.
  1256. * If so then the associated block is shared with the last snapshot device.
  1257. * Any block on a device created *after* the device last got snapshotted is
  1258. * necessarily not shared.
  1259. */
  1260. static bool __snapshotted_since(struct dm_thin_device *td, uint32_t time)
  1261. {
  1262. return td->snapshotted_time > time;
  1263. }
  1264. static void unpack_lookup_result(struct dm_thin_device *td, __le64 value,
  1265. struct dm_thin_lookup_result *result)
  1266. {
  1267. uint64_t block_time = 0;
  1268. dm_block_t exception_block;
  1269. uint32_t exception_time;
  1270. block_time = le64_to_cpu(value);
  1271. unpack_block_time(block_time, &exception_block, &exception_time);
  1272. result->block = exception_block;
  1273. result->shared = __snapshotted_since(td, exception_time);
  1274. }
  1275. static int __find_block(struct dm_thin_device *td, dm_block_t block,
  1276. int can_issue_io, struct dm_thin_lookup_result *result)
  1277. {
  1278. int r;
  1279. __le64 value;
  1280. struct dm_pool_metadata *pmd = td->pmd;
  1281. dm_block_t keys[2] = { td->id, block };
  1282. struct dm_btree_info *info;
  1283. if (can_issue_io)
  1284. info = &pmd->info;
  1285. else
  1286. info = &pmd->nb_info;
  1287. r = dm_btree_lookup(info, pmd->root, keys, &value);
  1288. if (!r)
  1289. unpack_lookup_result(td, value, result);
  1290. return r;
  1291. }
  1292. int dm_thin_find_block(struct dm_thin_device *td, dm_block_t block,
  1293. int can_issue_io, struct dm_thin_lookup_result *result)
  1294. {
  1295. int r;
  1296. struct dm_pool_metadata *pmd = td->pmd;
  1297. down_read(&pmd->root_lock);
  1298. if (pmd->fail_io) {
  1299. up_read(&pmd->root_lock);
  1300. return -EINVAL;
  1301. }
  1302. r = __find_block(td, block, can_issue_io, result);
  1303. up_read(&pmd->root_lock);
  1304. return r;
  1305. }
  1306. static int __find_next_mapped_block(struct dm_thin_device *td, dm_block_t block,
  1307. dm_block_t *vblock,
  1308. struct dm_thin_lookup_result *result)
  1309. {
  1310. int r;
  1311. __le64 value;
  1312. struct dm_pool_metadata *pmd = td->pmd;
  1313. dm_block_t keys[2] = { td->id, block };
  1314. r = dm_btree_lookup_next(&pmd->info, pmd->root, keys, vblock, &value);
  1315. if (!r)
  1316. unpack_lookup_result(td, value, result);
  1317. return r;
  1318. }
  1319. static int __find_mapped_range(struct dm_thin_device *td,
  1320. dm_block_t begin, dm_block_t end,
  1321. dm_block_t *thin_begin, dm_block_t *thin_end,
  1322. dm_block_t *pool_begin, bool *maybe_shared)
  1323. {
  1324. int r;
  1325. dm_block_t pool_end;
  1326. struct dm_thin_lookup_result lookup;
  1327. if (end < begin)
  1328. return -ENODATA;
  1329. r = __find_next_mapped_block(td, begin, &begin, &lookup);
  1330. if (r)
  1331. return r;
  1332. if (begin >= end)
  1333. return -ENODATA;
  1334. *thin_begin = begin;
  1335. *pool_begin = lookup.block;
  1336. *maybe_shared = lookup.shared;
  1337. begin++;
  1338. pool_end = *pool_begin + 1;
  1339. while (begin != end) {
  1340. r = __find_block(td, begin, true, &lookup);
  1341. if (r) {
  1342. if (r == -ENODATA)
  1343. break;
  1344. return r;
  1345. }
  1346. if ((lookup.block != pool_end) ||
  1347. (lookup.shared != *maybe_shared))
  1348. break;
  1349. pool_end++;
  1350. begin++;
  1351. }
  1352. *thin_end = begin;
  1353. return 0;
  1354. }
  1355. int dm_thin_find_mapped_range(struct dm_thin_device *td,
  1356. dm_block_t begin, dm_block_t end,
  1357. dm_block_t *thin_begin, dm_block_t *thin_end,
  1358. dm_block_t *pool_begin, bool *maybe_shared)
  1359. {
  1360. int r = -EINVAL;
  1361. struct dm_pool_metadata *pmd = td->pmd;
  1362. down_read(&pmd->root_lock);
  1363. if (!pmd->fail_io) {
  1364. r = __find_mapped_range(td, begin, end, thin_begin, thin_end,
  1365. pool_begin, maybe_shared);
  1366. }
  1367. up_read(&pmd->root_lock);
  1368. return r;
  1369. }
  1370. static int __insert(struct dm_thin_device *td, dm_block_t block,
  1371. dm_block_t data_block)
  1372. {
  1373. int r, inserted;
  1374. __le64 value;
  1375. struct dm_pool_metadata *pmd = td->pmd;
  1376. dm_block_t keys[2] = { td->id, block };
  1377. value = cpu_to_le64(pack_block_time(data_block, pmd->time));
  1378. __dm_bless_for_disk(&value);
  1379. r = dm_btree_insert_notify(&pmd->info, pmd->root, keys, &value,
  1380. &pmd->root, &inserted);
  1381. if (r)
  1382. return r;
  1383. td->changed = true;
  1384. if (inserted)
  1385. td->mapped_blocks++;
  1386. return 0;
  1387. }
  1388. int dm_thin_insert_block(struct dm_thin_device *td, dm_block_t block,
  1389. dm_block_t data_block)
  1390. {
  1391. int r = -EINVAL;
  1392. pmd_write_lock(td->pmd);
  1393. if (!td->pmd->fail_io)
  1394. r = __insert(td, block, data_block);
  1395. pmd_write_unlock(td->pmd);
  1396. return r;
  1397. }
  1398. static int __remove_range(struct dm_thin_device *td, dm_block_t begin, dm_block_t end)
  1399. {
  1400. int r;
  1401. unsigned int count, total_count = 0;
  1402. struct dm_pool_metadata *pmd = td->pmd;
  1403. dm_block_t keys[1] = { td->id };
  1404. __le64 value;
  1405. dm_block_t mapping_root;
  1406. /*
  1407. * Find the mapping tree
  1408. */
  1409. r = dm_btree_lookup(&pmd->tl_info, pmd->root, keys, &value);
  1410. if (r)
  1411. return r;
  1412. /*
  1413. * Remove from the mapping tree, taking care to inc the
  1414. * ref count so it doesn't get deleted.
  1415. */
  1416. mapping_root = le64_to_cpu(value);
  1417. dm_tm_inc(pmd->tm, mapping_root);
  1418. r = dm_btree_remove(&pmd->tl_info, pmd->root, keys, &pmd->root);
  1419. if (r)
  1420. return r;
  1421. /*
  1422. * Remove leaves stops at the first unmapped entry, so we have to
  1423. * loop round finding mapped ranges.
  1424. */
  1425. while (begin < end) {
  1426. r = dm_btree_lookup_next(&pmd->bl_info, mapping_root, &begin, &begin, &value);
  1427. if (r == -ENODATA)
  1428. break;
  1429. if (r)
  1430. return r;
  1431. if (begin >= end)
  1432. break;
  1433. r = dm_btree_remove_leaves(&pmd->bl_info, mapping_root, &begin, end, &mapping_root, &count);
  1434. if (r)
  1435. return r;
  1436. total_count += count;
  1437. }
  1438. td->mapped_blocks -= total_count;
  1439. td->changed = true;
  1440. /*
  1441. * Reinsert the mapping tree.
  1442. */
  1443. value = cpu_to_le64(mapping_root);
  1444. __dm_bless_for_disk(&value);
  1445. return dm_btree_insert(&pmd->tl_info, pmd->root, keys, &value, &pmd->root);
  1446. }
  1447. int dm_thin_remove_range(struct dm_thin_device *td,
  1448. dm_block_t begin, dm_block_t end)
  1449. {
  1450. int r = -EINVAL;
  1451. pmd_write_lock(td->pmd);
  1452. if (!td->pmd->fail_io)
  1453. r = __remove_range(td, begin, end);
  1454. pmd_write_unlock(td->pmd);
  1455. return r;
  1456. }
  1457. int dm_pool_block_is_shared(struct dm_pool_metadata *pmd, dm_block_t b, bool *result)
  1458. {
  1459. int r = -EINVAL;
  1460. uint32_t ref_count;
  1461. down_read(&pmd->root_lock);
  1462. if (!pmd->fail_io) {
  1463. r = dm_sm_get_count(pmd->data_sm, b, &ref_count);
  1464. if (!r)
  1465. *result = (ref_count > 1);
  1466. }
  1467. up_read(&pmd->root_lock);
  1468. return r;
  1469. }
  1470. int dm_pool_inc_data_range(struct dm_pool_metadata *pmd, dm_block_t b, dm_block_t e)
  1471. {
  1472. int r = -EINVAL;
  1473. pmd_write_lock(pmd);
  1474. if (!pmd->fail_io)
  1475. r = dm_sm_inc_blocks(pmd->data_sm, b, e);
  1476. pmd_write_unlock(pmd);
  1477. return r;
  1478. }
  1479. int dm_pool_dec_data_range(struct dm_pool_metadata *pmd, dm_block_t b, dm_block_t e)
  1480. {
  1481. int r = -EINVAL;
  1482. pmd_write_lock(pmd);
  1483. if (!pmd->fail_io)
  1484. r = dm_sm_dec_blocks(pmd->data_sm, b, e);
  1485. pmd_write_unlock(pmd);
  1486. return r;
  1487. }
  1488. bool dm_thin_changed_this_transaction(struct dm_thin_device *td)
  1489. {
  1490. int r;
  1491. down_read(&td->pmd->root_lock);
  1492. r = td->changed;
  1493. up_read(&td->pmd->root_lock);
  1494. return r;
  1495. }
  1496. bool dm_pool_changed_this_transaction(struct dm_pool_metadata *pmd)
  1497. {
  1498. bool r = false;
  1499. struct dm_thin_device *td, *tmp;
  1500. down_read(&pmd->root_lock);
  1501. list_for_each_entry_safe(td, tmp, &pmd->thin_devices, list) {
  1502. if (td->changed) {
  1503. r = td->changed;
  1504. break;
  1505. }
  1506. }
  1507. up_read(&pmd->root_lock);
  1508. return r;
  1509. }
  1510. bool dm_thin_aborted_changes(struct dm_thin_device *td)
  1511. {
  1512. bool r;
  1513. down_read(&td->pmd->root_lock);
  1514. r = td->aborted_with_changes;
  1515. up_read(&td->pmd->root_lock);
  1516. return r;
  1517. }
  1518. int dm_pool_alloc_data_block(struct dm_pool_metadata *pmd, dm_block_t *result)
  1519. {
  1520. int r = -EINVAL;
  1521. pmd_write_lock(pmd);
  1522. if (!pmd->fail_io)
  1523. r = dm_sm_new_block(pmd->data_sm, result);
  1524. pmd_write_unlock(pmd);
  1525. return r;
  1526. }
  1527. int dm_pool_commit_metadata(struct dm_pool_metadata *pmd)
  1528. {
  1529. int r = -EINVAL;
  1530. /*
  1531. * Care is taken to not have commit be what
  1532. * triggers putting the thin-pool in-service.
  1533. */
  1534. pmd_write_lock_in_core(pmd);
  1535. if (pmd->fail_io)
  1536. goto out;
  1537. r = __commit_transaction(pmd);
  1538. if (r < 0)
  1539. goto out;
  1540. /*
  1541. * Open the next transaction.
  1542. */
  1543. r = __begin_transaction(pmd);
  1544. out:
  1545. pmd_write_unlock(pmd);
  1546. return r;
  1547. }
  1548. static void __set_abort_with_changes_flags(struct dm_pool_metadata *pmd)
  1549. {
  1550. struct dm_thin_device *td;
  1551. list_for_each_entry(td, &pmd->thin_devices, list)
  1552. td->aborted_with_changes = td->changed;
  1553. }
  1554. int dm_pool_abort_metadata(struct dm_pool_metadata *pmd)
  1555. {
  1556. int r = -EINVAL;
  1557. /* fail_io is double-checked with pmd->root_lock held below */
  1558. if (unlikely(pmd->fail_io))
  1559. return r;
  1560. pmd_write_lock(pmd);
  1561. if (pmd->fail_io) {
  1562. pmd_write_unlock(pmd);
  1563. return r;
  1564. }
  1565. __set_abort_with_changes_flags(pmd);
  1566. /* destroy data_sm/metadata_sm/nb_tm/tm */
  1567. __destroy_persistent_data_objects(pmd, false);
  1568. /* reset bm */
  1569. dm_block_manager_reset(pmd->bm);
  1570. /* rebuild data_sm/metadata_sm/nb_tm/tm */
  1571. r = __open_or_format_metadata(pmd, false);
  1572. if (r)
  1573. pmd->fail_io = true;
  1574. pmd_write_unlock(pmd);
  1575. return r;
  1576. }
  1577. int dm_pool_get_free_block_count(struct dm_pool_metadata *pmd, dm_block_t *result)
  1578. {
  1579. int r = -EINVAL;
  1580. down_read(&pmd->root_lock);
  1581. if (!pmd->fail_io)
  1582. r = dm_sm_get_nr_free(pmd->data_sm, result);
  1583. up_read(&pmd->root_lock);
  1584. return r;
  1585. }
  1586. int dm_pool_get_free_metadata_block_count(struct dm_pool_metadata *pmd,
  1587. dm_block_t *result)
  1588. {
  1589. int r = -EINVAL;
  1590. down_read(&pmd->root_lock);
  1591. if (!pmd->fail_io)
  1592. r = dm_sm_get_nr_free(pmd->metadata_sm, result);
  1593. if (!r) {
  1594. if (*result < pmd->metadata_reserve)
  1595. *result = 0;
  1596. else
  1597. *result -= pmd->metadata_reserve;
  1598. }
  1599. up_read(&pmd->root_lock);
  1600. return r;
  1601. }
  1602. int dm_pool_get_metadata_dev_size(struct dm_pool_metadata *pmd,
  1603. dm_block_t *result)
  1604. {
  1605. int r = -EINVAL;
  1606. down_read(&pmd->root_lock);
  1607. if (!pmd->fail_io)
  1608. r = dm_sm_get_nr_blocks(pmd->metadata_sm, result);
  1609. up_read(&pmd->root_lock);
  1610. return r;
  1611. }
  1612. int dm_pool_get_data_dev_size(struct dm_pool_metadata *pmd, dm_block_t *result)
  1613. {
  1614. int r = -EINVAL;
  1615. down_read(&pmd->root_lock);
  1616. if (!pmd->fail_io)
  1617. r = dm_sm_get_nr_blocks(pmd->data_sm, result);
  1618. up_read(&pmd->root_lock);
  1619. return r;
  1620. }
  1621. int dm_thin_get_mapped_count(struct dm_thin_device *td, dm_block_t *result)
  1622. {
  1623. int r = -EINVAL;
  1624. struct dm_pool_metadata *pmd = td->pmd;
  1625. down_read(&pmd->root_lock);
  1626. if (!pmd->fail_io) {
  1627. *result = td->mapped_blocks;
  1628. r = 0;
  1629. }
  1630. up_read(&pmd->root_lock);
  1631. return r;
  1632. }
  1633. static int __highest_block(struct dm_thin_device *td, dm_block_t *result)
  1634. {
  1635. int r;
  1636. __le64 value_le;
  1637. dm_block_t thin_root;
  1638. struct dm_pool_metadata *pmd = td->pmd;
  1639. r = dm_btree_lookup(&pmd->tl_info, pmd->root, &td->id, &value_le);
  1640. if (r)
  1641. return r;
  1642. thin_root = le64_to_cpu(value_le);
  1643. return dm_btree_find_highest_key(&pmd->bl_info, thin_root, result);
  1644. }
  1645. int dm_thin_get_highest_mapped_block(struct dm_thin_device *td,
  1646. dm_block_t *result)
  1647. {
  1648. int r = -EINVAL;
  1649. struct dm_pool_metadata *pmd = td->pmd;
  1650. down_read(&pmd->root_lock);
  1651. if (!pmd->fail_io)
  1652. r = __highest_block(td, result);
  1653. up_read(&pmd->root_lock);
  1654. return r;
  1655. }
  1656. static int __resize_space_map(struct dm_space_map *sm, dm_block_t new_count)
  1657. {
  1658. int r;
  1659. dm_block_t old_count;
  1660. r = dm_sm_get_nr_blocks(sm, &old_count);
  1661. if (r)
  1662. return r;
  1663. if (new_count == old_count)
  1664. return 0;
  1665. if (new_count < old_count) {
  1666. DMERR("cannot reduce size of space map");
  1667. return -EINVAL;
  1668. }
  1669. return dm_sm_extend(sm, new_count - old_count);
  1670. }
  1671. int dm_pool_resize_data_dev(struct dm_pool_metadata *pmd, dm_block_t new_count)
  1672. {
  1673. int r = -EINVAL;
  1674. pmd_write_lock(pmd);
  1675. if (!pmd->fail_io)
  1676. r = __resize_space_map(pmd->data_sm, new_count);
  1677. pmd_write_unlock(pmd);
  1678. return r;
  1679. }
  1680. int dm_pool_resize_metadata_dev(struct dm_pool_metadata *pmd, dm_block_t new_count)
  1681. {
  1682. int r = -EINVAL;
  1683. pmd_write_lock(pmd);
  1684. if (!pmd->fail_io) {
  1685. r = __resize_space_map(pmd->metadata_sm, new_count);
  1686. if (!r)
  1687. __set_metadata_reserve(pmd);
  1688. }
  1689. pmd_write_unlock(pmd);
  1690. return r;
  1691. }
  1692. void dm_pool_metadata_read_only(struct dm_pool_metadata *pmd)
  1693. {
  1694. pmd_write_lock_in_core(pmd);
  1695. dm_bm_set_read_only(pmd->bm);
  1696. pmd_write_unlock(pmd);
  1697. }
  1698. void dm_pool_metadata_read_write(struct dm_pool_metadata *pmd)
  1699. {
  1700. pmd_write_lock_in_core(pmd);
  1701. dm_bm_set_read_write(pmd->bm);
  1702. pmd_write_unlock(pmd);
  1703. }
  1704. int dm_pool_register_metadata_threshold(struct dm_pool_metadata *pmd,
  1705. dm_block_t threshold,
  1706. dm_sm_threshold_fn fn,
  1707. void *context)
  1708. {
  1709. int r = -EINVAL;
  1710. pmd_write_lock_in_core(pmd);
  1711. if (!pmd->fail_io) {
  1712. r = dm_sm_register_threshold_callback(pmd->metadata_sm,
  1713. threshold, fn, context);
  1714. }
  1715. pmd_write_unlock(pmd);
  1716. return r;
  1717. }
  1718. void dm_pool_register_pre_commit_callback(struct dm_pool_metadata *pmd,
  1719. dm_pool_pre_commit_fn fn,
  1720. void *context)
  1721. {
  1722. pmd_write_lock_in_core(pmd);
  1723. pmd->pre_commit_fn = fn;
  1724. pmd->pre_commit_context = context;
  1725. pmd_write_unlock(pmd);
  1726. }
  1727. int dm_pool_metadata_set_needs_check(struct dm_pool_metadata *pmd)
  1728. {
  1729. int r = -EINVAL;
  1730. struct dm_block *sblock;
  1731. struct thin_disk_superblock *disk_super;
  1732. pmd_write_lock(pmd);
  1733. if (pmd->fail_io)
  1734. goto out;
  1735. pmd->flags |= THIN_METADATA_NEEDS_CHECK_FLAG;
  1736. r = superblock_lock(pmd, &sblock);
  1737. if (r) {
  1738. DMERR("couldn't lock superblock");
  1739. goto out;
  1740. }
  1741. disk_super = dm_block_data(sblock);
  1742. disk_super->flags = cpu_to_le32(pmd->flags);
  1743. dm_bm_unlock(sblock);
  1744. out:
  1745. pmd_write_unlock(pmd);
  1746. return r;
  1747. }
  1748. bool dm_pool_metadata_needs_check(struct dm_pool_metadata *pmd)
  1749. {
  1750. bool needs_check;
  1751. down_read(&pmd->root_lock);
  1752. needs_check = pmd->flags & THIN_METADATA_NEEDS_CHECK_FLAG;
  1753. up_read(&pmd->root_lock);
  1754. return needs_check;
  1755. }
  1756. void dm_pool_issue_prefetches(struct dm_pool_metadata *pmd)
  1757. {
  1758. down_read(&pmd->root_lock);
  1759. if (!pmd->fail_io)
  1760. dm_tm_issue_prefetches(pmd->tm);
  1761. up_read(&pmd->root_lock);
  1762. }