Blame view

fs/iomap.c 25.3 KB
ae259a9c8   Christoph Hellwig   fs: introduce iom...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
  /*
   * Copyright (C) 2010 Red Hat, Inc.
   * Copyright (c) 2016 Christoph Hellwig.
   *
   * This program is free software; you can redistribute it and/or modify it
   * under the terms and conditions of the GNU General Public License,
   * version 2, as published by the Free Software Foundation.
   *
   * This program is distributed in the hope it will be useful, but WITHOUT
   * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
   * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
   * more details.
   */
  #include <linux/module.h>
  #include <linux/compiler.h>
  #include <linux/fs.h>
  #include <linux/iomap.h>
  #include <linux/uaccess.h>
  #include <linux/gfp.h>
  #include <linux/mm.h>
  #include <linux/swap.h>
  #include <linux/pagemap.h>
  #include <linux/file.h>
  #include <linux/uio.h>
  #include <linux/backing-dev.h>
  #include <linux/buffer_head.h>
ff6a9292e   Christoph Hellwig   iomap: implement ...
27
  #include <linux/task_io_accounting_ops.h>
9a286f0e5   Christoph Hellwig   fs: support DAX b...
28
  #include <linux/dax.h>
f361bf4a6   Ingo Molnar   sched/headers: Pr...
29
  #include <linux/sched/signal.h>
ae259a9c8   Christoph Hellwig   fs: introduce iom...
30
  #include "internal.h"
ae259a9c8   Christoph Hellwig   fs: introduce iom...
31
32
33
34
35
36
37
38
39
40
41
  /*
   * Execute a iomap write on a segment of the mapping that spans a
   * contiguous range of pages that have identical block mapping state.
   *
   * This avoids the need to map pages individually, do individual allocations
   * for each page and most importantly avoid the need for filesystem specific
   * locking per page. Instead, all the operations are amortised over the entire
   * range of pages. It is assumed that the filesystems will lock whatever
   * resources they require in the iomap_begin call, and release them in the
   * iomap_end call.
   */
befb503ca   Christoph Hellwig   iomap: expose iom...
42
  loff_t
ae259a9c8   Christoph Hellwig   fs: introduce iom...
43
  iomap_apply(struct inode *inode, loff_t pos, loff_t length, unsigned flags,
8ff6daa17   Christoph Hellwig   iomap: constify s...
44
  		const struct iomap_ops *ops, void *data, iomap_actor_t actor)
ae259a9c8   Christoph Hellwig   fs: introduce iom...
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
  {
  	struct iomap iomap = { 0 };
  	loff_t written = 0, ret;
  
  	/*
  	 * Need to map a range from start position for length bytes. This can
  	 * span multiple pages - it is only guaranteed to return a range of a
  	 * single type of pages (e.g. all into a hole, all mapped or all
  	 * unwritten). Failure at this point has nothing to undo.
  	 *
  	 * If allocation is required for this range, reserve the space now so
  	 * that the allocation is guaranteed to succeed later on. Once we copy
  	 * the data into the page cache pages, then we cannot fail otherwise we
  	 * expose transient stale data. If the reserve fails, we can safely
  	 * back out at this point as there is nothing to undo.
  	 */
  	ret = ops->iomap_begin(inode, pos, length, flags, &iomap);
  	if (ret)
  		return ret;
  	if (WARN_ON(iomap.offset > pos))
  		return -EIO;
  
  	/*
  	 * Cut down the length to the one actually provided by the filesystem,
  	 * as it might not be able to give us the whole size that we requested.
  	 */
  	if (iomap.offset + iomap.length < pos + length)
  		length = iomap.offset + iomap.length - pos;
  
  	/*
  	 * Now that we have guaranteed that the space allocation will succeed.
  	 * we can do the copy-in page by page without having to worry about
  	 * failures exposing transient data.
  	 */
  	written = actor(inode, pos, length, data, &iomap);
  
  	/*
  	 * Now the data has been copied, commit the range we've copied.  This
  	 * should not fail unless the filesystem has had a fatal error.
  	 */
f20ac7ab1   Christoph Hellwig   iomap: mark ->iom...
85
86
87
88
89
  	if (ops->iomap_end) {
  		ret = ops->iomap_end(inode, pos, length,
  				     written > 0 ? written : 0,
  				     flags, &iomap);
  	}
ae259a9c8   Christoph Hellwig   fs: introduce iom...
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
  
  	return written ? written : ret;
  }
  
  static void
  iomap_write_failed(struct inode *inode, loff_t pos, unsigned len)
  {
  	loff_t i_size = i_size_read(inode);
  
  	/*
  	 * Only truncate newly allocated pages beyoned EOF, even if the
  	 * write started inside the existing inode size.
  	 */
  	if (pos + len > i_size)
  		truncate_pagecache_range(inode, max(pos, i_size), pos + len);
  }
  
  static int
  iomap_write_begin(struct inode *inode, loff_t pos, unsigned len, unsigned flags,
  		struct page **pagep, struct iomap *iomap)
  {
  	pgoff_t index = pos >> PAGE_SHIFT;
  	struct page *page;
  	int status = 0;
  
  	BUG_ON(pos + len > iomap->offset + iomap->length);
d1908f525   Michal Hocko   fs: break out of ...
116
117
  	if (fatal_signal_pending(current))
  		return -EINTR;
ae259a9c8   Christoph Hellwig   fs: introduce iom...
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
  	page = grab_cache_page_write_begin(inode->i_mapping, index, flags);
  	if (!page)
  		return -ENOMEM;
  
  	status = __block_write_begin_int(page, pos, len, NULL, iomap);
  	if (unlikely(status)) {
  		unlock_page(page);
  		put_page(page);
  		page = NULL;
  
  		iomap_write_failed(inode, pos, len);
  	}
  
  	*pagep = page;
  	return status;
  }
  
  static int
  iomap_write_end(struct inode *inode, loff_t pos, unsigned len,
  		unsigned copied, struct page *page)
  {
  	int ret;
  
  	ret = generic_write_end(NULL, inode->i_mapping, pos, len,
  			copied, page, NULL);
  	if (ret < len)
  		iomap_write_failed(inode, pos, len);
  	return ret;
  }
  
  static loff_t
  iomap_write_actor(struct inode *inode, loff_t pos, loff_t length, void *data,
  		struct iomap *iomap)
  {
  	struct iov_iter *i = data;
  	long status = 0;
  	ssize_t written = 0;
  	unsigned int flags = AOP_FLAG_NOFS;
ae259a9c8   Christoph Hellwig   fs: introduce iom...
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
  	do {
  		struct page *page;
  		unsigned long offset;	/* Offset into pagecache page */
  		unsigned long bytes;	/* Bytes to write to page */
  		size_t copied;		/* Bytes copied from user */
  
  		offset = (pos & (PAGE_SIZE - 1));
  		bytes = min_t(unsigned long, PAGE_SIZE - offset,
  						iov_iter_count(i));
  again:
  		if (bytes > length)
  			bytes = length;
  
  		/*
  		 * Bring in the user page that we will copy from _first_.
  		 * Otherwise there's a nasty deadlock on copying from the
  		 * same page as we're writing to, without it being marked
  		 * up-to-date.
  		 *
  		 * Not only is this an optimisation, but it is also required
  		 * to check that the address is actually valid, when atomic
  		 * usercopies are used, below.
  		 */
  		if (unlikely(iov_iter_fault_in_readable(i, bytes))) {
  			status = -EFAULT;
  			break;
  		}
  
  		status = iomap_write_begin(inode, pos, bytes, flags, &page,
  				iomap);
  		if (unlikely(status))
  			break;
  
  		if (mapping_writably_mapped(inode->i_mapping))
  			flush_dcache_page(page);
ae259a9c8   Christoph Hellwig   fs: introduce iom...
191
  		copied = iov_iter_copy_from_user_atomic(page, i, offset, bytes);
ae259a9c8   Christoph Hellwig   fs: introduce iom...
192
193
  
  		flush_dcache_page(page);
ae259a9c8   Christoph Hellwig   fs: introduce iom...
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
  
  		status = iomap_write_end(inode, pos, bytes, copied, page);
  		if (unlikely(status < 0))
  			break;
  		copied = status;
  
  		cond_resched();
  
  		iov_iter_advance(i, copied);
  		if (unlikely(copied == 0)) {
  			/*
  			 * If we were unable to copy any data at all, we must
  			 * fall back to a single segment length write.
  			 *
  			 * If we didn't fallback here, we could livelock
  			 * because not all segments in the iov can be copied at
  			 * once without a pagefault.
  			 */
  			bytes = min_t(unsigned long, PAGE_SIZE - offset,
  						iov_iter_single_seg_count(i));
  			goto again;
  		}
  		pos += copied;
  		written += copied;
  		length -= copied;
  
  		balance_dirty_pages_ratelimited(inode->i_mapping);
  	} while (iov_iter_count(i) && length);
  
  	return written ? written : status;
  }
  
  ssize_t
  iomap_file_buffered_write(struct kiocb *iocb, struct iov_iter *iter,
8ff6daa17   Christoph Hellwig   iomap: constify s...
228
  		const struct iomap_ops *ops)
