Blame view

drivers/md/dm-thin.c 89.6 KB
991d9fa02   Joe Thornber   dm: add thin prov...
1
  /*
e49e58296   Joe Thornber   dm thin: add read...
2
   * Copyright (C) 2011-2012 Red Hat UK.
991d9fa02   Joe Thornber   dm: add thin prov...
3
4
5
6
7
   *
   * This file is released under the GPL.
   */
  
  #include "dm-thin-metadata.h"
4f81a4176   Mike Snitzer   dm thin: move bio...
8
  #include "dm-bio-prison.h"
1f4e0ff07   Alasdair G Kergon   dm thin: commit b...
9
  #include "dm.h"
991d9fa02   Joe Thornber   dm: add thin prov...
10
11
12
13
14
  
  #include <linux/device-mapper.h>
  #include <linux/dm-io.h>
  #include <linux/dm-kcopyd.h>
  #include <linux/list.h>
c140e1c4e   Mike Snitzer   dm thin: use per ...
15
  #include <linux/rculist.h>
991d9fa02   Joe Thornber   dm: add thin prov...
16
17
18
  #include <linux/init.h>
  #include <linux/module.h>
  #include <linux/slab.h>
67324ea18   Mike Snitzer   dm thin: sort the...
19
  #include <linux/rbtree.h>
991d9fa02   Joe Thornber   dm: add thin prov...
20
21
22
23
24
25
  
  #define	DM_MSG_PREFIX	"thin"
  
  /*
   * Tunable constants
   */
7768ed33c   Alasdair G Kergon   dm thin: reduce e...
26
  #define ENDIO_HOOK_POOL_SIZE 1024
991d9fa02   Joe Thornber   dm: add thin prov...
27
28
  #define MAPPING_POOL_SIZE 1024
  #define PRISON_CELLS 1024
905e51b39   Joe Thornber   dm thin: commit o...
29
  #define COMMIT_PERIOD HZ
80c578930   Mike Snitzer   dm thin: add 'no_...
30
31
32
  #define NO_SPACE_TIMEOUT_SECS 60
  
  static unsigned no_space_timeout_secs = NO_SPACE_TIMEOUT_SECS;
991d9fa02   Joe Thornber   dm: add thin prov...
33

df5d2e908   Mikulas Patocka   dm kcopyd: introd...
34
35
  DECLARE_DM_KCOPYD_THROTTLE_WITH_MODULE_PARM(snapshot_copy_throttle,
  		"A percentage of time allocated for copy on write");
991d9fa02   Joe Thornber   dm: add thin prov...
36
37
38
39
40
41
42
43
  /*
   * The block size of the device holding pool data must be
   * between 64KB and 1GB.
   */
  #define DATA_DEV_BLOCK_SIZE_MIN_SECTORS (64 * 1024 >> SECTOR_SHIFT)
  #define DATA_DEV_BLOCK_SIZE_MAX_SECTORS (1024 * 1024 * 1024 >> SECTOR_SHIFT)
  
  /*
991d9fa02   Joe Thornber   dm: add thin prov...
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
   * Device id is restricted to 24 bits.
   */
  #define MAX_DEV_ID ((1 << 24) - 1)
  
  /*
   * How do we handle breaking sharing of data blocks?
   * =================================================
   *
   * We use a standard copy-on-write btree to store the mappings for the
   * devices (note I'm talking about copy-on-write of the metadata here, not
   * the data).  When you take an internal snapshot you clone the root node
   * of the origin btree.  After this there is no concept of an origin or a
   * snapshot.  They are just two device trees that happen to point to the
   * same data blocks.
   *
   * When we get a write in we decide if it's to a shared data block using
   * some timestamp magic.  If it is, we have to break sharing.
   *
   * Let's say we write to a shared block in what was the origin.  The
   * steps are:
   *
   * i) plug io further to this physical block. (see bio_prison code).
   *
   * ii) quiesce any read io to that shared data block.  Obviously
44feb387f   Mike Snitzer   dm thin: prepare ...
68
   * including all devices that share this block.  (see dm_deferred_set code)
991d9fa02   Joe Thornber   dm: add thin prov...
69
70
71
72
73
   *
   * iii) copy the data block to a newly allocate block.  This step can be
   * missed out if the io covers the block. (schedule_copy).
   *
   * iv) insert the new mapping into the origin's btree
fe878f34d   Joe Thornber   dm thin: correct ...
74
   * (process_prepared_mapping).  This act of inserting breaks some
991d9fa02   Joe Thornber   dm: add thin prov...
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
   * sharing of btree nodes between the two devices.  Breaking sharing only
   * effects the btree of that specific device.  Btrees for the other
   * devices that share the block never change.  The btree for the origin
   * device as it was after the last commit is untouched, ie. we're using
   * persistent data structures in the functional programming sense.
   *
   * v) unplug io to this physical block, including the io that triggered
   * the breaking of sharing.
   *
   * Steps (ii) and (iii) occur in parallel.
   *
   * The metadata _doesn't_ need to be committed before the io continues.  We
   * get away with this because the io is always written to a _new_ block.
   * If there's a crash, then:
   *
   * - The origin mapping will point to the old origin block (the shared
   * one).  This will contain the data as it was before the io that triggered
   * the breaking of sharing came in.
   *
   * - The snap mapping still points to the old block.  As it would after
   * the commit.
   *
   * The downside of this scheme is the timestamp magic isn't perfect, and
   * will continue to think that data block in the snapshot device is shared
   * even after the write to the origin has broken sharing.  I suspect data
   * blocks will typically be shared by many different devices, so we're
   * breaking sharing n + 1 times, rather than n, where n is the number of
   * devices that reference this data block.  At the moment I think the
   * benefits far, far outweigh the disadvantages.
   */
  
  /*----------------------------------------------------------------*/
  
  /*
991d9fa02   Joe Thornber   dm: add thin prov...
109
110
111
   * Key building.
   */
  static void build_data_key(struct dm_thin_device *td,
44feb387f   Mike Snitzer   dm thin: prepare ...
112
  			   dm_block_t b, struct dm_cell_key *key)
991d9fa02   Joe Thornber   dm: add thin prov...
113
114
115
116
117
118
119
  {
  	key->virtual = 0;
  	key->dev = dm_thin_dev_id(td);
  	key->block = b;
  }
  
  static void build_virtual_key(struct dm_thin_device *td, dm_block_t b,
44feb387f   Mike Snitzer   dm thin: prepare ...
120
  			      struct dm_cell_key *key)
991d9fa02   Joe Thornber   dm: add thin prov...
121
122
123
124
125
126
127
128
129
130
131
132
133
  {
  	key->virtual = 1;
  	key->dev = dm_thin_dev_id(td);
  	key->block = b;
  }
  
  /*----------------------------------------------------------------*/
  
  /*
   * A pool device ties together a metadata device and a data device.  It
   * also provides the interface for creating and destroying internal
   * devices.
   */
a24c25696   Mike Snitzer   dm thin: use slab...
134
  struct dm_thin_new_mapping;
67e2e2b28   Joe Thornber   dm thin: add pool...
135

e49e58296   Joe Thornber   dm thin: add read...
136
  /*
3e1a06990   Joe Thornber   dm thin: fix out ...
137
   * The pool runs in 4 modes.  Ordered in degraded order for comparisons.
e49e58296   Joe Thornber   dm thin: add read...
138
139
140
   */
  enum pool_mode {
  	PM_WRITE,		/* metadata may be changed */
3e1a06990   Joe Thornber   dm thin: fix out ...
141
  	PM_OUT_OF_DATA_SPACE,	/* metadata may be changed, though data may not be allocated */
e49e58296   Joe Thornber   dm thin: add read...
142
143
144
  	PM_READ_ONLY,		/* metadata may not be changed */
  	PM_FAIL,		/* all I/O fails */
  };
67e2e2b28   Joe Thornber   dm thin: add pool...
145
  struct pool_features {
e49e58296   Joe Thornber   dm thin: add read...
146
  	enum pool_mode mode;
9bc142dd7   Mike Snitzer   dm thin: tidy dis...
147
148
149
  	bool zero_new_blocks:1;
  	bool discard_enabled:1;
  	bool discard_passdown:1;
787a996cb   Mike Snitzer   dm thin: add erro...
150
  	bool error_if_no_space:1;
67e2e2b28   Joe Thornber   dm thin: add pool...
151
  };
e49e58296   Joe Thornber   dm thin: add read...
152
153
154
  struct thin_c;
  typedef void (*process_bio_fn)(struct thin_c *tc, struct bio *bio);
  typedef void (*process_mapping_fn)(struct dm_thin_new_mapping *m);
991d9fa02   Joe Thornber   dm: add thin prov...
155
156
157
158
159
160
161
  struct pool {
  	struct list_head list;
  	struct dm_target *ti;	/* Only set if a pool target is bound */
  
  	struct mapped_device *pool_md;
  	struct block_device *md_dev;
  	struct dm_pool_metadata *pmd;
991d9fa02   Joe Thornber   dm: add thin prov...
162
  	dm_block_t low_water_blocks;
55f2b8bdb   Mike Snitzer   dm thin: support ...
163
  	uint32_t sectors_per_block;
f9a8e0cd2   Mikulas Patocka   dm thin: optimize...
164
  	int sectors_per_block_shift;
991d9fa02   Joe Thornber   dm: add thin prov...
165

67e2e2b28   Joe Thornber   dm thin: add pool...
166
  	struct pool_features pf;
88a6621be   Joe Thornber   dm thin: factor o...
167
  	bool low_water_triggered:1;	/* A dm event has been sent */
991d9fa02   Joe Thornber   dm: add thin prov...
168

44feb387f   Mike Snitzer   dm thin: prepare ...
169
  	struct dm_bio_prison *prison;
991d9fa02   Joe Thornber   dm: add thin prov...
170
171
172
173
  	struct dm_kcopyd_client *copier;
  
  	struct workqueue_struct *wq;
  	struct work_struct worker;
905e51b39   Joe Thornber   dm thin: commit o...
174
  	struct delayed_work waker;
85ad643b7   Joe Thornber   dm thin: add time...
175
  	struct delayed_work no_space_timeout;
991d9fa02   Joe Thornber   dm: add thin prov...
176

905e51b39   Joe Thornber   dm thin: commit o...
177
  	unsigned long last_commit_jiffies;
55f2b8bdb   Mike Snitzer   dm thin: support ...
178
  	unsigned ref_count;
991d9fa02   Joe Thornber   dm: add thin prov...
179
180
  
  	spinlock_t lock;
991d9fa02   Joe Thornber   dm: add thin prov...
181
182
  	struct bio_list deferred_flush_bios;
  	struct list_head prepared_mappings;
104655fd4   Joe Thornber   dm thin: support ...
183
  	struct list_head prepared_discards;
c140e1c4e   Mike Snitzer   dm thin: use per ...
184
  	struct list_head active_thins;
991d9fa02   Joe Thornber   dm: add thin prov...
185

44feb387f   Mike Snitzer   dm thin: prepare ...
186
187
  	struct dm_deferred_set *shared_read_ds;
  	struct dm_deferred_set *all_io_ds;
991d9fa02   Joe Thornber   dm: add thin prov...
188

a24c25696   Mike Snitzer   dm thin: use slab...
189
  	struct dm_thin_new_mapping *next_mapping;
991d9fa02   Joe Thornber   dm: add thin prov...
190
  	mempool_t *mapping_pool;
e49e58296   Joe Thornber   dm thin: add read...
191
192
193
194
195
196
  
  	process_bio_fn process_bio;
  	process_bio_fn process_discard;
  
  	process_mapping_fn process_prepared_mapping;
  	process_mapping_fn process_prepared_discard;
991d9fa02   Joe Thornber   dm: add thin prov...
197
  };
e49e58296   Joe Thornber   dm thin: add read...
198
  static enum pool_mode get_pool_mode(struct pool *pool);
b53306558   Joe Thornber   dm thin: handle m...
199
  static void metadata_operation_failed(struct pool *pool, const char *op, int r);
e49e58296   Joe Thornber   dm thin: add read...
200

991d9fa02   Joe Thornber   dm: add thin prov...
201
202
203
204
205
206
207
208
209
210
211
  /*
   * Target context for a pool.
   */
  struct pool_c {
  	struct dm_target *ti;
  	struct pool *pool;
  	struct dm_dev *data_dev;
  	struct dm_dev *metadata_dev;
  	struct dm_target_callbacks callbacks;
  
  	dm_block_t low_water_blocks;
0424caa14   Mike Snitzer   dm thin: fix disc...
212
213
  	struct pool_features requested_pf; /* Features requested during table load */
  	struct pool_features adjusted_pf;  /* Features used after adjusting for constituent devices */
991d9fa02   Joe Thornber   dm: add thin prov...
214
215
216
217
218
219
  };
  
  /*
   * Target context for a thin.
   */
  struct thin_c {
c140e1c4e   Mike Snitzer   dm thin: use per ...
220
  	struct list_head list;
991d9fa02   Joe Thornber   dm: add thin prov...
221
  	struct dm_dev *pool_dev;
2dd9c257f   Joe Thornber   dm thin: support ...
222
  	struct dm_dev *origin_dev;
e5aea7b49   Joe Thornber   dm thin: relax ex...
223
  	sector_t origin_size;
991d9fa02   Joe Thornber   dm: add thin prov...
224
225
226
227
  	dm_thin_id dev_id;
  
  	struct pool *pool;
  	struct dm_thin_device *td;
738211f70   Joe Thornber   dm thin: fix nofl...
228
  	bool requeue_mode:1;
c140e1c4e   Mike Snitzer   dm thin: use per ...
229
230
231
  	spinlock_t lock;
  	struct bio_list deferred_bio_list;
  	struct bio_list retry_on_resume_list;
67324ea18   Mike Snitzer   dm thin: sort the...
232
  	struct rb_root sort_bio_list; /* sorted list of deferred bios */
b10ebd34c   Joe Thornber   dm thin: fix rcu_...
233
234
235
236
237
238
239
  
  	/*
  	 * Ensures the thin is not destroyed until the worker has finished
  	 * iterating the active_thins list.
  	 */
  	atomic_t refcount;
  	struct completion can_destroy;
991d9fa02   Joe Thornber   dm: add thin prov...
240
241
242
  };
  
  /*----------------------------------------------------------------*/
025b96853   Joe Thornber   dm thin: remove c...
243
244
245
246
247
248
249
250
251
252
  /*
   * wake_worker() is used when new work is queued and when pool_resume is
   * ready to continue deferred IO processing.
   */
  static void wake_worker(struct pool *pool)
  {
  	queue_work(pool->wq, &pool->worker);
  }
  
  /*----------------------------------------------------------------*/
6beca5eb6   Joe Thornber   dm bio prison: pa...
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
  static int bio_detain(struct pool *pool, struct dm_cell_key *key, struct bio *bio,
  		      struct dm_bio_prison_cell **cell_result)
  {
  	int r;
  	struct dm_bio_prison_cell *cell_prealloc;
  
  	/*
  	 * Allocate a cell from the prison's mempool.
  	 * This might block but it can't fail.
  	 */
  	cell_prealloc = dm_bio_prison_alloc_cell(pool->prison, GFP_NOIO);
  
  	r = dm_bio_detain(pool->prison, key, bio, cell_prealloc, cell_result);
  	if (r)
  		/*
  		 * We reused an old cell; we can get rid of
  		 * the new one.
  		 */
  		dm_bio_prison_free_cell(pool->prison, cell_prealloc);
  
  	return r;
  }
  
  static void cell_release(struct pool *pool,
  			 struct dm_bio_prison_cell *cell,
  			 struct bio_list *bios)
  {
  	dm_cell_release(pool->prison, cell, bios);
  	dm_bio_prison_free_cell(pool->prison, cell);
  }
  
  static void cell_release_no_holder(struct pool *pool,
  				   struct dm_bio_prison_cell *cell,
  				   struct bio_list *bios)
  {
  	dm_cell_release_no_holder(pool->prison, cell, bios);
  	dm_bio_prison_free_cell(pool->prison, cell);
  }
025b96853   Joe Thornber   dm thin: remove c...
291
292
293
294
295
  static void cell_defer_no_holder_no_free(struct thin_c *tc,
  					 struct dm_bio_prison_cell *cell)
  {
  	struct pool *pool = tc->pool;
  	unsigned long flags;
c140e1c4e   Mike Snitzer   dm thin: use per ...
296
297
298
  	spin_lock_irqsave(&tc->lock, flags);
  	dm_cell_release_no_holder(pool->prison, cell, &tc->deferred_bio_list);
  	spin_unlock_irqrestore(&tc->lock, flags);
025b96853   Joe Thornber   dm thin: remove c...
299
300
301
  
  	wake_worker(pool);
  }
af91805a4   Mike Snitzer   dm thin: return E...
302
303
  static void cell_error_with_code(struct pool *pool,
  				 struct dm_bio_prison_cell *cell, int error_code)
6beca5eb6   Joe Thornber   dm bio prison: pa...
304
  {
af91805a4   Mike Snitzer   dm thin: return E...
305
  	dm_cell_error(pool->prison, cell, error_code);
6beca5eb6   Joe Thornber   dm bio prison: pa...
306
307
  	dm_bio_prison_free_cell(pool->prison, cell);
  }
af91805a4   Mike Snitzer   dm thin: return E...
308
309
310
311
  static void cell_error(struct pool *pool, struct dm_bio_prison_cell *cell)
  {
  	cell_error_with_code(pool, cell, -EIO);
  }
6beca5eb6   Joe Thornber   dm bio prison: pa...
312
  /*----------------------------------------------------------------*/
991d9fa02   Joe Thornber   dm: add thin prov...
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
  /*
   * A global list of pools that uses a struct mapped_device as a key.
   */
  static struct dm_thin_pool_table {
  	struct mutex mutex;
  	struct list_head pools;
  } dm_thin_pool_table;
  
  static void pool_table_init(void)
  {
  	mutex_init(&dm_thin_pool_table.mutex);
  	INIT_LIST_HEAD(&dm_thin_pool_table.pools);
  }
  
  static void __pool_table_insert(struct pool *pool)
  {
  	BUG_ON(!mutex_is_locked(&dm_thin_pool_table.mutex));
  	list_add(&pool->list, &dm_thin_pool_table.pools);
  }
  
  static void __pool_table_remove(struct pool *pool)
  {
  	BUG_ON(!mutex_is_locked(&dm_thin_pool_table.mutex));
  	list_del(&pool->list);
  }
  
  static struct pool *__pool_table_lookup(struct mapped_device *md)
  {
  	struct pool *pool = NULL, *tmp;
  
  	BUG_ON(!mutex_is_locked(&dm_thin_pool_table.mutex));
  
  	list_for_each_entry(tmp, &dm_thin_pool_table.pools, list) {
  		if (tmp->pool_md == md) {
  			pool = tmp;
  			break;
  		}
  	}
  
  	return pool;
  }
  
  static struct pool *__pool_table_lookup_metadata_dev(struct block_device *md_dev)
  {
  	struct pool *pool = NULL, *tmp;
  
  	BUG_ON(!mutex_is_locked(&dm_thin_pool_table.mutex));
  
  	list_for_each_entry(tmp, &dm_thin_pool_table.pools, list) {
  		if (tmp->md_dev == md_dev) {
  			pool = tmp;
  			break;
  		}
  	}
  
  	return pool;
  }
  
  /*----------------------------------------------------------------*/
a24c25696   Mike Snitzer   dm thin: use slab...
372
  struct dm_thin_endio_hook {
eb2aa48d4   Joe Thornber   dm thin: prepare ...
373
  	struct thin_c *tc;
44feb387f   Mike Snitzer   dm thin: prepare ...
374
375
  	struct dm_deferred_entry *shared_read_entry;
  	struct dm_deferred_entry *all_io_entry;
a24c25696   Mike Snitzer   dm thin: use slab...
376
  	struct dm_thin_new_mapping *overwrite_mapping;
67324ea18   Mike Snitzer   dm thin: sort the...
377
  	struct rb_node rb_node;
eb2aa48d4   Joe Thornber   dm thin: prepare ...
378
  };
18adc5777   Joe Thornber   dm thin: fix dead...
379
  static void requeue_bio_list(struct thin_c *tc, struct bio_list *master)
991d9fa02   Joe Thornber   dm: add thin prov...
380
381
382
  {
  	struct bio *bio;
  	struct bio_list bios;
18adc5777   Joe Thornber   dm thin: fix dead...
383
  	unsigned long flags;
991d9fa02   Joe Thornber   dm: add thin prov...
384
385
  
  	bio_list_init(&bios);
18adc5777   Joe Thornber   dm thin: fix dead...
386

c140e1c4e   Mike Snitzer   dm thin: use per ...
387
  	spin_lock_irqsave(&tc->lock, flags);
991d9fa02   Joe Thornber   dm: add thin prov...
388
389
  	bio_list_merge(&bios, master);
  	bio_list_init(master);
c140e1c4e   Mike Snitzer   dm thin: use per ...
390
  	spin_unlock_irqrestore(&tc->lock, flags);
991d9fa02   Joe Thornber   dm: add thin prov...
391

c140e1c4e   Mike Snitzer   dm thin: use per ...
392
393
  	while ((bio = bio_list_pop(&bios)))
  		bio_endio(bio, DM_ENDIO_REQUEUE);
991d9fa02   Joe Thornber   dm: add thin prov...
394
395
396
397
  }
  
  static void requeue_io(struct thin_c *tc)
  {
c140e1c4e   Mike Snitzer   dm thin: use per ...
398
399
  	requeue_bio_list(tc, &tc->deferred_bio_list);
  	requeue_bio_list(tc, &tc->retry_on_resume_list);
991d9fa02   Joe Thornber   dm: add thin prov...
400
  }
c140e1c4e   Mike Snitzer   dm thin: use per ...
401
  static void error_thin_retry_list(struct thin_c *tc)
3e1a06990   Joe Thornber   dm thin: fix out ...
402
403
404
405
406
407
  {
  	struct bio *bio;
  	unsigned long flags;
  	struct bio_list bios;
  
  	bio_list_init(&bios);
c140e1c4e   Mike Snitzer   dm thin: use per ...
408
409
410
411
  	spin_lock_irqsave(&tc->lock, flags);
  	bio_list_merge(&bios, &tc->retry_on_resume_list);
  	bio_list_init(&tc->retry_on_resume_list);
  	spin_unlock_irqrestore(&tc->lock, flags);
3e1a06990   Joe Thornber   dm thin: fix out ...
412
413
414
415
  
  	while ((bio = bio_list_pop(&bios)))
  		bio_io_error(bio);
  }
c140e1c4e   Mike Snitzer   dm thin: use per ...
416
417
418
419
420
421
422
423
424
  static void error_retry_list(struct pool *pool)
  {
  	struct thin_c *tc;
  
  	rcu_read_lock();
  	list_for_each_entry_rcu(tc, &pool->active_thins, list)
  		error_thin_retry_list(tc);
  	rcu_read_unlock();
  }
991d9fa02   Joe Thornber   dm: add thin prov...
425
426
427
428
429
430
  /*
   * This section of code contains the logic for processing a thin device's IO.
   * Much of the code depends on pool object resources (lists, workqueues, etc)
   * but most is exclusively called from the thin target rather than the thin-pool
   * target.
   */
58f77a219   Mike Snitzer   dm thin: use bloc...
431
432
433
434
  static bool block_size_is_power_of_two(struct pool *pool)
  {
  	return pool->sectors_per_block_shift >= 0;
  }
991d9fa02   Joe Thornber   dm: add thin prov...
435
436
  static dm_block_t get_bio_block(struct thin_c *tc, struct bio *bio)
  {
58f77a219   Mike Snitzer   dm thin: use bloc...
437
  	struct pool *pool = tc->pool;
4f024f379   Kent Overstreet   block: Abstract o...
438
  	sector_t block_nr = bio->bi_iter.bi_sector;
55f2b8bdb   Mike Snitzer   dm thin: support ...
439

58f77a219   Mike Snitzer   dm thin: use bloc...
440
441
  	if (block_size_is_power_of_two(pool))
  		block_nr >>= pool->sectors_per_block_shift;
f9a8e0cd2   Mikulas Patocka   dm thin: optimize...
442
  	else
58f77a219   Mike Snitzer   dm thin: use bloc...
443
  		(void) sector_div(block_nr, pool->sectors_per_block);
55f2b8bdb   Mike Snitzer   dm thin: support ...
444
445
  
  	return block_nr;
991d9fa02   Joe Thornber   dm: add thin prov...
446
447
448
449
450
  }
  
  static void remap(struct thin_c *tc, struct bio *bio, dm_block_t block)
  {
  	struct pool *pool = tc->pool;
4f024f379   Kent Overstreet   block: Abstract o...
451
  	sector_t bi_sector = bio->bi_iter.bi_sector;
991d9fa02   Joe Thornber   dm: add thin prov...
452
453
  
  	bio->bi_bdev = tc->pool_dev->bdev;
58f77a219   Mike Snitzer   dm thin: use bloc...
454
  	if (block_size_is_power_of_two(pool))
4f024f379   Kent Overstreet   block: Abstract o...
455
456
457
  		bio->bi_iter.bi_sector =
  			(block << pool->sectors_per_block_shift) |
  			(bi_sector & (pool->sectors_per_block - 1));
58f77a219   Mike Snitzer   dm thin: use bloc...
458
  	else
4f024f379   Kent Overstreet   block: Abstract o...
459
  		bio->bi_iter.bi_sector = (block * pool->sectors_per_block) +
58f77a219   Mike Snitzer   dm thin: use bloc...
460
  				 sector_div(bi_sector, pool->sectors_per_block);
991d9fa02   Joe Thornber   dm: add thin prov...
461
  }
2dd9c257f   Joe Thornber   dm thin: support ...
462
463
464
465
  static void remap_to_origin(struct thin_c *tc, struct bio *bio)
  {
  	bio->bi_bdev = tc->origin_dev->bdev;
  }
4afdd680f   Joe Thornber   dm thin: reduce n...
466
467
468
469
470
  static int bio_triggers_commit(struct thin_c *tc, struct bio *bio)
  {
  	return (bio->bi_rw & (REQ_FLUSH | REQ_FUA)) &&
  		dm_thin_changed_this_transaction(tc->td);
  }
e8088073c   Joe Thornber   dm thin: fix race...
471
472
473
474
475
476
  static void inc_all_io_entry(struct pool *pool, struct bio *bio)
  {
  	struct dm_thin_endio_hook *h;
  
  	if (bio->bi_rw & REQ_DISCARD)
  		return;
59c3d2c6a   Mikulas Patocka   dm thin: dont use...
477
  	h = dm_per_bio_data(bio, sizeof(struct dm_thin_endio_hook));
e8088073c   Joe Thornber   dm thin: fix race...
478
479
  	h->all_io_entry = dm_deferred_entry_inc(pool->all_io_ds);
  }
2dd9c257f   Joe Thornber   dm thin: support ...
480
  static void issue(struct thin_c *tc, struct bio *bio)
991d9fa02   Joe Thornber   dm: add thin prov...
481
482
483
  {
  	struct pool *pool = tc->pool;
  	unsigned long flags;
e49e58296   Joe Thornber   dm thin: add read...
484
485
486
487
  	if (!bio_triggers_commit(tc, bio)) {
  		generic_make_request(bio);
  		return;
  	}
991d9fa02   Joe Thornber   dm: add thin prov...
488
  	/*
e49e58296   Joe Thornber   dm thin: add read...
489
490
491
  	 * Complete bio with an error if earlier I/O caused changes to
  	 * the metadata that can't be committed e.g, due to I/O errors
  	 * on the metadata device.
991d9fa02   Joe Thornber   dm: add thin prov...
492
  	 */
e49e58296   Joe Thornber   dm thin: add read...
493
494
495
496
497
498
499
500
501
502
503
504
  	if (dm_thin_aborted_changes(tc->td)) {
  		bio_io_error(bio);
  		return;
  	}
  
  	/*
  	 * Batch together any bios that trigger commits and then issue a
  	 * single commit for them in process_deferred_bios().
  	 */
  	spin_lock_irqsave(&pool->lock, flags);
  	bio_list_add(&pool->deferred_flush_bios, bio);
  	spin_unlock_irqrestore(&pool->lock, flags);
991d9fa02   Joe Thornber   dm: add thin prov...
505
  }
2dd9c257f   Joe Thornber   dm thin: support ...
506
507
508
509
510
511
512
513
514
515
516
517
  static void remap_to_origin_and_issue(struct thin_c *tc, struct bio *bio)
  {
  	remap_to_origin(tc, bio);
  	issue(tc, bio);
  }
  
  static void remap_and_issue(struct thin_c *tc, struct bio *bio,
  			    dm_block_t block)
  {
  	remap(tc, bio, block);
  	issue(tc, bio);
  }
991d9fa02   Joe Thornber   dm: add thin prov...
518
519
520
521
522
  /*----------------------------------------------------------------*/
  
  /*
   * Bio endio functions.
   */
a24c25696   Mike Snitzer   dm thin: use slab...
523
  struct dm_thin_new_mapping {
991d9fa02   Joe Thornber   dm: add thin prov...
524
  	struct list_head list;
7f2146651   Mike Snitzer   dm thin: use bool...
525
526
  	bool pass_discard:1;
  	bool definitely_not_shared:1;
991d9fa02   Joe Thornber   dm: add thin prov...
527

50f3c3efd   Joe Thornber   dm thin: switch t...
528
529
530
531
532
533
  	/*
  	 * Track quiescing, copying and zeroing preparation actions.  When this
  	 * counter hits zero the block is prepared and can be inserted into the
  	 * btree.
  	 */
  	atomic_t prepare_actions;
7f2146651   Mike Snitzer   dm thin: use bool...
534
  	int err;
991d9fa02   Joe Thornber   dm: add thin prov...
535
536
537
  	struct thin_c *tc;
  	dm_block_t virt_block;
  	dm_block_t data_block;
a24c25696   Mike Snitzer   dm thin: use slab...
538
  	struct dm_bio_prison_cell *cell, *cell2;
991d9fa02   Joe Thornber   dm: add thin prov...
539
540
541
542
543
544
545
546
547
548
  
  	/*
  	 * If the bio covers the whole area of a block then we can avoid
  	 * zeroing or copying.  Instead this bio is hooked.  The bio will
  	 * still be in the cell, so care has to be taken to avoid issuing
  	 * the bio twice.
  	 */
  	struct bio *bio;
  	bio_end_io_t *saved_bi_end_io;
  };
50f3c3efd   Joe Thornber   dm thin: switch t...
549
  static void __complete_mapping_preparation(struct dm_thin_new_mapping *m)
991d9fa02   Joe Thornber   dm: add thin prov...
550
551
  {
  	struct pool *pool = m->tc->pool;
50f3c3efd   Joe Thornber   dm thin: switch t...
552
  	if (atomic_dec_and_test(&m->prepare_actions)) {
daec338bb   Mike Snitzer   dm thin: add mapp...
553
  		list_add_tail(&m->list, &pool->prepared_mappings);
991d9fa02   Joe Thornber   dm: add thin prov...
554
555
556
  		wake_worker(pool);
  	}
  }
e5aea7b49   Joe Thornber   dm thin: relax ex...
557
  static void complete_mapping_preparation(struct dm_thin_new_mapping *m)
991d9fa02   Joe Thornber   dm: add thin prov...
558
559
  {
  	unsigned long flags;
991d9fa02   Joe Thornber   dm: add thin prov...
560
  	struct pool *pool = m->tc->pool;
991d9fa02   Joe Thornber   dm: add thin prov...
561
  	spin_lock_irqsave(&pool->lock, flags);
50f3c3efd   Joe Thornber   dm thin: switch t...
562
  	__complete_mapping_preparation(m);
991d9fa02   Joe Thornber   dm: add thin prov...
563
564
  	spin_unlock_irqrestore(&pool->lock, flags);
  }
e5aea7b49   Joe Thornber   dm thin: relax ex...
565
566
567
568
569
570
571
  static void copy_complete(int read_err, unsigned long write_err, void *context)
  {
  	struct dm_thin_new_mapping *m = context;
  
  	m->err = read_err || write_err ? -EIO : 0;
  	complete_mapping_preparation(m);
  }
991d9fa02   Joe Thornber   dm: add thin prov...
572
573
  static void overwrite_endio(struct bio *bio, int err)
  {
59c3d2c6a   Mikulas Patocka   dm thin: dont use...
574
  	struct dm_thin_endio_hook *h = dm_per_bio_data(bio, sizeof(struct dm_thin_endio_hook));
a24c25696   Mike Snitzer   dm thin: use slab...
575
  	struct dm_thin_new_mapping *m = h->overwrite_mapping;
991d9fa02   Joe Thornber   dm: add thin prov...
576
577
  
  	m->err = err;
e5aea7b49   Joe Thornber   dm thin: relax ex...
578
  	complete_mapping_preparation(m);
991d9fa02   Joe Thornber   dm: add thin prov...
579
  }
991d9fa02   Joe Thornber   dm: add thin prov...
580
581
582
583
584
585
586
587
588
589
590
591
592
  /*----------------------------------------------------------------*/
  
  /*
   * Workqueue.
   */
  
  /*
   * Prepared mapping jobs.
   */
  
  /*
   * This sends the bios in the cell back to the deferred_bios list.
   */
2aab38502   Joe Thornber   dm thin: cleanup ...
593
  static void cell_defer(struct thin_c *tc, struct dm_bio_prison_cell *cell)
991d9fa02   Joe Thornber   dm: add thin prov...
594
595
596
  {
  	struct pool *pool = tc->pool;
  	unsigned long flags;
c140e1c4e   Mike Snitzer   dm thin: use per ...
597
598
599
  	spin_lock_irqsave(&tc->lock, flags);
  	cell_release(pool, cell, &tc->deferred_bio_list);
  	spin_unlock_irqrestore(&tc->lock, flags);
991d9fa02   Joe Thornber   dm: add thin prov...
600
601
602
603
604
  
  	wake_worker(pool);
  }
  
  /*
6beca5eb6   Joe Thornber   dm bio prison: pa...
605
   * Same as cell_defer above, except it omits the original holder of the cell.
991d9fa02   Joe Thornber   dm: add thin prov...
606
   */
f286ba0ee   Joe Thornber   dm thin: rename c...
607
  static void cell_defer_no_holder(struct thin_c *tc, struct dm_bio_prison_cell *cell)
991d9fa02   Joe Thornber   dm: add thin prov...
608
  {
991d9fa02   Joe Thornber   dm: add thin prov...
609
610
  	struct pool *pool = tc->pool;
  	unsigned long flags;
c140e1c4e   Mike Snitzer   dm thin: use per ...
611
612
613
  	spin_lock_irqsave(&tc->lock, flags);
  	cell_release_no_holder(pool, cell, &tc->deferred_bio_list);
  	spin_unlock_irqrestore(&tc->lock, flags);
991d9fa02   Joe Thornber   dm: add thin prov...
614
615
616
  
  	wake_worker(pool);
  }
e49e58296   Joe Thornber   dm thin: add read...
617
618
  static void process_prepared_mapping_fail(struct dm_thin_new_mapping *m)
  {
196d38bcc   Kent Overstreet   block: Generic bi...
619
  	if (m->bio) {
e49e58296   Joe Thornber   dm thin: add read...
620
  		m->bio->bi_end_io = m->saved_bi_end_io;
196d38bcc   Kent Overstreet   block: Generic bi...
621
622
  		atomic_inc(&m->bio->bi_remaining);
  	}
6beca5eb6   Joe Thornber   dm bio prison: pa...
623
  	cell_error(m->tc->pool, m->cell);
e49e58296   Joe Thornber   dm thin: add read...
624
625
626
  	list_del(&m->list);
  	mempool_free(m, m->tc->pool->mapping_pool);
  }
025b96853   Joe Thornber   dm thin: remove c...
627

a24c25696   Mike Snitzer   dm thin: use slab...
628
  static void process_prepared_mapping(struct dm_thin_new_mapping *m)
991d9fa02   Joe Thornber   dm: add thin prov...
629
630
  {
  	struct thin_c *tc = m->tc;
6beca5eb6   Joe Thornber   dm bio prison: pa...
631
  	struct pool *pool = tc->pool;
991d9fa02   Joe Thornber   dm: add thin prov...
632
633
634
635
  	struct bio *bio;
  	int r;
  
  	bio = m->bio;
196d38bcc   Kent Overstreet   block: Generic bi...
636
  	if (bio) {
991d9fa02   Joe Thornber   dm: add thin prov...
637
  		bio->bi_end_io = m->saved_bi_end_io;
196d38bcc   Kent Overstreet   block: Generic bi...
638
639
  		atomic_inc(&bio->bi_remaining);
  	}
991d9fa02   Joe Thornber   dm: add thin prov...
640
641
  
  	if (m->err) {
6beca5eb6   Joe Thornber   dm bio prison: pa...
642
  		cell_error(pool, m->cell);
905386f82   Joe Thornber   dm thin: fix memo...
643
  		goto out;
991d9fa02   Joe Thornber   dm: add thin prov...
644
645
646
647
648
649
650
651
652
  	}
  
  	/*
  	 * Commit the prepared block into the mapping btree.
  	 * Any I/O for this block arriving after this point will get
  	 * remapped to it directly.
  	 */
  	r = dm_thin_insert_block(tc->td, m->virt_block, m->data_block);
  	if (r) {
b53306558   Joe Thornber   dm thin: handle m...
653
  		metadata_operation_failed(pool, "dm_thin_insert_block", r);
6beca5eb6   Joe Thornber   dm bio prison: pa...
654
  		cell_error(pool, m->cell);
905386f82   Joe Thornber   dm thin: fix memo...
655
  		goto out;
991d9fa02   Joe Thornber   dm: add thin prov...
656
657
658
659
660
661
662
663
664
  	}
  
  	/*
  	 * Release any bios held while the block was being provisioned.
  	 * If we are processing a write bio that completely covers the block,
  	 * we already processed it so can ignore it now when processing
  	 * the bios in the cell.
  	 */
  	if (bio) {
f286ba0ee   Joe Thornber   dm thin: rename c...
665
  		cell_defer_no_holder(tc, m->cell);
991d9fa02   Joe Thornber   dm: add thin prov...
666
667
  		bio_endio(bio, 0);
  	} else
2aab38502   Joe Thornber   dm thin: cleanup ...
668
  		cell_defer(tc, m->cell);
991d9fa02   Joe Thornber   dm: add thin prov...
669

905386f82   Joe Thornber   dm thin: fix memo...
670
  out:
991d9fa02   Joe Thornber   dm: add thin prov...
671
  	list_del(&m->list);
6beca5eb6   Joe Thornber   dm bio prison: pa...
672
  	mempool_free(m, pool->mapping_pool);
991d9fa02   Joe Thornber   dm: add thin prov...
673
  }
e49e58296   Joe Thornber   dm thin: add read...
674
  static void process_prepared_discard_fail(struct dm_thin_new_mapping *m)
104655fd4   Joe Thornber   dm thin: support ...
675
  {
104655fd4   Joe Thornber   dm thin: support ...
676
  	struct thin_c *tc = m->tc;
e49e58296   Joe Thornber   dm thin: add read...
677
  	bio_io_error(m->bio);
f286ba0ee   Joe Thornber   dm thin: rename c...
678
679
  	cell_defer_no_holder(tc, m->cell);
  	cell_defer_no_holder(tc, m->cell2);
e49e58296   Joe Thornber   dm thin: add read...
680
681
682
683
684
685
  	mempool_free(m, tc->pool->mapping_pool);
  }
  
  static void process_prepared_discard_passdown(struct dm_thin_new_mapping *m)
  {
  	struct thin_c *tc = m->tc;
104655fd4   Joe Thornber   dm thin: support ...
686

e8088073c   Joe Thornber   dm thin: fix race...
687
  	inc_all_io_entry(tc->pool, m->bio);
f286ba0ee   Joe Thornber   dm thin: rename c...
688
689
  	cell_defer_no_holder(tc, m->cell);
  	cell_defer_no_holder(tc, m->cell2);
e8088073c   Joe Thornber   dm thin: fix race...
690

104655fd4   Joe Thornber   dm thin: support ...
691
  	if (m->pass_discard)
19fa1a675   Joe Thornber   dm thin: fix disc...
692
693
694
695
696
697
698
699
700
  		if (m->definitely_not_shared)
  			remap_and_issue(tc, m->bio, m->data_block);
  		else {
  			bool used = false;
  			if (dm_pool_block_is_used(tc->pool->pmd, m->data_block, &used) || used)
  				bio_endio(m->bio, 0);
  			else
  				remap_and_issue(tc, m->bio, m->data_block);
  		}
104655fd4   Joe Thornber   dm thin: support ...
701
702
  	else
  		bio_endio(m->bio, 0);
104655fd4   Joe Thornber   dm thin: support ...
703
704
  	mempool_free(m, tc->pool->mapping_pool);
  }
e49e58296   Joe Thornber   dm thin: add read...
705
706
707
708
709
710
711
  static void process_prepared_discard(struct dm_thin_new_mapping *m)
  {
  	int r;
  	struct thin_c *tc = m->tc;
  
  	r = dm_thin_remove_block(tc->td, m->virt_block);
  	if (r)
c397741c7   Mike Snitzer   dm thin: use DMER...
712
  		DMERR_LIMIT("dm_thin_remove_block() failed");
e49e58296   Joe Thornber   dm thin: add read...
713
714
715
  
  	process_prepared_discard_passdown(m);
  }
104655fd4   Joe Thornber   dm thin: support ...
716
  static void process_prepared(struct pool *pool, struct list_head *head,
e49e58296   Joe Thornber   dm thin: add read...
717
  			     process_mapping_fn *fn)
991d9fa02   Joe Thornber   dm: add thin prov...
718
719
720
  {
  	unsigned long flags;
  	struct list_head maps;
a24c25696   Mike Snitzer   dm thin: use slab...
721
  	struct dm_thin_new_mapping *m, *tmp;
991d9fa02   Joe Thornber   dm: add thin prov...
722
723
724
  
  	INIT_LIST_HEAD(&maps);
  	spin_lock_irqsave(&pool->lock, flags);
104655fd4   Joe Thornber   dm thin: support ...
725
  	list_splice_init(head, &maps);
991d9fa02   Joe Thornber   dm: add thin prov...
726
727
728
  	spin_unlock_irqrestore(&pool->lock, flags);
  
  	list_for_each_entry_safe(m, tmp, &maps, list)
e49e58296   Joe Thornber   dm thin: add read...
729
  		(*fn)(m);
991d9fa02   Joe Thornber   dm: add thin prov...
730
731
732
733
734
  }
  
  /*
   * Deferred bio jobs.
   */
104655fd4   Joe Thornber   dm thin: support ...
735
  static int io_overlaps_block(struct pool *pool, struct bio *bio)
991d9fa02   Joe Thornber   dm: add thin prov...
736
  {
4f024f379   Kent Overstreet   block: Abstract o...
737
738
  	return bio->bi_iter.bi_size ==
  		(pool->sectors_per_block << SECTOR_SHIFT);
104655fd4   Joe Thornber   dm thin: support ...
739
740
741
742
743
744
  }
  
  static int io_overwrites_block(struct pool *pool, struct bio *bio)
  {
  	return (bio_data_dir(bio) == WRITE) &&
  		io_overlaps_block(pool, bio);
991d9fa02   Joe Thornber   dm: add thin prov...
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
  }
  
  static void save_and_set_endio(struct bio *bio, bio_end_io_t **save,
  			       bio_end_io_t *fn)
  {
  	*save = bio->bi_end_io;
  	bio->bi_end_io = fn;
  }
  
  static int ensure_next_mapping(struct pool *pool)
  {
  	if (pool->next_mapping)
  		return 0;
  
  	pool->next_mapping = mempool_alloc(pool->mapping_pool, GFP_ATOMIC);
  
  	return pool->next_mapping ? 0 : -ENOMEM;
  }
a24c25696   Mike Snitzer   dm thin: use slab...
763
  static struct dm_thin_new_mapping *get_next_mapping(struct pool *pool)
991d9fa02   Joe Thornber   dm: add thin prov...
764
  {
16961b042   Mike Snitzer   dm thin: initiali...
765
  	struct dm_thin_new_mapping *m = pool->next_mapping;
991d9fa02   Joe Thornber   dm: add thin prov...
766
767
  
  	BUG_ON(!pool->next_mapping);
16961b042   Mike Snitzer   dm thin: initiali...
768
769
770
  	memset(m, 0, sizeof(struct dm_thin_new_mapping));
  	INIT_LIST_HEAD(&m->list);
  	m->bio = NULL;
991d9fa02   Joe Thornber   dm: add thin prov...
771
  	pool->next_mapping = NULL;
16961b042   Mike Snitzer   dm thin: initiali...
772
  	return m;
991d9fa02   Joe Thornber   dm: add thin prov...
773
  }
e5aea7b49   Joe Thornber   dm thin: relax ex...
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
  static void ll_zero(struct thin_c *tc, struct dm_thin_new_mapping *m,
  		    sector_t begin, sector_t end)
  {
  	int r;
  	struct dm_io_region to;
  
  	to.bdev = tc->pool_dev->bdev;
  	to.sector = begin;
  	to.count = end - begin;
  
  	r = dm_kcopyd_zero(tc->pool->copier, 1, &to, 0, copy_complete, m);
  	if (r < 0) {
  		DMERR_LIMIT("dm_kcopyd_zero() failed");
  		copy_complete(1, 1, m);
  	}
  }
  
  /*
   * A partial copy also needs to zero the uncopied region.
   */
991d9fa02   Joe Thornber   dm: add thin prov...
794
  static void schedule_copy(struct thin_c *tc, dm_block_t virt_block,
2dd9c257f   Joe Thornber   dm thin: support ...
795
796
  			  struct dm_dev *origin, dm_block_t data_origin,
  			  dm_block_t data_dest,
e5aea7b49   Joe Thornber   dm thin: relax ex...
797
798
  			  struct dm_bio_prison_cell *cell, struct bio *bio,
  			  sector_t len)
991d9fa02   Joe Thornber   dm: add thin prov...
799
800
801
  {
  	int r;
  	struct pool *pool = tc->pool;
a24c25696   Mike Snitzer   dm thin: use slab...
802
  	struct dm_thin_new_mapping *m = get_next_mapping(pool);
991d9fa02   Joe Thornber   dm: add thin prov...
803

991d9fa02   Joe Thornber   dm: add thin prov...
804
805
806
807
  	m->tc = tc;
  	m->virt_block = virt_block;
  	m->data_block = data_dest;
  	m->cell = cell;
991d9fa02   Joe Thornber   dm: add thin prov...
808

e5aea7b49   Joe Thornber   dm thin: relax ex...
809
810
811
812
813
814
  	/*
  	 * quiesce action + copy action + an extra reference held for the
  	 * duration of this function (we may need to inc later for a
  	 * partial zero).
  	 */
  	atomic_set(&m->prepare_actions, 3);
44feb387f   Mike Snitzer   dm thin: prepare ...
815
  	if (!dm_deferred_set_add_work(pool->shared_read_ds, &m->list))
e5aea7b49   Joe Thornber   dm thin: relax ex...
816
  		complete_mapping_preparation(m); /* already quiesced */
991d9fa02   Joe Thornber   dm: add thin prov...
817
818
819
820
821
822
823
824
  
  	/*
  	 * IO to pool_dev remaps to the pool target's data_dev.
  	 *
  	 * If the whole block of data is being overwritten, we can issue the
  	 * bio immediately. Otherwise we use kcopyd to clone the data first.
  	 */
  	if (io_overwrites_block(pool, bio)) {
59c3d2c6a   Mikulas Patocka   dm thin: dont use...
825
  		struct dm_thin_endio_hook *h = dm_per_bio_data(bio, sizeof(struct dm_thin_endio_hook));
a24c25696   Mike Snitzer   dm thin: use slab...
826

eb2aa48d4   Joe Thornber   dm thin: prepare ...
827
  		h->overwrite_mapping = m;
991d9fa02   Joe Thornber   dm: add thin prov...
828
829
  		m->bio = bio;
  		save_and_set_endio(bio, &m->saved_bi_end_io, overwrite_endio);
e8088073c   Joe Thornber   dm thin: fix race...
830
  		inc_all_io_entry(pool, bio);
991d9fa02   Joe Thornber   dm: add thin prov...
831
832
833
  		remap_and_issue(tc, bio, data_dest);
  	} else {
  		struct dm_io_region from, to;
2dd9c257f   Joe Thornber   dm thin: support ...
834
  		from.bdev = origin->bdev;
991d9fa02   Joe Thornber   dm: add thin prov...
835
  		from.sector = data_origin * pool->sectors_per_block;
e5aea7b49   Joe Thornber   dm thin: relax ex...
836
  		from.count = len;
991d9fa02   Joe Thornber   dm: add thin prov...
837
838
839
  
  		to.bdev = tc->pool_dev->bdev;
  		to.sector = data_dest * pool->sectors_per_block;
e5aea7b49   Joe Thornber   dm thin: relax ex...
840
  		to.count = len;
991d9fa02   Joe Thornber   dm: add thin prov...
841
842
843
844
  
  		r = dm_kcopyd_copy(pool->copier, &from, 1, &to,
  				   0, copy_complete, m);
  		if (r < 0) {
c397741c7   Mike Snitzer   dm thin: use DMER...
845
  			DMERR_LIMIT("dm_kcopyd_copy() failed");
e5aea7b49   Joe Thornber   dm thin: relax ex...
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
  			copy_complete(1, 1, m);
  
  			/*
  			 * We allow the zero to be issued, to simplify the
  			 * error path.  Otherwise we'd need to start
  			 * worrying about decrementing the prepare_actions
  			 * counter.
  			 */
  		}
  
  		/*
  		 * Do we need to zero a tail region?
  		 */
  		if (len < pool->sectors_per_block && pool->pf.zero_new_blocks) {
  			atomic_inc(&m->prepare_actions);
  			ll_zero(tc, m,
  				data_dest * pool->sectors_per_block + len,
  				(data_dest + 1) * pool->sectors_per_block);
991d9fa02   Joe Thornber   dm: add thin prov...
864
865
  		}
  	}
e5aea7b49   Joe Thornber   dm thin: relax ex...
866
867
  
  	complete_mapping_preparation(m); /* drop our ref */
991d9fa02   Joe Thornber   dm: add thin prov...
868
  }
2dd9c257f   Joe Thornber   dm thin: support ...
869
870
  static void schedule_internal_copy(struct thin_c *tc, dm_block_t virt_block,
  				   dm_block_t data_origin, dm_block_t data_dest,
a24c25696   Mike Snitzer   dm thin: use slab...
871
  				   struct dm_bio_prison_cell *cell, struct bio *bio)
2dd9c257f   Joe Thornber   dm thin: support ...
872
873
  {
  	schedule_copy(tc, virt_block, tc->pool_dev,
e5aea7b49   Joe Thornber   dm thin: relax ex...
874
875
  		      data_origin, data_dest, cell, bio,
  		      tc->pool->sectors_per_block);
2dd9c257f   Joe Thornber   dm thin: support ...
876
  }