ae259a9c8   Christoph Hellwig   fs: introduce iom...
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
  {
  	struct inode *inode = iocb->ki_filp->f_mapping->host;
  	loff_t pos = iocb->ki_pos, ret = 0, written = 0;
  
  	while (iov_iter_count(iter)) {
  		ret = iomap_apply(inode, pos, iov_iter_count(iter),
  				IOMAP_WRITE, ops, iter, iomap_write_actor);
  		if (ret <= 0)
  			break;
  		pos += ret;
  		written += ret;
  	}
  
  	return written ? written : ret;
  }
  EXPORT_SYMBOL_GPL(iomap_file_buffered_write);
5f4e5752a   Christoph Hellwig   fs: add iomap_fil...
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
  static struct page *
  __iomap_read_page(struct inode *inode, loff_t offset)
  {
  	struct address_space *mapping = inode->i_mapping;
  	struct page *page;
  
  	page = read_mapping_page(mapping, offset >> PAGE_SHIFT, NULL);
  	if (IS_ERR(page))
  		return page;
  	if (!PageUptodate(page)) {
  		put_page(page);
  		return ERR_PTR(-EIO);
  	}
  	return page;
  }
  
  static loff_t
  iomap_dirty_actor(struct inode *inode, loff_t pos, loff_t length, void *data,
  		struct iomap *iomap)
  {
  	long status = 0;
  	ssize_t written = 0;
  
  	do {
  		struct page *page, *rpage;
  		unsigned long offset;	/* Offset into pagecache page */
  		unsigned long bytes;	/* Bytes to write to page */
  
  		offset = (pos & (PAGE_SIZE - 1));
e28ae8e42   Christoph Hellwig   iomap: fix intege...
274
  		bytes = min_t(loff_t, PAGE_SIZE - offset, length);
5f4e5752a   Christoph Hellwig   fs: add iomap_fil...
275
276
277
278
279
280
  
  		rpage = __iomap_read_page(inode, pos);
  		if (IS_ERR(rpage))
  			return PTR_ERR(rpage);
  
  		status = iomap_write_begin(inode, pos, bytes,
c718a9751   Tetsuo Handa   fs: semove set bu...
281
  					   AOP_FLAG_NOFS, &page, iomap);
5f4e5752a   Christoph Hellwig   fs: add iomap_fil...
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
  		put_page(rpage);
  		if (unlikely(status))
  			return status;
  
  		WARN_ON_ONCE(!PageUptodate(page));
  
  		status = iomap_write_end(inode, pos, bytes, bytes, page);
  		if (unlikely(status <= 0)) {
  			if (WARN_ON_ONCE(status == 0))
  				return -EIO;
  			return status;
  		}
  
  		cond_resched();
  
  		pos += status;
  		written += status;
  		length -= status;
  
  		balance_dirty_pages_ratelimited(inode->i_mapping);
  	} while (length);
  
  	return written;
  }
  
  int
  iomap_file_dirty(struct inode *inode, loff_t pos, loff_t len,
8ff6daa17   Christoph Hellwig   iomap: constify s...
309
  		const struct iomap_ops *ops)