991d9fa02   Joe Thornber   dm: add thin prov...
877
  static void schedule_zero(struct thin_c *tc, dm_block_t virt_block,
a24c25696   Mike Snitzer   dm thin: use slab...
878
  			  dm_block_t data_block, struct dm_bio_prison_cell *cell,
991d9fa02   Joe Thornber   dm: add thin prov...
879
880
881
  			  struct bio *bio)
  {
  	struct pool *pool = tc->pool;
a24c25696   Mike Snitzer   dm thin: use slab...
882
  	struct dm_thin_new_mapping *m = get_next_mapping(pool);
991d9fa02   Joe Thornber   dm: add thin prov...
883

50f3c3efd   Joe Thornber   dm thin: switch t...
884
  	atomic_set(&m->prepare_actions, 1); /* no need to quiesce */
991d9fa02   Joe Thornber   dm: add thin prov...
885
886
887
888
  	m->tc = tc;
  	m->virt_block = virt_block;
  	m->data_block = data_block;
  	m->cell = cell;
991d9fa02   Joe Thornber   dm: add thin prov...
889
890
891
892
893
894
  
  	/*
  	 * If the whole block of data is being overwritten or we are not
  	 * zeroing pre-existing data, we can issue the bio immediately.
  	 * Otherwise we use kcopyd to zero the data first.
  	 */
67e2e2b28   Joe Thornber   dm thin: add pool...
895
  	if (!pool->pf.zero_new_blocks)
991d9fa02   Joe Thornber   dm: add thin prov...
896
897
898
  		process_prepared_mapping(m);
  
  	else if (io_overwrites_block(pool, bio)) {
59c3d2c6a   Mikulas Patocka   dm thin: dont use...
899
  		struct dm_thin_endio_hook *h = dm_per_bio_data(bio, sizeof(struct dm_thin_endio_hook));
a24c25696   Mike Snitzer   dm thin: use slab...
900

eb2aa48d4   Joe Thornber   dm thin: prepare ...
901
  		h->overwrite_mapping = m;
991d9fa02   Joe Thornber   dm: add thin prov...
902
903
  		m->bio = bio;
  		save_and_set_endio(bio, &m->saved_bi_end_io, overwrite_endio);
e8088073c   Joe Thornber   dm thin: fix race...
904
  		inc_all_io_entry(pool, bio);
991d9fa02   Joe Thornber   dm: add thin prov...
905
  		remap_and_issue(tc, bio, data_block);
991d9fa02   Joe Thornber   dm: add thin prov...
906

e5aea7b49   Joe Thornber   dm thin: relax ex...
907
908
909
910
911
  	} else
  		ll_zero(tc, m,
  			data_block * pool->sectors_per_block,
  			(data_block + 1) * pool->sectors_per_block);
  }
991d9fa02   Joe Thornber   dm: add thin prov...
912

e5aea7b49   Joe Thornber   dm thin: relax ex...
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
  static void schedule_external_copy(struct thin_c *tc, dm_block_t virt_block,
  				   dm_block_t data_dest,
  				   struct dm_bio_prison_cell *cell, struct bio *bio)
  {
  	struct pool *pool = tc->pool;
  	sector_t virt_block_begin = virt_block * pool->sectors_per_block;
  	sector_t virt_block_end = (virt_block + 1) * pool->sectors_per_block;
  
  	if (virt_block_end <= tc->origin_size)
  		schedule_copy(tc, virt_block, tc->origin_dev,
  			      virt_block, data_dest, cell, bio,
  			      pool->sectors_per_block);
  
  	else if (virt_block_begin < tc->origin_size)
  		schedule_copy(tc, virt_block, tc->origin_dev,
  			      virt_block, data_dest, cell, bio,
  			      tc->origin_size - virt_block_begin);
  
  	else
  		schedule_zero(tc, virt_block, data_dest, cell, bio);
991d9fa02   Joe Thornber   dm: add thin prov...
933
  }
e49e58296   Joe Thornber   dm thin: add read...
934
935
936
937
  /*
   * A non-zero return indicates read_only or fail_io mode.
   * Many callers don't care about the return value.
   */
020cc3b5e   Joe Thornber   dm thin: always f...
938
  static int commit(struct pool *pool)
e49e58296   Joe Thornber   dm thin: add read...
939
940
  {
  	int r;
8d07e8a5f   Joe Thornber   dm thin: allow me...
941
  	if (get_pool_mode(pool) >= PM_READ_ONLY)
e49e58296   Joe Thornber   dm thin: add read...
942
  		return -EINVAL;
020cc3b5e   Joe Thornber   dm thin: always f...
943
  	r = dm_pool_commit_metadata(pool->pmd);
b53306558   Joe Thornber   dm thin: handle m...
944
945
  	if (r)
  		metadata_operation_failed(pool, "dm_pool_commit_metadata", r);
e49e58296   Joe Thornber   dm thin: add read...
946
947
948
  
  	return r;
  }
88a6621be   Joe Thornber   dm thin: factor o...
949
950
951
952
953
954
955
956
957
958
959
960
961
  static void check_low_water_mark(struct pool *pool, dm_block_t free_blocks)
  {
  	unsigned long flags;
  
  	if (free_blocks <= pool->low_water_blocks && !pool->low_water_triggered) {
  		DMWARN("%s: reached low water mark for data device: sending event.",
  		       dm_device_name(pool->pool_md));
  		spin_lock_irqsave(&pool->lock, flags);
  		pool->low_water_triggered = true;
  		spin_unlock_irqrestore(&pool->lock, flags);
  		dm_table_event(pool->ti->table);
  	}
  }
3e1a06990   Joe Thornber   dm thin: fix out ...
962
  static void set_pool_mode(struct pool *pool, enum pool_mode new_mode);
991d9fa02   Joe Thornber   dm: add thin prov...
963
964
965
966
  static int alloc_data_block(struct thin_c *tc, dm_block_t *result)
  {
  	int r;
  	dm_block_t free_blocks;
991d9fa02   Joe Thornber   dm: add thin prov...
967
  	struct pool *pool = tc->pool;
3e1a06990   Joe Thornber   dm thin: fix out ...
968
  	if (WARN_ON(get_pool_mode(pool) != PM_WRITE))
8d30abff7   Joe Thornber   dm thin: return e...
969
  		return -EINVAL;
991d9fa02   Joe Thornber   dm: add thin prov...
970
  	r = dm_pool_get_free_block_count(pool->pmd, &free_blocks);
b53306558   Joe Thornber   dm thin: handle m...
971
972
  	if (r) {
  		metadata_operation_failed(pool, "dm_pool_get_free_block_count", r);
991d9fa02   Joe Thornber   dm: add thin prov...
973
  		return r;
b53306558   Joe Thornber   dm thin: handle m...
974
  	}
991d9fa02   Joe Thornber   dm: add thin prov...
975

88a6621be   Joe Thornber   dm thin: factor o...
976
  	check_low_water_mark(pool, free_blocks);
991d9fa02   Joe Thornber   dm: add thin prov...
977
978
  
  	if (!free_blocks) {
94563bada   Mike Snitzer   dm thin: always r...
979
980
981
982
  		/*
  		 * Try to commit to see if that will free up some
  		 * more space.
  		 */
020cc3b5e   Joe Thornber   dm thin: always f...
983
984
985
  		r = commit(pool);
  		if (r)
  			return r;
991d9fa02   Joe Thornber   dm: add thin prov...
986

94563bada   Mike Snitzer   dm thin: always r...
987
  		r = dm_pool_get_free_block_count(pool->pmd, &free_blocks);
b53306558   Joe Thornber   dm thin: handle m...
988
989
  		if (r) {
  			metadata_operation_failed(pool, "dm_pool_get_free_block_count", r);
94563bada   Mike Snitzer   dm thin: always r...
990
  			return r;
b53306558   Joe Thornber   dm thin: handle m...
991
  		}
991d9fa02   Joe Thornber   dm: add thin prov...
992

94563bada   Mike Snitzer   dm thin: always r...
993
  		if (!free_blocks) {
3e1a06990   Joe Thornber   dm thin: fix out ...
994
  			set_pool_mode(pool, PM_OUT_OF_DATA_SPACE);
94563bada   Mike Snitzer   dm thin: always r...
995
  			return -ENOSPC;
991d9fa02   Joe Thornber   dm: add thin prov...
996
997
998
999
  		}
  	}
  
  	r = dm_pool_alloc_data_block(pool->pmd, result);
4a02b34e0   Mike Snitzer   dm thin: switch t...
1000
  	if (r) {
b53306558   Joe Thornber   dm thin: handle m...
1001
  		metadata_operation_failed(pool, "dm_pool_alloc_data_block", r);
991d9fa02   Joe Thornber   dm: add thin prov...
1002
  		return r;
4a02b34e0   Mike Snitzer   dm thin: switch t...
1003
  	}
991d9fa02   Joe Thornber   dm: add thin prov...
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
  
  	return 0;
  }
  
  /*
   * If we have run out of space, queue bios until the device is
   * resumed, presumably after having been reloaded with more space.
   */
  static void retry_on_resume(struct bio *bio)
  {
59c3d2c6a   Mikulas Patocka   dm thin: dont use...
1014
  	struct dm_thin_endio_hook *h = dm_per_bio_data(bio, sizeof(struct dm_thin_endio_hook));
eb2aa48d4   Joe Thornber   dm thin: prepare ...
1015
  	struct thin_c *tc = h->tc;
991d9fa02   Joe Thornber   dm: add thin prov...
1016
  	unsigned long flags;
c140e1c4e   Mike Snitzer   dm thin: use per ...
1017
1018
1019
  	spin_lock_irqsave(&tc->lock, flags);
  	bio_list_add(&tc->retry_on_resume_list, bio);
  	spin_unlock_irqrestore(&tc->lock, flags);
991d9fa02   Joe Thornber   dm: add thin prov...
1020
  }
af91805a4   Mike Snitzer   dm thin: return E...
1021
  static int should_error_unserviceable_bio(struct pool *pool)
8c0f0e8c9   Mike Snitzer   dm thin: requeue ...
1022
  {
3e1a06990   Joe Thornber   dm thin: fix out ...
1023
1024
1025
1026
1027
1028
  	enum pool_mode m = get_pool_mode(pool);
  
  	switch (m) {
  	case PM_WRITE:
  		/* Shouldn't get here */
  		DMERR_LIMIT("bio unserviceable, yet pool is in PM_WRITE mode");
af91805a4   Mike Snitzer   dm thin: return E...
1029
  		return -EIO;
3e1a06990   Joe Thornber   dm thin: fix out ...
1030
1031
  
  	case PM_OUT_OF_DATA_SPACE:
af91805a4   Mike Snitzer   dm thin: return E...
1032
  		return pool->pf.error_if_no_space ? -ENOSPC : 0;
3e1a06990   Joe Thornber   dm thin: fix out ...
1033
1034
1035
  
  	case PM_READ_ONLY:
  	case PM_FAIL:
af91805a4   Mike Snitzer   dm thin: return E...
1036
  		return -EIO;
3e1a06990   Joe Thornber   dm thin: fix out ...
1037
1038
1039
  	default:
  		/* Shouldn't get here */
  		DMERR_LIMIT("bio unserviceable, yet pool has an unknown mode");
af91805a4   Mike Snitzer   dm thin: return E...
1040
  		return -EIO;
3e1a06990   Joe Thornber   dm thin: fix out ...
1041
1042
  	}
  }
8c0f0e8c9   Mike Snitzer   dm thin: requeue ...
1043

3e1a06990   Joe Thornber   dm thin: fix out ...
1044
1045
  static void handle_unserviceable_bio(struct pool *pool, struct bio *bio)
  {
af91805a4   Mike Snitzer   dm thin: return E...
1046
1047
1048
1049
  	int error = should_error_unserviceable_bio(pool);
  
  	if (error)
  		bio_endio(bio, error);
6d16202be   Mike Snitzer   dm thin: eliminat...
1050
1051
  	else
  		retry_on_resume(bio);
8c0f0e8c9   Mike Snitzer   dm thin: requeue ...
1052
  }
399caddfb   Mike Snitzer   dm thin: cleanup ...
1053
  static void retry_bios_on_resume(struct pool *pool, struct dm_bio_prison_cell *cell)
991d9fa02   Joe Thornber   dm: add thin prov...
1054
1055
1056
  {
  	struct bio *bio;
  	struct bio_list bios;
af91805a4   Mike Snitzer   dm thin: return E...
1057
  	int error;
991d9fa02   Joe Thornber   dm: add thin prov...
1058

af91805a4   Mike Snitzer   dm thin: return E...
1059
1060
1061
  	error = should_error_unserviceable_bio(pool);
  	if (error) {
  		cell_error_with_code(pool, cell, error);
3e1a06990   Joe Thornber   dm thin: fix out ...
1062
1063
  		return;
  	}
991d9fa02   Joe Thornber   dm: add thin prov...
1064
  	bio_list_init(&bios);
6beca5eb6   Joe Thornber   dm bio prison: pa...
1065
  	cell_release(pool, cell, &bios);
991d9fa02   Joe Thornber   dm: add thin prov...
1066

af91805a4   Mike Snitzer   dm thin: return E...
1067
1068
  	error = should_error_unserviceable_bio(pool);
  	if (error)
3e1a06990   Joe Thornber   dm thin: fix out ...
1069
  		while ((bio = bio_list_pop(&bios)))
af91805a4   Mike Snitzer   dm thin: return E...
1070
  			bio_endio(bio, error);
3e1a06990   Joe Thornber   dm thin: fix out ...
1071
1072
1073
  	else
  		while ((bio = bio_list_pop(&bios)))
  			retry_on_resume(bio);
991d9fa02   Joe Thornber   dm: add thin prov...
1074
  }
104655fd4   Joe Thornber   dm thin: support ...
1075
1076
1077
  static void process_discard(struct thin_c *tc, struct bio *bio)
  {
  	int r;
c3a0ce2ea   Mike Snitzer   dm thin: fix unpr...
1078
  	unsigned long flags;
104655fd4   Joe Thornber   dm thin: support ...
1079
  	struct pool *pool = tc->pool;
a24c25696   Mike Snitzer   dm thin: use slab...
1080
  	struct dm_bio_prison_cell *cell, *cell2;
44feb387f   Mike Snitzer   dm thin: prepare ...
1081
  	struct dm_cell_key key, key2;
104655fd4   Joe Thornber   dm thin: support ...
1082
1083
  	dm_block_t block = get_bio_block(tc, bio);
  	struct dm_thin_lookup_result lookup_result;
a24c25696   Mike Snitzer   dm thin: use slab...
1084
  	struct dm_thin_new_mapping *m;
104655fd4   Joe Thornber   dm thin: support ...
1085
1086
  
  	build_virtual_key(tc->td, block, &key);
6beca5eb6   Joe Thornber   dm bio prison: pa...
1087
  	if (bio_detain(tc->pool, &key, bio, &cell))
104655fd4   Joe Thornber   dm thin: support ...
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
  		return;
  
  	r = dm_thin_find_block(tc->td, block, 1, &lookup_result);
  	switch (r) {
  	case 0:
  		/*
  		 * Check nobody is fiddling with this pool block.  This can
  		 * happen if someone's in the process of breaking sharing
  		 * on this block.
  		 */
  		build_data_key(tc->td, lookup_result.block, &key2);
6beca5eb6   Joe Thornber   dm bio prison: pa...
1099
  		if (bio_detain(tc->pool, &key2, bio, &cell2)) {
f286ba0ee   Joe Thornber   dm thin: rename c...
1100
  			cell_defer_no_holder(tc, cell);
104655fd4   Joe Thornber   dm thin: support ...
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
  			break;
  		}
  
  		if (io_overlaps_block(pool, bio)) {
  			/*
  			 * IO may still be going to the destination block.  We must
  			 * quiesce before we can do the removal.
  			 */
  			m = get_next_mapping(pool);
  			m->tc = tc;
19fa1a675   Joe Thornber   dm thin: fix disc...
1111
1112
  			m->pass_discard = pool->pf.discard_passdown;
  			m->definitely_not_shared = !lookup_result.shared;
104655fd4   Joe Thornber   dm thin: support ...
1113
1114
1115
1116
  			m->virt_block = block;
  			m->data_block = lookup_result.block;
  			m->cell = cell;
  			m->cell2 = cell2;
104655fd4   Joe Thornber   dm thin: support ...
1117
  			m->bio = bio;
44feb387f   Mike Snitzer   dm thin: prepare ...
1118
  			if (!dm_deferred_set_add_work(pool->all_io_ds, &m->list)) {
c3a0ce2ea   Mike Snitzer   dm thin: fix unpr...
1119
  				spin_lock_irqsave(&pool->lock, flags);
daec338bb   Mike Snitzer   dm thin: add mapp...
1120
  				list_add_tail(&m->list, &pool->prepared_discards);
c3a0ce2ea   Mike Snitzer   dm thin: fix unpr...
1121
  				spin_unlock_irqrestore(&pool->lock, flags);
104655fd4   Joe Thornber   dm thin: support ...
1122
1123
1124
  				wake_worker(pool);
  			}
  		} else {
e8088073c   Joe Thornber   dm thin: fix race...
1125
  			inc_all_io_entry(pool, bio);
f286ba0ee   Joe Thornber   dm thin: rename c...
1126
1127
  			cell_defer_no_holder(tc, cell);
  			cell_defer_no_holder(tc, cell2);
e8088073c   Joe Thornber   dm thin: fix race...
1128

104655fd4   Joe Thornber   dm thin: support ...
1129
  			/*
492963090   Mikulas Patocka   dm thin: split di...
1130
1131
1132
  			 * The DM core makes sure that the discard doesn't span
  			 * a block boundary.  So we submit the discard of a
  			 * partial block appropriately.
104655fd4   Joe Thornber   dm thin: support ...
1133
  			 */
650d2a06b   Mikulas Patocka   dm thin: do not s...
1134
1135
1136
1137
  			if ((!lookup_result.shared) && pool->pf.discard_passdown)
  				remap_and_issue(tc, bio, lookup_result.block);
  			else
  				bio_endio(bio, 0);
104655fd4   Joe Thornber   dm thin: support ...
1138
1139
1140
1141
1142
1143
1144
  		}
  		break;
  
  	case -ENODATA:
  		/*
  		 * It isn't provisioned, just forget it.
  		 */
f286ba0ee   Joe Thornber   dm thin: rename c...
1145
  		cell_defer_no_holder(tc, cell);
104655fd4   Joe Thornber   dm thin: support ...
1146
1147
1148
1149
  		bio_endio(bio, 0);
  		break;
  
  	default:
c397741c7   Mike Snitzer   dm thin: use DMER...
1150
1151
  		DMERR_LIMIT("%s: dm_thin_find_block() failed: error = %d",
  			    __func__, r);
f286ba0ee   Joe Thornber   dm thin: rename c...
1152
  		cell_defer_no_holder(tc, cell);
104655fd4   Joe Thornber   dm thin: support ...
1153
1154
1155
1156
  		bio_io_error(bio);
  		break;
  	}
  }
991d9fa02   Joe Thornber   dm: add thin prov...
1157
  static void break_sharing(struct thin_c *tc, struct bio *bio, dm_block_t block,
44feb387f   Mike Snitzer   dm thin: prepare ...
1158
  			  struct dm_cell_key *key,
991d9fa02   Joe Thornber   dm: add thin prov...
1159
  			  struct dm_thin_lookup_result *lookup_result,
a24c25696   Mike Snitzer   dm thin: use slab...
1160
  			  struct dm_bio_prison_cell *cell)
991d9fa02   Joe Thornber   dm: add thin prov...
1161
1162
1163
  {
  	int r;
  	dm_block_t data_block;
d6fc20420   Mike Snitzer   dm thin: set pool...
1164
  	struct pool *pool = tc->pool;
991d9fa02   Joe Thornber   dm: add thin prov...
1165
1166
1167
1168
  
  	r = alloc_data_block(tc, &data_block);
  	switch (r) {
  	case 0:
2dd9c257f   Joe Thornber   dm thin: support ...
1169
1170
  		schedule_internal_copy(tc, block, lookup_result->block,
  				       data_block, cell, bio);
991d9fa02   Joe Thornber   dm: add thin prov...
1171
1172
1173
  		break;
  
  	case -ENOSPC:
399caddfb   Mike Snitzer   dm thin: cleanup ...
1174
  		retry_bios_on_resume(pool, cell);
991d9fa02   Joe Thornber   dm: add thin prov...
1175
1176
1177
  		break;
  
  	default:
c397741c7   Mike Snitzer   dm thin: use DMER...
1178
1179
  		DMERR_LIMIT("%s: alloc_data_block() failed: error = %d",
  			    __func__, r);
d6fc20420   Mike Snitzer   dm thin: set pool...
1180
  		cell_error(pool, cell);
991d9fa02   Joe Thornber   dm: add thin prov...
1181
1182
1183
1184
1185
1186
1187
1188
  		break;
  	}
  }
  
  static void process_shared_bio(struct thin_c *tc, struct bio *bio,
  			       dm_block_t block,
  			       struct dm_thin_lookup_result *lookup_result)
  {
a24c25696   Mike Snitzer   dm thin: use slab...
1189
  	struct dm_bio_prison_cell *cell;
991d9fa02   Joe Thornber   dm: add thin prov...
1190
  	struct pool *pool = tc->pool;
44feb387f   Mike Snitzer   dm thin: prepare ...
1191
  	struct dm_cell_key key;
991d9fa02   Joe Thornber   dm: add thin prov...
1192
1193
1194
1195
1196
1197
  
  	/*
  	 * If cell is already occupied, then sharing is already in the process
  	 * of being broken so we have nothing further to do here.
  	 */
  	build_data_key(tc->td, lookup_result->block, &key);
6beca5eb6   Joe Thornber   dm bio prison: pa...
1198
  	if (bio_detain(pool, &key, bio, &cell))
991d9fa02   Joe Thornber   dm: add thin prov...
1199
  		return;
4f024f379   Kent Overstreet   block: Abstract o...
1200
  	if (bio_data_dir(bio) == WRITE && bio->bi_iter.bi_size)
991d9fa02   Joe Thornber   dm: add thin prov...
1201
1202
  		break_sharing(tc, bio, block, &key, lookup_result, cell);
  	else {
59c3d2c6a   Mikulas Patocka   dm thin: dont use...
1203
  		struct dm_thin_endio_hook *h = dm_per_bio_data(bio, sizeof(struct dm_thin_endio_hook));
991d9fa02   Joe Thornber   dm: add thin prov...
1204

44feb387f   Mike Snitzer   dm thin: prepare ...
1205
  		h->shared_read_entry = dm_deferred_entry_inc(pool->shared_read_ds);
e8088073c   Joe Thornber   dm thin: fix race...
1206
  		inc_all_io_entry(pool, bio);
f286ba0ee   Joe Thornber   dm thin: rename c...
1207
  		cell_defer_no_holder(tc, cell);
e8088073c   Joe Thornber   dm thin: fix race...
1208

991d9fa02   Joe Thornber   dm: add thin prov...
1209
1210
1211
1212
1213
  		remap_and_issue(tc, bio, lookup_result->block);
  	}
  }
  
  static void provision_block(struct thin_c *tc, struct bio *bio, dm_block_t block,
a24c25696   Mike Snitzer   dm thin: use slab...
1214
  			    struct dm_bio_prison_cell *cell)