5f4e5752a   Christoph Hellwig   fs: add iomap_fil...
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
  {
  	loff_t ret;
  
  	while (len) {
  		ret = iomap_apply(inode, pos, len, IOMAP_WRITE, ops, NULL,
  				iomap_dirty_actor);
  		if (ret <= 0)
  			return ret;
  		pos += ret;
  		len -= ret;
  	}
  
  	return 0;
  }
  EXPORT_SYMBOL_GPL(iomap_file_dirty);
ae259a9c8   Christoph Hellwig   fs: introduce iom...
325
326
327
328
329
  static int iomap_zero(struct inode *inode, loff_t pos, unsigned offset,
  		unsigned bytes, struct iomap *iomap)
  {
  	struct page *page;
  	int status;
c718a9751   Tetsuo Handa   fs: semove set bu...
330
331
  	status = iomap_write_begin(inode, pos, bytes, AOP_FLAG_NOFS, &page,
  				   iomap);
ae259a9c8   Christoph Hellwig   fs: introduce iom...
332
333
334
335
336
337
338
339
  	if (status)
  		return status;
  
  	zero_user(page, offset, bytes);
  	mark_page_accessed(page);
  
  	return iomap_write_end(inode, pos, bytes, bytes, page);
  }
9a286f0e5   Christoph Hellwig   fs: support DAX b...
340
341
342
343
344
  static int iomap_dax_zero(loff_t pos, unsigned offset, unsigned bytes,
  		struct iomap *iomap)
  {
  	sector_t sector = iomap->blkno +
  		(((pos & ~(PAGE_SIZE - 1)) - iomap->offset) >> 9);
cccbce671   Dan Williams   filesystem-dax: c...
345
346
  	return __dax_zero_page_range(iomap->bdev, iomap->dax_dev, sector,
  			offset, bytes);
9a286f0e5   Christoph Hellwig   fs: support DAX b...
347
  }
ae259a9c8   Christoph Hellwig   fs: introduce iom...
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
  static loff_t
  iomap_zero_range_actor(struct inode *inode, loff_t pos, loff_t count,
  		void *data, struct iomap *iomap)
  {
  	bool *did_zero = data;
  	loff_t written = 0;
  	int status;
  
  	/* already zeroed?  we're done. */
  	if (iomap->type == IOMAP_HOLE || iomap->type == IOMAP_UNWRITTEN)
  	    	return count;
  
  	do {
  		unsigned offset, bytes;
  
  		offset = pos & (PAGE_SIZE - 1); /* Within page */
e28ae8e42   Christoph Hellwig   iomap: fix intege...
364
  		bytes = min_t(loff_t, PAGE_SIZE - offset, count);
ae259a9c8   Christoph Hellwig   fs: introduce iom...
365

9a286f0e5   Christoph Hellwig   fs: support DAX b...
366
367
368
369
  		if (IS_DAX(inode))
  			status = iomap_dax_zero(pos, offset, bytes, iomap);
  		else
  			status = iomap_zero(inode, pos, offset, bytes, iomap);
ae259a9c8   Christoph Hellwig   fs: introduce iom...
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
  		if (status < 0)
  			return status;
  
  		pos += bytes;
  		count -= bytes;
  		written += bytes;
  		if (did_zero)
  			*did_zero = true;
  	} while (count > 0);
  
  	return written;
  }
  
  int
  iomap_zero_range(struct inode *inode, loff_t pos, loff_t len, bool *did_zero,
8ff6daa17   Christoph Hellwig   iomap: constify s...
385
  		const struct iomap_ops *ops)
ae259a9c8   Christoph Hellwig   fs: introduce iom...
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
  {
  	loff_t ret;
  
  	while (len > 0) {
  		ret = iomap_apply(inode, pos, len, IOMAP_ZERO,
  				ops, did_zero, iomap_zero_range_actor);
  		if (ret <= 0)
  			return ret;
  
  		pos += ret;
  		len -= ret;
  	}
  
  	return 0;
  }
  EXPORT_SYMBOL_GPL(iomap_zero_range);
  
  int
  iomap_truncate_page(struct inode *inode, loff_t pos, bool *did_zero,
8ff6daa17   Christoph Hellwig   iomap: constify s...
405
  		const struct iomap_ops *ops)
ae259a9c8   Christoph Hellwig   fs: introduce iom...
406
  {
93407472a   Fabian Frederick   fs: add i_blocksi...
407
408
  	unsigned int blocksize = i_blocksize(inode);
  	unsigned int off = pos & (blocksize - 1);
ae259a9c8   Christoph Hellwig   fs: introduce iom...
409
410
411
412
413
414
415
416
417
418
419
420
421
422
  
  	/* Block boundary? Nothing to do */
  	if (!off)
  		return 0;
  	return iomap_zero_range(inode, pos, blocksize - off, did_zero, ops);
  }
  EXPORT_SYMBOL_GPL(iomap_truncate_page);
  
  static loff_t
  iomap_page_mkwrite_actor(struct inode *inode, loff_t pos, loff_t length,
  		void *data, struct iomap *iomap)
  {
  	struct page *page = data;
  	int ret;
c663e29f8   Jan Kara   fs: Do to trim hi...
423
  	ret = __block_write_begin_int(page, pos, length, NULL, iomap);
ae259a9c8   Christoph Hellwig   fs: introduce iom...
424
425
426
427
428
429
  	if (ret)
  		return ret;
  
  	block_commit_write(page, 0, length);
  	return length;
  }