991d9fa02   Joe Thornber   dm: add thin prov...
1215
1216
1217
  {
  	int r;
  	dm_block_t data_block;
6beca5eb6   Joe Thornber   dm bio prison: pa...
1218
  	struct pool *pool = tc->pool;
991d9fa02   Joe Thornber   dm: add thin prov...
1219
1220
1221
1222
  
  	/*
  	 * Remap empty bios (flushes) immediately, without provisioning.
  	 */
4f024f379   Kent Overstreet   block: Abstract o...
1223
  	if (!bio->bi_iter.bi_size) {
6beca5eb6   Joe Thornber   dm bio prison: pa...
1224
  		inc_all_io_entry(pool, bio);
f286ba0ee   Joe Thornber   dm thin: rename c...
1225
  		cell_defer_no_holder(tc, cell);
e8088073c   Joe Thornber   dm thin: fix race...
1226

991d9fa02   Joe Thornber   dm: add thin prov...
1227
1228
1229
1230
1231
1232
1233
1234
1235
  		remap_and_issue(tc, bio, 0);
  		return;
  	}
  
  	/*
  	 * Fill read bios with zeroes and complete them immediately.
  	 */
  	if (bio_data_dir(bio) == READ) {
  		zero_fill_bio(bio);
f286ba0ee   Joe Thornber   dm thin: rename c...
1236
  		cell_defer_no_holder(tc, cell);
991d9fa02   Joe Thornber   dm: add thin prov...
1237
1238
1239
1240
1241
1242
1243
  		bio_endio(bio, 0);
  		return;
  	}
  
  	r = alloc_data_block(tc, &data_block);
  	switch (r) {
  	case 0:
2dd9c257f   Joe Thornber   dm thin: support ...
1244
1245
1246
1247
  		if (tc->origin_dev)
  			schedule_external_copy(tc, block, data_block, cell, bio);
  		else
  			schedule_zero(tc, block, data_block, cell, bio);
991d9fa02   Joe Thornber   dm: add thin prov...
1248
1249
1250
  		break;
  
  	case -ENOSPC:
399caddfb   Mike Snitzer   dm thin: cleanup ...
1251
  		retry_bios_on_resume(pool, cell);
991d9fa02   Joe Thornber   dm: add thin prov...
1252
1253
1254
  		break;
  
  	default:
c397741c7   Mike Snitzer   dm thin: use DMER...
1255
1256
  		DMERR_LIMIT("%s: alloc_data_block() failed: error = %d",
  			    __func__, r);
6beca5eb6   Joe Thornber   dm bio prison: pa...
1257
  		cell_error(pool, cell);
991d9fa02   Joe Thornber   dm: add thin prov...
1258
1259
1260
1261
1262
1263
1264
  		break;
  	}
  }
  
  static void process_bio(struct thin_c *tc, struct bio *bio)
  {
  	int r;
6beca5eb6   Joe Thornber   dm bio prison: pa...
1265
  	struct pool *pool = tc->pool;
991d9fa02   Joe Thornber   dm: add thin prov...
1266
  	dm_block_t block = get_bio_block(tc, bio);
a24c25696   Mike Snitzer   dm thin: use slab...
1267
  	struct dm_bio_prison_cell *cell;
44feb387f   Mike Snitzer   dm thin: prepare ...
1268
  	struct dm_cell_key key;
991d9fa02   Joe Thornber   dm: add thin prov...
1269
1270
1271
1272
1273
1274
1275
  	struct dm_thin_lookup_result lookup_result;
  
  	/*
  	 * If cell is already occupied, then the block is already
  	 * being provisioned so we have nothing further to do here.
  	 */
  	build_virtual_key(tc->td, block, &key);
6beca5eb6   Joe Thornber   dm bio prison: pa...
1276
  	if (bio_detain(pool, &key, bio, &cell))
991d9fa02   Joe Thornber   dm: add thin prov...
1277
1278
1279
1280
1281
  		return;
  
  	r = dm_thin_find_block(tc->td, block, 1, &lookup_result);
  	switch (r) {
  	case 0:
e8088073c   Joe Thornber   dm thin: fix race...
1282
  		if (lookup_result.shared) {
991d9fa02   Joe Thornber   dm: add thin prov...
1283
  			process_shared_bio(tc, bio, block, &lookup_result);
6beca5eb6   Joe Thornber   dm bio prison: pa...
1284
  			cell_defer_no_holder(tc, cell); /* FIXME: pass this cell into process_shared? */
e8088073c   Joe Thornber   dm thin: fix race...
1285
  		} else {
6beca5eb6   Joe Thornber   dm bio prison: pa...
1286
  			inc_all_io_entry(pool, bio);
f286ba0ee   Joe Thornber   dm thin: rename c...
1287
  			cell_defer_no_holder(tc, cell);
e8088073c   Joe Thornber   dm thin: fix race...
1288

991d9fa02   Joe Thornber   dm: add thin prov...
1289
  			remap_and_issue(tc, bio, lookup_result.block);
e8088073c   Joe Thornber   dm thin: fix race...
1290
  		}
991d9fa02   Joe Thornber   dm: add thin prov...
1291
1292
1293
  		break;
  
  	case -ENODATA:
2dd9c257f   Joe Thornber   dm thin: support ...
1294
  		if (bio_data_dir(bio) == READ && tc->origin_dev) {
6beca5eb6   Joe Thornber   dm bio prison: pa...
1295
  			inc_all_io_entry(pool, bio);
f286ba0ee   Joe Thornber   dm thin: rename c...
1296
  			cell_defer_no_holder(tc, cell);
e8088073c   Joe Thornber   dm thin: fix race...
1297

e5aea7b49   Joe Thornber   dm thin: relax ex...
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
  			if (bio_end_sector(bio) <= tc->origin_size)
  				remap_to_origin_and_issue(tc, bio);
  
  			else if (bio->bi_iter.bi_sector < tc->origin_size) {
  				zero_fill_bio(bio);
  				bio->bi_iter.bi_size = (tc->origin_size - bio->bi_iter.bi_sector) << SECTOR_SHIFT;
  				remap_to_origin_and_issue(tc, bio);
  
  			} else {
  				zero_fill_bio(bio);
  				bio_endio(bio, 0);
  			}
2dd9c257f   Joe Thornber   dm thin: support ...
1310
1311
  		} else
  			provision_block(tc, bio, block, cell);
991d9fa02   Joe Thornber   dm: add thin prov...
1312
1313
1314
  		break;
  
  	default:
c397741c7   Mike Snitzer   dm thin: use DMER...
1315
1316
  		DMERR_LIMIT("%s: dm_thin_find_block() failed: error = %d",
  			    __func__, r);
f286ba0ee   Joe Thornber   dm thin: rename c...
1317
  		cell_defer_no_holder(tc, cell);
991d9fa02   Joe Thornber   dm: add thin prov...
1318
1319
1320
1321
  		bio_io_error(bio);
  		break;
  	}
  }
e49e58296   Joe Thornber   dm thin: add read...
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
  static void process_bio_read_only(struct thin_c *tc, struct bio *bio)
  {
  	int r;
  	int rw = bio_data_dir(bio);
  	dm_block_t block = get_bio_block(tc, bio);
  	struct dm_thin_lookup_result lookup_result;
  
  	r = dm_thin_find_block(tc->td, block, 1, &lookup_result);
  	switch (r) {
  	case 0:
4f024f379   Kent Overstreet   block: Abstract o...
1332
  		if (lookup_result.shared && (rw == WRITE) && bio->bi_iter.bi_size)
8c0f0e8c9   Mike Snitzer   dm thin: requeue ...
1333
  			handle_unserviceable_bio(tc->pool, bio);
e8088073c   Joe Thornber   dm thin: fix race...
1334
1335
  		else {
  			inc_all_io_entry(tc->pool, bio);
e49e58296   Joe Thornber   dm thin: add read...
1336
  			remap_and_issue(tc, bio, lookup_result.block);
e8088073c   Joe Thornber   dm thin: fix race...
1337
  		}
e49e58296   Joe Thornber   dm thin: add read...
1338
1339
1340
1341
  		break;
  
  	case -ENODATA:
  		if (rw != READ) {
8c0f0e8c9   Mike Snitzer   dm thin: requeue ...
1342
  			handle_unserviceable_bio(tc->pool, bio);
e49e58296   Joe Thornber   dm thin: add read...
1343
1344
1345
1346
  			break;
  		}
  
  		if (tc->origin_dev) {
e8088073c   Joe Thornber   dm thin: fix race...
1347
  			inc_all_io_entry(tc->pool, bio);
e49e58296   Joe Thornber   dm thin: add read...
1348
1349
1350
1351
1352
1353
1354
1355
1356
  			remap_to_origin_and_issue(tc, bio);
  			break;
  		}
  
  		zero_fill_bio(bio);
  		bio_endio(bio, 0);
  		break;
  
  	default:
c397741c7   Mike Snitzer   dm thin: use DMER...
1357
1358
  		DMERR_LIMIT("%s: dm_thin_find_block() failed: error = %d",
  			    __func__, r);
e49e58296   Joe Thornber   dm thin: add read...
1359
1360
1361
1362
  		bio_io_error(bio);
  		break;
  	}
  }
3e1a06990   Joe Thornber   dm thin: fix out ...
1363
1364
1365
1366
  static void process_bio_success(struct thin_c *tc, struct bio *bio)
  {
  	bio_endio(bio, 0);
  }
e49e58296   Joe Thornber   dm thin: add read...
1367
1368
1369
1370
  static void process_bio_fail(struct thin_c *tc, struct bio *bio)
  {
  	bio_io_error(bio);
  }
ac8c3f3df   Joe Thornber   dm thin: generate...
1371
1372
1373
1374
  /*
   * FIXME: should we also commit due to size of transaction, measured in
   * metadata blocks?
   */
905e51b39   Joe Thornber   dm thin: commit o...
1375
1376
1377
1378
1379
  static int need_commit_due_to_time(struct pool *pool)
  {
  	return jiffies < pool->last_commit_jiffies ||
  	       jiffies > pool->last_commit_jiffies + COMMIT_PERIOD;
  }
67324ea18   Mike Snitzer   dm thin: sort the...
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
  #define thin_pbd(node) rb_entry((node), struct dm_thin_endio_hook, rb_node)
  #define thin_bio(pbd) dm_bio_from_per_bio_data((pbd), sizeof(struct dm_thin_endio_hook))
  
  static void __thin_bio_rb_add(struct thin_c *tc, struct bio *bio)
  {
  	struct rb_node **rbp, *parent;
  	struct dm_thin_endio_hook *pbd;
  	sector_t bi_sector = bio->bi_iter.bi_sector;
  
  	rbp = &tc->sort_bio_list.rb_node;
  	parent = NULL;
  	while (*rbp) {
  		parent = *rbp;
  		pbd = thin_pbd(parent);
  
  		if (bi_sector < thin_bio(pbd)->bi_iter.bi_sector)
  			rbp = &(*rbp)->rb_left;
  		else
  			rbp = &(*rbp)->rb_right;
  	}
  
  	pbd = dm_per_bio_data(bio, sizeof(struct dm_thin_endio_hook));
  	rb_link_node(&pbd->rb_node, parent, rbp);
  	rb_insert_color(&pbd->rb_node, &tc->sort_bio_list);
  }
  
  static void __extract_sorted_bios(struct thin_c *tc)
  {
  	struct rb_node *node;
  	struct dm_thin_endio_hook *pbd;
  	struct bio *bio;
  
  	for (node = rb_first(&tc->sort_bio_list); node; node = rb_next(node)) {
  		pbd = thin_pbd(node);
  		bio = thin_bio(pbd);
  
  		bio_list_add(&tc->deferred_bio_list, bio);
  		rb_erase(&pbd->rb_node, &tc->sort_bio_list);
  	}
  
  	WARN_ON(!RB_EMPTY_ROOT(&tc->sort_bio_list));
  }
  
  static void __sort_thin_deferred_bios(struct thin_c *tc)
  {
  	struct bio *bio;
  	struct bio_list bios;
  
  	bio_list_init(&bios);
  	bio_list_merge(&bios, &tc->deferred_bio_list);
  	bio_list_init(&tc->deferred_bio_list);
  
  	/* Sort deferred_bio_list using rb-tree */
  	while ((bio = bio_list_pop(&bios)))
  		__thin_bio_rb_add(tc, bio);
  
  	/*
  	 * Transfer the sorted bios in sort_bio_list back to
  	 * deferred_bio_list to allow lockless submission of
  	 * all bios.
  	 */
  	__extract_sorted_bios(tc);
  }
c140e1c4e   Mike Snitzer   dm thin: use per ...
1443
  static void process_thin_deferred_bios(struct thin_c *tc)
991d9fa02   Joe Thornber   dm: add thin prov...
1444
  {
c140e1c4e   Mike Snitzer   dm thin: use per ...
1445
  	struct pool *pool = tc->pool;
991d9fa02   Joe Thornber   dm: add thin prov...
1446
1447
1448
  	unsigned long flags;
  	struct bio *bio;
  	struct bio_list bios;
67324ea18   Mike Snitzer   dm thin: sort the...
1449
  	struct blk_plug plug;
991d9fa02   Joe Thornber   dm: add thin prov...
1450

c140e1c4e   Mike Snitzer   dm thin: use per ...
1451
1452
1453
1454
  	if (tc->requeue_mode) {
  		requeue_bio_list(tc, &tc->deferred_bio_list);
  		return;
  	}
991d9fa02   Joe Thornber   dm: add thin prov...
1455
  	bio_list_init(&bios);
c140e1c4e   Mike Snitzer   dm thin: use per ...
1456
  	spin_lock_irqsave(&tc->lock, flags);
67324ea18   Mike Snitzer   dm thin: sort the...
1457
1458
1459
1460
1461
1462
1463
  
  	if (bio_list_empty(&tc->deferred_bio_list)) {
  		spin_unlock_irqrestore(&tc->lock, flags);
  		return;
  	}
  
  	__sort_thin_deferred_bios(tc);
c140e1c4e   Mike Snitzer   dm thin: use per ...
1464
1465
  	bio_list_merge(&bios, &tc->deferred_bio_list);
  	bio_list_init(&tc->deferred_bio_list);
67324ea18   Mike Snitzer   dm thin: sort the...
1466

c140e1c4e   Mike Snitzer   dm thin: use per ...
1467
  	spin_unlock_irqrestore(&tc->lock, flags);
991d9fa02   Joe Thornber   dm: add thin prov...
1468

67324ea18   Mike Snitzer   dm thin: sort the...
1469
  	blk_start_plug(&plug);
991d9fa02   Joe Thornber   dm: add thin prov...
1470
  	while ((bio = bio_list_pop(&bios))) {
991d9fa02   Joe Thornber   dm: add thin prov...
1471
1472
1473
1474
1475
1476
  		/*
  		 * If we've got no free new_mapping structs, and processing
  		 * this bio might require one, we pause until there are some
  		 * prepared mappings to process.
  		 */
  		if (ensure_next_mapping(pool)) {
c140e1c4e   Mike Snitzer   dm thin: use per ...
1477
1478
1479
1480
  			spin_lock_irqsave(&tc->lock, flags);
  			bio_list_add(&tc->deferred_bio_list, bio);
  			bio_list_merge(&tc->deferred_bio_list, &bios);
  			spin_unlock_irqrestore(&tc->lock, flags);
991d9fa02   Joe Thornber   dm: add thin prov...
1481
1482
  			break;
  		}
104655fd4   Joe Thornber   dm thin: support ...
1483
1484
  
  		if (bio->bi_rw & REQ_DISCARD)
e49e58296   Joe Thornber   dm thin: add read...
1485
  			pool->process_discard(tc, bio);
104655fd4   Joe Thornber   dm thin: support ...
1486
  		else
e49e58296   Joe Thornber   dm thin: add read...
1487
  			pool->process_bio(tc, bio);
991d9fa02   Joe Thornber   dm: add thin prov...
1488
  	}
67324ea18   Mike Snitzer   dm thin: sort the...
1489
  	blk_finish_plug(&plug);
c140e1c4e   Mike Snitzer   dm thin: use per ...
1490
  }
b10ebd34c   Joe Thornber   dm thin: fix rcu_...
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
  static void thin_get(struct thin_c *tc);
  static void thin_put(struct thin_c *tc);
  
  /*
   * We can't hold rcu_read_lock() around code that can block.  So we
   * find a thin with the rcu lock held; bump a refcount; then drop
   * the lock.
   */
  static struct thin_c *get_first_thin(struct pool *pool)
  {
  	struct thin_c *tc = NULL;
  
  	rcu_read_lock();
  	if (!list_empty(&pool->active_thins)) {
  		tc = list_entry_rcu(pool->active_thins.next, struct thin_c, list);
  		thin_get(tc);
  	}
  	rcu_read_unlock();
  
  	return tc;
  }
  
  static struct thin_c *get_next_thin(struct pool *pool, struct thin_c *tc)
  {
  	struct thin_c *old_tc = tc;
  
  	rcu_read_lock();
  	list_for_each_entry_continue_rcu(tc, &pool->active_thins, list) {
  		thin_get(tc);
  		thin_put(old_tc);
  		rcu_read_unlock();
  		return tc;
  	}
  	thin_put(old_tc);
  	rcu_read_unlock();
  
  	return NULL;
  }
c140e1c4e   Mike Snitzer   dm thin: use per ...
1529
1530
1531
1532
1533
1534
  static void process_deferred_bios(struct pool *pool)
  {
  	unsigned long flags;
  	struct bio *bio;
  	struct bio_list bios;
  	struct thin_c *tc;
b10ebd34c   Joe Thornber   dm thin: fix rcu_...
1535
1536
  	tc = get_first_thin(pool);
  	while (tc) {
c140e1c4e   Mike Snitzer   dm thin: use per ...
1537
  		process_thin_deferred_bios(tc);
b10ebd34c   Joe Thornber   dm thin: fix rcu_...
1538
1539
  		tc = get_next_thin(pool, tc);
  	}
991d9fa02   Joe Thornber   dm: add thin prov...
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
  
  	/*
  	 * If there are any deferred flush bios, we must commit
  	 * the metadata before issuing them.
  	 */
  	bio_list_init(&bios);
  	spin_lock_irqsave(&pool->lock, flags);
  	bio_list_merge(&bios, &pool->deferred_flush_bios);
  	bio_list_init(&pool->deferred_flush_bios);
  	spin_unlock_irqrestore(&pool->lock, flags);
4d1662a30   Mike Snitzer   dm thin: avoid me...
1550
1551
  	if (bio_list_empty(&bios) &&
  	    !(dm_pool_changed_this_transaction(pool->pmd) && need_commit_due_to_time(pool)))
991d9fa02   Joe Thornber   dm: add thin prov...
1552
  		return;
020cc3b5e   Joe Thornber   dm thin: always f...
1553
  	if (commit(pool)) {
991d9fa02   Joe Thornber   dm: add thin prov...
1554
1555
1556
1557
  		while ((bio = bio_list_pop(&bios)))
  			bio_io_error(bio);
  		return;
  	}
905e51b39   Joe Thornber   dm thin: commit o...
1558
  	pool->last_commit_jiffies = jiffies;
991d9fa02   Joe Thornber   dm: add thin prov...
1559
1560
1561
1562
1563
1564
1565
1566
  
  	while ((bio = bio_list_pop(&bios)))
  		generic_make_request(bio);
  }
  
  static void do_worker(struct work_struct *ws)
  {
  	struct pool *pool = container_of(ws, struct pool, worker);
e49e58296   Joe Thornber   dm thin: add read...
1567
1568
  	process_prepared(pool, &pool->prepared_mappings, &pool->process_prepared_mapping);
  	process_prepared(pool, &pool->prepared_discards, &pool->process_prepared_discard);
991d9fa02   Joe Thornber   dm: add thin prov...
1569
1570
  	process_deferred_bios(pool);
  }
905e51b39   Joe Thornber   dm thin: commit o...
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
  /*
   * We want to commit periodically so that not too much
   * unwritten data builds up.
   */
  static void do_waker(struct work_struct *ws)
  {
  	struct pool *pool = container_of(to_delayed_work(ws), struct pool, waker);
  	wake_worker(pool);
  	queue_delayed_work(pool->wq, &pool->waker, COMMIT_PERIOD);
  }
85ad643b7   Joe Thornber   dm thin: add time...
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
  /*
   * We're holding onto IO to allow userland time to react.  After the
   * timeout either the pool will have been resized (and thus back in
   * PM_WRITE mode), or we degrade to PM_READ_ONLY and start erroring IO.
   */
  static void do_no_space_timeout(struct work_struct *ws)
  {
  	struct pool *pool = container_of(to_delayed_work(ws), struct pool,
  					 no_space_timeout);
  
  	if (get_pool_mode(pool) == PM_OUT_OF_DATA_SPACE && !pool->pf.error_if_no_space)
  		set_pool_mode(pool, PM_READ_ONLY);
  }
991d9fa02   Joe Thornber   dm: add thin prov...
1594
  /*----------------------------------------------------------------*/
e7a3e871d   Joe Thornber   dm thin: cleanup ...
1595
  struct pool_work {
738211f70   Joe Thornber   dm thin: fix nofl...
1596
  	struct work_struct worker;
e7a3e871d   Joe Thornber   dm thin: cleanup ...
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
  	struct completion complete;
  };
  
  static struct pool_work *to_pool_work(struct work_struct *ws)
  {
  	return container_of(ws, struct pool_work, worker);
  }
  
  static void pool_work_complete(struct pool_work *pw)
  {
  	complete(&pw->complete);
  }
738211f70   Joe Thornber   dm thin: fix nofl...
1609

e7a3e871d   Joe Thornber   dm thin: cleanup ...
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
  static void pool_work_wait(struct pool_work *pw, struct pool *pool,
  			   void (*fn)(struct work_struct *))
  {
  	INIT_WORK_ONSTACK(&pw->worker, fn);
  	init_completion(&pw->complete);
  	queue_work(pool->wq, &pw->worker);
  	wait_for_completion(&pw->complete);
  }
  
  /*----------------------------------------------------------------*/
  
  struct noflush_work {
  	struct pool_work pw;
  	struct thin_c *tc;
738211f70   Joe Thornber   dm thin: fix nofl...
1624
  };
e7a3e871d   Joe Thornber   dm thin: cleanup ...
1625
  static struct noflush_work *to_noflush(struct work_struct *ws)
738211f70   Joe Thornber   dm thin: fix nofl...
1626
  {
e7a3e871d   Joe Thornber   dm thin: cleanup ...
1627
  	return container_of(to_pool_work(ws), struct noflush_work, pw);
738211f70   Joe Thornber   dm thin: fix nofl...
1628
1629
1630
1631
  }
  
  static void do_noflush_start(struct work_struct *ws)
  {
e7a3e871d   Joe Thornber   dm thin: cleanup ...
1632
  	struct noflush_work *w = to_noflush(ws);
738211f70   Joe Thornber   dm thin: fix nofl...
1633
1634
  	w->tc->requeue_mode = true;
  	requeue_io(w->tc);
e7a3e871d   Joe Thornber   dm thin: cleanup ...
1635
  	pool_work_complete(&w->pw);
738211f70   Joe Thornber   dm thin: fix nofl...
1636
1637
1638
1639
  }
  
  static void do_noflush_stop(struct work_struct *ws)
  {
e7a3e871d   Joe Thornber   dm thin: cleanup ...
1640
  	struct noflush_work *w = to_noflush(ws);
738211f70   Joe Thornber   dm thin: fix nofl...
1641
  	w->tc->requeue_mode = false;
e7a3e871d   Joe Thornber   dm thin: cleanup ...
1642
  	pool_work_complete(&w->pw);
738211f70   Joe Thornber   dm thin: fix nofl...
1643
1644
1645
1646
1647
  }
  
  static void noflush_work(struct thin_c *tc, void (*fn)(struct work_struct *))
  {
  	struct noflush_work w;
738211f70   Joe Thornber   dm thin: fix nofl...
1648
  	w.tc = tc;
e7a3e871d   Joe Thornber   dm thin: cleanup ...
1649
  	pool_work_wait(&w.pw, tc->pool, fn);
738211f70   Joe Thornber   dm thin: fix nofl...
1650
1651
1652
  }
  
  /*----------------------------------------------------------------*/
e49e58296   Joe Thornber   dm thin: add read...
1653
1654
1655
1656
  static enum pool_mode get_pool_mode(struct pool *pool)
  {
  	return pool->pf.mode;
  }
3e1a06990   Joe Thornber   dm thin: fix out ...
1657
1658
1659
1660
1661
1662
  static void notify_of_pool_mode_change(struct pool *pool, const char *new_mode)
  {
  	dm_table_event(pool->ti->table);
  	DMINFO("%s: switching pool to %s mode",
  	       dm_device_name(pool->pool_md), new_mode);
  }
8b64e881e   Mike Snitzer   dm thin: fix set_...
1663
  static void set_pool_mode(struct pool *pool, enum pool_mode new_mode)
e49e58296   Joe Thornber   dm thin: add read...
1664
  {
cdc2b4158   Mike Snitzer   dm thin: synchron...
1665
  	struct pool_c *pt = pool->ti->private;
07f2b6e03   Mike Snitzer   dm thin: ensure u...
1666
1667
  	bool needs_check = dm_pool_metadata_needs_check(pool->pmd);
  	enum pool_mode old_mode = get_pool_mode(pool);
80c578930   Mike Snitzer   dm thin: add 'no_...
1668
  	unsigned long no_space_timeout = ACCESS_ONCE(no_space_timeout_secs) * HZ;
07f2b6e03   Mike Snitzer   dm thin: ensure u...
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
  
  	/*
  	 * Never allow the pool to transition to PM_WRITE mode if user
  	 * intervention is required to verify metadata and data consistency.
  	 */
  	if (new_mode == PM_WRITE && needs_check) {
  		DMERR("%s: unable to switch pool to write mode until repaired.",
  		      dm_device_name(pool->pool_md));
  		if (old_mode != new_mode)
  			new_mode = old_mode;
  		else
  			new_mode = PM_READ_ONLY;
  	}
  	/*
  	 * If we were in PM_FAIL mode, rollback of metadata failed.  We're
  	 * not going to recover without a thin_repair.	So we never let the
  	 * pool move out of the old mode.
  	 */
  	if (old_mode == PM_FAIL)
  		new_mode = old_mode;
e49e58296   Joe Thornber   dm thin: add read...
1689

8b64e881e   Mike Snitzer   dm thin: fix set_...
1690
  	switch (new_mode) {
e49e58296   Joe Thornber   dm thin: add read...
1691
  	case PM_FAIL:
8b64e881e   Mike Snitzer   dm thin: fix set_...
1692
  		if (old_mode != new_mode)
3e1a06990   Joe Thornber   dm thin: fix out ...
1693
  			notify_of_pool_mode_change(pool, "failure");
5383ef3a9   Joe Thornber   dm thin: re-estab...
1694
  		dm_pool_metadata_read_only(pool->pmd);
e49e58296   Joe Thornber   dm thin: add read...
1695
1696
1697
1698
  		pool->process_bio = process_bio_fail;
  		pool->process_discard = process_bio_fail;
  		pool->process_prepared_mapping = process_prepared_mapping_fail;
  		pool->process_prepared_discard = process_prepared_discard_fail;
3e1a06990   Joe Thornber   dm thin: fix out ...
1699
1700
  
  		error_retry_list(pool);
e49e58296   Joe Thornber   dm thin: add read...
1701
1702
1703
  		break;
  
  	case PM_READ_ONLY:
8b64e881e   Mike Snitzer   dm thin: fix set_...
1704
  		if (old_mode != new_mode)
3e1a06990   Joe Thornber   dm thin: fix out ...
1705
1706
1707
1708
1709
1710
1711
1712
1713
1714
1715
1716
1717
1718
1719
1720
1721
1722
1723
1724
1725
1726
1727
1728
1729
  			notify_of_pool_mode_change(pool, "read-only");
  		dm_pool_metadata_read_only(pool->pmd);
  		pool->process_bio = process_bio_read_only;
  		pool->process_discard = process_bio_success;
  		pool->process_prepared_mapping = process_prepared_mapping_fail;
  		pool->process_prepared_discard = process_prepared_discard_passdown;
  
  		error_retry_list(pool);
  		break;
  
  	case PM_OUT_OF_DATA_SPACE:
  		/*
  		 * Ideally we'd never hit this state; the low water mark
  		 * would trigger userland to extend the pool before we
  		 * completely run out of data space.  However, many small
  		 * IOs to unprovisioned space can consume data space at an
  		 * alarming rate.  Adjust your low water mark if you're
  		 * frequently seeing this mode.
  		 */
  		if (old_mode != new_mode)
  			notify_of_pool_mode_change(pool, "out-of-data-space");
  		pool->process_bio = process_bio_read_only;
  		pool->process_discard = process_discard;
  		pool->process_prepared_mapping = process_prepared_mapping;
  		pool->process_prepared_discard = process_prepared_discard_passdown;
85ad643b7   Joe Thornber   dm thin: add time...
1730

80c578930   Mike Snitzer   dm thin: add 'no_...
1731
1732
  		if (!pool->pf.error_if_no_space && no_space_timeout)
  			queue_delayed_work(pool->wq, &pool->no_space_timeout, no_space_timeout);
e49e58296   Joe Thornber   dm thin: add read...
1733
1734
1735
  		break;
  
  	case PM_WRITE:
8b64e881e   Mike Snitzer   dm thin: fix set_...
1736
  		if (old_mode != new_mode)
3e1a06990   Joe Thornber   dm thin: fix out ...
1737
  			notify_of_pool_mode_change(pool, "write");
9b7aaa64f   Joe Thornber   dm thin: allow po...
1738
  		dm_pool_metadata_read_write(pool->pmd);
e49e58296   Joe Thornber   dm thin: add read...
1739
1740
1741
1742
1743
1744
  		pool->process_bio = process_bio;
  		pool->process_discard = process_discard;
  		pool->process_prepared_mapping = process_prepared_mapping;
  		pool->process_prepared_discard = process_prepared_discard;
  		break;
  	}
8b64e881e   Mike Snitzer   dm thin: fix set_...
1745
1746
  
  	pool->pf.mode = new_mode;
cdc2b4158   Mike Snitzer   dm thin: synchron...
1747
1748
1749
1750
1751
  	/*
  	 * The pool mode may have changed, sync it so bind_control_target()
  	 * doesn't cause an unexpected mode transition on resume.
  	 */
  	pt->adjusted_pf.mode = new_mode;
e49e58296   Joe Thornber   dm thin: add read...
1752
  }