11bac8000   Dave Jiang   mm, fs: reduce fa...
430
  int iomap_page_mkwrite(struct vm_fault *vmf, const struct iomap_ops *ops)
ae259a9c8   Christoph Hellwig   fs: introduce iom...
431
432
  {
  	struct page *page = vmf->page;
11bac8000   Dave Jiang   mm, fs: reduce fa...
433
  	struct inode *inode = file_inode(vmf->vma->vm_file);
ae259a9c8   Christoph Hellwig   fs: introduce iom...
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
  	unsigned long length;
  	loff_t offset, size;
  	ssize_t ret;
  
  	lock_page(page);
  	size = i_size_read(inode);
  	if ((page->mapping != inode->i_mapping) ||
  	    (page_offset(page) > size)) {
  		/* We overload EFAULT to mean page got truncated */
  		ret = -EFAULT;
  		goto out_unlock;
  	}
  
  	/* page is wholly or partially inside EOF */
  	if (((page->index + 1) << PAGE_SHIFT) > size)
  		length = size & ~PAGE_MASK;
  	else
  		length = PAGE_SIZE;
  
  	offset = page_offset(page);
  	while (length > 0) {
9484ab1bf   Jan Kara   dax: Introduce IO...
455
456
457
  		ret = iomap_apply(inode, offset, length,
  				IOMAP_WRITE | IOMAP_FAULT, ops, page,
  				iomap_page_mkwrite_actor);
ae259a9c8   Christoph Hellwig   fs: introduce iom...
458
459
460
461
462
463
464
465
  		if (unlikely(ret <= 0))
  			goto out_unlock;
  		offset += ret;
  		length -= ret;
  	}
  
  	set_page_dirty(page);
  	wait_for_stable_page(page);
e7647fb49   Christoph Hellwig   iomap: return VM_...
466
  	return VM_FAULT_LOCKED;
ae259a9c8   Christoph Hellwig   fs: introduce iom...
467
468
  out_unlock:
  	unlock_page(page);
e7647fb49   Christoph Hellwig   iomap: return VM_...
469
  	return block_page_mkwrite_return(ret);
ae259a9c8   Christoph Hellwig   fs: introduce iom...
470
471
  }
  EXPORT_SYMBOL_GPL(iomap_page_mkwrite);
8be9f564d   Christoph Hellwig   fs: iomap based f...
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
  
  struct fiemap_ctx {
  	struct fiemap_extent_info *fi;
  	struct iomap prev;
  };
  
  static int iomap_to_fiemap(struct fiemap_extent_info *fi,
  		struct iomap *iomap, u32 flags)
  {
  	switch (iomap->type) {
  	case IOMAP_HOLE:
  		/* skip holes */
  		return 0;
  	case IOMAP_DELALLOC:
  		flags |= FIEMAP_EXTENT_DELALLOC | FIEMAP_EXTENT_UNKNOWN;
  		break;
  	case IOMAP_UNWRITTEN:
  		flags |= FIEMAP_EXTENT_UNWRITTEN;
  		break;
  	case IOMAP_MAPPED:
  		break;
  	}
17de0a9ff   Christoph Hellwig   iomap: don't set ...
494
495
  	if (iomap->flags & IOMAP_F_MERGED)
  		flags |= FIEMAP_EXTENT_MERGED;
e43c460dc   Darrick J. Wong   iomap: add a flag...
496
497
  	if (iomap->flags & IOMAP_F_SHARED)
  		flags |= FIEMAP_EXTENT_SHARED;
17de0a9ff   Christoph Hellwig   iomap: don't set ...
498

8be9f564d   Christoph Hellwig   fs: iomap based f...
499
500
  	return fiemap_fill_next_extent(fi, iomap->offset,
  			iomap->blkno != IOMAP_NULL_BLOCK ? iomap->blkno << 9: 0,
17de0a9ff   Christoph Hellwig   iomap: don't set ...
501
  			iomap->length, flags);
8be9f564d   Christoph Hellwig   fs: iomap based f...
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
  
  }
  
  static loff_t
  iomap_fiemap_actor(struct inode *inode, loff_t pos, loff_t length, void *data,
  		struct iomap *iomap)
  {
  	struct fiemap_ctx *ctx = data;
  	loff_t ret = length;
  
  	if (iomap->type == IOMAP_HOLE)
  		return length;
  
  	ret = iomap_to_fiemap(ctx->fi, &ctx->prev, 0);
  	ctx->prev = *iomap;
  	switch (ret) {
  	case 0:		/* success */
  		return length;
  	case 1:		/* extent array full */
  		return 0;
  	default:
  		return ret;
  	}
  }
  
  int iomap_fiemap(struct inode *inode, struct fiemap_extent_info *fi,
8ff6daa17   Christoph Hellwig   iomap: constify s...
528
  		loff_t start, loff_t len, const struct iomap_ops *ops)