07f2b6e03   Mike Snitzer   dm thin: ensure u...
1753
  static void abort_transaction(struct pool *pool)
b53306558   Joe Thornber   dm thin: handle m...
1754
  {
07f2b6e03   Mike Snitzer   dm thin: ensure u...
1755
1756
1757
1758
1759
1760
1761
1762
1763
1764
1765
1766
1767
  	const char *dev_name = dm_device_name(pool->pool_md);
  
  	DMERR_LIMIT("%s: aborting current metadata transaction", dev_name);
  	if (dm_pool_abort_metadata(pool->pmd)) {
  		DMERR("%s: failed to abort metadata transaction", dev_name);
  		set_pool_mode(pool, PM_FAIL);
  	}
  
  	if (dm_pool_metadata_set_needs_check(pool->pmd)) {
  		DMERR("%s: failed to set 'needs_check' flag in metadata", dev_name);
  		set_pool_mode(pool, PM_FAIL);
  	}
  }
399caddfb   Mike Snitzer   dm thin: cleanup ...
1768

07f2b6e03   Mike Snitzer   dm thin: ensure u...
1769
1770
  static void metadata_operation_failed(struct pool *pool, const char *op, int r)
  {
b53306558   Joe Thornber   dm thin: handle m...
1771
1772
  	DMERR_LIMIT("%s: metadata operation '%s' failed: error = %d",
  		    dm_device_name(pool->pool_md), op, r);
07f2b6e03   Mike Snitzer   dm thin: ensure u...
1773
  	abort_transaction(pool);
b53306558   Joe Thornber   dm thin: handle m...
1774
1775
  	set_pool_mode(pool, PM_READ_ONLY);
  }
e49e58296   Joe Thornber   dm thin: add read...
1776
  /*----------------------------------------------------------------*/
991d9fa02   Joe Thornber   dm: add thin prov...
1777
1778
1779
1780
1781
1782
1783
1784
1785
1786
1787
  /*
   * Mapping functions.
   */
  
  /*
   * Called only while mapping a thin bio to hand it over to the workqueue.
   */
  static void thin_defer_bio(struct thin_c *tc, struct bio *bio)
  {
  	unsigned long flags;
  	struct pool *pool = tc->pool;
c140e1c4e   Mike Snitzer   dm thin: use per ...
1788
1789
1790
  	spin_lock_irqsave(&tc->lock, flags);
  	bio_list_add(&tc->deferred_bio_list, bio);
  	spin_unlock_irqrestore(&tc->lock, flags);
991d9fa02   Joe Thornber   dm: add thin prov...
1791
1792
1793
  
  	wake_worker(pool);
  }
59c3d2c6a   Mikulas Patocka   dm thin: dont use...
1794
  static void thin_hook_bio(struct thin_c *tc, struct bio *bio)
eb2aa48d4   Joe Thornber   dm thin: prepare ...
1795
  {
59c3d2c6a   Mikulas Patocka   dm thin: dont use...
1796
  	struct dm_thin_endio_hook *h = dm_per_bio_data(bio, sizeof(struct dm_thin_endio_hook));
eb2aa48d4   Joe Thornber   dm thin: prepare ...
1797
1798
1799
  
  	h->tc = tc;
  	h->shared_read_entry = NULL;
e8088073c   Joe Thornber   dm thin: fix race...
1800
  	h->all_io_entry = NULL;
eb2aa48d4   Joe Thornber   dm thin: prepare ...
1801
  	h->overwrite_mapping = NULL;
eb2aa48d4   Joe Thornber   dm thin: prepare ...
1802
  }
991d9fa02   Joe Thornber   dm: add thin prov...
1803
1804
1805
  /*
   * Non-blocking function called from the thin target's map function.
   */
7de3ee57d   Mikulas Patocka   dm: remove map_info
1806
  static int thin_bio_map(struct dm_target *ti, struct bio *bio)
991d9fa02   Joe Thornber   dm: add thin prov...
1807
1808
1809
1810
1811
1812
  {
  	int r;
  	struct thin_c *tc = ti->private;
  	dm_block_t block = get_bio_block(tc, bio);
  	struct dm_thin_device *td = tc->td;
  	struct dm_thin_lookup_result result;
025b96853   Joe Thornber   dm thin: remove c...
1813
1814
  	struct dm_bio_prison_cell cell1, cell2;
  	struct dm_bio_prison_cell *cell_result;
e8088073c   Joe Thornber   dm thin: fix race...
1815
  	struct dm_cell_key key;
991d9fa02   Joe Thornber   dm: add thin prov...
1816

59c3d2c6a   Mikulas Patocka   dm thin: dont use...
1817
  	thin_hook_bio(tc, bio);
e49e58296   Joe Thornber   dm thin: add read...
1818

738211f70   Joe Thornber   dm thin: fix nofl...
1819
1820
1821
1822
  	if (tc->requeue_mode) {
  		bio_endio(bio, DM_ENDIO_REQUEUE);
  		return DM_MAPIO_SUBMITTED;
  	}
e49e58296   Joe Thornber   dm thin: add read...
1823
1824
1825
1826
  	if (get_pool_mode(tc->pool) == PM_FAIL) {
  		bio_io_error(bio);
  		return DM_MAPIO_SUBMITTED;
  	}
104655fd4   Joe Thornber   dm thin: support ...
1827
  	if (bio->bi_rw & (REQ_DISCARD | REQ_FLUSH | REQ_FUA)) {
991d9fa02   Joe Thornber   dm: add thin prov...
1828
1829
1830
1831
1832
1833
1834
1835
1836
1837
1838
1839
1840
1841
1842
1843
1844
1845
1846
1847
1848
1849
1850
1851
1852
1853
1854
  		thin_defer_bio(tc, bio);
  		return DM_MAPIO_SUBMITTED;
  	}
  
  	r = dm_thin_find_block(td, block, 0, &result);
  
  	/*
  	 * Note that we defer readahead too.
  	 */
  	switch (r) {
  	case 0:
  		if (unlikely(result.shared)) {
  			/*
  			 * We have a race condition here between the
  			 * result.shared value returned by the lookup and
  			 * snapshot creation, which may cause new
  			 * sharing.
  			 *
  			 * To avoid this always quiesce the origin before
  			 * taking the snap.  You want to do this anyway to
  			 * ensure a consistent application view
  			 * (i.e. lockfs).
  			 *
  			 * More distant ancestors are irrelevant. The
  			 * shared flag will be set in their case.
  			 */
  			thin_defer_bio(tc, bio);
e8088073c   Joe Thornber   dm thin: fix race...
1855
  			return DM_MAPIO_SUBMITTED;
991d9fa02   Joe Thornber   dm: add thin prov...
1856
  		}
e8088073c   Joe Thornber   dm thin: fix race...
1857
1858
  
  		build_virtual_key(tc->td, block, &key);
025b96853   Joe Thornber   dm thin: remove c...
1859
  		if (dm_bio_detain(tc->pool->prison, &key, bio, &cell1, &cell_result))
e8088073c   Joe Thornber   dm thin: fix race...
1860
1861
1862
  			return DM_MAPIO_SUBMITTED;
  
  		build_data_key(tc->td, result.block, &key);
025b96853   Joe Thornber   dm thin: remove c...
1863
1864
  		if (dm_bio_detain(tc->pool->prison, &key, bio, &cell2, &cell_result)) {
  			cell_defer_no_holder_no_free(tc, &cell1);
e8088073c   Joe Thornber   dm thin: fix race...
1865
1866
1867
1868
  			return DM_MAPIO_SUBMITTED;
  		}
  
  		inc_all_io_entry(tc->pool, bio);
025b96853   Joe Thornber   dm thin: remove c...
1869
1870
  		cell_defer_no_holder_no_free(tc, &cell2);
  		cell_defer_no_holder_no_free(tc, &cell1);
e8088073c   Joe Thornber   dm thin: fix race...
1871
1872
1873
  
  		remap(tc, bio, result.block);
  		return DM_MAPIO_REMAPPED;
991d9fa02   Joe Thornber   dm: add thin prov...
1874
1875
  
  	case -ENODATA:
e49e58296   Joe Thornber   dm thin: add read...
1876
1877
1878
  		if (get_pool_mode(tc->pool) == PM_READ_ONLY) {
  			/*
  			 * This block isn't provisioned, and we have no way
8c0f0e8c9   Mike Snitzer   dm thin: requeue ...
1879
  			 * of doing so.
e49e58296   Joe Thornber   dm thin: add read...
1880
  			 */
8c0f0e8c9   Mike Snitzer   dm thin: requeue ...
1881
  			handle_unserviceable_bio(tc->pool, bio);
2aab38502   Joe Thornber   dm thin: cleanup ...
1882
  			return DM_MAPIO_SUBMITTED;
e49e58296   Joe Thornber   dm thin: add read...
1883
1884
1885
1886
  		}
  		/* fall through */
  
  	case -EWOULDBLOCK:
991d9fa02   Joe Thornber   dm: add thin prov...
1887
1888
1889
1890
  		/*
  		 * In future, the failed dm_thin_find_block above could
  		 * provide the hint to load the metadata into cache.
  		 */
991d9fa02   Joe Thornber   dm: add thin prov...
1891
  		thin_defer_bio(tc, bio);
2aab38502   Joe Thornber   dm thin: cleanup ...
1892
  		return DM_MAPIO_SUBMITTED;
e49e58296   Joe Thornber   dm thin: add read...
1893
1894
1895
1896
1897
1898
1899
1900
  
  	default:
  		/*
  		 * Must always call bio_io_error on failure.
  		 * dm_thin_find_block can fail with -EINVAL if the
  		 * pool is switched to fail-io mode.
  		 */
  		bio_io_error(bio);
2aab38502   Joe Thornber   dm thin: cleanup ...
1901
  		return DM_MAPIO_SUBMITTED;
991d9fa02   Joe Thornber   dm: add thin prov...
1902
  	}
991d9fa02   Joe Thornber   dm: add thin prov...
1903
1904
1905
1906
  }
  
  static int pool_is_congested(struct dm_target_callbacks *cb, int bdi_bits)
  {
991d9fa02   Joe Thornber   dm: add thin prov...
1907
  	struct pool_c *pt = container_of(cb, struct pool_c, callbacks);
760fe67e5   Mike Snitzer   dm thin: simplify...
1908
  	struct request_queue *q;
991d9fa02   Joe Thornber   dm: add thin prov...
1909

760fe67e5   Mike Snitzer   dm thin: simplify...
1910
1911
  	if (get_pool_mode(pt->pool) == PM_OUT_OF_DATA_SPACE)
  		return 1;
991d9fa02   Joe Thornber   dm: add thin prov...
1912

760fe67e5   Mike Snitzer   dm thin: simplify...
1913
1914
  	q = bdev_get_queue(pt->data_dev->bdev);
  	return bdi_congested(&q->backing_dev_info, bdi_bits);
991d9fa02   Joe Thornber   dm: add thin prov...
1915
  }
c140e1c4e   Mike Snitzer   dm thin: use per ...
1916
  static void requeue_bios(struct pool *pool)
991d9fa02   Joe Thornber   dm: add thin prov...
1917
  {
c140e1c4e   Mike Snitzer   dm thin: use per ...
1918
1919
1920
1921
1922
1923
1924
1925
1926
1927
1928
  	unsigned long flags;
  	struct thin_c *tc;
  
  	rcu_read_lock();
  	list_for_each_entry_rcu(tc, &pool->active_thins, list) {
  		spin_lock_irqsave(&tc->lock, flags);
  		bio_list_merge(&tc->deferred_bio_list, &tc->retry_on_resume_list);
  		bio_list_init(&tc->retry_on_resume_list);
  		spin_unlock_irqrestore(&tc->lock, flags);
  	}
  	rcu_read_unlock();
991d9fa02   Joe Thornber   dm: add thin prov...
1929
1930
1931
1932
1933
  }
  
  /*----------------------------------------------------------------
   * Binding of control targets to a pool object
   *--------------------------------------------------------------*/
9bc142dd7   Mike Snitzer   dm thin: tidy dis...
1934
1935
1936
1937
1938
1939
  static bool data_dev_supports_discard(struct pool_c *pt)
  {
  	struct request_queue *q = bdev_get_queue(pt->data_dev->bdev);
  
  	return q && blk_queue_discard(q);
  }
58051b94e   Joe Thornber   dm thin: fix non ...
1940
1941
1942
1943
  static bool is_factor(sector_t block_size, uint32_t n)
  {
  	return !sector_div(block_size, n);
  }
9bc142dd7   Mike Snitzer   dm thin: tidy dis...
1944
1945
  /*
   * If discard_passdown was enabled verify that the data device
0424caa14   Mike Snitzer   dm thin: fix disc...
1946
   * supports discards.  Disable discard_passdown if not.
9bc142dd7   Mike Snitzer   dm thin: tidy dis...
1947
   */
0424caa14   Mike Snitzer   dm thin: fix disc...
1948
  static void disable_passdown_if_not_supported(struct pool_c *pt)
9bc142dd7   Mike Snitzer   dm thin: tidy dis...
1949
  {
0424caa14   Mike Snitzer   dm thin: fix disc...
1950
1951
1952
1953
1954
  	struct pool *pool = pt->pool;
  	struct block_device *data_bdev = pt->data_dev->bdev;
  	struct queue_limits *data_limits = &bdev_get_queue(data_bdev)->limits;
  	sector_t block_size = pool->sectors_per_block << SECTOR_SHIFT;
  	const char *reason = NULL;
9bc142dd7   Mike Snitzer   dm thin: tidy dis...
1955
  	char buf[BDEVNAME_SIZE];
0424caa14   Mike Snitzer   dm thin: fix disc...
1956
  	if (!pt->adjusted_pf.discard_passdown)
9bc142dd7   Mike Snitzer   dm thin: tidy dis...
1957
  		return;
0424caa14   Mike Snitzer   dm thin: fix disc...
1958
1959
1960
1961
1962
  	if (!data_dev_supports_discard(pt))
  		reason = "discard unsupported";
  
  	else if (data_limits->max_discard_sectors < pool->sectors_per_block)
  		reason = "max discard sectors smaller than a block";
9bc142dd7   Mike Snitzer   dm thin: tidy dis...
1963

0424caa14   Mike Snitzer   dm thin: fix disc...
1964
1965
  	else if (data_limits->discard_granularity > block_size)
  		reason = "discard granularity larger than a block";
58051b94e   Joe Thornber   dm thin: fix non ...
1966
  	else if (!is_factor(block_size, data_limits->discard_granularity))
0424caa14   Mike Snitzer   dm thin: fix disc...
1967
1968
1969
1970
1971
1972
  		reason = "discard granularity not a factor of block size";
  
  	if (reason) {
  		DMWARN("Data device (%s) %s: Disabling discard passdown.", bdevname(data_bdev, buf), reason);
  		pt->adjusted_pf.discard_passdown = false;
  	}
9bc142dd7   Mike Snitzer   dm thin: tidy dis...
1973
  }
991d9fa02   Joe Thornber   dm: add thin prov...
1974
1975
1976
  static int bind_control_target(struct pool *pool, struct dm_target *ti)
  {
  	struct pool_c *pt = ti->private;
e49e58296   Joe Thornber   dm thin: add read...
1977
  	/*
9b7aaa64f   Joe Thornber   dm thin: allow po...
1978
  	 * We want to make sure that a pool in PM_FAIL mode is never upgraded.
e49e58296   Joe Thornber   dm thin: add read...
1979
  	 */
07f2b6e03   Mike Snitzer   dm thin: ensure u...
1980
  	enum pool_mode old_mode = get_pool_mode(pool);
0424caa14   Mike Snitzer   dm thin: fix disc...
1981
  	enum pool_mode new_mode = pt->adjusted_pf.mode;
e49e58296   Joe Thornber   dm thin: add read...
1982

9b7aaa64f   Joe Thornber   dm thin: allow po...
1983
  	/*
8b64e881e   Mike Snitzer   dm thin: fix set_...
1984
1985
1986
1987
1988
1989
1990
1991
1992
  	 * Don't change the pool's mode until set_pool_mode() below.
  	 * Otherwise the pool's process_* function pointers may
  	 * not match the desired pool mode.
  	 */
  	pt->adjusted_pf.mode = old_mode;
  
  	pool->ti = ti;
  	pool->pf = pt->adjusted_pf;
  	pool->low_water_blocks = pt->low_water_blocks;
9bc142dd7   Mike Snitzer   dm thin: tidy dis...
1993
  	set_pool_mode(pool, new_mode);
f402693d0   Mike Snitzer   dm thin: fix tabl...
1994

991d9fa02   Joe Thornber   dm: add thin prov...
1995
1996
1997
1998
1999
2000
2001
2002
2003
2004
2005
2006
  	return 0;
  }
  
  static void unbind_control_target(struct pool *pool, struct dm_target *ti)
  {
  	if (pool->ti == ti)
  		pool->ti = NULL;
  }
  
  /*----------------------------------------------------------------
   * Pool creation
   *--------------------------------------------------------------*/
67e2e2b28   Joe Thornber   dm thin: add pool...
2007
2008
2009
  /* Initialize pool features. */
  static void pool_features_init(struct pool_features *pf)
  {
e49e58296   Joe Thornber   dm thin: add read...
2010
  	pf->mode = PM_WRITE;
9bc142dd7   Mike Snitzer   dm thin: tidy dis...
2011
2012
2013
  	pf->zero_new_blocks = true;
  	pf->discard_enabled = true;
  	pf->discard_passdown = true;
787a996cb   Mike Snitzer   dm thin: add erro...
2014
  	pf->error_if_no_space = false;
67e2e2b28   Joe Thornber   dm thin: add pool...
2015
  }
991d9fa02   Joe Thornber   dm: add thin prov...
2016
2017
2018
2019
2020
2021
  static void __pool_destroy(struct pool *pool)
  {
  	__pool_table_remove(pool);
  
  	if (dm_pool_metadata_close(pool->pmd) < 0)
  		DMWARN("%s: dm_pool_metadata_close() failed.", __func__);
44feb387f   Mike Snitzer   dm thin: prepare ...
2022
  	dm_bio_prison_destroy(pool->prison);
991d9fa02   Joe Thornber   dm: add thin prov...
2023
2024
2025
2026
2027
2028
2029
2030
  	dm_kcopyd_client_destroy(pool->copier);
  
  	if (pool->wq)
  		destroy_workqueue(pool->wq);
  
  	if (pool->next_mapping)
  		mempool_free(pool->next_mapping, pool->mapping_pool);
  	mempool_destroy(pool->mapping_pool);
44feb387f   Mike Snitzer   dm thin: prepare ...
2031
2032
  	dm_deferred_set_destroy(pool->shared_read_ds);
  	dm_deferred_set_destroy(pool->all_io_ds);
991d9fa02   Joe Thornber   dm: add thin prov...
2033
2034
  	kfree(pool);
  }
a24c25696   Mike Snitzer   dm thin: use slab...
2035
  static struct kmem_cache *_new_mapping_cache;
a24c25696   Mike Snitzer   dm thin: use slab...
2036

991d9fa02   Joe Thornber   dm: add thin prov...
2037
2038
  static struct pool *pool_create(struct mapped_device *pool_md,
  				struct block_device *metadata_dev,
e49e58296   Joe Thornber   dm thin: add read...
2039
2040
  				unsigned long block_size,
  				int read_only, char **error)
991d9fa02   Joe Thornber   dm: add thin prov...
2041
2042
2043
2044
2045
  {
  	int r;
  	void *err_p;
  	struct pool *pool;
  	struct dm_pool_metadata *pmd;
e49e58296   Joe Thornber   dm thin: add read...
2046
  	bool format_device = read_only ? false : true;
991d9fa02   Joe Thornber   dm: add thin prov...
2047

e49e58296   Joe Thornber   dm thin: add read...
2048
  	pmd = dm_pool_metadata_open(metadata_dev, block_size, format_device);
991d9fa02   Joe Thornber   dm: add thin prov...
2049
2050
2051
2052
2053
2054
2055
2056
2057
2058
2059
2060
2061
2062
  	if (IS_ERR(pmd)) {
  		*error = "Error creating metadata object";
  		return (struct pool *)pmd;
  	}
  
  	pool = kmalloc(sizeof(*pool), GFP_KERNEL);
  	if (!pool) {
  		*error = "Error allocating memory for pool";
  		err_p = ERR_PTR(-ENOMEM);
  		goto bad_pool;
  	}
  
  	pool->pmd = pmd;
  	pool->sectors_per_block = block_size;
f9a8e0cd2   Mikulas Patocka   dm thin: optimize...
2063
2064
2065
2066
  	if (block_size & (block_size - 1))
  		pool->sectors_per_block_shift = -1;
  	else
  		pool->sectors_per_block_shift = __ffs(block_size);
991d9fa02   Joe Thornber   dm: add thin prov...
2067
  	pool->low_water_blocks = 0;
67e2e2b28   Joe Thornber   dm thin: add pool...
2068
  	pool_features_init(&pool->pf);
44feb387f   Mike Snitzer   dm thin: prepare ...
2069
  	pool->prison = dm_bio_prison_create(PRISON_CELLS);
991d9fa02   Joe Thornber   dm: add thin prov...
2070
2071
2072
2073
2074
  	if (!pool->prison) {
  		*error = "Error creating pool's bio prison";
  		err_p = ERR_PTR(-ENOMEM);
  		goto bad_prison;
  	}
df5d2e908   Mikulas Patocka   dm kcopyd: introd...
2075
  	pool->copier = dm_kcopyd_client_create(&dm_kcopyd_throttle);
991d9fa02   Joe Thornber   dm: add thin prov...
2076
2077
2078
2079
2080
2081
2082
2083
2084
2085
2086
2087
2088
2089
2090
2091
2092
2093
2094
  	if (IS_ERR(pool->copier)) {
  		r = PTR_ERR(pool->copier);
  		*error = "Error creating pool's kcopyd client";
  		err_p = ERR_PTR(r);
  		goto bad_kcopyd_client;
  	}
  
  	/*
  	 * Create singlethreaded workqueue that will service all devices
  	 * that use this metadata.
  	 */
  	pool->wq = alloc_ordered_workqueue("dm-" DM_MSG_PREFIX, WQ_MEM_RECLAIM);
  	if (!pool->wq) {
  		*error = "Error creating pool's workqueue";
  		err_p = ERR_PTR(-ENOMEM);
  		goto bad_wq;
  	}
  
  	INIT_WORK(&pool->worker, do_worker);
905e51b39   Joe Thornber   dm thin: commit o...
2095
  	INIT_DELAYED_WORK(&pool->waker, do_waker);
85ad643b7   Joe Thornber   dm thin: add time...
2096
  	INIT_DELAYED_WORK(&pool->no_space_timeout, do_no_space_timeout);
991d9fa02   Joe Thornber   dm: add thin prov...
2097
  	spin_lock_init(&pool->lock);
991d9fa02   Joe Thornber   dm: add thin prov...
2098
2099
  	bio_list_init(&pool->deferred_flush_bios);
  	INIT_LIST_HEAD(&pool->prepared_mappings);
104655fd4   Joe Thornber   dm thin: support ...
2100
  	INIT_LIST_HEAD(&pool->prepared_discards);
c140e1c4e   Mike Snitzer   dm thin: use per ...
2101
  	INIT_LIST_HEAD(&pool->active_thins);
88a6621be   Joe Thornber   dm thin: factor o...
2102
  	pool->low_water_triggered = false;
44feb387f   Mike Snitzer   dm thin: prepare ...
2103
2104
2105
2106
2107
2108
2109
2110
2111
2112
2113
2114
2115
2116
  
  	pool->shared_read_ds = dm_deferred_set_create();
  	if (!pool->shared_read_ds) {
  		*error = "Error creating pool's shared read deferred set";
  		err_p = ERR_PTR(-ENOMEM);
  		goto bad_shared_read_ds;
  	}
  
  	pool->all_io_ds = dm_deferred_set_create();
  	if (!pool->all_io_ds) {
  		*error = "Error creating pool's all io deferred set";
  		err_p = ERR_PTR(-ENOMEM);
  		goto bad_all_io_ds;
  	}
991d9fa02   Joe Thornber   dm: add thin prov...
2117
2118
  
  	pool->next_mapping = NULL;
a24c25696   Mike Snitzer   dm thin: use slab...
2119
2120
  	pool->mapping_pool = mempool_create_slab_pool(MAPPING_POOL_SIZE,
  						      _new_mapping_cache);
991d9fa02   Joe Thornber   dm: add thin prov...
2121
2122
2123
2124
2125
  	if (!pool->mapping_pool) {
  		*error = "Error creating pool's mapping mempool";
  		err_p = ERR_PTR(-ENOMEM);
  		goto bad_mapping_pool;
  	}
991d9fa02   Joe Thornber   dm: add thin prov...
2126
  	pool->ref_count = 1;
905e51b39   Joe Thornber   dm thin: commit o...
2127
  	pool->last_commit_jiffies = jiffies;
991d9fa02   Joe Thornber   dm: add thin prov...
2128
2129
2130
2131
2132
  	pool->pool_md = pool_md;
  	pool->md_dev = metadata_dev;
  	__pool_table_insert(pool);
  
  	return pool;
991d9fa02   Joe Thornber   dm: add thin prov...
2133
  bad_mapping_pool:
44feb387f   Mike Snitzer   dm thin: prepare ...
2134
2135
2136
2137
  	dm_deferred_set_destroy(pool->all_io_ds);
  bad_all_io_ds:
  	dm_deferred_set_destroy(pool->shared_read_ds);
  bad_shared_read_ds:
991d9fa02   Joe Thornber   dm: add thin prov...
2138
2139
2140
2141
  	destroy_workqueue(pool->wq);
  bad_wq:
  	dm_kcopyd_client_destroy(pool->copier);
  bad_kcopyd_client:
44feb387f   Mike Snitzer   dm thin: prepare ...
2142
  	dm_bio_prison_destroy(pool->prison);
991d9fa02   Joe Thornber   dm: add thin prov...
2143
2144
2145
2146
2147
2148
2149
2150
2151
2152
2153
2154
2155
2156
2157
2158
2159
2160
2161
2162
2163
2164
2165
2166
2167
  bad_prison:
  	kfree(pool);
  bad_pool:
  	if (dm_pool_metadata_close(pmd))
  		DMWARN("%s: dm_pool_metadata_close() failed.", __func__);
  
  	return err_p;
  }
  
  static void __pool_inc(struct pool *pool)
  {
  	BUG_ON(!mutex_is_locked(&dm_thin_pool_table.mutex));
  	pool->ref_count++;
  }
  
  static void __pool_dec(struct pool *pool)
  {
  	BUG_ON(!mutex_is_locked(&dm_thin_pool_table.mutex));
  	BUG_ON(!pool->ref_count);
  	if (!--pool->ref_count)
  		__pool_destroy(pool);
  }
  
  static struct pool *__pool_find(struct mapped_device *pool_md,
  				struct block_device *metadata_dev,
e49e58296   Joe Thornber   dm thin: add read...
2168
2169
  				unsigned long block_size, int read_only,
  				char **error, int *created)
991d9fa02   Joe Thornber   dm: add thin prov...
2170
2171
2172
2173
  {
  	struct pool *pool = __pool_table_lookup_metadata_dev(metadata_dev);
  
  	if (pool) {
f09996c99   Mike Snitzer   dm thin: provide ...
2174
2175
  		if (pool->pool_md != pool_md) {
  			*error = "metadata device already in use by a pool";
991d9fa02   Joe Thornber   dm: add thin prov...
2176
  			return ERR_PTR(-EBUSY);
f09996c99   Mike Snitzer   dm thin: provide ...
2177
  		}
991d9fa02   Joe Thornber   dm: add thin prov...
2178
2179
2180
2181
2182
  		__pool_inc(pool);
  
  	} else {
  		pool = __pool_table_lookup(pool_md);
  		if (pool) {
f09996c99   Mike Snitzer   dm thin: provide ...
2183
2184
  			if (pool->md_dev != metadata_dev) {
  				*error = "different pool cannot replace a pool";
991d9fa02   Joe Thornber   dm: add thin prov...
2185
  				return ERR_PTR(-EINVAL);
f09996c99   Mike Snitzer   dm thin: provide ...
2186
  			}
991d9fa02   Joe Thornber   dm: add thin prov...
2187
  			__pool_inc(pool);
67e2e2b28   Joe Thornber   dm thin: add pool...
2188
  		} else {
e49e58296   Joe Thornber   dm thin: add read...
2189
  			pool = pool_create(pool_md, metadata_dev, block_size, read_only, error);
67e2e2b28   Joe Thornber   dm thin: add pool...
2190
2191
  			*created = 1;
  		}
991d9fa02   Joe Thornber   dm: add thin prov...
2192
2193
2194
2195
2196
2197
2198
2199
2200
2201
2202
2203
2204
2205
2206
2207
2208
2209
2210
2211
2212
2213
  	}
  
  	return pool;
  }
  
  /*----------------------------------------------------------------
   * Pool target methods
   *--------------------------------------------------------------*/
  static void pool_dtr(struct dm_target *ti)
  {
  	struct pool_c *pt = ti->private;
  
  	mutex_lock(&dm_thin_pool_table.mutex);
  
  	unbind_control_target(pt->pool, ti);
  	__pool_dec(pt->pool);
  	dm_put_device(ti, pt->metadata_dev);
  	dm_put_device(ti, pt->data_dev);
  	kfree(pt);
  
  	mutex_unlock(&dm_thin_pool_table.mutex);
  }
991d9fa02   Joe Thornber   dm: add thin prov...
2214
2215
2216
2217
2218
2219
2220
2221
  static int parse_pool_features(struct dm_arg_set *as, struct pool_features *pf,
  			       struct dm_target *ti)
  {
  	int r;
  	unsigned argc;
  	const char *arg_name;
  
  	static struct dm_arg _args[] = {
74aa45c33   Mike Snitzer   dm thin: fix pool...
2222
  		{0, 4, "Invalid number of pool feature arguments"},
991d9fa02   Joe Thornber   dm: add thin prov...
2223
2224
2225
2226
2227
2228
2229
2230
2231
2232
2233
2234
2235
2236
2237
  	};
  
  	/*
  	 * No feature arguments supplied.
  	 */
  	if (!as->argc)
  		return 0;
  
  	r = dm_read_arg_group(_args, as, &argc, &ti->error);
  	if (r)
  		return -EINVAL;
  
  	while (argc && !r) {
  		arg_name = dm_shift_arg(as);
  		argc--;
e49e58296   Joe Thornber   dm thin: add read...
2238
  		if (!strcasecmp(arg_name, "skip_block_zeroing"))
9bc142dd7   Mike Snitzer   dm thin: tidy dis...
2239
  			pf->zero_new_blocks = false;
e49e58296   Joe Thornber   dm thin: add read...
2240
2241
  
  		else if (!strcasecmp(arg_name, "ignore_discard"))
9bc142dd7   Mike Snitzer   dm thin: tidy dis...
2242
  			pf->discard_enabled = false;
e49e58296   Joe Thornber   dm thin: add read...
2243
2244
  
  		else if (!strcasecmp(arg_name, "no_discard_passdown"))
9bc142dd7   Mike Snitzer   dm thin: tidy dis...
2245
  			pf->discard_passdown = false;
991d9fa02   Joe Thornber   dm: add thin prov...
2246

e49e58296   Joe Thornber   dm thin: add read...
2247
2248
  		else if (!strcasecmp(arg_name, "read_only"))
  			pf->mode = PM_READ_ONLY;
787a996cb   Mike Snitzer   dm thin: add erro...
2249
2250
  		else if (!strcasecmp(arg_name, "error_if_no_space"))
  			pf->error_if_no_space = true;
e49e58296   Joe Thornber   dm thin: add read...
2251
2252
2253
2254
2255
  		else {
  			ti->error = "Unrecognised pool feature requested";
  			r = -EINVAL;
  			break;
  		}
991d9fa02   Joe Thornber   dm: add thin prov...
2256
2257
2258
2259
  	}
  
  	return r;
  }
ac8c3f3df   Joe Thornber   dm thin: generate...
2260
2261
2262
2263
2264
2265
2266
2267
2268
  static void metadata_low_callback(void *context)
  {
  	struct pool *pool = context;
  
  	DMWARN("%s: reached low water mark for metadata device: sending event.",
  	       dm_device_name(pool->pool_md));
  
  	dm_table_event(pool->ti->table);
  }
7d48935ef   Mike Snitzer   dm thin: allow me...
2269
2270
2271
2272
2273
2274
  static sector_t get_dev_size(struct block_device *bdev)
  {
  	return i_size_read(bdev->bd_inode) >> SECTOR_SHIFT;
  }
  
  static void warn_if_metadata_device_too_big(struct block_device *bdev)
b17446df2   Joe Thornber   dm thin: refactor...
2275
  {
7d48935ef   Mike Snitzer   dm thin: allow me...
2276
  	sector_t metadata_dev_size = get_dev_size(bdev);
b17446df2   Joe Thornber   dm thin: refactor...
2277
  	char buffer[BDEVNAME_SIZE];
7d48935ef   Mike Snitzer   dm thin: allow me...
2278
  	if (metadata_dev_size > THIN_METADATA_MAX_SECTORS_WARNING)
b17446df2   Joe Thornber   dm thin: refactor...
2279
2280
  		DMWARN("Metadata device %s is larger than %u sectors: excess space will not be used.",
  		       bdevname(bdev, buffer), THIN_METADATA_MAX_SECTORS);
7d48935ef   Mike Snitzer   dm thin: allow me...
2281
2282
2283
2284
2285
2286
2287
2288
  }
  
  static sector_t get_metadata_dev_size(struct block_device *bdev)
  {
  	sector_t metadata_dev_size = get_dev_size(bdev);
  
  	if (metadata_dev_size > THIN_METADATA_MAX_SECTORS)
  		metadata_dev_size = THIN_METADATA_MAX_SECTORS;
b17446df2   Joe Thornber   dm thin: refactor...
2289
2290
2291
  
  	return metadata_dev_size;
  }
24347e959   Joe Thornber   dm thin: detect m...
2292
2293
2294
  static dm_block_t get_metadata_dev_size_in_blocks(struct block_device *bdev)
  {
  	sector_t metadata_dev_size = get_metadata_dev_size(bdev);
7d48935ef   Mike Snitzer   dm thin: allow me...
2295
  	sector_div(metadata_dev_size, THIN_METADATA_BLOCK_SIZE);
24347e959   Joe Thornber   dm thin: detect m...
2296
2297
2298
  
  	return metadata_dev_size;
  }
991d9fa02   Joe Thornber   dm: add thin prov...
2299
  /*
ac8c3f3df   Joe Thornber   dm thin: generate...
2300
2301
2302
2303
2304
2305
2306
2307
2308
2309
2310
2311
2312
2313
2314
2315
2316
   * When a metadata threshold is crossed a dm event is triggered, and
   * userland should respond by growing the metadata device.  We could let
   * userland set the threshold, like we do with the data threshold, but I'm
   * not sure they know enough to do this well.
   */
  static dm_block_t calc_metadata_threshold(struct pool_c *pt)
  {
  	/*
  	 * 4M is ample for all ops with the possible exception of thin
  	 * device deletion which is harmless if it fails (just retry the
  	 * delete after you've grown the device).
  	 */
  	dm_block_t quarter = get_metadata_dev_size_in_blocks(pt->metadata_dev->bdev) / 4;
  	return min((dm_block_t)1024ULL /* 4M */, quarter);
  }
  
  /*
991d9fa02   Joe Thornber   dm: add thin prov...
2317
2318
2319
2320
2321
2322
2323
   * thin-pool <metadata dev> <data dev>
   *	     <data block size (sectors)>
   *	     <low water mark (blocks)>
   *	     [<#feature args> [<arg>]*]
   *
   * Optional feature arguments are:
   *	     skip_block_zeroing: skips the zeroing of newly-provisioned blocks.
67e2e2b28   Joe Thornber   dm thin: add pool...
2324
2325
   *	     ignore_discard: disable discard
   *	     no_discard_passdown: don't pass discards down to the data device
787a996cb   Mike Snitzer   dm thin: add erro...
2326
2327
   *	     read_only: Don't allow any changes to be made to the pool metadata.
   *	     error_if_no_space: error IOs, instead of queueing, if no space.
991d9fa02   Joe Thornber   dm: add thin prov...
2328
2329
2330
   */
  static int pool_ctr(struct dm_target *ti, unsigned argc, char **argv)
  {
67e2e2b28   Joe Thornber   dm thin: add pool...
2331
  	int r, pool_created = 0;
991d9fa02   Joe Thornber   dm: add thin prov...
2332
2333
2334
2335
2336
2337
2338
2339
  	struct pool_c *pt;
  	struct pool *pool;
  	struct pool_features pf;
  	struct dm_arg_set as;
  	struct dm_dev *data_dev;
  	unsigned long block_size;
  	dm_block_t low_water_blocks;
  	struct dm_dev *metadata_dev;
5d0db96d1   Joe Thornber   dm thin: open dev...
2340
  	fmode_t metadata_mode;
991d9fa02   Joe Thornber   dm: add thin prov...
2341
2342
2343
2344
2345
2346
2347
2348
2349
2350
2351
  
  	/*
  	 * FIXME Remove validation from scope of lock.
  	 */
  	mutex_lock(&dm_thin_pool_table.mutex);
  
  	if (argc < 4) {
  		ti->error = "Invalid argument count";
  		r = -EINVAL;
  		goto out_unlock;
  	}
5d0db96d1   Joe Thornber   dm thin: open dev...
2352

991d9fa02   Joe Thornber   dm: add thin prov...
2353
2354
  	as.argc = argc;
  	as.argv = argv;
5d0db96d1   Joe Thornber   dm thin: open dev...
2355
2356
2357
2358
2359
2360
2361
2362
2363
2364
2365
2366
  	/*
  	 * Set default pool features.
  	 */
  	pool_features_init(&pf);
  
  	dm_consume_args(&as, 4);
  	r = parse_pool_features(&as, &pf, ti);
  	if (r)
  		goto out_unlock;
  
  	metadata_mode = FMODE_READ | ((pf.mode == PM_READ_ONLY) ? 0 : FMODE_WRITE);
  	r = dm_get_device(ti, argv[0], metadata_mode, &metadata_dev);
991d9fa02   Joe Thornber   dm: add thin prov...
2367
2368
2369
2370
  	if (r) {
  		ti->error = "Error opening metadata block device";
  		goto out_unlock;
  	}
7d48935ef   Mike Snitzer   dm thin: allow me...
2371
  	warn_if_metadata_device_too_big(metadata_dev->bdev);
991d9fa02   Joe Thornber   dm: add thin prov...
2372
2373
2374
2375
2376
2377
2378
2379
2380
2381
  
  	r = dm_get_device(ti, argv[1], FMODE_READ | FMODE_WRITE, &data_dev);
  	if (r) {
  		ti->error = "Error getting data device";
  		goto out_metadata;
  	}
  
  	if (kstrtoul(argv[2], 10, &block_size) || !block_size ||
  	    block_size < DATA_DEV_BLOCK_SIZE_MIN_SECTORS ||
  	    block_size > DATA_DEV_BLOCK_SIZE_MAX_SECTORS ||
55f2b8bdb   Mike Snitzer   dm thin: support ...
2382
  	    block_size & (DATA_DEV_BLOCK_SIZE_MIN_SECTORS - 1)) {
991d9fa02   Joe Thornber   dm: add thin prov...
2383
2384
2385
2386
2387
2388
2389
2390
2391
2392
  		ti->error = "Invalid block size";
  		r = -EINVAL;
  		goto out;
  	}
  
  	if (kstrtoull(argv[3], 10, (unsigned long long *)&low_water_blocks)) {
  		ti->error = "Invalid low water mark";
  		r = -EINVAL;
  		goto out;
  	}
991d9fa02   Joe Thornber   dm: add thin prov...
2393
2394
2395
2396
2397
2398
2399
  	pt = kzalloc(sizeof(*pt), GFP_KERNEL);
  	if (!pt) {
  		r = -ENOMEM;
  		goto out;
  	}
  
  	pool = __pool_find(dm_table_get_md(ti->table), metadata_dev->bdev,
e49e58296   Joe Thornber   dm thin: add read...
2400
  			   block_size, pf.mode == PM_READ_ONLY, &ti->error, &pool_created);
991d9fa02   Joe Thornber   dm: add thin prov...
2401
2402
2403
2404
  	if (IS_ERR(pool)) {
  		r = PTR_ERR(pool);
  		goto out_free_pt;
  	}
67e2e2b28   Joe Thornber   dm thin: add pool...
2405
2406
2407
2408
2409
2410
2411
2412
2413
2414
2415
  	/*
  	 * 'pool_created' reflects whether this is the first table load.
  	 * Top level discard support is not allowed to be changed after
  	 * initial load.  This would require a pool reload to trigger thin
  	 * device changes.
  	 */
  	if (!pool_created && pf.discard_enabled != pool->pf.discard_enabled) {
  		ti->error = "Discard support cannot be disabled once enabled";
  		r = -EINVAL;
  		goto out_flags_changed;
  	}
991d9fa02   Joe Thornber   dm: add thin prov...
2416
2417
2418
2419
2420
  	pt->pool = pool;
  	pt->ti = ti;
  	pt->metadata_dev = metadata_dev;
  	pt->data_dev = data_dev;
  	pt->low_water_blocks = low_water_blocks;
0424caa14   Mike Snitzer   dm thin: fix disc...
2421
  	pt->adjusted_pf = pt->requested_pf = pf;
55a62eef8   Alasdair G Kergon   dm: rename reques...
2422
  	ti->num_flush_bios = 1;
9bc142dd7   Mike Snitzer   dm thin: tidy dis...
2423

67e2e2b28   Joe Thornber   dm thin: add pool...
2424
2425
2426
2427
2428
  	/*
  	 * Only need to enable discards if the pool should pass
  	 * them down to the data device.  The thin device's discard
  	 * processing will cause mappings to be removed from the btree.
  	 */
b60ab990c   Mike Snitzer   dm thin: do not e...
2429
  	ti->discard_zeroes_data_unsupported = true;
67e2e2b28   Joe Thornber   dm thin: add pool...
2430
  	if (pf.discard_enabled && pf.discard_passdown) {
55a62eef8   Alasdair G Kergon   dm: rename reques...
2431
  		ti->num_discard_bios = 1;
9bc142dd7   Mike Snitzer   dm thin: tidy dis...
2432

67e2e2b28   Joe Thornber   dm thin: add pool...
2433
2434
2435
2436
2437
  		/*
  		 * Setting 'discards_supported' circumvents the normal
  		 * stacking of discard limits (this keeps the pool and
  		 * thin devices' discard limits consistent).
  		 */
0ac55489d   Alasdair G Kergon   dm: use bool bitf...
2438
  		ti->discards_supported = true;
67e2e2b28   Joe Thornber   dm thin: add pool...
2439
  	}
991d9fa02   Joe Thornber   dm: add thin prov...
2440
  	ti->private = pt;
ac8c3f3df   Joe Thornber   dm thin: generate...
2441
2442
2443
2444
2445
2446
  	r = dm_pool_register_metadata_threshold(pt->pool->pmd,
  						calc_metadata_threshold(pt),
  						metadata_low_callback,
  						pool);
  	if (r)
  		goto out_free_pt;
991d9fa02   Joe Thornber   dm: add thin prov...
2447
2448
2449
2450
2451
2452
  	pt->callbacks.congested_fn = pool_is_congested;
  	dm_table_add_target_callbacks(ti->table, &pt->callbacks);
  
  	mutex_unlock(&dm_thin_pool_table.mutex);
  
  	return 0;
67e2e2b28   Joe Thornber   dm thin: add pool...
2453
2454
  out_flags_changed:
  	__pool_dec(pool);
991d9fa02   Joe Thornber   dm: add thin prov...
2455
2456
2457
2458
2459
2460
2461
2462
2463
2464
2465
  out_free_pt:
  	kfree(pt);
  out:
  	dm_put_device(ti, data_dev);
  out_metadata:
  	dm_put_device(ti, metadata_dev);
  out_unlock:
  	mutex_unlock(&dm_thin_pool_table.mutex);
  
  	return r;
  }
7de3ee57d   Mikulas Patocka   dm: remove map_info
2466
  static int pool_map(struct dm_target *ti, struct bio *bio)
991d9fa02   Joe Thornber   dm: add thin prov...
2467
2468
2469
2470
2471
2472
2473
2474
2475
2476
2477
2478
2479
2480
2481
2482
  {
  	int r;
  	struct pool_c *pt = ti->private;
  	struct pool *pool = pt->pool;
  	unsigned long flags;
  
  	/*
  	 * As this is a singleton target, ti->begin is always zero.
  	 */
  	spin_lock_irqsave(&pool->lock, flags);
  	bio->bi_bdev = pt->data_dev->bdev;
  	r = DM_MAPIO_REMAPPED;
  	spin_unlock_irqrestore(&pool->lock, flags);
  
  	return r;
  }
b17446df2   Joe Thornber   dm thin: refactor...
2483
  static int maybe_resize_data_dev(struct dm_target *ti, bool *need_commit)
991d9fa02   Joe Thornber   dm: add thin prov...
2484
2485
2486
2487
  {
  	int r;
  	struct pool_c *pt = ti->private;
  	struct pool *pool = pt->pool;
55f2b8bdb   Mike Snitzer   dm thin: support ...
2488
2489
  	sector_t data_size = ti->len;
  	dm_block_t sb_data_size;
991d9fa02   Joe Thornber   dm: add thin prov...
2490

b17446df2   Joe Thornber   dm thin: refactor...
2491
  	*need_commit = false;
991d9fa02   Joe Thornber   dm: add thin prov...
2492

55f2b8bdb   Mike Snitzer   dm thin: support ...
2493
  	(void) sector_div(data_size, pool->sectors_per_block);
991d9fa02   Joe Thornber   dm: add thin prov...
2494
2495
  	r = dm_pool_get_data_dev_size(pool->pmd, &sb_data_size);
  	if (r) {
4fa5971a6   Mike Snitzer   dm thin: prefix p...
2496
2497
  		DMERR("%s: failed to retrieve data device size",
  		      dm_device_name(pool->pool_md));
991d9fa02   Joe Thornber   dm: add thin prov...
2498
2499
2500
2501
  		return r;
  	}
  
  	if (data_size < sb_data_size) {
4fa5971a6   Mike Snitzer   dm thin: prefix p...
2502
2503
  		DMERR("%s: pool target (%llu blocks) too small: expected %llu",
  		      dm_device_name(pool->pool_md),
55f2b8bdb   Mike Snitzer   dm thin: support ...
2504
  		      (unsigned long long)data_size, sb_data_size);
991d9fa02   Joe Thornber   dm: add thin prov...
2505
2506
2507
  		return -EINVAL;
  
  	} else if (data_size > sb_data_size) {
07f2b6e03   Mike Snitzer   dm thin: ensure u...
2508
2509
2510
2511
2512
  		if (dm_pool_metadata_needs_check(pool->pmd)) {
  			DMERR("%s: unable to grow the data device until repaired.",
  			      dm_device_name(pool->pool_md));
  			return 0;
  		}
6f7f51d43   Mike Snitzer   dm thin: log info...
2513
2514
2515
2516
  		if (sb_data_size)
  			DMINFO("%s: growing the data device from %llu to %llu blocks",
  			       dm_device_name(pool->pool_md),
  			       sb_data_size, (unsigned long long)data_size);
991d9fa02   Joe Thornber   dm: add thin prov...
2517
2518
  		r = dm_pool_resize_data_dev(pool->pmd, data_size);
  		if (r) {
b53306558   Joe Thornber   dm thin: handle m...
2519
  			metadata_operation_failed(pool, "dm_pool_resize_data_dev", r);
991d9fa02   Joe Thornber   dm: add thin prov...
2520
2521
  			return r;
  		}
b17446df2   Joe Thornber   dm thin: refactor...
2522
  		*need_commit = true;
991d9fa02   Joe Thornber   dm: add thin prov...
2523
2524
2525
2526
  	}
  
  	return 0;
  }
24347e959   Joe Thornber   dm thin: detect m...
2527
2528
2529
2530
2531
2532
2533
2534
  static int maybe_resize_metadata_dev(struct dm_target *ti, bool *need_commit)
  {
  	int r;
  	struct pool_c *pt = ti->private;
  	struct pool *pool = pt->pool;
  	dm_block_t metadata_dev_size, sb_metadata_dev_size;
  
  	*need_commit = false;
610bba8b9   Alasdair G Kergon   dm thin: fix meta...
2535
  	metadata_dev_size = get_metadata_dev_size_in_blocks(pool->md_dev);
24347e959   Joe Thornber   dm thin: detect m...
2536
2537
2538
  
  	r = dm_pool_get_metadata_dev_size(pool->pmd, &sb_metadata_dev_size);
  	if (r) {
4fa5971a6   Mike Snitzer   dm thin: prefix p...
2539
2540
  		DMERR("%s: failed to retrieve metadata device size",
  		      dm_device_name(pool->pool_md));
24347e959   Joe Thornber   dm thin: detect m...
2541
2542
2543
2544
  		return r;
  	}
  
  	if (metadata_dev_size < sb_metadata_dev_size) {
4fa5971a6   Mike Snitzer   dm thin: prefix p...
2545
2546
  		DMERR("%s: metadata device (%llu blocks) too small: expected %llu",
  		      dm_device_name(pool->pool_md),
24347e959   Joe Thornber   dm thin: detect m...
2547
2548
2549
2550
  		      metadata_dev_size, sb_metadata_dev_size);
  		return -EINVAL;
  
  	} else if (metadata_dev_size > sb_metadata_dev_size) {
07f2b6e03   Mike Snitzer   dm thin: ensure u...
2551
2552
2553
2554
2555
  		if (dm_pool_metadata_needs_check(pool->pmd)) {
  			DMERR("%s: unable to grow the metadata device until repaired.",
  			      dm_device_name(pool->pool_md));
  			return 0;
  		}
7d48935ef   Mike Snitzer   dm thin: allow me...
2556
  		warn_if_metadata_device_too_big(pool->md_dev);
6f7f51d43   Mike Snitzer   dm thin: log info...
2557
2558
2559
  		DMINFO("%s: growing the metadata device from %llu to %llu blocks",
  		       dm_device_name(pool->pool_md),
  		       sb_metadata_dev_size, metadata_dev_size);
24347e959   Joe Thornber   dm thin: detect m...
2560
2561
  		r = dm_pool_resize_metadata_dev(pool->pmd, metadata_dev_size);
  		if (r) {
b53306558   Joe Thornber   dm thin: handle m...
2562
  			metadata_operation_failed(pool, "dm_pool_resize_metadata_dev", r);
24347e959   Joe Thornber   dm thin: detect m...
2563
2564
2565
2566
2567
2568
2569
2570
  			return r;
  		}
  
  		*need_commit = true;
  	}
  
  	return 0;
  }