8be9f564d   Christoph Hellwig   fs: iomap based f...
529
530
531
532
533
534
535
536
537
538
539
  {
  	struct fiemap_ctx ctx;
  	loff_t ret;
  
  	memset(&ctx, 0, sizeof(ctx));
  	ctx.fi = fi;
  	ctx.prev.type = IOMAP_HOLE;
  
  	ret = fiemap_check_flags(fi, FIEMAP_FLAG_SYNC);
  	if (ret)
  		return ret;
8896b8f60   Dave Chinner   iomap: fiemap sho...
540
541
542
543
544
  	if (fi->fi_flags & FIEMAP_FLAG_SYNC) {
  		ret = filemap_write_and_wait(inode->i_mapping);
  		if (ret)
  			return ret;
  	}
8be9f564d   Christoph Hellwig   fs: iomap based f...
545
546
  
  	while (len > 0) {
d33fd776f   Christoph Hellwig   iomap: add IOMAP_...
547
  		ret = iomap_apply(inode, start, len, IOMAP_REPORT, ops, &ctx,
8be9f564d   Christoph Hellwig   fs: iomap based f...
548
  				iomap_fiemap_actor);
ac2dc058b   Dave Chinner   iomap: prepare io...
549
550
551
  		/* inode with no (attribute) mapping will give ENOENT */
  		if (ret == -ENOENT)
  			break;
8be9f564d   Christoph Hellwig   fs: iomap based f...
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
  		if (ret < 0)
  			return ret;
  		if (ret == 0)
  			break;
  
  		start += ret;
  		len -= ret;
  	}
  
  	if (ctx.prev.type != IOMAP_HOLE) {
  		ret = iomap_to_fiemap(fi, &ctx.prev, FIEMAP_EXTENT_LAST);
  		if (ret < 0)
  			return ret;
  	}
  
  	return 0;
  }
  EXPORT_SYMBOL_GPL(iomap_fiemap);
ff6a9292e   Christoph Hellwig   iomap: implement ...
570

0ed3b0d45   Andreas Gruenbacher   vfs: Add iomap_se...
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
  static loff_t
  iomap_seek_hole_actor(struct inode *inode, loff_t offset, loff_t length,
  		      void *data, struct iomap *iomap)
  {
  	switch (iomap->type) {
  	case IOMAP_UNWRITTEN:
  		offset = page_cache_seek_hole_data(inode, offset, length,
  						   SEEK_HOLE);
  		if (offset < 0)
  			return length;
  		/* fall through */
  	case IOMAP_HOLE:
  		*(loff_t *)data = offset;
  		return 0;
  	default:
  		return length;
  	}
  }
  
  loff_t
  iomap_seek_hole(struct inode *inode, loff_t offset, const struct iomap_ops *ops)
  {
  	loff_t size = i_size_read(inode);
  	loff_t length = size - offset;
  	loff_t ret;
d6ab17f26   Darrick J. Wong   vfs: in iomap see...
596
597
  	/* Nothing to be found before or beyond the end of the file. */
  	if (offset < 0 || offset >= size)
0ed3b0d45   Andreas Gruenbacher   vfs: Add iomap_se...
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
  		return -ENXIO;
  
  	while (length > 0) {
  		ret = iomap_apply(inode, offset, length, IOMAP_REPORT, ops,
  				  &offset, iomap_seek_hole_actor);
  		if (ret < 0)
  			return ret;
  		if (ret == 0)
  			break;
  
  		offset += ret;
  		length -= ret;
  	}
  
  	return offset;
  }
  EXPORT_SYMBOL_GPL(iomap_seek_hole);
  
  static loff_t
  iomap_seek_data_actor(struct inode *inode, loff_t offset, loff_t length,
  		      void *data, struct iomap *iomap)
  {
  	switch (iomap->type) {
  	case IOMAP_HOLE:
  		return length;
  	case IOMAP_UNWRITTEN:
  		offset = page_cache_seek_hole_data(inode, offset, length,
  						   SEEK_DATA);
  		if (offset < 0)
  			return length;
  		/*FALLTHRU*/
  	default:
  		*(loff_t *)data = offset;
  		return 0;
  	}
  }
  
  loff_t
  iomap_seek_data(struct inode *inode, loff_t offset, const struct iomap_ops *ops)
  {
  	loff_t size = i_size_read(inode);
  	loff_t length = size - offset;
  	loff_t ret;
d6ab17f26   Darrick J. Wong   vfs: in iomap see...
641
642
  	/* Nothing to be found before or beyond the end of the file. */
  	if (offset < 0 || offset >= size)
0ed3b0d45   Andreas Gruenbacher   vfs: Add iomap_se...
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
  		return -ENXIO;
  
  	while (length > 0) {
  		ret = iomap_apply(inode, offset, length, IOMAP_REPORT, ops,
  				  &offset, iomap_seek_data_actor);
  		if (ret < 0)
  			return ret;
  		if (ret == 0)
  			break;
  
  		offset += ret;
  		length -= ret;
  	}
  
  	if (length <= 0)
  		return -ENXIO;
  	return offset;
  }
  EXPORT_SYMBOL_GPL(iomap_seek_data);