b17446df2   Joe Thornber   dm thin: refactor...
2571
2572
2573
2574
2575
2576
2577
2578
2579
2580
2581
2582
2583
2584
  /*
   * Retrieves the number of blocks of the data device from
   * the superblock and compares it to the actual device size,
   * thus resizing the data device in case it has grown.
   *
   * This both copes with opening preallocated data devices in the ctr
   * being followed by a resume
   * -and-
   * calling the resume method individually after userspace has
   * grown the data device in reaction to a table event.
   */
  static int pool_preresume(struct dm_target *ti)
  {
  	int r;
24347e959   Joe Thornber   dm thin: detect m...
2585
  	bool need_commit1, need_commit2;
b17446df2   Joe Thornber   dm thin: refactor...
2586
2587
2588
2589
2590
2591
2592
2593
2594
2595
2596
2597
2598
  	struct pool_c *pt = ti->private;
  	struct pool *pool = pt->pool;
  
  	/*
  	 * Take control of the pool object.
  	 */
  	r = bind_control_target(pool, ti);
  	if (r)
  		return r;
  
  	r = maybe_resize_data_dev(ti, &need_commit1);
  	if (r)
  		return r;
24347e959   Joe Thornber   dm thin: detect m...
2599
2600
2601
2602
2603
  	r = maybe_resize_metadata_dev(ti, &need_commit2);
  	if (r)
  		return r;
  
  	if (need_commit1 || need_commit2)
020cc3b5e   Joe Thornber   dm thin: always f...
2604
  		(void) commit(pool);
b17446df2   Joe Thornber   dm thin: refactor...
2605
2606
2607
  
  	return 0;
  }
991d9fa02   Joe Thornber   dm: add thin prov...
2608
2609
2610
2611
2612
2613
2614
  static void pool_resume(struct dm_target *ti)
  {
  	struct pool_c *pt = ti->private;
  	struct pool *pool = pt->pool;
  	unsigned long flags;
  
  	spin_lock_irqsave(&pool->lock, flags);
88a6621be   Joe Thornber   dm thin: factor o...
2615
  	pool->low_water_triggered = false;
991d9fa02   Joe Thornber   dm: add thin prov...
2616
  	spin_unlock_irqrestore(&pool->lock, flags);
c140e1c4e   Mike Snitzer   dm thin: use per ...
2617
  	requeue_bios(pool);
991d9fa02   Joe Thornber   dm: add thin prov...
2618

905e51b39   Joe Thornber   dm thin: commit o...
2619
  	do_waker(&pool->waker.work);
991d9fa02   Joe Thornber   dm: add thin prov...
2620
2621
2622
2623
  }
  
  static void pool_postsuspend(struct dm_target *ti)
  {
991d9fa02   Joe Thornber   dm: add thin prov...
2624
2625
  	struct pool_c *pt = ti->private;
  	struct pool *pool = pt->pool;
905e51b39   Joe Thornber   dm thin: commit o...
2626
  	cancel_delayed_work(&pool->waker);
85ad643b7   Joe Thornber   dm thin: add time...
2627
  	cancel_delayed_work(&pool->no_space_timeout);
991d9fa02   Joe Thornber   dm: add thin prov...
2628
  	flush_workqueue(pool->wq);
020cc3b5e   Joe Thornber   dm thin: always f...
2629
  	(void) commit(pool);
991d9fa02   Joe Thornber   dm: add thin prov...
2630
2631
2632
2633
2634
2635
2636
2637
2638
2639
2640
2641
2642
2643
2644
2645
2646
2647
2648
2649
2650
2651
2652
2653
2654
2655
2656
2657
2658
2659
2660
2661
2662
2663
2664
2665
2666
2667
2668
2669
2670
2671
2672
2673
2674
2675
2676
2677
2678
2679
2680
2681
2682
2683
2684
2685
2686
2687
2688
2689
2690
2691
2692
2693
2694
2695
2696
2697
2698
2699
2700
2701
2702
2703
2704
2705
2706
2707
2708
2709
2710
2711
2712
2713
2714
2715
2716
2717
2718
2719
2720
2721
2722
2723
2724
2725
2726
2727
2728
2729
2730
2731
2732
2733
2734
2735
2736
2737
2738
2739
2740
2741
2742
2743
2744
2745
2746
2747
2748
2749
2750
2751
2752
2753
  }
  
  static int check_arg_count(unsigned argc, unsigned args_required)
  {
  	if (argc != args_required) {
  		DMWARN("Message received with %u arguments instead of %u.",
  		       argc, args_required);
  		return -EINVAL;
  	}
  
  	return 0;
  }
  
  static int read_dev_id(char *arg, dm_thin_id *dev_id, int warning)
  {
  	if (!kstrtoull(arg, 10, (unsigned long long *)dev_id) &&
  	    *dev_id <= MAX_DEV_ID)
  		return 0;
  
  	if (warning)
  		DMWARN("Message received with invalid device id: %s", arg);
  
  	return -EINVAL;
  }
  
  static int process_create_thin_mesg(unsigned argc, char **argv, struct pool *pool)
  {
  	dm_thin_id dev_id;
  	int r;
  
  	r = check_arg_count(argc, 2);
  	if (r)
  		return r;
  
  	r = read_dev_id(argv[1], &dev_id, 1);
  	if (r)
  		return r;
  
  	r = dm_pool_create_thin(pool->pmd, dev_id);
  	if (r) {
  		DMWARN("Creation of new thinly-provisioned device with id %s failed.",
  		       argv[1]);
  		return r;
  	}
  
  	return 0;
  }
  
  static int process_create_snap_mesg(unsigned argc, char **argv, struct pool *pool)
  {
  	dm_thin_id dev_id;
  	dm_thin_id origin_dev_id;
  	int r;
  
  	r = check_arg_count(argc, 3);
  	if (r)
  		return r;
  
  	r = read_dev_id(argv[1], &dev_id, 1);
  	if (r)
  		return r;
  
  	r = read_dev_id(argv[2], &origin_dev_id, 1);
  	if (r)
  		return r;
  
  	r = dm_pool_create_snap(pool->pmd, dev_id, origin_dev_id);
  	if (r) {
  		DMWARN("Creation of new snapshot %s of device %s failed.",
  		       argv[1], argv[2]);
  		return r;
  	}
  
  	return 0;
  }
  
  static int process_delete_mesg(unsigned argc, char **argv, struct pool *pool)
  {
  	dm_thin_id dev_id;
  	int r;
  
  	r = check_arg_count(argc, 2);
  	if (r)
  		return r;
  
  	r = read_dev_id(argv[1], &dev_id, 1);
  	if (r)
  		return r;
  
  	r = dm_pool_delete_thin_device(pool->pmd, dev_id);
  	if (r)
  		DMWARN("Deletion of thin device %s failed.", argv[1]);
  
  	return r;
  }
  
  static int process_set_transaction_id_mesg(unsigned argc, char **argv, struct pool *pool)
  {
  	dm_thin_id old_id, new_id;
  	int r;
  
  	r = check_arg_count(argc, 3);
  	if (r)
  		return r;
  
  	if (kstrtoull(argv[1], 10, (unsigned long long *)&old_id)) {
  		DMWARN("set_transaction_id message: Unrecognised id %s.", argv[1]);
  		return -EINVAL;
  	}
  
  	if (kstrtoull(argv[2], 10, (unsigned long long *)&new_id)) {
  		DMWARN("set_transaction_id message: Unrecognised new id %s.", argv[2]);
  		return -EINVAL;
  	}
  
  	r = dm_pool_set_metadata_transaction_id(pool->pmd, old_id, new_id);
  	if (r) {
  		DMWARN("Failed to change transaction id from %s to %s.",
  		       argv[1], argv[2]);
  		return r;
  	}
  
  	return 0;
  }
cc8394d86   Joe Thornber   dm thin: provide ...
2754
2755
2756
2757
2758
2759
2760
  static int process_reserve_metadata_snap_mesg(unsigned argc, char **argv, struct pool *pool)
  {
  	int r;
  
  	r = check_arg_count(argc, 1);
  	if (r)
  		return r;
020cc3b5e   Joe Thornber   dm thin: always f...
2761
  	(void) commit(pool);
0d200aefd   Joe Thornber   dm thin: commit m...
2762

cc8394d86   Joe Thornber   dm thin: provide ...
2763
2764
2765
2766
2767
2768
2769
2770
2771
2772
2773
2774
2775
2776
2777
2778
2779
2780
2781
2782
2783
  	r = dm_pool_reserve_metadata_snap(pool->pmd);
  	if (r)
  		DMWARN("reserve_metadata_snap message failed.");
  
  	return r;
  }
  
  static int process_release_metadata_snap_mesg(unsigned argc, char **argv, struct pool *pool)
  {
  	int r;
  
  	r = check_arg_count(argc, 1);
  	if (r)
  		return r;
  
  	r = dm_pool_release_metadata_snap(pool->pmd);
  	if (r)
  		DMWARN("release_metadata_snap message failed.");
  
  	return r;
  }
991d9fa02   Joe Thornber   dm: add thin prov...
2784
2785
2786
2787
2788
2789
2790
  /*
   * Messages supported:
   *   create_thin	<dev_id>
   *   create_snap	<dev_id> <origin_id>
   *   delete		<dev_id>
   *   trim		<dev_id> <new_size_in_sectors>
   *   set_transaction_id <current_trans_id> <new_trans_id>
cc8394d86   Joe Thornber   dm thin: provide ...
2791
2792
   *   reserve_metadata_snap
   *   release_metadata_snap
991d9fa02   Joe Thornber   dm: add thin prov...
2793
2794
2795
2796
2797
2798
2799
2800
2801
2802
2803
2804
2805
2806
2807
2808
2809
2810
   */
  static int pool_message(struct dm_target *ti, unsigned argc, char **argv)
  {
  	int r = -EINVAL;
  	struct pool_c *pt = ti->private;
  	struct pool *pool = pt->pool;
  
  	if (!strcasecmp(argv[0], "create_thin"))
  		r = process_create_thin_mesg(argc, argv, pool);
  
  	else if (!strcasecmp(argv[0], "create_snap"))
  		r = process_create_snap_mesg(argc, argv, pool);
  
  	else if (!strcasecmp(argv[0], "delete"))
  		r = process_delete_mesg(argc, argv, pool);
  
  	else if (!strcasecmp(argv[0], "set_transaction_id"))
  		r = process_set_transaction_id_mesg(argc, argv, pool);
cc8394d86   Joe Thornber   dm thin: provide ...
2811
2812
2813
2814
2815
  	else if (!strcasecmp(argv[0], "reserve_metadata_snap"))
  		r = process_reserve_metadata_snap_mesg(argc, argv, pool);
  
  	else if (!strcasecmp(argv[0], "release_metadata_snap"))
  		r = process_release_metadata_snap_mesg(argc, argv, pool);
991d9fa02   Joe Thornber   dm: add thin prov...
2816
2817
  	else
  		DMWARN("Unrecognised thin pool target message received: %s", argv[0]);
e49e58296   Joe Thornber   dm thin: add read...
2818
  	if (!r)
020cc3b5e   Joe Thornber   dm thin: always f...
2819
  		(void) commit(pool);
991d9fa02   Joe Thornber   dm: add thin prov...
2820
2821
2822
  
  	return r;
  }
e49e58296   Joe Thornber   dm thin: add read...
2823
2824
2825
2826
  static void emit_flags(struct pool_features *pf, char *result,
  		       unsigned sz, unsigned maxlen)
  {
  	unsigned count = !pf->zero_new_blocks + !pf->discard_enabled +
787a996cb   Mike Snitzer   dm thin: add erro...
2827
2828
  		!pf->discard_passdown + (pf->mode == PM_READ_ONLY) +
  		pf->error_if_no_space;
e49e58296   Joe Thornber   dm thin: add read...
2829
2830
2831
2832
2833
2834
2835
2836
2837
2838
2839
2840
2841
  	DMEMIT("%u ", count);
  
  	if (!pf->zero_new_blocks)
  		DMEMIT("skip_block_zeroing ");
  
  	if (!pf->discard_enabled)
  		DMEMIT("ignore_discard ");
  
  	if (!pf->discard_passdown)
  		DMEMIT("no_discard_passdown ");
  
  	if (pf->mode == PM_READ_ONLY)
  		DMEMIT("read_only ");
787a996cb   Mike Snitzer   dm thin: add erro...
2842
2843
2844
  
  	if (pf->error_if_no_space)
  		DMEMIT("error_if_no_space ");
e49e58296   Joe Thornber   dm thin: add read...
2845
  }
991d9fa02   Joe Thornber   dm: add thin prov...
2846
2847
2848
2849
2850
  /*
   * Status line is:
   *    <transaction id> <used metadata sectors>/<total metadata sectors>
   *    <used data sectors>/<total data sectors> <held metadata root>
   */
fd7c092e7   Mikulas Patocka   dm: fix truncated...
2851
2852
  static void pool_status(struct dm_target *ti, status_type_t type,
  			unsigned status_flags, char *result, unsigned maxlen)
991d9fa02   Joe Thornber   dm: add thin prov...
2853
  {
e49e58296   Joe Thornber   dm thin: add read...
2854
  	int r;
991d9fa02   Joe Thornber   dm: add thin prov...
2855
2856
2857
2858
2859
2860
2861
2862
2863
2864
2865
2866
2867
2868
  	unsigned sz = 0;
  	uint64_t transaction_id;
  	dm_block_t nr_free_blocks_data;
  	dm_block_t nr_free_blocks_metadata;
  	dm_block_t nr_blocks_data;
  	dm_block_t nr_blocks_metadata;
  	dm_block_t held_root;
  	char buf[BDEVNAME_SIZE];
  	char buf2[BDEVNAME_SIZE];
  	struct pool_c *pt = ti->private;
  	struct pool *pool = pt->pool;
  
  	switch (type) {
  	case STATUSTYPE_INFO:
e49e58296   Joe Thornber   dm thin: add read...
2869
2870
2871
2872
  		if (get_pool_mode(pool) == PM_FAIL) {
  			DMEMIT("Fail");
  			break;
  		}
1f4e0ff07   Alasdair G Kergon   dm thin: commit b...
2873
2874
  		/* Commit to ensure statistics aren't out-of-date */
  		if (!(status_flags & DM_STATUS_NOFLUSH_FLAG) && !dm_suspended(ti))
020cc3b5e   Joe Thornber   dm thin: always f...
2875
  			(void) commit(pool);
1f4e0ff07   Alasdair G Kergon   dm thin: commit b...
2876

fd7c092e7   Mikulas Patocka   dm: fix truncated...
2877
2878
  		r = dm_pool_get_metadata_transaction_id(pool->pmd, &transaction_id);
  		if (r) {
4fa5971a6   Mike Snitzer   dm thin: prefix p...
2879
2880
  			DMERR("%s: dm_pool_get_metadata_transaction_id returned %d",
  			      dm_device_name(pool->pool_md), r);
fd7c092e7   Mikulas Patocka   dm: fix truncated...
2881
2882
  			goto err;
  		}
991d9fa02   Joe Thornber   dm: add thin prov...
2883

fd7c092e7   Mikulas Patocka   dm: fix truncated...
2884
2885
  		r = dm_pool_get_free_metadata_block_count(pool->pmd, &nr_free_blocks_metadata);
  		if (r) {
4fa5971a6   Mike Snitzer   dm thin: prefix p...
2886
2887
  			DMERR("%s: dm_pool_get_free_metadata_block_count returned %d",
  			      dm_device_name(pool->pool_md), r);
fd7c092e7   Mikulas Patocka   dm: fix truncated...
2888
2889
  			goto err;
  		}
991d9fa02   Joe Thornber   dm: add thin prov...
2890
2891
  
  		r = dm_pool_get_metadata_dev_size(pool->pmd, &nr_blocks_metadata);
fd7c092e7   Mikulas Patocka   dm: fix truncated...
2892
  		if (r) {
4fa5971a6   Mike Snitzer   dm thin: prefix p...
2893
2894
  			DMERR("%s: dm_pool_get_metadata_dev_size returned %d",
  			      dm_device_name(pool->pool_md), r);
fd7c092e7   Mikulas Patocka   dm: fix truncated...
2895
2896
  			goto err;
  		}
991d9fa02   Joe Thornber   dm: add thin prov...
2897

fd7c092e7   Mikulas Patocka   dm: fix truncated...
2898
2899
  		r = dm_pool_get_free_block_count(pool->pmd, &nr_free_blocks_data);
  		if (r) {
4fa5971a6   Mike Snitzer   dm thin: prefix p...
2900
2901
  			DMERR("%s: dm_pool_get_free_block_count returned %d",
  			      dm_device_name(pool->pool_md), r);
fd7c092e7   Mikulas Patocka   dm: fix truncated...
2902
2903
  			goto err;
  		}
991d9fa02   Joe Thornber   dm: add thin prov...
2904
2905
  
  		r = dm_pool_get_data_dev_size(pool->pmd, &nr_blocks_data);
fd7c092e7   Mikulas Patocka   dm: fix truncated...
2906
  		if (r) {
4fa5971a6   Mike Snitzer   dm thin: prefix p...
2907
2908
  			DMERR("%s: dm_pool_get_data_dev_size returned %d",
  			      dm_device_name(pool->pool_md), r);
fd7c092e7   Mikulas Patocka   dm: fix truncated...
2909
2910
  			goto err;
  		}
991d9fa02   Joe Thornber   dm: add thin prov...
2911

cc8394d86   Joe Thornber   dm thin: provide ...
2912
  		r = dm_pool_get_metadata_snap(pool->pmd, &held_root);
fd7c092e7   Mikulas Patocka   dm: fix truncated...
2913
  		if (r) {
4fa5971a6   Mike Snitzer   dm thin: prefix p...
2914
2915
  			DMERR("%s: dm_pool_get_metadata_snap returned %d",
  			      dm_device_name(pool->pool_md), r);
fd7c092e7   Mikulas Patocka   dm: fix truncated...
2916
2917
  			goto err;
  		}
991d9fa02   Joe Thornber   dm: add thin prov...
2918
2919
2920
2921
2922
2923
2924
2925
2926
  
  		DMEMIT("%llu %llu/%llu %llu/%llu ",
  		       (unsigned long long)transaction_id,
  		       (unsigned long long)(nr_blocks_metadata - nr_free_blocks_metadata),
  		       (unsigned long long)nr_blocks_metadata,
  		       (unsigned long long)(nr_blocks_data - nr_free_blocks_data),
  		       (unsigned long long)nr_blocks_data);
  
  		if (held_root)
e49e58296   Joe Thornber   dm thin: add read...
2927
2928
2929
  			DMEMIT("%llu ", held_root);
  		else
  			DMEMIT("- ");
3e1a06990   Joe Thornber   dm thin: fix out ...
2930
2931
2932
  		if (pool->pf.mode == PM_OUT_OF_DATA_SPACE)
  			DMEMIT("out_of_data_space ");
  		else if (pool->pf.mode == PM_READ_ONLY)
e49e58296   Joe Thornber   dm thin: add read...
2933
  			DMEMIT("ro ");
991d9fa02   Joe Thornber   dm: add thin prov...
2934
  		else
e49e58296   Joe Thornber   dm thin: add read...
2935
  			DMEMIT("rw ");
018debea8   Mike Snitzer   dm thin: emit ign...
2936
  		if (!pool->pf.discard_enabled)
787a996cb   Mike Snitzer   dm thin: add erro...
2937
  			DMEMIT("ignore_discard ");
018debea8   Mike Snitzer   dm thin: emit ign...
2938
  		else if (pool->pf.discard_passdown)
787a996cb   Mike Snitzer   dm thin: add erro...
2939
2940
2941
2942
2943
2944
  			DMEMIT("discard_passdown ");
  		else
  			DMEMIT("no_discard_passdown ");
  
  		if (pool->pf.error_if_no_space)
  			DMEMIT("error_if_no_space ");
e49e58296   Joe Thornber   dm thin: add read...
2945
  		else
787a996cb   Mike Snitzer   dm thin: add erro...
2946
  			DMEMIT("queue_if_no_space ");
991d9fa02   Joe Thornber   dm: add thin prov...
2947
2948
2949
2950
2951
2952
2953
2954
2955
  
  		break;
  
  	case STATUSTYPE_TABLE:
  		DMEMIT("%s %s %lu %llu ",
  		       format_dev_t(buf, pt->metadata_dev->bdev->bd_dev),
  		       format_dev_t(buf2, pt->data_dev->bdev->bd_dev),
  		       (unsigned long)pool->sectors_per_block,
  		       (unsigned long long)pt->low_water_blocks);
0424caa14   Mike Snitzer   dm thin: fix disc...
2956
  		emit_flags(&pt->requested_pf, result, sz, maxlen);
991d9fa02   Joe Thornber   dm: add thin prov...
2957
2958
  		break;
  	}
fd7c092e7   Mikulas Patocka   dm: fix truncated...
2959
  	return;
991d9fa02   Joe Thornber   dm: add thin prov...
2960

fd7c092e7   Mikulas Patocka   dm: fix truncated...
2961
2962
  err:
  	DMEMIT("Error");
991d9fa02   Joe Thornber   dm: add thin prov...
2963
2964
2965
2966
2967
2968
2969
2970
2971
2972
2973
2974
2975
2976
2977
2978
2979
2980
2981
2982
2983
2984
2985
  }
  
  static int pool_iterate_devices(struct dm_target *ti,
  				iterate_devices_callout_fn fn, void *data)
  {
  	struct pool_c *pt = ti->private;
  
  	return fn(ti, pt->data_dev, 0, ti->len, data);
  }
  
  static int pool_merge(struct dm_target *ti, struct bvec_merge_data *bvm,
  		      struct bio_vec *biovec, int max_size)
  {
  	struct pool_c *pt = ti->private;
  	struct request_queue *q = bdev_get_queue(pt->data_dev->bdev);
  
  	if (!q->merge_bvec_fn)
  		return max_size;
  
  	bvm->bi_bdev = pt->data_dev->bdev;
  
  	return min(max_size, q->merge_bvec_fn(q, bvm, biovec));
  }
0424caa14   Mike Snitzer   dm thin: fix disc...
2986
  static void set_discard_limits(struct pool_c *pt, struct queue_limits *limits)
104655fd4   Joe Thornber   dm thin: support ...
2987
  {
0424caa14   Mike Snitzer   dm thin: fix disc...
2988
2989
  	struct pool *pool = pt->pool;
  	struct queue_limits *data_limits;
104655fd4   Joe Thornber   dm thin: support ...
2990
2991
2992
  	limits->max_discard_sectors = pool->sectors_per_block;
  
  	/*
0424caa14   Mike Snitzer   dm thin: fix disc...
2993
  	 * discard_granularity is just a hint, and not enforced.
104655fd4   Joe Thornber   dm thin: support ...
2994
  	 */
0424caa14   Mike Snitzer   dm thin: fix disc...
2995
2996
  	if (pt->adjusted_pf.discard_passdown) {
  		data_limits = &bdev_get_queue(pt->data_dev->bdev)->limits;
09869de57   Lukas Czerner   dm thin: update d...
2997
2998
  		limits->discard_granularity = max(data_limits->discard_granularity,
  						  pool->sectors_per_block << SECTOR_SHIFT);
f13945d75   Mike Snitzer   dm thin: support ...
2999
  	} else
0424caa14   Mike Snitzer   dm thin: fix disc...
3000
  		limits->discard_granularity = pool->sectors_per_block << SECTOR_SHIFT;
104655fd4   Joe Thornber   dm thin: support ...
3001
  }