ff6a9292e   Christoph Hellwig   iomap: implement ...
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
  /*
   * Private flags for iomap_dio, must not overlap with the public ones in
   * iomap.h:
   */
  #define IOMAP_DIO_WRITE		(1 << 30)
  #define IOMAP_DIO_DIRTY		(1 << 31)
  
  struct iomap_dio {
  	struct kiocb		*iocb;
  	iomap_dio_end_io_t	*end_io;
  	loff_t			i_size;
  	loff_t			size;
  	atomic_t		ref;
  	unsigned		flags;
  	int			error;
a56b97a2f   Andreas Gruenbacher   iomap: complete p...
677
  	bool			wait_for_completion;
ff6a9292e   Christoph Hellwig   iomap: implement ...
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
  
  	union {
  		/* used during submission and for synchronous completion: */
  		struct {
  			struct iov_iter		*iter;
  			struct task_struct	*waiter;
  			struct request_queue	*last_queue;
  			blk_qc_t		cookie;
  		} submit;
  
  		/* used for aio completion: */
  		struct {
  			struct work_struct	work;
  		} aio;
  	};
  };
  
  static ssize_t iomap_dio_complete(struct iomap_dio *dio)
  {
  	struct kiocb *iocb = dio->iocb;
332391a99   Lukas Czerner   fs: Fix page cach...
698
  	struct inode *inode = file_inode(iocb->ki_filp);
5e25c269e   Eryu Guan   fs: invalidate pa...
699
  	loff_t offset = iocb->ki_pos;
ff6a9292e   Christoph Hellwig   iomap: implement ...
700
701
702
703
704
705
706
707
708
709
710
711
712
  	ssize_t ret;
  
  	if (dio->end_io) {
  		ret = dio->end_io(iocb,
  				dio->error ? dio->error : dio->size,
  				dio->flags);
  	} else {
  		ret = dio->error;
  	}
  
  	if (likely(!ret)) {
  		ret = dio->size;
  		/* check for short read */
5e25c269e   Eryu Guan   fs: invalidate pa...
713
  		if (offset + ret > dio->i_size &&
ff6a9292e   Christoph Hellwig   iomap: implement ...
714
  		    !(dio->flags & IOMAP_DIO_WRITE))
5e25c269e   Eryu Guan   fs: invalidate pa...
715
  			ret = dio->i_size - offset;
ff6a9292e   Christoph Hellwig   iomap: implement ...
716
717
  		iocb->ki_pos += ret;
  	}
5e25c269e   Eryu Guan   fs: invalidate pa...
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
  	/*
  	 * Try again to invalidate clean pages which might have been cached by
  	 * non-direct readahead, or faulted in by get_user_pages() if the source
  	 * of the write was an mmap'ed region of the file we're writing.  Either
  	 * one is a pretty crazy thing to do, so we don't support it 100%.  If
  	 * this invalidation fails, tough, the write still worked...
  	 *
  	 * And this page cache invalidation has to be after dio->end_io(), as
  	 * some filesystems convert unwritten extents to real allocations in
  	 * end_io() when necessary, otherwise a racing buffer read would cache
  	 * zeros from unwritten extents.
  	 */
  	if (!dio->error &&
  	    (dio->flags & IOMAP_DIO_WRITE) && inode->i_mapping->nrpages) {
  		int err;
  		err = invalidate_inode_pages2_range(inode->i_mapping,
  				offset >> PAGE_SHIFT,
  				(offset + dio->size - 1) >> PAGE_SHIFT);
  		WARN_ON_ONCE(err);
  	}
ff6a9292e   Christoph Hellwig   iomap: implement ...
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
  	inode_dio_end(file_inode(iocb->ki_filp));
  	kfree(dio);
  
  	return ret;
  }
  
  static void iomap_dio_complete_work(struct work_struct *work)
  {
  	struct iomap_dio *dio = container_of(work, struct iomap_dio, aio.work);
  	struct kiocb *iocb = dio->iocb;
  	bool is_write = (dio->flags & IOMAP_DIO_WRITE);
  	ssize_t ret;
  
  	ret = iomap_dio_complete(dio);
  	if (is_write && ret > 0)
  		ret = generic_write_sync(iocb, ret);
  	iocb->ki_complete(iocb, ret, 0);
  }
  
  /*
   * Set an error in the dio if none is set yet.  We have to use cmpxchg
   * as the submission context and the completion context(s) can race to
   * update the error.
   */
  static inline void iomap_dio_set_error(struct iomap_dio *dio, int ret)
  {
  	cmpxchg(&dio->error, 0, ret);
  }
  
  static void iomap_dio_bio_end_io(struct bio *bio)
  {
  	struct iomap_dio *dio = bio->bi_private;
  	bool should_dirty = (dio->flags & IOMAP_DIO_DIRTY);
4e4cbee93   Christoph Hellwig   block: switch bio...
771
772
  	if (bio->bi_status)
  		iomap_dio_set_error(dio, blk_status_to_errno(bio->bi_status));
ff6a9292e   Christoph Hellwig   iomap: implement ...
773
774
  
  	if (atomic_dec_and_test(&dio->ref)) {
a56b97a2f   Andreas Gruenbacher   iomap: complete p...
775
  		if (dio->wait_for_completion) {
ff6a9292e   Christoph Hellwig   iomap: implement ...
776
  			struct task_struct *waiter = dio->submit.waiter;
ff6a9292e   Christoph Hellwig   iomap: implement ...
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
  			WRITE_ONCE(dio->submit.waiter, NULL);
  			wake_up_process(waiter);
  		} else if (dio->flags & IOMAP_DIO_WRITE) {
  			struct inode *inode = file_inode(dio->iocb->ki_filp);
  
  			INIT_WORK(&dio->aio.work, iomap_dio_complete_work);
  			queue_work(inode->i_sb->s_dio_done_wq, &dio->aio.work);
  		} else {
  			iomap_dio_complete_work(&dio->aio.work);
  		}
  	}
  
  	if (should_dirty) {
  		bio_check_pages_dirty(bio);
  	} else {
  		struct bio_vec *bvec;
  		int i;
  
  		bio_for_each_segment_all(bvec, bio, i)
  			put_page(bvec->bv_page);
  		bio_put(bio);
  	}
  }
  
  static blk_qc_t
  iomap_dio_zero(struct iomap_dio *dio, struct iomap *iomap, loff_t pos,
  		unsigned len)
  {
  	struct page *page = ZERO_PAGE(0);
  	struct bio *bio;
  
  	bio = bio_alloc(GFP_KERNEL, 1);
74d46992e   Christoph Hellwig   block: replace bi...
809
  	bio_set_dev(bio, iomap->bdev);
ff6a9292e   Christoph Hellwig   iomap: implement ...
810
811
812
813
814
815
816
817
  	bio->bi_iter.bi_sector =
  		iomap->blkno + ((pos - iomap->offset) >> 9);
  	bio->bi_private = dio;
  	bio->bi_end_io = iomap_dio_bio_end_io;
  
  	get_page(page);
  	if (bio_add_page(bio, page, len, 0) != len)
  		BUG();
5cc60aeed   Linus Torvalds   Merge tag 'xfs-fo...
818
  	bio_set_op_attrs(bio, REQ_OP_WRITE, REQ_SYNC | REQ_IDLE);
ff6a9292e   Christoph Hellwig   iomap: implement ...
819
820
821
822
823
824
825
826
827
828
  
  	atomic_inc(&dio->ref);
  	return submit_bio(bio);
  }
  
  static loff_t
  iomap_dio_actor(struct inode *inode, loff_t pos, loff_t length,
  		void *data, struct iomap *iomap)
  {
  	struct iomap_dio *dio = data;
93407472a   Fabian Frederick   fs: add i_blocksi...
829
830
831
  	unsigned int blkbits = blksize_bits(bdev_logical_block_size(iomap->bdev));
  	unsigned int fs_block_size = i_blocksize(inode), pad;
  	unsigned int align = iov_iter_alignment(dio->submit.iter);
ff6a9292e   Christoph Hellwig   iomap: implement ...
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
  	struct iov_iter iter;
  	struct bio *bio;
  	bool need_zeroout = false;
  	int nr_pages, ret;
  
  	if ((pos | length | align) & ((1 << blkbits) - 1))
  		return -EINVAL;
  
  	switch (iomap->type) {
  	case IOMAP_HOLE:
  		if (WARN_ON_ONCE(dio->flags & IOMAP_DIO_WRITE))
  			return -EIO;
  		/*FALLTHRU*/
  	case IOMAP_UNWRITTEN:
  		if (!(dio->flags & IOMAP_DIO_WRITE)) {
  			iov_iter_zero(length, dio->submit.iter);
  			dio->size += length;
  			return length;
  		}
  		dio->flags |= IOMAP_DIO_UNWRITTEN;
  		need_zeroout = true;
  		break;
  	case IOMAP_MAPPED:
  		if (iomap->flags & IOMAP_F_SHARED)
  			dio->flags |= IOMAP_DIO_COW;
  		if (iomap->flags & IOMAP_F_NEW)
  			need_zeroout = true;
  		break;
  	default:
  		WARN_ON_ONCE(1);
  		return -EIO;
  	}
  
  	/*
  	 * Operate on a partial iter trimmed to the extent we were called for.
  	 * We'll update the iter in the dio once we're done with this extent.
  	 */
  	iter = *dio->submit.iter;
  	iov_iter_truncate(&iter, length);
  
  	nr_pages = iov_iter_npages(&iter, BIO_MAX_PAGES);
  	if (nr_pages <= 0)
  		return nr_pages;
  
  	if (need_zeroout) {
  		/* zero out from the start of the block to the write offset */
  		pad = pos & (fs_block_size - 1);
  		if (pad)
  			iomap_dio_zero(dio, iomap, pos - pad, pad);
  	}
  
  	do {
  		if (dio->error)
  			return 0;
  
  		bio = bio_alloc(GFP_KERNEL, nr_pages);
74d46992e   Christoph Hellwig   block: replace bi...
888
  		bio_set_dev(bio, iomap->bdev);
ff6a9292e   Christoph Hellwig   iomap: implement ...
889
890
  		bio->bi_iter.bi_sector =
  			iomap->blkno + ((pos - iomap->offset) >> 9);
45d06cf70   Jens Axboe   fs: add O_DIRECT ...
891
  		bio->bi_write_hint = dio->iocb->ki_hint;
ff6a9292e   Christoph Hellwig   iomap: implement ...
892
893
894
895
896
897
898
899
900
901
  		bio->bi_private = dio;
  		bio->bi_end_io = iomap_dio_bio_end_io;
  
  		ret = bio_iov_iter_get_pages(bio, &iter);
  		if (unlikely(ret)) {
  			bio_put(bio);
  			return ret;
  		}
  
  		if (dio->flags & IOMAP_DIO_WRITE) {
5cc60aeed   Linus Torvalds   Merge tag 'xfs-fo...
902
  			bio_set_op_attrs(bio, REQ_OP_WRITE, REQ_SYNC | REQ_IDLE);
ff6a9292e   Christoph Hellwig   iomap: implement ...
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
  			task_io_account_write(bio->bi_iter.bi_size);
  		} else {
  			bio_set_op_attrs(bio, REQ_OP_READ, 0);
  			if (dio->flags & IOMAP_DIO_DIRTY)
  				bio_set_pages_dirty(bio);
  		}
  
  		dio->size += bio->bi_iter.bi_size;
  		pos += bio->bi_iter.bi_size;
  
  		nr_pages = iov_iter_npages(&iter, BIO_MAX_PAGES);
  
  		atomic_inc(&dio->ref);
  
  		dio->submit.last_queue = bdev_get_queue(iomap->bdev);
  		dio->submit.cookie = submit_bio(bio);
  	} while (nr_pages);
  
  	if (need_zeroout) {
  		/* zero out from the end of the write to the end of the block */
  		pad = pos & (fs_block_size - 1);
  		if (pad)
  			iomap_dio_zero(dio, iomap, pos, fs_block_size - pad);
  	}
  
  	iov_iter_advance(dio->submit.iter, length);
  	return length;
  }
  
  ssize_t
8ff6daa17   Christoph Hellwig   iomap: constify s...
933
934
  iomap_dio_rw(struct kiocb *iocb, struct iov_iter *iter,
  		const struct iomap_ops *ops, iomap_dio_end_io_t end_io)
ff6a9292e   Christoph Hellwig   iomap: implement ...
935
936
937
938
  {
  	struct address_space *mapping = iocb->ki_filp->f_mapping;
  	struct inode *inode = file_inode(iocb->ki_filp);
  	size_t count = iov_iter_count(iter);
c771c14ba   Eryu Guan   iomap: invalidate...
939
940
  	loff_t pos = iocb->ki_pos, start = pos;
  	loff_t end = iocb->ki_pos + count - 1, ret = 0;
ff6a9292e   Christoph Hellwig   iomap: implement ...
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
  	unsigned int flags = IOMAP_DIRECT;
  	struct blk_plug plug;
  	struct iomap_dio *dio;
  
  	lockdep_assert_held(&inode->i_rwsem);
  
  	if (!count)
  		return 0;
  
  	dio = kmalloc(sizeof(*dio), GFP_KERNEL);
  	if (!dio)
  		return -ENOMEM;
  
  	dio->iocb = iocb;
  	atomic_set(&dio->ref, 1);
  	dio->size = 0;
  	dio->i_size = i_size_read(inode);
  	dio->end_io = end_io;
  	dio->error = 0;
  	dio->flags = 0;
a56b97a2f   Andreas Gruenbacher   iomap: complete p...
961
  	dio->wait_for_completion = is_sync_kiocb(iocb);
ff6a9292e   Christoph Hellwig   iomap: implement ...
962
963
  
  	dio->submit.iter = iter;
a56b97a2f   Andreas Gruenbacher   iomap: complete p...
964
965
966
  	dio->submit.waiter = current;
  	dio->submit.cookie = BLK_QC_T_NONE;
  	dio->submit.last_queue = NULL;
ff6a9292e   Christoph Hellwig   iomap: implement ...
967
968
969
970
971
972
973
974
975
976
977
  
  	if (iov_iter_rw(iter) == READ) {
  		if (pos >= dio->i_size)
  			goto out_free_dio;
  
  		if (iter->type == ITER_IOVEC)
  			dio->flags |= IOMAP_DIO_DIRTY;
  	} else {
  		dio->flags |= IOMAP_DIO_WRITE;
  		flags |= IOMAP_WRITE;
  	}
a38d12437   Goldwyn Rodrigues   fs: Introduce IOM...
978
979
980
981
982
983
984
  	if (iocb->ki_flags & IOCB_NOWAIT) {
  		if (filemap_range_has_page(mapping, start, end)) {
  			ret = -EAGAIN;
  			goto out_free_dio;
  		}
  		flags |= IOMAP_NOWAIT;
  	}
55635ba76   Andrey Ryabinin   fs: fix data inva...
985
986
987
  	ret = filemap_write_and_wait_range(mapping, start, end);
  	if (ret)
  		goto out_free_dio;
ff6a9292e   Christoph Hellwig   iomap: implement ...
988

55635ba76   Andrey Ryabinin   fs: fix data inva...
989
990
991
992
  	ret = invalidate_inode_pages2_range(mapping,
  			start >> PAGE_SHIFT, end >> PAGE_SHIFT);
  	WARN_ON_ONCE(ret);
  	ret = 0;
ff6a9292e   Christoph Hellwig   iomap: implement ...
993

a56b97a2f   Andreas Gruenbacher   iomap: complete p...
994
  	if (iov_iter_rw(iter) == WRITE && !dio->wait_for_completion &&
546e7be82   Chandan Rajendra   iomap_dio_rw: All...
995
996
997
998
999
  	    !inode->i_sb->s_dio_done_wq) {
  		ret = sb_init_dio_done_wq(inode->i_sb);
  		if (ret < 0)
  			goto out_free_dio;
  	}
ff6a9292e   Christoph Hellwig   iomap: implement ...
1000
1001
1002
1003
1004
1005
1006
1007
  	inode_dio_begin(inode);
  
  	blk_start_plug(&plug);
  	do {
  		ret = iomap_apply(inode, pos, count, flags, ops, dio,
  				iomap_dio_actor);
  		if (ret <= 0) {
  			/* magic error code to fall back to buffered I/O */
a56b97a2f   Andreas Gruenbacher   iomap: complete p...
1008
1009
  			if (ret == -ENOTBLK) {
  				dio->wait_for_completion = true;
ff6a9292e   Christoph Hellwig   iomap: implement ...
1010
  				ret = 0;
a56b97a2f   Andreas Gruenbacher   iomap: complete p...
1011
  			}
ff6a9292e   Christoph Hellwig   iomap: implement ...
1012
1013
1014
  			break;
  		}
  		pos += ret;
a008c31c7   Chandan Rajendra   iomap_dio_rw: Pre...
1015
1016
1017
  
  		if (iov_iter_rw(iter) == READ && pos >= dio->i_size)
  			break;
ff6a9292e   Christoph Hellwig   iomap: implement ...
1018
1019
1020
1021
1022
  	} while ((count = iov_iter_count(iter)) > 0);
  	blk_finish_plug(&plug);
  
  	if (ret < 0)
  		iomap_dio_set_error(dio, ret);
ff6a9292e   Christoph Hellwig   iomap: implement ...
1023
  	if (!atomic_dec_and_test(&dio->ref)) {
a56b97a2f   Andreas Gruenbacher   iomap: complete p...
1024
  		if (!dio->wait_for_completion)
ff6a9292e   Christoph Hellwig   iomap: implement ...
1025
1026
1027
1028
1029
1030
1031
1032
1033
  			return -EIOCBQUEUED;
  
  		for (;;) {
  			set_current_state(TASK_UNINTERRUPTIBLE);
  			if (!READ_ONCE(dio->submit.waiter))
  				break;
  
  			if (!(iocb->ki_flags & IOCB_HIPRI) ||
  			    !dio->submit.last_queue ||
ee4e916b2   Christoph Hellwig   block: add a poll...
1034
  			    !blk_poll(dio->submit.last_queue,
5cc60aeed   Linus Torvalds   Merge tag 'xfs-fo...
1035
  					 dio->submit.cookie))
ff6a9292e   Christoph Hellwig   iomap: implement ...
1036
1037
1038
1039
  				io_schedule();
  		}
  		__set_current_state(TASK_RUNNING);
  	}
c771c14ba   Eryu Guan   iomap: invalidate...
1040
  	ret = iomap_dio_complete(dio);
c771c14ba   Eryu Guan   iomap: invalidate...
1041
  	return ret;
ff6a9292e   Christoph Hellwig   iomap: implement ...
1042
1043
1044
1045
1046
1047
  
  out_free_dio:
  	kfree(dio);
  	return ret;
  }
  EXPORT_SYMBOL_GPL(iomap_dio_rw);