991d9fa02   Joe Thornber   dm: add thin prov...
3002
3003
3004
3005
  static void pool_io_hints(struct dm_target *ti, struct queue_limits *limits)
  {
  	struct pool_c *pt = ti->private;
  	struct pool *pool = pt->pool;
0cc67cd9c   Mike Snitzer   dm thin: fix stac...
3006
  	uint64_t io_opt_sectors = limits->io_opt >> SECTOR_SHIFT;
991d9fa02   Joe Thornber   dm: add thin prov...
3007

0cc67cd9c   Mike Snitzer   dm thin: fix stac...
3008
3009
3010
3011
3012
3013
  	/*
  	 * If the system-determined stacked limits are compatible with the
  	 * pool's blocksize (io_opt is a factor) do not override them.
  	 */
  	if (io_opt_sectors < pool->sectors_per_block ||
  	    do_div(io_opt_sectors, pool->sectors_per_block)) {
fdfb4c8c1   Mike Snitzer   dm thin: set mini...
3014
  		blk_limits_io_min(limits, pool->sectors_per_block << SECTOR_SHIFT);
0cc67cd9c   Mike Snitzer   dm thin: fix stac...
3015
3016
  		blk_limits_io_opt(limits, pool->sectors_per_block << SECTOR_SHIFT);
  	}
0424caa14   Mike Snitzer   dm thin: fix disc...
3017
3018
3019
3020
3021
3022
  
  	/*
  	 * pt->adjusted_pf is a staging area for the actual features to use.
  	 * They get transferred to the live pool in bind_control_target()
  	 * called from pool_preresume().
  	 */
b60ab990c   Mike Snitzer   dm thin: do not e...
3023
3024
3025
3026
3027
3028
3029
3030
  	if (!pt->adjusted_pf.discard_enabled) {
  		/*
  		 * Must explicitly disallow stacking discard limits otherwise the
  		 * block layer will stack them if pool's data device has support.
  		 * QUEUE_FLAG_DISCARD wouldn't be set but there is no way for the
  		 * user to see that, so make sure to set all discard limits to 0.
  		 */
  		limits->discard_granularity = 0;
0424caa14   Mike Snitzer   dm thin: fix disc...
3031
  		return;
b60ab990c   Mike Snitzer   dm thin: do not e...
3032
  	}
0424caa14   Mike Snitzer   dm thin: fix disc...
3033
3034
3035
3036
  
  	disable_passdown_if_not_supported(pt);
  
  	set_discard_limits(pt, limits);
991d9fa02   Joe Thornber   dm: add thin prov...
3037
3038
3039
3040
3041
3042
  }
  
  static struct target_type pool_target = {
  	.name = "thin-pool",
  	.features = DM_TARGET_SINGLETON | DM_TARGET_ALWAYS_WRITEABLE |
  		    DM_TARGET_IMMUTABLE,
e5aea7b49   Joe Thornber   dm thin: relax ex...
3043
  	.version = {1, 13, 0},
991d9fa02   Joe Thornber   dm: add thin prov...
3044
3045
3046
3047
3048
3049
3050
3051
3052
3053
3054
3055
3056
3057
3058
3059
3060
  	.module = THIS_MODULE,
  	.ctr = pool_ctr,
  	.dtr = pool_dtr,
  	.map = pool_map,
  	.postsuspend = pool_postsuspend,
  	.preresume = pool_preresume,
  	.resume = pool_resume,
  	.message = pool_message,
  	.status = pool_status,
  	.merge = pool_merge,
  	.iterate_devices = pool_iterate_devices,
  	.io_hints = pool_io_hints,
  };
  
  /*----------------------------------------------------------------
   * Thin target methods
   *--------------------------------------------------------------*/
b10ebd34c   Joe Thornber   dm thin: fix rcu_...
3061
3062
3063
3064
3065
3066
3067
3068
3069
3070
  static void thin_get(struct thin_c *tc)
  {
  	atomic_inc(&tc->refcount);
  }
  
  static void thin_put(struct thin_c *tc)
  {
  	if (atomic_dec_and_test(&tc->refcount))
  		complete(&tc->can_destroy);
  }
991d9fa02   Joe Thornber   dm: add thin prov...
3071
3072
3073
  static void thin_dtr(struct dm_target *ti)
  {
  	struct thin_c *tc = ti->private;
c140e1c4e   Mike Snitzer   dm thin: use per ...
3074
  	unsigned long flags;
b10ebd34c   Joe Thornber   dm thin: fix rcu_...
3075
3076
  	thin_put(tc);
  	wait_for_completion(&tc->can_destroy);
c140e1c4e   Mike Snitzer   dm thin: use per ...
3077
3078
3079
3080
  	spin_lock_irqsave(&tc->pool->lock, flags);
  	list_del_rcu(&tc->list);
  	spin_unlock_irqrestore(&tc->pool->lock, flags);
  	synchronize_rcu();
991d9fa02   Joe Thornber   dm: add thin prov...
3081
3082
3083
3084
3085
3086
  
  	mutex_lock(&dm_thin_pool_table.mutex);
  
  	__pool_dec(tc->pool);
  	dm_pool_close_thin_device(tc->td);
  	dm_put_device(ti, tc->pool_dev);
2dd9c257f   Joe Thornber   dm thin: support ...
3087
3088
  	if (tc->origin_dev)
  		dm_put_device(ti, tc->origin_dev);
991d9fa02   Joe Thornber   dm: add thin prov...
3089
3090
3091
3092
3093
3094
3095
3096
  	kfree(tc);
  
  	mutex_unlock(&dm_thin_pool_table.mutex);
  }
  
  /*
   * Thin target parameters:
   *
2dd9c257f   Joe Thornber   dm thin: support ...
3097
   * <pool_dev> <dev_id> [origin_dev]
991d9fa02   Joe Thornber   dm: add thin prov...
3098
3099
3100
   *
   * pool_dev: the path to the pool (eg, /dev/mapper/my_pool)
   * dev_id: the internal device identifier
2dd9c257f   Joe Thornber   dm thin: support ...
3101
   * origin_dev: a device external to the pool that should act as the origin
67e2e2b28   Joe Thornber   dm thin: add pool...
3102
3103
3104
   *
   * If the pool device has discards disabled, they get disabled for the thin
   * device as well.
991d9fa02   Joe Thornber   dm: add thin prov...
3105
3106
3107
3108
3109
   */
  static int thin_ctr(struct dm_target *ti, unsigned argc, char **argv)
  {
  	int r;
  	struct thin_c *tc;
2dd9c257f   Joe Thornber   dm thin: support ...
3110
  	struct dm_dev *pool_dev, *origin_dev;
991d9fa02   Joe Thornber   dm: add thin prov...
3111
  	struct mapped_device *pool_md;
5e3283e29   Joe Thornber   dm thin: irqsave ...
3112
  	unsigned long flags;
991d9fa02   Joe Thornber   dm: add thin prov...
3113
3114
  
  	mutex_lock(&dm_thin_pool_table.mutex);
2dd9c257f   Joe Thornber   dm thin: support ...
3115
  	if (argc != 2 && argc != 3) {
991d9fa02   Joe Thornber   dm: add thin prov...
3116
3117
3118
3119
3120
3121
3122
3123
3124
3125
3126
  		ti->error = "Invalid argument count";
  		r = -EINVAL;
  		goto out_unlock;
  	}
  
  	tc = ti->private = kzalloc(sizeof(*tc), GFP_KERNEL);
  	if (!tc) {
  		ti->error = "Out of memory";
  		r = -ENOMEM;
  		goto out_unlock;
  	}
c140e1c4e   Mike Snitzer   dm thin: use per ...
3127
3128
3129
  	spin_lock_init(&tc->lock);
  	bio_list_init(&tc->deferred_bio_list);
  	bio_list_init(&tc->retry_on_resume_list);
67324ea18   Mike Snitzer   dm thin: sort the...
3130
  	tc->sort_bio_list = RB_ROOT;
991d9fa02   Joe Thornber   dm: add thin prov...
3131

2dd9c257f   Joe Thornber   dm thin: support ...
3132
3133
3134
3135
3136
3137
3138
3139
  	if (argc == 3) {
  		r = dm_get_device(ti, argv[2], FMODE_READ, &origin_dev);
  		if (r) {
  			ti->error = "Error opening origin device";
  			goto bad_origin_dev;
  		}
  		tc->origin_dev = origin_dev;
  	}
991d9fa02   Joe Thornber   dm: add thin prov...
3140
3141
3142
3143
3144
3145
3146
3147
3148
3149
3150
3151
3152
3153
3154
3155
3156
3157
3158
3159
3160
3161
3162
3163
3164
3165
3166
  	r = dm_get_device(ti, argv[0], dm_table_get_mode(ti->table), &pool_dev);
  	if (r) {
  		ti->error = "Error opening pool device";
  		goto bad_pool_dev;
  	}
  	tc->pool_dev = pool_dev;
  
  	if (read_dev_id(argv[1], (unsigned long long *)&tc->dev_id, 0)) {
  		ti->error = "Invalid device id";
  		r = -EINVAL;
  		goto bad_common;
  	}
  
  	pool_md = dm_get_md(tc->pool_dev->bdev->bd_dev);
  	if (!pool_md) {
  		ti->error = "Couldn't get pool mapped device";
  		r = -EINVAL;
  		goto bad_common;
  	}
  
  	tc->pool = __pool_table_lookup(pool_md);
  	if (!tc->pool) {
  		ti->error = "Couldn't find pool object";
  		r = -EINVAL;
  		goto bad_pool_lookup;
  	}
  	__pool_inc(tc->pool);
e49e58296   Joe Thornber   dm thin: add read...
3167
3168
  	if (get_pool_mode(tc->pool) == PM_FAIL) {
  		ti->error = "Couldn't open thin device, Pool is in fail mode";
1acacc078   Mike Snitzer   dm thin: fix the ...
3169
  		r = -EINVAL;
e49e58296   Joe Thornber   dm thin: add read...
3170
3171
  		goto bad_thin_open;
  	}
991d9fa02   Joe Thornber   dm: add thin prov...
3172
3173
3174
3175
3176
  	r = dm_pool_open_thin_device(tc->pool->pmd, tc->dev_id, &tc->td);
  	if (r) {
  		ti->error = "Couldn't open thin internal device";
  		goto bad_thin_open;
  	}
542f90381   Mike Snitzer   dm: support non p...
3177
3178
  	r = dm_set_target_max_io_len(ti, tc->pool->sectors_per_block);
  	if (r)
1acacc078   Mike Snitzer   dm thin: fix the ...
3179
  		goto bad_target_max_io_len;
542f90381   Mike Snitzer   dm: support non p...
3180

55a62eef8   Alasdair G Kergon   dm: rename reques...
3181
  	ti->num_flush_bios = 1;
16ad3d103   Joe Thornber   dm thin: set flus...
3182
  	ti->flush_supported = true;
59c3d2c6a   Mikulas Patocka   dm thin: dont use...
3183
  	ti->per_bio_data_size = sizeof(struct dm_thin_endio_hook);
67e2e2b28   Joe Thornber   dm thin: add pool...
3184
3185
  
  	/* In case the pool supports discards, pass them on. */
b60ab990c   Mike Snitzer   dm thin: do not e...
3186
  	ti->discard_zeroes_data_unsupported = true;
67e2e2b28   Joe Thornber   dm thin: add pool...
3187
  	if (tc->pool->pf.discard_enabled) {
0ac55489d   Alasdair G Kergon   dm: use bool bitf...
3188
  		ti->discards_supported = true;
55a62eef8   Alasdair G Kergon   dm: rename reques...
3189
  		ti->num_discard_bios = 1;
55a62eef8   Alasdair G Kergon   dm: rename reques...
3190
3191
  		/* Discard bios must be split on a block boundary */
  		ti->split_discard_bios = true;
67e2e2b28   Joe Thornber   dm thin: add pool...
3192
  	}
991d9fa02   Joe Thornber   dm: add thin prov...
3193
3194
3195
3196
  
  	dm_put(pool_md);
  
  	mutex_unlock(&dm_thin_pool_table.mutex);
b10ebd34c   Joe Thornber   dm thin: fix rcu_...
3197
3198
  	atomic_set(&tc->refcount, 1);
  	init_completion(&tc->can_destroy);
5e3283e29   Joe Thornber   dm thin: irqsave ...
3199
  	spin_lock_irqsave(&tc->pool->lock, flags);
c140e1c4e   Mike Snitzer   dm thin: use per ...
3200
  	list_add_tail_rcu(&tc->list, &tc->pool->active_thins);
5e3283e29   Joe Thornber   dm thin: irqsave ...
3201
  	spin_unlock_irqrestore(&tc->pool->lock, flags);
c140e1c4e   Mike Snitzer   dm thin: use per ...
3202
3203
3204
3205
3206
3207
3208
  	/*
  	 * This synchronize_rcu() call is needed here otherwise we risk a
  	 * wake_worker() call finding no bios to process (because the newly
  	 * added tc isn't yet visible).  So this reduces latency since we
  	 * aren't then dependent on the periodic commit to wake_worker().
  	 */
  	synchronize_rcu();
991d9fa02   Joe Thornber   dm: add thin prov...
3209
  	return 0;
1acacc078   Mike Snitzer   dm thin: fix the ...
3210
3211
  bad_target_max_io_len:
  	dm_pool_close_thin_device(tc->td);
991d9fa02   Joe Thornber   dm: add thin prov...
3212
3213
3214
3215
3216
3217
3218
  bad_thin_open:
  	__pool_dec(tc->pool);
  bad_pool_lookup:
  	dm_put(pool_md);
  bad_common:
  	dm_put_device(ti, tc->pool_dev);
  bad_pool_dev:
2dd9c257f   Joe Thornber   dm thin: support ...
3219
3220
3221
  	if (tc->origin_dev)
  		dm_put_device(ti, tc->origin_dev);
  bad_origin_dev:
991d9fa02   Joe Thornber   dm: add thin prov...
3222
3223
3224
3225
3226
3227
  	kfree(tc);
  out_unlock:
  	mutex_unlock(&dm_thin_pool_table.mutex);
  
  	return r;
  }
7de3ee57d   Mikulas Patocka   dm: remove map_info
3228
  static int thin_map(struct dm_target *ti, struct bio *bio)
991d9fa02   Joe Thornber   dm: add thin prov...
3229
  {
4f024f379   Kent Overstreet   block: Abstract o...
3230
  	bio->bi_iter.bi_sector = dm_target_offset(ti, bio->bi_iter.bi_sector);
991d9fa02   Joe Thornber   dm: add thin prov...
3231

7de3ee57d   Mikulas Patocka   dm: remove map_info
3232
  	return thin_bio_map(ti, bio);
991d9fa02   Joe Thornber   dm: add thin prov...
3233
  }
7de3ee57d   Mikulas Patocka   dm: remove map_info
3234
  static int thin_endio(struct dm_target *ti, struct bio *bio, int err)
eb2aa48d4   Joe Thornber   dm thin: prepare ...
3235
3236
  {
  	unsigned long flags;
59c3d2c6a   Mikulas Patocka   dm thin: dont use...
3237
  	struct dm_thin_endio_hook *h = dm_per_bio_data(bio, sizeof(struct dm_thin_endio_hook));
eb2aa48d4   Joe Thornber   dm thin: prepare ...
3238
  	struct list_head work;
a24c25696   Mike Snitzer   dm thin: use slab...
3239
  	struct dm_thin_new_mapping *m, *tmp;
eb2aa48d4   Joe Thornber   dm thin: prepare ...
3240
3241
3242
3243
  	struct pool *pool = h->tc->pool;
  
  	if (h->shared_read_entry) {
  		INIT_LIST_HEAD(&work);
44feb387f   Mike Snitzer   dm thin: prepare ...
3244
  		dm_deferred_entry_dec(h->shared_read_entry, &work);
eb2aa48d4   Joe Thornber   dm thin: prepare ...
3245
3246
3247
3248
  
  		spin_lock_irqsave(&pool->lock, flags);
  		list_for_each_entry_safe(m, tmp, &work, list) {
  			list_del(&m->list);
50f3c3efd   Joe Thornber   dm thin: switch t...
3249
  			__complete_mapping_preparation(m);
eb2aa48d4   Joe Thornber   dm thin: prepare ...
3250
3251
3252
  		}
  		spin_unlock_irqrestore(&pool->lock, flags);
  	}
104655fd4   Joe Thornber   dm thin: support ...
3253
3254
  	if (h->all_io_entry) {
  		INIT_LIST_HEAD(&work);
44feb387f   Mike Snitzer   dm thin: prepare ...
3255
  		dm_deferred_entry_dec(h->all_io_entry, &work);
563af186d   Joe Thornber   dm thin: wake wor...
3256
3257
3258
  		if (!list_empty(&work)) {
  			spin_lock_irqsave(&pool->lock, flags);
  			list_for_each_entry_safe(m, tmp, &work, list)
daec338bb   Mike Snitzer   dm thin: add mapp...
3259
  				list_add_tail(&m->list, &pool->prepared_discards);
563af186d   Joe Thornber   dm thin: wake wor...
3260
3261
3262
  			spin_unlock_irqrestore(&pool->lock, flags);
  			wake_worker(pool);
  		}
104655fd4   Joe Thornber   dm thin: support ...
3263
  	}
eb2aa48d4   Joe Thornber   dm thin: prepare ...
3264
3265
  	return 0;
  }
738211f70   Joe Thornber   dm thin: fix nofl...
3266
  static void thin_presuspend(struct dm_target *ti)
991d9fa02   Joe Thornber   dm: add thin prov...
3267
  {
738211f70   Joe Thornber   dm thin: fix nofl...
3268
  	struct thin_c *tc = ti->private;
991d9fa02   Joe Thornber   dm: add thin prov...
3269
  	if (dm_noflush_suspending(ti))
738211f70   Joe Thornber   dm thin: fix nofl...
3270
3271
3272
3273
3274
3275
3276
3277
3278
3279
3280
3281
  		noflush_work(tc, do_noflush_start);
  }
  
  static void thin_postsuspend(struct dm_target *ti)
  {
  	struct thin_c *tc = ti->private;
  
  	/*
  	 * The dm_noflush_suspending flag has been cleared by now, so
  	 * unfortunately we must always run this.
  	 */
  	noflush_work(tc, do_noflush_stop);
991d9fa02   Joe Thornber   dm: add thin prov...
3282
  }
e5aea7b49   Joe Thornber   dm thin: relax ex...
3283
3284
3285
3286
3287
3288
3289
3290
3291
  static int thin_preresume(struct dm_target *ti)
  {
  	struct thin_c *tc = ti->private;
  
  	if (tc->origin_dev)
  		tc->origin_size = get_dev_size(tc->origin_dev->bdev);
  
  	return 0;
  }
991d9fa02   Joe Thornber   dm: add thin prov...
3292
3293
3294
  /*
   * <nr mapped sectors> <highest mapped sector>
   */
fd7c092e7   Mikulas Patocka   dm: fix truncated...
3295
3296
  static void thin_status(struct dm_target *ti, status_type_t type,
  			unsigned status_flags, char *result, unsigned maxlen)
991d9fa02   Joe Thornber   dm: add thin prov...
3297
3298
3299
3300
3301
3302
  {
  	int r;
  	ssize_t sz = 0;
  	dm_block_t mapped, highest;
  	char buf[BDEVNAME_SIZE];
  	struct thin_c *tc = ti->private;
e49e58296   Joe Thornber   dm thin: add read...
3303
3304
  	if (get_pool_mode(tc->pool) == PM_FAIL) {
  		DMEMIT("Fail");
fd7c092e7   Mikulas Patocka   dm: fix truncated...
3305
  		return;
e49e58296   Joe Thornber   dm thin: add read...
3306
  	}
991d9fa02   Joe Thornber   dm: add thin prov...
3307
3308
3309
3310
3311
3312
  	if (!tc->td)
  		DMEMIT("-");
  	else {
  		switch (type) {
  		case STATUSTYPE_INFO:
  			r = dm_thin_get_mapped_count(tc->td, &mapped);
fd7c092e7   Mikulas Patocka   dm: fix truncated...
3313
3314
3315
3316
  			if (r) {
  				DMERR("dm_thin_get_mapped_count returned %d", r);
  				goto err;
  			}
991d9fa02   Joe Thornber   dm: add thin prov...
3317
3318
  
  			r = dm_thin_get_highest_mapped_block(tc->td, &highest);
fd7c092e7   Mikulas Patocka   dm: fix truncated...
3319
3320
3321
3322
  			if (r < 0) {
  				DMERR("dm_thin_get_highest_mapped_block returned %d", r);
  				goto err;
  			}
991d9fa02   Joe Thornber   dm: add thin prov...
3323
3324
3325
3326
3327
3328
3329
3330
3331
3332
3333
3334
3335
  
  			DMEMIT("%llu ", mapped * tc->pool->sectors_per_block);
  			if (r)
  				DMEMIT("%llu", ((highest + 1) *
  						tc->pool->sectors_per_block) - 1);
  			else
  				DMEMIT("-");
  			break;
  
  		case STATUSTYPE_TABLE:
  			DMEMIT("%s %lu",
  			       format_dev_t(buf, tc->pool_dev->bdev->bd_dev),
  			       (unsigned long) tc->dev_id);
2dd9c257f   Joe Thornber   dm thin: support ...
3336
3337
  			if (tc->origin_dev)
  				DMEMIT(" %s", format_dev_t(buf, tc->origin_dev->bdev->bd_dev));
991d9fa02   Joe Thornber   dm: add thin prov...
3338
3339
3340
  			break;
  		}
  	}
fd7c092e7   Mikulas Patocka   dm: fix truncated...
3341
3342
3343
3344
  	return;
  
  err:
  	DMEMIT("Error");
991d9fa02   Joe Thornber   dm: add thin prov...
3345
3346
3347
3348
3349
  }
  
  static int thin_iterate_devices(struct dm_target *ti,
  				iterate_devices_callout_fn fn, void *data)
  {
55f2b8bdb   Mike Snitzer   dm thin: support ...
3350
  	sector_t blocks;
991d9fa02   Joe Thornber   dm: add thin prov...
3351
  	struct thin_c *tc = ti->private;
55f2b8bdb   Mike Snitzer   dm thin: support ...
3352
  	struct pool *pool = tc->pool;
991d9fa02   Joe Thornber   dm: add thin prov...
3353
3354
3355
3356
3357
  
  	/*
  	 * We can't call dm_pool_get_data_dev_size() since that blocks.  So
  	 * we follow a more convoluted path through to the pool's target.
  	 */
55f2b8bdb   Mike Snitzer   dm thin: support ...
3358
  	if (!pool->ti)
991d9fa02   Joe Thornber   dm: add thin prov...
3359
  		return 0;	/* nothing is bound */
55f2b8bdb   Mike Snitzer   dm thin: support ...
3360
3361
  	blocks = pool->ti->len;
  	(void) sector_div(blocks, pool->sectors_per_block);
991d9fa02   Joe Thornber   dm: add thin prov...
3362
  	if (blocks)
55f2b8bdb   Mike Snitzer   dm thin: support ...
3363
  		return fn(ti, tc->pool_dev, 0, pool->sectors_per_block * blocks, data);
991d9fa02   Joe Thornber   dm: add thin prov...
3364
3365
3366
  
  	return 0;
  }
991d9fa02   Joe Thornber   dm: add thin prov...
3367
3368
  static struct target_type thin_target = {
  	.name = "thin",
e5aea7b49   Joe Thornber   dm thin: relax ex...
3369
  	.version = {1, 13, 0},
991d9fa02   Joe Thornber   dm: add thin prov...
3370
3371
3372
3373
  	.module	= THIS_MODULE,
  	.ctr = thin_ctr,
  	.dtr = thin_dtr,
  	.map = thin_map,
eb2aa48d4   Joe Thornber   dm thin: prepare ...
3374
  	.end_io = thin_endio,
e5aea7b49   Joe Thornber   dm thin: relax ex...
3375
  	.preresume = thin_preresume,
738211f70   Joe Thornber   dm thin: fix nofl...
3376
  	.presuspend = thin_presuspend,
991d9fa02   Joe Thornber   dm: add thin prov...
3377
3378
3379
  	.postsuspend = thin_postsuspend,
  	.status = thin_status,
  	.iterate_devices = thin_iterate_devices,
991d9fa02   Joe Thornber   dm: add thin prov...
3380
3381
3382
3383
3384
3385
3386
3387
3388
3389
3390
3391
3392
3393
3394
3395
  };
  
  /*----------------------------------------------------------------*/
  
  static int __init dm_thin_init(void)
  {
  	int r;
  
  	pool_table_init();
  
  	r = dm_register_target(&thin_target);
  	if (r)
  		return r;
  
  	r = dm_register_target(&pool_target);
  	if (r)
a24c25696   Mike Snitzer   dm thin: use slab...
3396
3397
3398
  		goto bad_pool_target;
  
  	r = -ENOMEM;
a24c25696   Mike Snitzer   dm thin: use slab...
3399
3400
3401
  	_new_mapping_cache = KMEM_CACHE(dm_thin_new_mapping, 0);
  	if (!_new_mapping_cache)
  		goto bad_new_mapping_cache;
a24c25696   Mike Snitzer   dm thin: use slab...
3402
  	return 0;
a24c25696   Mike Snitzer   dm thin: use slab...
3403
  bad_new_mapping_cache:
a24c25696   Mike Snitzer   dm thin: use slab...
3404
3405
3406
  	dm_unregister_target(&pool_target);
  bad_pool_target:
  	dm_unregister_target(&thin_target);
991d9fa02   Joe Thornber   dm: add thin prov...
3407
3408
3409
3410
3411
3412
3413
3414
  
  	return r;
  }
  
  static void dm_thin_exit(void)
  {
  	dm_unregister_target(&thin_target);
  	dm_unregister_target(&pool_target);
a24c25696   Mike Snitzer   dm thin: use slab...
3415

a24c25696   Mike Snitzer   dm thin: use slab...
3416
  	kmem_cache_destroy(_new_mapping_cache);
991d9fa02   Joe Thornber   dm: add thin prov...
3417
3418
3419
3420
  }
  
  module_init(dm_thin_init);
  module_exit(dm_thin_exit);
80c578930   Mike Snitzer   dm thin: add 'no_...
3421
3422
  module_param_named(no_space_timeout, no_space_timeout_secs, uint, S_IRUGO | S_IWUSR);
  MODULE_PARM_DESC(no_space_timeout, "Out of data space queue IO timeout in seconds");
7cab8bf16   Alasdair G Kergon   dm thin: correct ...
3423
  MODULE_DESCRIPTION(DM_NAME " thin provisioning target");
991d9fa02   Joe Thornber   dm: add thin prov...
3424
3425
  MODULE_AUTHOR("Joe Thornber <dm-devel@redhat.com>");
  MODULE_LICENSE("GPL");