xref: /openbmc/linux/fs/ntfs/file.c (revision 2612e3bbc0386368a850140a6c9b990cd496a5ec)
1a1d312deSThomas Gleixner // SPDX-License-Identifier: GPL-2.0-or-later
21da177e4SLinus Torvalds /*
31da177e4SLinus Torvalds  * file.c - NTFS kernel file operations.  Part of the Linux-NTFS project.
41da177e4SLinus Torvalds  *
5a632f559SAnton Altaparmakov  * Copyright (c) 2001-2015 Anton Altaparmakov and Tuxera Inc.
61da177e4SLinus Torvalds  */
71da177e4SLinus Torvalds 
8ccdf7741SChristoph Hellwig #include <linux/blkdev.h>
9de1414a6SChristoph Hellwig #include <linux/backing-dev.h>
101da177e4SLinus Torvalds #include <linux/buffer_head.h>
115a0e3ad6STejun Heo #include <linux/gfp.h>
1298b27036SAnton Altaparmakov #include <linux/pagemap.h>
1398b27036SAnton Altaparmakov #include <linux/pagevec.h>
14174cd4b1SIngo Molnar #include <linux/sched/signal.h>
1598b27036SAnton Altaparmakov #include <linux/swap.h>
1698b27036SAnton Altaparmakov #include <linux/uio.h>
1798b27036SAnton Altaparmakov #include <linux/writeback.h>
181da177e4SLinus Torvalds 
1998b27036SAnton Altaparmakov #include <asm/page.h>
207c0f6ba6SLinus Torvalds #include <linux/uaccess.h>
2198b27036SAnton Altaparmakov 
2298b27036SAnton Altaparmakov #include "attrib.h"
2398b27036SAnton Altaparmakov #include "bitmap.h"
241da177e4SLinus Torvalds #include "inode.h"
251da177e4SLinus Torvalds #include "debug.h"
2698b27036SAnton Altaparmakov #include "lcnalloc.h"
2798b27036SAnton Altaparmakov #include "malloc.h"
2898b27036SAnton Altaparmakov #include "mft.h"
291da177e4SLinus Torvalds #include "ntfs.h"
301da177e4SLinus Torvalds 
311da177e4SLinus Torvalds /**
321da177e4SLinus Torvalds  * ntfs_file_open - called when an inode is about to be opened
331da177e4SLinus Torvalds  * @vi:		inode to be opened
341da177e4SLinus Torvalds  * @filp:	file structure describing the inode
351da177e4SLinus Torvalds  *
361da177e4SLinus Torvalds  * Limit file size to the page cache limit on architectures where unsigned long
371da177e4SLinus Torvalds  * is 32-bits. This is the most we can do for now without overflowing the page
381da177e4SLinus Torvalds  * cache page index. Doing it this way means we don't run into problems because
391da177e4SLinus Torvalds  * of existing too large files. It would be better to allow the user to read
401da177e4SLinus Torvalds  * the beginning of the file but I doubt very much anyone is going to hit this
411da177e4SLinus Torvalds  * check on a 32-bit architecture, so there is no point in adding the extra
421da177e4SLinus Torvalds  * complexity required to support this.
431da177e4SLinus Torvalds  *
441da177e4SLinus Torvalds  * On 64-bit architectures, the check is hopefully optimized away by the
451da177e4SLinus Torvalds  * compiler.
461da177e4SLinus Torvalds  *
471da177e4SLinus Torvalds  * After the check passes, just call generic_file_open() to do its work.
481da177e4SLinus Torvalds  */
ntfs_file_open(struct inode * vi,struct file * filp)491da177e4SLinus Torvalds static int ntfs_file_open(struct inode *vi, struct file *filp)
501da177e4SLinus Torvalds {
511da177e4SLinus Torvalds 	if (sizeof(unsigned long) < 8) {
52d4b9ba7bSAnton Altaparmakov 		if (i_size_read(vi) > MAX_LFS_FILESIZE)
53a9c62a18SAlan Cox 			return -EOVERFLOW;
541da177e4SLinus Torvalds 	}
551da177e4SLinus Torvalds 	return generic_file_open(vi, filp);
561da177e4SLinus Torvalds }
571da177e4SLinus Torvalds 
581da177e4SLinus Torvalds #ifdef NTFS_RW
591da177e4SLinus Torvalds 
601da177e4SLinus Torvalds /**
6198b27036SAnton Altaparmakov  * ntfs_attr_extend_initialized - extend the initialized size of an attribute
6298b27036SAnton Altaparmakov  * @ni:			ntfs inode of the attribute to extend
6398b27036SAnton Altaparmakov  * @new_init_size:	requested new initialized size in bytes
6498b27036SAnton Altaparmakov  *
6598b27036SAnton Altaparmakov  * Extend the initialized size of an attribute described by the ntfs inode @ni
6698b27036SAnton Altaparmakov  * to @new_init_size bytes.  This involves zeroing any non-sparse space between
6798b27036SAnton Altaparmakov  * the old initialized size and @new_init_size both in the page cache and on
68dda65b94SAnton Altaparmakov  * disk (if relevant complete pages are already uptodate in the page cache then
69dda65b94SAnton Altaparmakov  * these are simply marked dirty).
7098b27036SAnton Altaparmakov  *
7198b27036SAnton Altaparmakov  * As a side-effect, the file size (vfs inode->i_size) may be incremented as,
7298b27036SAnton Altaparmakov  * in the resident attribute case, it is tied to the initialized size and, in
7398b27036SAnton Altaparmakov  * the non-resident attribute case, it may not fall below the initialized size.
7498b27036SAnton Altaparmakov  *
7598b27036SAnton Altaparmakov  * Note that if the attribute is resident, we do not need to touch the page
7698b27036SAnton Altaparmakov  * cache at all.  This is because if the page cache page is not uptodate we
7798b27036SAnton Altaparmakov  * bring it uptodate later, when doing the write to the mft record since we
7898b27036SAnton Altaparmakov  * then already have the page mapped.  And if the page is uptodate, the
7998b27036SAnton Altaparmakov  * non-initialized region will already have been zeroed when the page was
8098b27036SAnton Altaparmakov  * brought uptodate and the region may in fact already have been overwritten
8198b27036SAnton Altaparmakov  * with new data via mmap() based writes, so we cannot just zero it.  And since
8298b27036SAnton Altaparmakov  * POSIX specifies that the behaviour of resizing a file whilst it is mmap()ped
8398b27036SAnton Altaparmakov  * is unspecified, we choose not to do zeroing and thus we do not need to touch
84dda65b94SAnton Altaparmakov  * the page at all.  For a more detailed explanation see ntfs_truncate() in
85dda65b94SAnton Altaparmakov  * fs/ntfs/inode.c.
8698b27036SAnton Altaparmakov  *
8798b27036SAnton Altaparmakov  * Return 0 on success and -errno on error.  In the case that an error is
8898b27036SAnton Altaparmakov  * encountered it is possible that the initialized size will already have been
8998b27036SAnton Altaparmakov  * incremented some way towards @new_init_size but it is guaranteed that if
9098b27036SAnton Altaparmakov  * this is the case, the necessary zeroing will also have happened and that all
9198b27036SAnton Altaparmakov  * metadata is self-consistent.
9298b27036SAnton Altaparmakov  *
931b1dcc1bSJes Sorensen  * Locking: i_mutex on the vfs inode corrseponsind to the ntfs inode @ni must be
94dda65b94SAnton Altaparmakov  *	    held by the caller.
9598b27036SAnton Altaparmakov  */
ntfs_attr_extend_initialized(ntfs_inode * ni,const s64 new_init_size)962ec93b0bSMinchan Kim static int ntfs_attr_extend_initialized(ntfs_inode *ni, const s64 new_init_size)
9798b27036SAnton Altaparmakov {
9898b27036SAnton Altaparmakov 	s64 old_init_size;
9998b27036SAnton Altaparmakov 	loff_t old_i_size;
10098b27036SAnton Altaparmakov 	pgoff_t index, end_index;
10198b27036SAnton Altaparmakov 	unsigned long flags;
10298b27036SAnton Altaparmakov 	struct inode *vi = VFS_I(ni);
10398b27036SAnton Altaparmakov 	ntfs_inode *base_ni;
10498b27036SAnton Altaparmakov 	MFT_RECORD *m = NULL;
10598b27036SAnton Altaparmakov 	ATTR_RECORD *a;
10698b27036SAnton Altaparmakov 	ntfs_attr_search_ctx *ctx = NULL;
10798b27036SAnton Altaparmakov 	struct address_space *mapping;
10898b27036SAnton Altaparmakov 	struct page *page = NULL;
10998b27036SAnton Altaparmakov 	u8 *kattr;
11098b27036SAnton Altaparmakov 	int err;
11198b27036SAnton Altaparmakov 	u32 attr_len;
11298b27036SAnton Altaparmakov 
11398b27036SAnton Altaparmakov 	read_lock_irqsave(&ni->size_lock, flags);
11498b27036SAnton Altaparmakov 	old_init_size = ni->initialized_size;
11598b27036SAnton Altaparmakov 	old_i_size = i_size_read(vi);
11698b27036SAnton Altaparmakov 	BUG_ON(new_init_size > ni->allocated_size);
11798b27036SAnton Altaparmakov 	read_unlock_irqrestore(&ni->size_lock, flags);
11898b27036SAnton Altaparmakov 	ntfs_debug("Entering for i_ino 0x%lx, attribute type 0x%x, "
11998b27036SAnton Altaparmakov 			"old_initialized_size 0x%llx, "
12098b27036SAnton Altaparmakov 			"new_initialized_size 0x%llx, i_size 0x%llx.",
12198b27036SAnton Altaparmakov 			vi->i_ino, (unsigned)le32_to_cpu(ni->type),
12298b27036SAnton Altaparmakov 			(unsigned long long)old_init_size,
12398b27036SAnton Altaparmakov 			(unsigned long long)new_init_size, old_i_size);
12498b27036SAnton Altaparmakov 	if (!NInoAttr(ni))
12598b27036SAnton Altaparmakov 		base_ni = ni;
12698b27036SAnton Altaparmakov 	else
12798b27036SAnton Altaparmakov 		base_ni = ni->ext.base_ntfs_ino;
12898b27036SAnton Altaparmakov 	/* Use goto to reduce indentation and we need the label below anyway. */
12998b27036SAnton Altaparmakov 	if (NInoNonResident(ni))
13098b27036SAnton Altaparmakov 		goto do_non_resident_extend;
13198b27036SAnton Altaparmakov 	BUG_ON(old_init_size != old_i_size);
13298b27036SAnton Altaparmakov 	m = map_mft_record(base_ni);
13398b27036SAnton Altaparmakov 	if (IS_ERR(m)) {
13498b27036SAnton Altaparmakov 		err = PTR_ERR(m);
13598b27036SAnton Altaparmakov 		m = NULL;
13698b27036SAnton Altaparmakov 		goto err_out;
13798b27036SAnton Altaparmakov 	}
13898b27036SAnton Altaparmakov 	ctx = ntfs_attr_get_search_ctx(base_ni, m);
13998b27036SAnton Altaparmakov 	if (unlikely(!ctx)) {
14098b27036SAnton Altaparmakov 		err = -ENOMEM;
14198b27036SAnton Altaparmakov 		goto err_out;
14298b27036SAnton Altaparmakov 	}
14398b27036SAnton Altaparmakov 	err = ntfs_attr_lookup(ni->type, ni->name, ni->name_len,
14498b27036SAnton Altaparmakov 			CASE_SENSITIVE, 0, NULL, 0, ctx);
14598b27036SAnton Altaparmakov 	if (unlikely(err)) {
14698b27036SAnton Altaparmakov 		if (err == -ENOENT)
14798b27036SAnton Altaparmakov 			err = -EIO;
14898b27036SAnton Altaparmakov 		goto err_out;
14998b27036SAnton Altaparmakov 	}
15098b27036SAnton Altaparmakov 	m = ctx->mrec;
15198b27036SAnton Altaparmakov 	a = ctx->attr;
15298b27036SAnton Altaparmakov 	BUG_ON(a->non_resident);
15398b27036SAnton Altaparmakov 	/* The total length of the attribute value. */
15498b27036SAnton Altaparmakov 	attr_len = le32_to_cpu(a->data.resident.value_length);
15598b27036SAnton Altaparmakov 	BUG_ON(old_i_size != (loff_t)attr_len);
15698b27036SAnton Altaparmakov 	/*
15798b27036SAnton Altaparmakov 	 * Do the zeroing in the mft record and update the attribute size in
15898b27036SAnton Altaparmakov 	 * the mft record.
15998b27036SAnton Altaparmakov 	 */
16098b27036SAnton Altaparmakov 	kattr = (u8*)a + le16_to_cpu(a->data.resident.value_offset);
16198b27036SAnton Altaparmakov 	memset(kattr + attr_len, 0, new_init_size - attr_len);
16298b27036SAnton Altaparmakov 	a->data.resident.value_length = cpu_to_le32((u32)new_init_size);
16398b27036SAnton Altaparmakov 	/* Finally, update the sizes in the vfs and ntfs inodes. */
16498b27036SAnton Altaparmakov 	write_lock_irqsave(&ni->size_lock, flags);
16598b27036SAnton Altaparmakov 	i_size_write(vi, new_init_size);
16698b27036SAnton Altaparmakov 	ni->initialized_size = new_init_size;
16798b27036SAnton Altaparmakov 	write_unlock_irqrestore(&ni->size_lock, flags);
16898b27036SAnton Altaparmakov 	goto done;
16998b27036SAnton Altaparmakov do_non_resident_extend:
17098b27036SAnton Altaparmakov 	/*
17198b27036SAnton Altaparmakov 	 * If the new initialized size @new_init_size exceeds the current file
17298b27036SAnton Altaparmakov 	 * size (vfs inode->i_size), we need to extend the file size to the
17398b27036SAnton Altaparmakov 	 * new initialized size.
17498b27036SAnton Altaparmakov 	 */
17598b27036SAnton Altaparmakov 	if (new_init_size > old_i_size) {
17698b27036SAnton Altaparmakov 		m = map_mft_record(base_ni);
17798b27036SAnton Altaparmakov 		if (IS_ERR(m)) {
17898b27036SAnton Altaparmakov 			err = PTR_ERR(m);
17998b27036SAnton Altaparmakov 			m = NULL;
18098b27036SAnton Altaparmakov 			goto err_out;
18198b27036SAnton Altaparmakov 		}
18298b27036SAnton Altaparmakov 		ctx = ntfs_attr_get_search_ctx(base_ni, m);
18398b27036SAnton Altaparmakov 		if (unlikely(!ctx)) {
18498b27036SAnton Altaparmakov 			err = -ENOMEM;
18598b27036SAnton Altaparmakov 			goto err_out;
18698b27036SAnton Altaparmakov 		}
18798b27036SAnton Altaparmakov 		err = ntfs_attr_lookup(ni->type, ni->name, ni->name_len,
18898b27036SAnton Altaparmakov 				CASE_SENSITIVE, 0, NULL, 0, ctx);
18998b27036SAnton Altaparmakov 		if (unlikely(err)) {
19098b27036SAnton Altaparmakov 			if (err == -ENOENT)
19198b27036SAnton Altaparmakov 				err = -EIO;
19298b27036SAnton Altaparmakov 			goto err_out;
19398b27036SAnton Altaparmakov 		}
19498b27036SAnton Altaparmakov 		m = ctx->mrec;
19598b27036SAnton Altaparmakov 		a = ctx->attr;
19698b27036SAnton Altaparmakov 		BUG_ON(!a->non_resident);
19798b27036SAnton Altaparmakov 		BUG_ON(old_i_size != (loff_t)
19898b27036SAnton Altaparmakov 				sle64_to_cpu(a->data.non_resident.data_size));
19998b27036SAnton Altaparmakov 		a->data.non_resident.data_size = cpu_to_sle64(new_init_size);
20098b27036SAnton Altaparmakov 		flush_dcache_mft_record_page(ctx->ntfs_ino);
20198b27036SAnton Altaparmakov 		mark_mft_record_dirty(ctx->ntfs_ino);
20298b27036SAnton Altaparmakov 		/* Update the file size in the vfs inode. */
20398b27036SAnton Altaparmakov 		i_size_write(vi, new_init_size);
20498b27036SAnton Altaparmakov 		ntfs_attr_put_search_ctx(ctx);
20598b27036SAnton Altaparmakov 		ctx = NULL;
20698b27036SAnton Altaparmakov 		unmap_mft_record(base_ni);
20798b27036SAnton Altaparmakov 		m = NULL;
20898b27036SAnton Altaparmakov 	}
20998b27036SAnton Altaparmakov 	mapping = vi->i_mapping;
21009cbfeafSKirill A. Shutemov 	index = old_init_size >> PAGE_SHIFT;
21109cbfeafSKirill A. Shutemov 	end_index = (new_init_size + PAGE_SIZE - 1) >> PAGE_SHIFT;
21298b27036SAnton Altaparmakov 	do {
21398b27036SAnton Altaparmakov 		/*
21498b27036SAnton Altaparmakov 		 * Read the page.  If the page is not present, this will zero
21598b27036SAnton Altaparmakov 		 * the uninitialized regions for us.
21698b27036SAnton Altaparmakov 		 */
217090d2b18SPekka Enberg 		page = read_mapping_page(mapping, index, NULL);
21898b27036SAnton Altaparmakov 		if (IS_ERR(page)) {
21998b27036SAnton Altaparmakov 			err = PTR_ERR(page);
22098b27036SAnton Altaparmakov 			goto init_err_out;
22198b27036SAnton Altaparmakov 		}
22298b27036SAnton Altaparmakov 		/*
22398b27036SAnton Altaparmakov 		 * Update the initialized size in the ntfs inode.  This is
22498b27036SAnton Altaparmakov 		 * enough to make ntfs_writepage() work.
22598b27036SAnton Altaparmakov 		 */
22698b27036SAnton Altaparmakov 		write_lock_irqsave(&ni->size_lock, flags);
22709cbfeafSKirill A. Shutemov 		ni->initialized_size = (s64)(index + 1) << PAGE_SHIFT;
22898b27036SAnton Altaparmakov 		if (ni->initialized_size > new_init_size)
22998b27036SAnton Altaparmakov 			ni->initialized_size = new_init_size;
23098b27036SAnton Altaparmakov 		write_unlock_irqrestore(&ni->size_lock, flags);
23198b27036SAnton Altaparmakov 		/* Set the page dirty so it gets written out. */
23298b27036SAnton Altaparmakov 		set_page_dirty(page);
23309cbfeafSKirill A. Shutemov 		put_page(page);
23498b27036SAnton Altaparmakov 		/*
23598b27036SAnton Altaparmakov 		 * Play nice with the vm and the rest of the system.  This is
23698b27036SAnton Altaparmakov 		 * very much needed as we can potentially be modifying the
23798b27036SAnton Altaparmakov 		 * initialised size from a very small value to a really huge
23898b27036SAnton Altaparmakov 		 * value, e.g.
23998b27036SAnton Altaparmakov 		 *	f = open(somefile, O_TRUNC);
24098b27036SAnton Altaparmakov 		 *	truncate(f, 10GiB);
24198b27036SAnton Altaparmakov 		 *	seek(f, 10GiB);
24298b27036SAnton Altaparmakov 		 *	write(f, 1);
24398b27036SAnton Altaparmakov 		 * And this would mean we would be marking dirty hundreds of
24498b27036SAnton Altaparmakov 		 * thousands of pages or as in the above example more than
24598b27036SAnton Altaparmakov 		 * two and a half million pages!
24698b27036SAnton Altaparmakov 		 *
24798b27036SAnton Altaparmakov 		 * TODO: For sparse pages could optimize this workload by using
24898b27036SAnton Altaparmakov 		 * the FsMisc / MiscFs page bit as a "PageIsSparse" bit.  This
249933906f8SMatthew Wilcox (Oracle) 		 * would be set in read_folio for sparse pages and here we would
25098b27036SAnton Altaparmakov 		 * not need to mark dirty any pages which have this bit set.
25198b27036SAnton Altaparmakov 		 * The only caveat is that we have to clear the bit everywhere
25298b27036SAnton Altaparmakov 		 * where we allocate any clusters that lie in the page or that
25398b27036SAnton Altaparmakov 		 * contain the page.
25498b27036SAnton Altaparmakov 		 *
25598b27036SAnton Altaparmakov 		 * TODO: An even greater optimization would be for us to only
256933906f8SMatthew Wilcox (Oracle) 		 * call read_folio() on pages which are not in sparse regions as
25798b27036SAnton Altaparmakov 		 * determined from the runlist.  This would greatly reduce the
25898b27036SAnton Altaparmakov 		 * number of pages we read and make dirty in the case of sparse
25998b27036SAnton Altaparmakov 		 * files.
26098b27036SAnton Altaparmakov 		 */
26198b27036SAnton Altaparmakov 		balance_dirty_pages_ratelimited(mapping);
26298b27036SAnton Altaparmakov 		cond_resched();
26398b27036SAnton Altaparmakov 	} while (++index < end_index);
26498b27036SAnton Altaparmakov 	read_lock_irqsave(&ni->size_lock, flags);
26598b27036SAnton Altaparmakov 	BUG_ON(ni->initialized_size != new_init_size);
26698b27036SAnton Altaparmakov 	read_unlock_irqrestore(&ni->size_lock, flags);
26798b27036SAnton Altaparmakov 	/* Now bring in sync the initialized_size in the mft record. */
26898b27036SAnton Altaparmakov 	m = map_mft_record(base_ni);
26998b27036SAnton Altaparmakov 	if (IS_ERR(m)) {
27098b27036SAnton Altaparmakov 		err = PTR_ERR(m);
27198b27036SAnton Altaparmakov 		m = NULL;
27298b27036SAnton Altaparmakov 		goto init_err_out;
27398b27036SAnton Altaparmakov 	}
27498b27036SAnton Altaparmakov 	ctx = ntfs_attr_get_search_ctx(base_ni, m);
27598b27036SAnton Altaparmakov 	if (unlikely(!ctx)) {
27698b27036SAnton Altaparmakov 		err = -ENOMEM;
27798b27036SAnton Altaparmakov 		goto init_err_out;
27898b27036SAnton Altaparmakov 	}
27998b27036SAnton Altaparmakov 	err = ntfs_attr_lookup(ni->type, ni->name, ni->name_len,
28098b27036SAnton Altaparmakov 			CASE_SENSITIVE, 0, NULL, 0, ctx);
28198b27036SAnton Altaparmakov 	if (unlikely(err)) {
28298b27036SAnton Altaparmakov 		if (err == -ENOENT)
28398b27036SAnton Altaparmakov 			err = -EIO;
28498b27036SAnton Altaparmakov 		goto init_err_out;
28598b27036SAnton Altaparmakov 	}
28698b27036SAnton Altaparmakov 	m = ctx->mrec;
28798b27036SAnton Altaparmakov 	a = ctx->attr;
28898b27036SAnton Altaparmakov 	BUG_ON(!a->non_resident);
28998b27036SAnton Altaparmakov 	a->data.non_resident.initialized_size = cpu_to_sle64(new_init_size);
29098b27036SAnton Altaparmakov done:
29198b27036SAnton Altaparmakov 	flush_dcache_mft_record_page(ctx->ntfs_ino);
29298b27036SAnton Altaparmakov 	mark_mft_record_dirty(ctx->ntfs_ino);
29398b27036SAnton Altaparmakov 	if (ctx)
29498b27036SAnton Altaparmakov 		ntfs_attr_put_search_ctx(ctx);
29598b27036SAnton Altaparmakov 	if (m)
29698b27036SAnton Altaparmakov 		unmap_mft_record(base_ni);
29798b27036SAnton Altaparmakov 	ntfs_debug("Done, initialized_size 0x%llx, i_size 0x%llx.",
29898b27036SAnton Altaparmakov 			(unsigned long long)new_init_size, i_size_read(vi));
29998b27036SAnton Altaparmakov 	return 0;
30098b27036SAnton Altaparmakov init_err_out:
30198b27036SAnton Altaparmakov 	write_lock_irqsave(&ni->size_lock, flags);
30298b27036SAnton Altaparmakov 	ni->initialized_size = old_init_size;
30398b27036SAnton Altaparmakov 	write_unlock_irqrestore(&ni->size_lock, flags);
30498b27036SAnton Altaparmakov err_out:
30598b27036SAnton Altaparmakov 	if (ctx)
30698b27036SAnton Altaparmakov 		ntfs_attr_put_search_ctx(ctx);
30798b27036SAnton Altaparmakov 	if (m)
30898b27036SAnton Altaparmakov 		unmap_mft_record(base_ni);
30998b27036SAnton Altaparmakov 	ntfs_debug("Failed.  Returning error code %i.", err);
31098b27036SAnton Altaparmakov 	return err;
31198b27036SAnton Altaparmakov }
31298b27036SAnton Altaparmakov 
ntfs_prepare_file_for_write(struct kiocb * iocb,struct iov_iter * from)313ccca2683SAl Viro static ssize_t ntfs_prepare_file_for_write(struct kiocb *iocb,
314ccca2683SAl Viro 		struct iov_iter *from)
31598b27036SAnton Altaparmakov {
316a632f559SAnton Altaparmakov 	loff_t pos;
317a632f559SAnton Altaparmakov 	s64 end, ll;
318a632f559SAnton Altaparmakov 	ssize_t err;
319a632f559SAnton Altaparmakov 	unsigned long flags;
320ccca2683SAl Viro 	struct file *file = iocb->ki_filp;
321a632f559SAnton Altaparmakov 	struct inode *vi = file_inode(file);
3223f10c2faSAlex Shi 	ntfs_inode *ni = NTFS_I(vi);
323a632f559SAnton Altaparmakov 	ntfs_volume *vol = ni->vol;
32498b27036SAnton Altaparmakov 
325a632f559SAnton Altaparmakov 	ntfs_debug("Entering for i_ino 0x%lx, attribute type 0x%x, pos "
326ccca2683SAl Viro 			"0x%llx, count 0x%zx.", vi->i_ino,
327a632f559SAnton Altaparmakov 			(unsigned)le32_to_cpu(ni->type),
3283309dd04SAl Viro 			(unsigned long long)iocb->ki_pos,
3293309dd04SAl Viro 			iov_iter_count(from));
3303309dd04SAl Viro 	err = generic_write_checks(iocb, from);
3313309dd04SAl Viro 	if (unlikely(err <= 0))
332ccca2683SAl Viro 		goto out;
333a632f559SAnton Altaparmakov 	/*
334a632f559SAnton Altaparmakov 	 * All checks have passed.  Before we start doing any writing we want
335a632f559SAnton Altaparmakov 	 * to abort any totally illegal writes.
336a632f559SAnton Altaparmakov 	 */
337a632f559SAnton Altaparmakov 	BUG_ON(NInoMstProtected(ni));
338a632f559SAnton Altaparmakov 	BUG_ON(ni->type != AT_DATA);
339a632f559SAnton Altaparmakov 	/* If file is encrypted, deny access, just like NT4. */
340a632f559SAnton Altaparmakov 	if (NInoEncrypted(ni)) {
341a632f559SAnton Altaparmakov 		/* Only $DATA attributes can be encrypted. */
342a632f559SAnton Altaparmakov 		/*
343a632f559SAnton Altaparmakov 		 * Reminder for later: Encrypted files are _always_
344a632f559SAnton Altaparmakov 		 * non-resident so that the content can always be encrypted.
345a632f559SAnton Altaparmakov 		 */
346a632f559SAnton Altaparmakov 		ntfs_debug("Denying write access to encrypted file.");
347a632f559SAnton Altaparmakov 		err = -EACCES;
348a632f559SAnton Altaparmakov 		goto out;
34998b27036SAnton Altaparmakov 	}
350a632f559SAnton Altaparmakov 	if (NInoCompressed(ni)) {
351a632f559SAnton Altaparmakov 		/* Only unnamed $DATA attribute can be compressed. */
352a632f559SAnton Altaparmakov 		BUG_ON(ni->name_len);
353a632f559SAnton Altaparmakov 		/*
354a632f559SAnton Altaparmakov 		 * Reminder for later: If resident, the data is not actually
355a632f559SAnton Altaparmakov 		 * compressed.  Only on the switch to non-resident does
356a632f559SAnton Altaparmakov 		 * compression kick in.  This is in contrast to encrypted files
357a632f559SAnton Altaparmakov 		 * (see above).
35898b27036SAnton Altaparmakov 		 */
359a632f559SAnton Altaparmakov 		ntfs_error(vi->i_sb, "Writing to compressed files is not "
360a632f559SAnton Altaparmakov 				"implemented yet.  Sorry.");
361a632f559SAnton Altaparmakov 		err = -EOPNOTSUPP;
362a632f559SAnton Altaparmakov 		goto out;
363a632f559SAnton Altaparmakov 	}
3645fa8e0a1SJan Kara 	err = file_remove_privs(file);
365a632f559SAnton Altaparmakov 	if (unlikely(err))
366a632f559SAnton Altaparmakov 		goto out;
367a632f559SAnton Altaparmakov 	/*
368a632f559SAnton Altaparmakov 	 * Our ->update_time method always succeeds thus file_update_time()
369a632f559SAnton Altaparmakov 	 * cannot fail either so there is no need to check the return code.
370a632f559SAnton Altaparmakov 	 */
371a632f559SAnton Altaparmakov 	file_update_time(file);
372ccca2683SAl Viro 	pos = iocb->ki_pos;
373a632f559SAnton Altaparmakov 	/* The first byte after the last cluster being written to. */
374ccca2683SAl Viro 	end = (pos + iov_iter_count(from) + vol->cluster_size_mask) &
375a632f559SAnton Altaparmakov 			~(u64)vol->cluster_size_mask;
376a632f559SAnton Altaparmakov 	/*
377a632f559SAnton Altaparmakov 	 * If the write goes beyond the allocated size, extend the allocation
378a632f559SAnton Altaparmakov 	 * to cover the whole of the write, rounded up to the nearest cluster.
379a632f559SAnton Altaparmakov 	 */
380a632f559SAnton Altaparmakov 	read_lock_irqsave(&ni->size_lock, flags);
381a632f559SAnton Altaparmakov 	ll = ni->allocated_size;
382a632f559SAnton Altaparmakov 	read_unlock_irqrestore(&ni->size_lock, flags);
383a632f559SAnton Altaparmakov 	if (end > ll) {
384a632f559SAnton Altaparmakov 		/*
385a632f559SAnton Altaparmakov 		 * Extend the allocation without changing the data size.
386a632f559SAnton Altaparmakov 		 *
387a632f559SAnton Altaparmakov 		 * Note we ensure the allocation is big enough to at least
388a632f559SAnton Altaparmakov 		 * write some data but we do not require the allocation to be
389a632f559SAnton Altaparmakov 		 * complete, i.e. it may be partial.
390a632f559SAnton Altaparmakov 		 */
391a632f559SAnton Altaparmakov 		ll = ntfs_attr_extend_allocation(ni, end, -1, pos);
392a632f559SAnton Altaparmakov 		if (likely(ll >= 0)) {
393a632f559SAnton Altaparmakov 			BUG_ON(pos >= ll);
394a632f559SAnton Altaparmakov 			/* If the extension was partial truncate the write. */
395a632f559SAnton Altaparmakov 			if (end > ll) {
396a632f559SAnton Altaparmakov 				ntfs_debug("Truncating write to inode 0x%lx, "
397a632f559SAnton Altaparmakov 						"attribute type 0x%x, because "
398a632f559SAnton Altaparmakov 						"the allocation was only "
399a632f559SAnton Altaparmakov 						"partially extended.",
400a632f559SAnton Altaparmakov 						vi->i_ino, (unsigned)
401a632f559SAnton Altaparmakov 						le32_to_cpu(ni->type));
402ccca2683SAl Viro 				iov_iter_truncate(from, ll - pos);
403a632f559SAnton Altaparmakov 			}
404a632f559SAnton Altaparmakov 		} else {
405a632f559SAnton Altaparmakov 			err = ll;
406a632f559SAnton Altaparmakov 			read_lock_irqsave(&ni->size_lock, flags);
407a632f559SAnton Altaparmakov 			ll = ni->allocated_size;
408a632f559SAnton Altaparmakov 			read_unlock_irqrestore(&ni->size_lock, flags);
409a632f559SAnton Altaparmakov 			/* Perform a partial write if possible or fail. */
410a632f559SAnton Altaparmakov 			if (pos < ll) {
411a632f559SAnton Altaparmakov 				ntfs_debug("Truncating write to inode 0x%lx "
412a632f559SAnton Altaparmakov 						"attribute type 0x%x, because "
413a632f559SAnton Altaparmakov 						"extending the allocation "
414a632f559SAnton Altaparmakov 						"failed (error %d).",
415a632f559SAnton Altaparmakov 						vi->i_ino, (unsigned)
416a632f559SAnton Altaparmakov 						le32_to_cpu(ni->type),
417a632f559SAnton Altaparmakov 						(int)-err);
418ccca2683SAl Viro 				iov_iter_truncate(from, ll - pos);
419a632f559SAnton Altaparmakov 			} else {
420a632f559SAnton Altaparmakov 				if (err != -ENOSPC)
421a632f559SAnton Altaparmakov 					ntfs_error(vi->i_sb, "Cannot perform "
422a632f559SAnton Altaparmakov 							"write to inode "
423a632f559SAnton Altaparmakov 							"0x%lx, attribute "
424a632f559SAnton Altaparmakov 							"type 0x%x, because "
425a632f559SAnton Altaparmakov 							"extending the "
426a632f559SAnton Altaparmakov 							"allocation failed "
427a632f559SAnton Altaparmakov 							"(error %ld).",
428a632f559SAnton Altaparmakov 							vi->i_ino, (unsigned)
429a632f559SAnton Altaparmakov 							le32_to_cpu(ni->type),
430a632f559SAnton Altaparmakov 							(long)-err);
431a632f559SAnton Altaparmakov 				else
432a632f559SAnton Altaparmakov 					ntfs_debug("Cannot perform write to "
433a632f559SAnton Altaparmakov 							"inode 0x%lx, "
434a632f559SAnton Altaparmakov 							"attribute type 0x%x, "
435a632f559SAnton Altaparmakov 							"because there is not "
436a632f559SAnton Altaparmakov 							"space left.",
437a632f559SAnton Altaparmakov 							vi->i_ino, (unsigned)
438a632f559SAnton Altaparmakov 							le32_to_cpu(ni->type));
439a632f559SAnton Altaparmakov 				goto out;
440a632f559SAnton Altaparmakov 			}
441a632f559SAnton Altaparmakov 		}
442a632f559SAnton Altaparmakov 	}
443a632f559SAnton Altaparmakov 	/*
444a632f559SAnton Altaparmakov 	 * If the write starts beyond the initialized size, extend it up to the
445a632f559SAnton Altaparmakov 	 * beginning of the write and initialize all non-sparse space between
446a632f559SAnton Altaparmakov 	 * the old initialized size and the new one.  This automatically also
447a632f559SAnton Altaparmakov 	 * increments the vfs inode->i_size to keep it above or equal to the
448a632f559SAnton Altaparmakov 	 * initialized_size.
449a632f559SAnton Altaparmakov 	 */
450a632f559SAnton Altaparmakov 	read_lock_irqsave(&ni->size_lock, flags);
451a632f559SAnton Altaparmakov 	ll = ni->initialized_size;
452a632f559SAnton Altaparmakov 	read_unlock_irqrestore(&ni->size_lock, flags);
453a632f559SAnton Altaparmakov 	if (pos > ll) {
454a632f559SAnton Altaparmakov 		/*
455a632f559SAnton Altaparmakov 		 * Wait for ongoing direct i/o to complete before proceeding.
456a632f559SAnton Altaparmakov 		 * New direct i/o cannot start as we hold i_mutex.
457a632f559SAnton Altaparmakov 		 */
458a632f559SAnton Altaparmakov 		inode_dio_wait(vi);
459a632f559SAnton Altaparmakov 		err = ntfs_attr_extend_initialized(ni, pos);
460a632f559SAnton Altaparmakov 		if (unlikely(err < 0))
461a632f559SAnton Altaparmakov 			ntfs_error(vi->i_sb, "Cannot perform write to inode "
462a632f559SAnton Altaparmakov 					"0x%lx, attribute type 0x%x, because "
463a632f559SAnton Altaparmakov 					"extending the initialized size "
464a632f559SAnton Altaparmakov 					"failed (error %d).", vi->i_ino,
465a632f559SAnton Altaparmakov 					(unsigned)le32_to_cpu(ni->type),
466a632f559SAnton Altaparmakov 					(int)-err);
467a632f559SAnton Altaparmakov 	}
468a632f559SAnton Altaparmakov out:
469a632f559SAnton Altaparmakov 	return err;
47098b27036SAnton Altaparmakov }
47198b27036SAnton Altaparmakov 
47298b27036SAnton Altaparmakov /**
47398b27036SAnton Altaparmakov  * __ntfs_grab_cache_pages - obtain a number of locked pages
47498b27036SAnton Altaparmakov  * @mapping:	address space mapping from which to obtain page cache pages
47598b27036SAnton Altaparmakov  * @index:	starting index in @mapping at which to begin obtaining pages
47698b27036SAnton Altaparmakov  * @nr_pages:	number of page cache pages to obtain
47798b27036SAnton Altaparmakov  * @pages:	array of pages in which to return the obtained page cache pages
47898b27036SAnton Altaparmakov  * @cached_page: allocated but as yet unused page
47998b27036SAnton Altaparmakov  *
480af901ca1SAndré Goddard Rosa  * Obtain @nr_pages locked page cache pages from the mapping @mapping and
48198b27036SAnton Altaparmakov  * starting at index @index.
48298b27036SAnton Altaparmakov  *
4834c99000aSMinchan Kim  * If a page is newly created, add it to lru list
48498b27036SAnton Altaparmakov  *
48598b27036SAnton Altaparmakov  * Note, the page locks are obtained in ascending page index order.
48698b27036SAnton Altaparmakov  */
__ntfs_grab_cache_pages(struct address_space * mapping,pgoff_t index,const unsigned nr_pages,struct page ** pages,struct page ** cached_page)48798b27036SAnton Altaparmakov static inline int __ntfs_grab_cache_pages(struct address_space *mapping,
48898b27036SAnton Altaparmakov 		pgoff_t index, const unsigned nr_pages, struct page **pages,
4894c99000aSMinchan Kim 		struct page **cached_page)
49098b27036SAnton Altaparmakov {
49198b27036SAnton Altaparmakov 	int err, nr;
49298b27036SAnton Altaparmakov 
49398b27036SAnton Altaparmakov 	BUG_ON(!nr_pages);
49498b27036SAnton Altaparmakov 	err = nr = 0;
49598b27036SAnton Altaparmakov 	do {
4965272d036SAnton Altaparmakov 		pages[nr] = find_get_page_flags(mapping, index, FGP_LOCK |
4975272d036SAnton Altaparmakov 				FGP_ACCESSED);
49898b27036SAnton Altaparmakov 		if (!pages[nr]) {
49998b27036SAnton Altaparmakov 			if (!*cached_page) {
50098b27036SAnton Altaparmakov 				*cached_page = page_cache_alloc(mapping);
50198b27036SAnton Altaparmakov 				if (unlikely(!*cached_page)) {
50298b27036SAnton Altaparmakov 					err = -ENOMEM;
50398b27036SAnton Altaparmakov 					goto err_out;
50498b27036SAnton Altaparmakov 				}
50598b27036SAnton Altaparmakov 			}
506a632f559SAnton Altaparmakov 			err = add_to_page_cache_lru(*cached_page, mapping,
5076afdb859SMichal Hocko 				   index,
508c62d2555SMichal Hocko 				   mapping_gfp_constraint(mapping, GFP_KERNEL));
50998b27036SAnton Altaparmakov 			if (unlikely(err)) {
51098b27036SAnton Altaparmakov 				if (err == -EEXIST)
51198b27036SAnton Altaparmakov 					continue;
51298b27036SAnton Altaparmakov 				goto err_out;
51398b27036SAnton Altaparmakov 			}
51498b27036SAnton Altaparmakov 			pages[nr] = *cached_page;
51598b27036SAnton Altaparmakov 			*cached_page = NULL;
51698b27036SAnton Altaparmakov 		}
51798b27036SAnton Altaparmakov 		index++;
51898b27036SAnton Altaparmakov 		nr++;
51998b27036SAnton Altaparmakov 	} while (nr < nr_pages);
52098b27036SAnton Altaparmakov out:
52198b27036SAnton Altaparmakov 	return err;
52298b27036SAnton Altaparmakov err_out:
52398b27036SAnton Altaparmakov 	while (nr > 0) {
52498b27036SAnton Altaparmakov 		unlock_page(pages[--nr]);
52509cbfeafSKirill A. Shutemov 		put_page(pages[nr]);
52698b27036SAnton Altaparmakov 	}
52798b27036SAnton Altaparmakov 	goto out;
52898b27036SAnton Altaparmakov }
52998b27036SAnton Altaparmakov 
ntfs_submit_bh_for_read(struct buffer_head * bh)530c5475248SRitesh Harjani (IBM) static inline void ntfs_submit_bh_for_read(struct buffer_head *bh)
53198b27036SAnton Altaparmakov {
53298b27036SAnton Altaparmakov 	lock_buffer(bh);
53398b27036SAnton Altaparmakov 	get_bh(bh);
53498b27036SAnton Altaparmakov 	bh->b_end_io = end_buffer_read_sync;
535c5475248SRitesh Harjani (IBM) 	submit_bh(REQ_OP_READ, bh);
53698b27036SAnton Altaparmakov }
53798b27036SAnton Altaparmakov 
53898b27036SAnton Altaparmakov /**
53998b27036SAnton Altaparmakov  * ntfs_prepare_pages_for_non_resident_write - prepare pages for receiving data
54098b27036SAnton Altaparmakov  * @pages:	array of destination pages
54198b27036SAnton Altaparmakov  * @nr_pages:	number of pages in @pages
54298b27036SAnton Altaparmakov  * @pos:	byte position in file at which the write begins
54398b27036SAnton Altaparmakov  * @bytes:	number of bytes to be written
54498b27036SAnton Altaparmakov  *
54598b27036SAnton Altaparmakov  * This is called for non-resident attributes from ntfs_file_buffered_write()
5461b1dcc1bSJes Sorensen  * with i_mutex held on the inode (@pages[0]->mapping->host).  There are
54798b27036SAnton Altaparmakov  * @nr_pages pages in @pages which are locked but not kmap()ped.  The source
54898b27036SAnton Altaparmakov  * data has not yet been copied into the @pages.
54998b27036SAnton Altaparmakov  *
55098b27036SAnton Altaparmakov  * Need to fill any holes with actual clusters, allocate buffers if necessary,
55198b27036SAnton Altaparmakov  * ensure all the buffers are mapped, and bring uptodate any buffers that are
55298b27036SAnton Altaparmakov  * only partially being written to.
55398b27036SAnton Altaparmakov  *
55498b27036SAnton Altaparmakov  * If @nr_pages is greater than one, we are guaranteed that the cluster size is
555ea1754a0SKirill A. Shutemov  * greater than PAGE_SIZE, that all pages in @pages are entirely inside
55698b27036SAnton Altaparmakov  * the same cluster and that they are the entirety of that cluster, and that
55798b27036SAnton Altaparmakov  * the cluster is sparse, i.e. we need to allocate a cluster to fill the hole.
55898b27036SAnton Altaparmakov  *
55998b27036SAnton Altaparmakov  * i_size is not to be modified yet.
56098b27036SAnton Altaparmakov  *
56198b27036SAnton Altaparmakov  * Return 0 on success or -errno on error.
56298b27036SAnton Altaparmakov  */
ntfs_prepare_pages_for_non_resident_write(struct page ** pages,unsigned nr_pages,s64 pos,size_t bytes)56398b27036SAnton Altaparmakov static int ntfs_prepare_pages_for_non_resident_write(struct page **pages,
56498b27036SAnton Altaparmakov 		unsigned nr_pages, s64 pos, size_t bytes)
56598b27036SAnton Altaparmakov {
56698b27036SAnton Altaparmakov 	VCN vcn, highest_vcn = 0, cpos, cend, bh_cpos, bh_cend;
56798b27036SAnton Altaparmakov 	LCN lcn;
56898b27036SAnton Altaparmakov 	s64 bh_pos, vcn_len, end, initialized_size;
56998b27036SAnton Altaparmakov 	sector_t lcn_block;
57098b27036SAnton Altaparmakov 	struct page *page;
57198b27036SAnton Altaparmakov 	struct inode *vi;
57298b27036SAnton Altaparmakov 	ntfs_inode *ni, *base_ni = NULL;
57398b27036SAnton Altaparmakov 	ntfs_volume *vol;
57498b27036SAnton Altaparmakov 	runlist_element *rl, *rl2;
57598b27036SAnton Altaparmakov 	struct buffer_head *bh, *head, *wait[2], **wait_bh = wait;
57698b27036SAnton Altaparmakov 	ntfs_attr_search_ctx *ctx = NULL;
57798b27036SAnton Altaparmakov 	MFT_RECORD *m = NULL;
57898b27036SAnton Altaparmakov 	ATTR_RECORD *a = NULL;
57998b27036SAnton Altaparmakov 	unsigned long flags;
58098b27036SAnton Altaparmakov 	u32 attr_rec_len = 0;
58198b27036SAnton Altaparmakov 	unsigned blocksize, u;
58298b27036SAnton Altaparmakov 	int err, mp_size;
583c49c3111SRichard Knutsson 	bool rl_write_locked, was_hole, is_retry;
58498b27036SAnton Altaparmakov 	unsigned char blocksize_bits;
58598b27036SAnton Altaparmakov 	struct {
58698b27036SAnton Altaparmakov 		u8 runlist_merged:1;
58798b27036SAnton Altaparmakov 		u8 mft_attr_mapped:1;
58898b27036SAnton Altaparmakov 		u8 mp_rebuilt:1;
58998b27036SAnton Altaparmakov 		u8 attr_switched:1;
59098b27036SAnton Altaparmakov 	} status = { 0, 0, 0, 0 };
59198b27036SAnton Altaparmakov 
59298b27036SAnton Altaparmakov 	BUG_ON(!nr_pages);
59398b27036SAnton Altaparmakov 	BUG_ON(!pages);
59498b27036SAnton Altaparmakov 	BUG_ON(!*pages);
59598b27036SAnton Altaparmakov 	vi = pages[0]->mapping->host;
59698b27036SAnton Altaparmakov 	ni = NTFS_I(vi);
59798b27036SAnton Altaparmakov 	vol = ni->vol;
59898b27036SAnton Altaparmakov 	ntfs_debug("Entering for inode 0x%lx, attribute type 0x%x, start page "
599d04bd1fbSAnton Altaparmakov 			"index 0x%lx, nr_pages 0x%x, pos 0x%llx, bytes 0x%zx.",
60098b27036SAnton Altaparmakov 			vi->i_ino, ni->type, pages[0]->index, nr_pages,
60198b27036SAnton Altaparmakov 			(long long)pos, bytes);
60278af34f0SAnton Altaparmakov 	blocksize = vol->sb->s_blocksize;
60378af34f0SAnton Altaparmakov 	blocksize_bits = vol->sb->s_blocksize_bits;
60498b27036SAnton Altaparmakov 	u = 0;
60598b27036SAnton Altaparmakov 	do {
606bfab36e8SAnton Altaparmakov 		page = pages[u];
607bfab36e8SAnton Altaparmakov 		BUG_ON(!page);
60898b27036SAnton Altaparmakov 		/*
60998b27036SAnton Altaparmakov 		 * create_empty_buffers() will create uptodate/dirty buffers if
61098b27036SAnton Altaparmakov 		 * the page is uptodate/dirty.
61198b27036SAnton Altaparmakov 		 */
61298b27036SAnton Altaparmakov 		if (!page_has_buffers(page)) {
61398b27036SAnton Altaparmakov 			create_empty_buffers(page, blocksize, 0);
61498b27036SAnton Altaparmakov 			if (unlikely(!page_has_buffers(page)))
61598b27036SAnton Altaparmakov 				return -ENOMEM;
61698b27036SAnton Altaparmakov 		}
61798b27036SAnton Altaparmakov 	} while (++u < nr_pages);
618c49c3111SRichard Knutsson 	rl_write_locked = false;
61998b27036SAnton Altaparmakov 	rl = NULL;
62098b27036SAnton Altaparmakov 	err = 0;
62198b27036SAnton Altaparmakov 	vcn = lcn = -1;
62298b27036SAnton Altaparmakov 	vcn_len = 0;
62398b27036SAnton Altaparmakov 	lcn_block = -1;
624c49c3111SRichard Knutsson 	was_hole = false;
62598b27036SAnton Altaparmakov 	cpos = pos >> vol->cluster_size_bits;
62698b27036SAnton Altaparmakov 	end = pos + bytes;
62798b27036SAnton Altaparmakov 	cend = (end + vol->cluster_size - 1) >> vol->cluster_size_bits;
62898b27036SAnton Altaparmakov 	/*
62998b27036SAnton Altaparmakov 	 * Loop over each page and for each page over each buffer.  Use goto to
63098b27036SAnton Altaparmakov 	 * reduce indentation.
63198b27036SAnton Altaparmakov 	 */
63298b27036SAnton Altaparmakov 	u = 0;
63398b27036SAnton Altaparmakov do_next_page:
63498b27036SAnton Altaparmakov 	page = pages[u];
63509cbfeafSKirill A. Shutemov 	bh_pos = (s64)page->index << PAGE_SHIFT;
63698b27036SAnton Altaparmakov 	bh = head = page_buffers(page);
63798b27036SAnton Altaparmakov 	do {
63898b27036SAnton Altaparmakov 		VCN cdelta;
63998b27036SAnton Altaparmakov 		s64 bh_end;
64098b27036SAnton Altaparmakov 		unsigned bh_cofs;
64198b27036SAnton Altaparmakov 
64298b27036SAnton Altaparmakov 		/* Clear buffer_new on all buffers to reinitialise state. */
64398b27036SAnton Altaparmakov 		if (buffer_new(bh))
64498b27036SAnton Altaparmakov 			clear_buffer_new(bh);
64598b27036SAnton Altaparmakov 		bh_end = bh_pos + blocksize;
64698b27036SAnton Altaparmakov 		bh_cpos = bh_pos >> vol->cluster_size_bits;
64798b27036SAnton Altaparmakov 		bh_cofs = bh_pos & vol->cluster_size_mask;
64898b27036SAnton Altaparmakov 		if (buffer_mapped(bh)) {
64998b27036SAnton Altaparmakov 			/*
65098b27036SAnton Altaparmakov 			 * The buffer is already mapped.  If it is uptodate,
65198b27036SAnton Altaparmakov 			 * ignore it.
65298b27036SAnton Altaparmakov 			 */
65398b27036SAnton Altaparmakov 			if (buffer_uptodate(bh))
65498b27036SAnton Altaparmakov 				continue;
65598b27036SAnton Altaparmakov 			/*
65698b27036SAnton Altaparmakov 			 * The buffer is not uptodate.  If the page is uptodate
65798b27036SAnton Altaparmakov 			 * set the buffer uptodate and otherwise ignore it.
65898b27036SAnton Altaparmakov 			 */
65998b27036SAnton Altaparmakov 			if (PageUptodate(page)) {
66098b27036SAnton Altaparmakov 				set_buffer_uptodate(bh);
66198b27036SAnton Altaparmakov 				continue;
66298b27036SAnton Altaparmakov 			}
66398b27036SAnton Altaparmakov 			/*
66498b27036SAnton Altaparmakov 			 * Neither the page nor the buffer are uptodate.  If
66598b27036SAnton Altaparmakov 			 * the buffer is only partially being written to, we
66698b27036SAnton Altaparmakov 			 * need to read it in before the write, i.e. now.
66798b27036SAnton Altaparmakov 			 */
66898b27036SAnton Altaparmakov 			if ((bh_pos < pos && bh_end > pos) ||
66998b27036SAnton Altaparmakov 					(bh_pos < end && bh_end > end)) {
67098b27036SAnton Altaparmakov 				/*
67198b27036SAnton Altaparmakov 				 * If the buffer is fully or partially within
67298b27036SAnton Altaparmakov 				 * the initialized size, do an actual read.
67398b27036SAnton Altaparmakov 				 * Otherwise, simply zero the buffer.
67498b27036SAnton Altaparmakov 				 */
67598b27036SAnton Altaparmakov 				read_lock_irqsave(&ni->size_lock, flags);
67698b27036SAnton Altaparmakov 				initialized_size = ni->initialized_size;
67798b27036SAnton Altaparmakov 				read_unlock_irqrestore(&ni->size_lock, flags);
67898b27036SAnton Altaparmakov 				if (bh_pos < initialized_size) {
67998b27036SAnton Altaparmakov 					ntfs_submit_bh_for_read(bh);
68098b27036SAnton Altaparmakov 					*wait_bh++ = bh;
68198b27036SAnton Altaparmakov 				} else {
682eebd2aa3SChristoph Lameter 					zero_user(page, bh_offset(bh),
683eebd2aa3SChristoph Lameter 							blocksize);
68498b27036SAnton Altaparmakov 					set_buffer_uptodate(bh);
68598b27036SAnton Altaparmakov 				}
68698b27036SAnton Altaparmakov 			}
68798b27036SAnton Altaparmakov 			continue;
68898b27036SAnton Altaparmakov 		}
68998b27036SAnton Altaparmakov 		/* Unmapped buffer.  Need to map it. */
69098b27036SAnton Altaparmakov 		bh->b_bdev = vol->sb->s_bdev;
69198b27036SAnton Altaparmakov 		/*
69298b27036SAnton Altaparmakov 		 * If the current buffer is in the same clusters as the map
69398b27036SAnton Altaparmakov 		 * cache, there is no need to check the runlist again.  The
69498b27036SAnton Altaparmakov 		 * map cache is made up of @vcn, which is the first cached file
69598b27036SAnton Altaparmakov 		 * cluster, @vcn_len which is the number of cached file
69698b27036SAnton Altaparmakov 		 * clusters, @lcn is the device cluster corresponding to @vcn,
69798b27036SAnton Altaparmakov 		 * and @lcn_block is the block number corresponding to @lcn.
69898b27036SAnton Altaparmakov 		 */
69998b27036SAnton Altaparmakov 		cdelta = bh_cpos - vcn;
70098b27036SAnton Altaparmakov 		if (likely(!cdelta || (cdelta > 0 && cdelta < vcn_len))) {
70198b27036SAnton Altaparmakov map_buffer_cached:
70298b27036SAnton Altaparmakov 			BUG_ON(lcn < 0);
70398b27036SAnton Altaparmakov 			bh->b_blocknr = lcn_block +
70498b27036SAnton Altaparmakov 					(cdelta << (vol->cluster_size_bits -
70598b27036SAnton Altaparmakov 					blocksize_bits)) +
70698b27036SAnton Altaparmakov 					(bh_cofs >> blocksize_bits);
70798b27036SAnton Altaparmakov 			set_buffer_mapped(bh);
70898b27036SAnton Altaparmakov 			/*
70998b27036SAnton Altaparmakov 			 * If the page is uptodate so is the buffer.  If the
71098b27036SAnton Altaparmakov 			 * buffer is fully outside the write, we ignore it if
71198b27036SAnton Altaparmakov 			 * it was already allocated and we mark it dirty so it
71298b27036SAnton Altaparmakov 			 * gets written out if we allocated it.  On the other
71398b27036SAnton Altaparmakov 			 * hand, if we allocated the buffer but we are not
71498b27036SAnton Altaparmakov 			 * marking it dirty we set buffer_new so we can do
71598b27036SAnton Altaparmakov 			 * error recovery.
71698b27036SAnton Altaparmakov 			 */
71798b27036SAnton Altaparmakov 			if (PageUptodate(page)) {
71898b27036SAnton Altaparmakov 				if (!buffer_uptodate(bh))
71998b27036SAnton Altaparmakov 					set_buffer_uptodate(bh);
72098b27036SAnton Altaparmakov 				if (unlikely(was_hole)) {
72198b27036SAnton Altaparmakov 					/* We allocated the buffer. */
722e64855c6SJan Kara 					clean_bdev_bh_alias(bh);
72398b27036SAnton Altaparmakov 					if (bh_end <= pos || bh_pos >= end)
72498b27036SAnton Altaparmakov 						mark_buffer_dirty(bh);
72598b27036SAnton Altaparmakov 					else
72698b27036SAnton Altaparmakov 						set_buffer_new(bh);
72798b27036SAnton Altaparmakov 				}
72898b27036SAnton Altaparmakov 				continue;
72998b27036SAnton Altaparmakov 			}
73098b27036SAnton Altaparmakov 			/* Page is _not_ uptodate. */
73198b27036SAnton Altaparmakov 			if (likely(!was_hole)) {
73298b27036SAnton Altaparmakov 				/*
73398b27036SAnton Altaparmakov 				 * Buffer was already allocated.  If it is not
73498b27036SAnton Altaparmakov 				 * uptodate and is only partially being written
73598b27036SAnton Altaparmakov 				 * to, we need to read it in before the write,
73698b27036SAnton Altaparmakov 				 * i.e. now.
73798b27036SAnton Altaparmakov 				 */
7383aebf25bSAnton Altaparmakov 				if (!buffer_uptodate(bh) && bh_pos < end &&
7393aebf25bSAnton Altaparmakov 						bh_end > pos &&
7403aebf25bSAnton Altaparmakov 						(bh_pos < pos ||
7413aebf25bSAnton Altaparmakov 						bh_end > end)) {
74298b27036SAnton Altaparmakov 					/*
74398b27036SAnton Altaparmakov 					 * If the buffer is fully or partially
74498b27036SAnton Altaparmakov 					 * within the initialized size, do an
74598b27036SAnton Altaparmakov 					 * actual read.  Otherwise, simply zero
74698b27036SAnton Altaparmakov 					 * the buffer.
74798b27036SAnton Altaparmakov 					 */
74898b27036SAnton Altaparmakov 					read_lock_irqsave(&ni->size_lock,
74998b27036SAnton Altaparmakov 							flags);
75098b27036SAnton Altaparmakov 					initialized_size = ni->initialized_size;
75198b27036SAnton Altaparmakov 					read_unlock_irqrestore(&ni->size_lock,
75298b27036SAnton Altaparmakov 							flags);
75398b27036SAnton Altaparmakov 					if (bh_pos < initialized_size) {
75498b27036SAnton Altaparmakov 						ntfs_submit_bh_for_read(bh);
75598b27036SAnton Altaparmakov 						*wait_bh++ = bh;
75698b27036SAnton Altaparmakov 					} else {
757eebd2aa3SChristoph Lameter 						zero_user(page, bh_offset(bh),
758eebd2aa3SChristoph Lameter 								blocksize);
75998b27036SAnton Altaparmakov 						set_buffer_uptodate(bh);
76098b27036SAnton Altaparmakov 					}
76198b27036SAnton Altaparmakov 				}
76298b27036SAnton Altaparmakov 				continue;
76398b27036SAnton Altaparmakov 			}
76498b27036SAnton Altaparmakov 			/* We allocated the buffer. */
765e64855c6SJan Kara 			clean_bdev_bh_alias(bh);
76698b27036SAnton Altaparmakov 			/*
76798b27036SAnton Altaparmakov 			 * If the buffer is fully outside the write, zero it,
76898b27036SAnton Altaparmakov 			 * set it uptodate, and mark it dirty so it gets
76998b27036SAnton Altaparmakov 			 * written out.  If it is partially being written to,
77098b27036SAnton Altaparmakov 			 * zero region surrounding the write but leave it to
77198b27036SAnton Altaparmakov 			 * commit write to do anything else.  Finally, if the
77298b27036SAnton Altaparmakov 			 * buffer is fully being overwritten, do nothing.
77398b27036SAnton Altaparmakov 			 */
77498b27036SAnton Altaparmakov 			if (bh_end <= pos || bh_pos >= end) {
77598b27036SAnton Altaparmakov 				if (!buffer_uptodate(bh)) {
776eebd2aa3SChristoph Lameter 					zero_user(page, bh_offset(bh),
777eebd2aa3SChristoph Lameter 							blocksize);
77898b27036SAnton Altaparmakov 					set_buffer_uptodate(bh);
77998b27036SAnton Altaparmakov 				}
78098b27036SAnton Altaparmakov 				mark_buffer_dirty(bh);
78198b27036SAnton Altaparmakov 				continue;
78298b27036SAnton Altaparmakov 			}
78398b27036SAnton Altaparmakov 			set_buffer_new(bh);
78498b27036SAnton Altaparmakov 			if (!buffer_uptodate(bh) &&
78598b27036SAnton Altaparmakov 					(bh_pos < pos || bh_end > end)) {
78698b27036SAnton Altaparmakov 				u8 *kaddr;
78798b27036SAnton Altaparmakov 				unsigned pofs;
78898b27036SAnton Altaparmakov 
789a3ac1414SCong Wang 				kaddr = kmap_atomic(page);
79098b27036SAnton Altaparmakov 				if (bh_pos < pos) {
79109cbfeafSKirill A. Shutemov 					pofs = bh_pos & ~PAGE_MASK;
79298b27036SAnton Altaparmakov 					memset(kaddr + pofs, 0, pos - bh_pos);
79398b27036SAnton Altaparmakov 				}
79498b27036SAnton Altaparmakov 				if (bh_end > end) {
79509cbfeafSKirill A. Shutemov 					pofs = end & ~PAGE_MASK;
79698b27036SAnton Altaparmakov 					memset(kaddr + pofs, 0, bh_end - end);
79798b27036SAnton Altaparmakov 				}
798a3ac1414SCong Wang 				kunmap_atomic(kaddr);
79998b27036SAnton Altaparmakov 				flush_dcache_page(page);
80098b27036SAnton Altaparmakov 			}
80198b27036SAnton Altaparmakov 			continue;
80298b27036SAnton Altaparmakov 		}
80398b27036SAnton Altaparmakov 		/*
80498b27036SAnton Altaparmakov 		 * Slow path: this is the first buffer in the cluster.  If it
80598b27036SAnton Altaparmakov 		 * is outside allocated size and is not uptodate, zero it and
80698b27036SAnton Altaparmakov 		 * set it uptodate.
80798b27036SAnton Altaparmakov 		 */
80898b27036SAnton Altaparmakov 		read_lock_irqsave(&ni->size_lock, flags);
80998b27036SAnton Altaparmakov 		initialized_size = ni->allocated_size;
81098b27036SAnton Altaparmakov 		read_unlock_irqrestore(&ni->size_lock, flags);
81198b27036SAnton Altaparmakov 		if (bh_pos > initialized_size) {
81298b27036SAnton Altaparmakov 			if (PageUptodate(page)) {
81398b27036SAnton Altaparmakov 				if (!buffer_uptodate(bh))
81498b27036SAnton Altaparmakov 					set_buffer_uptodate(bh);
81598b27036SAnton Altaparmakov 			} else if (!buffer_uptodate(bh)) {
816eebd2aa3SChristoph Lameter 				zero_user(page, bh_offset(bh), blocksize);
81798b27036SAnton Altaparmakov 				set_buffer_uptodate(bh);
81898b27036SAnton Altaparmakov 			}
81998b27036SAnton Altaparmakov 			continue;
82098b27036SAnton Altaparmakov 		}
821c49c3111SRichard Knutsson 		is_retry = false;
82298b27036SAnton Altaparmakov 		if (!rl) {
82398b27036SAnton Altaparmakov 			down_read(&ni->runlist.lock);
82498b27036SAnton Altaparmakov retry_remap:
82598b27036SAnton Altaparmakov 			rl = ni->runlist.rl;
82698b27036SAnton Altaparmakov 		}
82798b27036SAnton Altaparmakov 		if (likely(rl != NULL)) {
82898b27036SAnton Altaparmakov 			/* Seek to element containing target cluster. */
82998b27036SAnton Altaparmakov 			while (rl->length && rl[1].vcn <= bh_cpos)
83098b27036SAnton Altaparmakov 				rl++;
83198b27036SAnton Altaparmakov 			lcn = ntfs_rl_vcn_to_lcn(rl, bh_cpos);
83298b27036SAnton Altaparmakov 			if (likely(lcn >= 0)) {
83398b27036SAnton Altaparmakov 				/*
83498b27036SAnton Altaparmakov 				 * Successful remap, setup the map cache and
83598b27036SAnton Altaparmakov 				 * use that to deal with the buffer.
83698b27036SAnton Altaparmakov 				 */
837c49c3111SRichard Knutsson 				was_hole = false;
83898b27036SAnton Altaparmakov 				vcn = bh_cpos;
83998b27036SAnton Altaparmakov 				vcn_len = rl[1].vcn - vcn;
84098b27036SAnton Altaparmakov 				lcn_block = lcn << (vol->cluster_size_bits -
84198b27036SAnton Altaparmakov 						blocksize_bits);
842d5aeaef3SAnton Altaparmakov 				cdelta = 0;
84398b27036SAnton Altaparmakov 				/*
8443aebf25bSAnton Altaparmakov 				 * If the number of remaining clusters touched
8453aebf25bSAnton Altaparmakov 				 * by the write is smaller or equal to the
8463aebf25bSAnton Altaparmakov 				 * number of cached clusters, unlock the
8473aebf25bSAnton Altaparmakov 				 * runlist as the map cache will be used from
8483aebf25bSAnton Altaparmakov 				 * now on.
84998b27036SAnton Altaparmakov 				 */
85098b27036SAnton Altaparmakov 				if (likely(vcn + vcn_len >= cend)) {
85198b27036SAnton Altaparmakov 					if (rl_write_locked) {
85298b27036SAnton Altaparmakov 						up_write(&ni->runlist.lock);
853c49c3111SRichard Knutsson 						rl_write_locked = false;
85498b27036SAnton Altaparmakov 					} else
85598b27036SAnton Altaparmakov 						up_read(&ni->runlist.lock);
85698b27036SAnton Altaparmakov 					rl = NULL;
85798b27036SAnton Altaparmakov 				}
85898b27036SAnton Altaparmakov 				goto map_buffer_cached;
85998b27036SAnton Altaparmakov 			}
86098b27036SAnton Altaparmakov 		} else
86198b27036SAnton Altaparmakov 			lcn = LCN_RL_NOT_MAPPED;
86298b27036SAnton Altaparmakov 		/*
86398b27036SAnton Altaparmakov 		 * If it is not a hole and not out of bounds, the runlist is
86498b27036SAnton Altaparmakov 		 * probably unmapped so try to map it now.
86598b27036SAnton Altaparmakov 		 */
86698b27036SAnton Altaparmakov 		if (unlikely(lcn != LCN_HOLE && lcn != LCN_ENOENT)) {
86798b27036SAnton Altaparmakov 			if (likely(!is_retry && lcn == LCN_RL_NOT_MAPPED)) {
86898b27036SAnton Altaparmakov 				/* Attempt to map runlist. */
86998b27036SAnton Altaparmakov 				if (!rl_write_locked) {
87098b27036SAnton Altaparmakov 					/*
87198b27036SAnton Altaparmakov 					 * We need the runlist locked for
87298b27036SAnton Altaparmakov 					 * writing, so if it is locked for
87398b27036SAnton Altaparmakov 					 * reading relock it now and retry in
87498b27036SAnton Altaparmakov 					 * case it changed whilst we dropped
87598b27036SAnton Altaparmakov 					 * the lock.
87698b27036SAnton Altaparmakov 					 */
87798b27036SAnton Altaparmakov 					up_read(&ni->runlist.lock);
87898b27036SAnton Altaparmakov 					down_write(&ni->runlist.lock);
879c49c3111SRichard Knutsson 					rl_write_locked = true;
88098b27036SAnton Altaparmakov 					goto retry_remap;
88198b27036SAnton Altaparmakov 				}
88298b27036SAnton Altaparmakov 				err = ntfs_map_runlist_nolock(ni, bh_cpos,
88398b27036SAnton Altaparmakov 						NULL);
88498b27036SAnton Altaparmakov 				if (likely(!err)) {
885c49c3111SRichard Knutsson 					is_retry = true;
88698b27036SAnton Altaparmakov 					goto retry_remap;
88798b27036SAnton Altaparmakov 				}
88898b27036SAnton Altaparmakov 				/*
88998b27036SAnton Altaparmakov 				 * If @vcn is out of bounds, pretend @lcn is
89098b27036SAnton Altaparmakov 				 * LCN_ENOENT.  As long as the buffer is out
89198b27036SAnton Altaparmakov 				 * of bounds this will work fine.
89298b27036SAnton Altaparmakov 				 */
89398b27036SAnton Altaparmakov 				if (err == -ENOENT) {
89498b27036SAnton Altaparmakov 					lcn = LCN_ENOENT;
89598b27036SAnton Altaparmakov 					err = 0;
89698b27036SAnton Altaparmakov 					goto rl_not_mapped_enoent;
89798b27036SAnton Altaparmakov 				}
89898b27036SAnton Altaparmakov 			} else
89998b27036SAnton Altaparmakov 				err = -EIO;
90098b27036SAnton Altaparmakov 			/* Failed to map the buffer, even after retrying. */
90198b27036SAnton Altaparmakov 			bh->b_blocknr = -1;
90298b27036SAnton Altaparmakov 			ntfs_error(vol->sb, "Failed to write to inode 0x%lx, "
90398b27036SAnton Altaparmakov 					"attribute type 0x%x, vcn 0x%llx, "
90498b27036SAnton Altaparmakov 					"vcn offset 0x%x, because its "
90598b27036SAnton Altaparmakov 					"location on disk could not be "
90698b27036SAnton Altaparmakov 					"determined%s (error code %i).",
90798b27036SAnton Altaparmakov 					ni->mft_no, ni->type,
90898b27036SAnton Altaparmakov 					(unsigned long long)bh_cpos,
90998b27036SAnton Altaparmakov 					(unsigned)bh_pos &
91098b27036SAnton Altaparmakov 					vol->cluster_size_mask,
91198b27036SAnton Altaparmakov 					is_retry ? " even after retrying" : "",
91298b27036SAnton Altaparmakov 					err);
91398b27036SAnton Altaparmakov 			break;
91498b27036SAnton Altaparmakov 		}
91598b27036SAnton Altaparmakov rl_not_mapped_enoent:
91698b27036SAnton Altaparmakov 		/*
91798b27036SAnton Altaparmakov 		 * The buffer is in a hole or out of bounds.  We need to fill
91898b27036SAnton Altaparmakov 		 * the hole, unless the buffer is in a cluster which is not
91998b27036SAnton Altaparmakov 		 * touched by the write, in which case we just leave the buffer
92098b27036SAnton Altaparmakov 		 * unmapped.  This can only happen when the cluster size is
92198b27036SAnton Altaparmakov 		 * less than the page cache size.
92298b27036SAnton Altaparmakov 		 */
92309cbfeafSKirill A. Shutemov 		if (unlikely(vol->cluster_size < PAGE_SIZE)) {
92498b27036SAnton Altaparmakov 			bh_cend = (bh_end + vol->cluster_size - 1) >>
92598b27036SAnton Altaparmakov 					vol->cluster_size_bits;
92698b27036SAnton Altaparmakov 			if ((bh_cend <= cpos || bh_cpos >= cend)) {
92798b27036SAnton Altaparmakov 				bh->b_blocknr = -1;
92898b27036SAnton Altaparmakov 				/*
92998b27036SAnton Altaparmakov 				 * If the buffer is uptodate we skip it.  If it
93098b27036SAnton Altaparmakov 				 * is not but the page is uptodate, we can set
93198b27036SAnton Altaparmakov 				 * the buffer uptodate.  If the page is not
93298b27036SAnton Altaparmakov 				 * uptodate, we can clear the buffer and set it
93398b27036SAnton Altaparmakov 				 * uptodate.  Whether this is worthwhile is
93498b27036SAnton Altaparmakov 				 * debatable and this could be removed.
93598b27036SAnton Altaparmakov 				 */
93698b27036SAnton Altaparmakov 				if (PageUptodate(page)) {
93798b27036SAnton Altaparmakov 					if (!buffer_uptodate(bh))
93898b27036SAnton Altaparmakov 						set_buffer_uptodate(bh);
93998b27036SAnton Altaparmakov 				} else if (!buffer_uptodate(bh)) {
940eebd2aa3SChristoph Lameter 					zero_user(page, bh_offset(bh),
941eebd2aa3SChristoph Lameter 						blocksize);
94298b27036SAnton Altaparmakov 					set_buffer_uptodate(bh);
94398b27036SAnton Altaparmakov 				}
94498b27036SAnton Altaparmakov 				continue;
94598b27036SAnton Altaparmakov 			}
94698b27036SAnton Altaparmakov 		}
94798b27036SAnton Altaparmakov 		/*
94898b27036SAnton Altaparmakov 		 * Out of bounds buffer is invalid if it was not really out of
94998b27036SAnton Altaparmakov 		 * bounds.
95098b27036SAnton Altaparmakov 		 */
95198b27036SAnton Altaparmakov 		BUG_ON(lcn != LCN_HOLE);
95298b27036SAnton Altaparmakov 		/*
95398b27036SAnton Altaparmakov 		 * We need the runlist locked for writing, so if it is locked
95498b27036SAnton Altaparmakov 		 * for reading relock it now and retry in case it changed
95598b27036SAnton Altaparmakov 		 * whilst we dropped the lock.
95698b27036SAnton Altaparmakov 		 */
95798b27036SAnton Altaparmakov 		BUG_ON(!rl);
95898b27036SAnton Altaparmakov 		if (!rl_write_locked) {
95998b27036SAnton Altaparmakov 			up_read(&ni->runlist.lock);
96098b27036SAnton Altaparmakov 			down_write(&ni->runlist.lock);
961c49c3111SRichard Knutsson 			rl_write_locked = true;
96298b27036SAnton Altaparmakov 			goto retry_remap;
96398b27036SAnton Altaparmakov 		}
96498b27036SAnton Altaparmakov 		/* Find the previous last allocated cluster. */
96598b27036SAnton Altaparmakov 		BUG_ON(rl->lcn != LCN_HOLE);
96698b27036SAnton Altaparmakov 		lcn = -1;
96798b27036SAnton Altaparmakov 		rl2 = rl;
96898b27036SAnton Altaparmakov 		while (--rl2 >= ni->runlist.rl) {
96998b27036SAnton Altaparmakov 			if (rl2->lcn >= 0) {
97098b27036SAnton Altaparmakov 				lcn = rl2->lcn + rl2->length;
97198b27036SAnton Altaparmakov 				break;
97298b27036SAnton Altaparmakov 			}
97398b27036SAnton Altaparmakov 		}
97498b27036SAnton Altaparmakov 		rl2 = ntfs_cluster_alloc(vol, bh_cpos, 1, lcn, DATA_ZONE,
975c49c3111SRichard Knutsson 				false);
97698b27036SAnton Altaparmakov 		if (IS_ERR(rl2)) {
97798b27036SAnton Altaparmakov 			err = PTR_ERR(rl2);
97898b27036SAnton Altaparmakov 			ntfs_debug("Failed to allocate cluster, error code %i.",
97998b27036SAnton Altaparmakov 					err);
98098b27036SAnton Altaparmakov 			break;
98198b27036SAnton Altaparmakov 		}
98298b27036SAnton Altaparmakov 		lcn = rl2->lcn;
98398b27036SAnton Altaparmakov 		rl = ntfs_runlists_merge(ni->runlist.rl, rl2);
98498b27036SAnton Altaparmakov 		if (IS_ERR(rl)) {
98598b27036SAnton Altaparmakov 			err = PTR_ERR(rl);
98698b27036SAnton Altaparmakov 			if (err != -ENOMEM)
98798b27036SAnton Altaparmakov 				err = -EIO;
98898b27036SAnton Altaparmakov 			if (ntfs_cluster_free_from_rl(vol, rl2)) {
98998b27036SAnton Altaparmakov 				ntfs_error(vol->sb, "Failed to release "
99098b27036SAnton Altaparmakov 						"allocated cluster in error "
99198b27036SAnton Altaparmakov 						"code path.  Run chkdsk to "
99298b27036SAnton Altaparmakov 						"recover the lost cluster.");
99398b27036SAnton Altaparmakov 				NVolSetErrors(vol);
99498b27036SAnton Altaparmakov 			}
99598b27036SAnton Altaparmakov 			ntfs_free(rl2);
99698b27036SAnton Altaparmakov 			break;
99798b27036SAnton Altaparmakov 		}
99898b27036SAnton Altaparmakov 		ni->runlist.rl = rl;
99998b27036SAnton Altaparmakov 		status.runlist_merged = 1;
1000bb8047d3SAnton Altaparmakov 		ntfs_debug("Allocated cluster, lcn 0x%llx.",
1001bb8047d3SAnton Altaparmakov 				(unsigned long long)lcn);
100298b27036SAnton Altaparmakov 		/* Map and lock the mft record and get the attribute record. */
100398b27036SAnton Altaparmakov 		if (!NInoAttr(ni))
100498b27036SAnton Altaparmakov 			base_ni = ni;
100598b27036SAnton Altaparmakov 		else
100698b27036SAnton Altaparmakov 			base_ni = ni->ext.base_ntfs_ino;
100798b27036SAnton Altaparmakov 		m = map_mft_record(base_ni);
100898b27036SAnton Altaparmakov 		if (IS_ERR(m)) {
100998b27036SAnton Altaparmakov 			err = PTR_ERR(m);
101098b27036SAnton Altaparmakov 			break;
101198b27036SAnton Altaparmakov 		}
101298b27036SAnton Altaparmakov 		ctx = ntfs_attr_get_search_ctx(base_ni, m);
101398b27036SAnton Altaparmakov 		if (unlikely(!ctx)) {
101498b27036SAnton Altaparmakov 			err = -ENOMEM;
101598b27036SAnton Altaparmakov 			unmap_mft_record(base_ni);
101698b27036SAnton Altaparmakov 			break;
101798b27036SAnton Altaparmakov 		}
101898b27036SAnton Altaparmakov 		status.mft_attr_mapped = 1;
101998b27036SAnton Altaparmakov 		err = ntfs_attr_lookup(ni->type, ni->name, ni->name_len,
102098b27036SAnton Altaparmakov 				CASE_SENSITIVE, bh_cpos, NULL, 0, ctx);
102198b27036SAnton Altaparmakov 		if (unlikely(err)) {
102298b27036SAnton Altaparmakov 			if (err == -ENOENT)
102398b27036SAnton Altaparmakov 				err = -EIO;
102498b27036SAnton Altaparmakov 			break;
102598b27036SAnton Altaparmakov 		}
102698b27036SAnton Altaparmakov 		m = ctx->mrec;
102798b27036SAnton Altaparmakov 		a = ctx->attr;
102898b27036SAnton Altaparmakov 		/*
102998b27036SAnton Altaparmakov 		 * Find the runlist element with which the attribute extent
103098b27036SAnton Altaparmakov 		 * starts.  Note, we cannot use the _attr_ version because we
103198b27036SAnton Altaparmakov 		 * have mapped the mft record.  That is ok because we know the
103298b27036SAnton Altaparmakov 		 * runlist fragment must be mapped already to have ever gotten
103398b27036SAnton Altaparmakov 		 * here, so we can just use the _rl_ version.
103498b27036SAnton Altaparmakov 		 */
103598b27036SAnton Altaparmakov 		vcn = sle64_to_cpu(a->data.non_resident.lowest_vcn);
103698b27036SAnton Altaparmakov 		rl2 = ntfs_rl_find_vcn_nolock(rl, vcn);
103798b27036SAnton Altaparmakov 		BUG_ON(!rl2);
103898b27036SAnton Altaparmakov 		BUG_ON(!rl2->length);
103998b27036SAnton Altaparmakov 		BUG_ON(rl2->lcn < LCN_HOLE);
104098b27036SAnton Altaparmakov 		highest_vcn = sle64_to_cpu(a->data.non_resident.highest_vcn);
104198b27036SAnton Altaparmakov 		/*
104298b27036SAnton Altaparmakov 		 * If @highest_vcn is zero, calculate the real highest_vcn
104398b27036SAnton Altaparmakov 		 * (which can really be zero).
104498b27036SAnton Altaparmakov 		 */
104598b27036SAnton Altaparmakov 		if (!highest_vcn)
104698b27036SAnton Altaparmakov 			highest_vcn = (sle64_to_cpu(
104798b27036SAnton Altaparmakov 					a->data.non_resident.allocated_size) >>
104898b27036SAnton Altaparmakov 					vol->cluster_size_bits) - 1;
104998b27036SAnton Altaparmakov 		/*
105098b27036SAnton Altaparmakov 		 * Determine the size of the mapping pairs array for the new
105198b27036SAnton Altaparmakov 		 * extent, i.e. the old extent with the hole filled.
105298b27036SAnton Altaparmakov 		 */
105398b27036SAnton Altaparmakov 		mp_size = ntfs_get_size_for_mapping_pairs(vol, rl2, vcn,
105498b27036SAnton Altaparmakov 				highest_vcn);
105598b27036SAnton Altaparmakov 		if (unlikely(mp_size <= 0)) {
105698b27036SAnton Altaparmakov 			if (!(err = mp_size))
105798b27036SAnton Altaparmakov 				err = -EIO;
105898b27036SAnton Altaparmakov 			ntfs_debug("Failed to get size for mapping pairs "
105998b27036SAnton Altaparmakov 					"array, error code %i.", err);
106098b27036SAnton Altaparmakov 			break;
106198b27036SAnton Altaparmakov 		}
106298b27036SAnton Altaparmakov 		/*
106398b27036SAnton Altaparmakov 		 * Resize the attribute record to fit the new mapping pairs
106498b27036SAnton Altaparmakov 		 * array.
106598b27036SAnton Altaparmakov 		 */
106698b27036SAnton Altaparmakov 		attr_rec_len = le32_to_cpu(a->length);
106798b27036SAnton Altaparmakov 		err = ntfs_attr_record_resize(m, a, mp_size + le16_to_cpu(
106898b27036SAnton Altaparmakov 				a->data.non_resident.mapping_pairs_offset));
106998b27036SAnton Altaparmakov 		if (unlikely(err)) {
107098b27036SAnton Altaparmakov 			BUG_ON(err != -ENOSPC);
107198b27036SAnton Altaparmakov 			// TODO: Deal with this by using the current attribute
107298b27036SAnton Altaparmakov 			// and fill it with as much of the mapping pairs
107398b27036SAnton Altaparmakov 			// array as possible.  Then loop over each attribute
107498b27036SAnton Altaparmakov 			// extent rewriting the mapping pairs arrays as we go
107598b27036SAnton Altaparmakov 			// along and if when we reach the end we have not
107698b27036SAnton Altaparmakov 			// enough space, try to resize the last attribute
107798b27036SAnton Altaparmakov 			// extent and if even that fails, add a new attribute
107898b27036SAnton Altaparmakov 			// extent.
107998b27036SAnton Altaparmakov 			// We could also try to resize at each step in the hope
108098b27036SAnton Altaparmakov 			// that we will not need to rewrite every single extent.
108198b27036SAnton Altaparmakov 			// Note, we may need to decompress some extents to fill
108298b27036SAnton Altaparmakov 			// the runlist as we are walking the extents...
108398b27036SAnton Altaparmakov 			ntfs_error(vol->sb, "Not enough space in the mft "
108498b27036SAnton Altaparmakov 					"record for the extended attribute "
108598b27036SAnton Altaparmakov 					"record.  This case is not "
108698b27036SAnton Altaparmakov 					"implemented yet.");
108798b27036SAnton Altaparmakov 			err = -EOPNOTSUPP;
108898b27036SAnton Altaparmakov 			break ;
108998b27036SAnton Altaparmakov 		}
109098b27036SAnton Altaparmakov 		status.mp_rebuilt = 1;
109198b27036SAnton Altaparmakov 		/*
109298b27036SAnton Altaparmakov 		 * Generate the mapping pairs array directly into the attribute
109398b27036SAnton Altaparmakov 		 * record.
109498b27036SAnton Altaparmakov 		 */
109598b27036SAnton Altaparmakov 		err = ntfs_mapping_pairs_build(vol, (u8*)a + le16_to_cpu(
109698b27036SAnton Altaparmakov 				a->data.non_resident.mapping_pairs_offset),
109798b27036SAnton Altaparmakov 				mp_size, rl2, vcn, highest_vcn, NULL);
109898b27036SAnton Altaparmakov 		if (unlikely(err)) {
109998b27036SAnton Altaparmakov 			ntfs_error(vol->sb, "Cannot fill hole in inode 0x%lx, "
110098b27036SAnton Altaparmakov 					"attribute type 0x%x, because building "
110198b27036SAnton Altaparmakov 					"the mapping pairs failed with error "
110298b27036SAnton Altaparmakov 					"code %i.", vi->i_ino,
110398b27036SAnton Altaparmakov 					(unsigned)le32_to_cpu(ni->type), err);
110498b27036SAnton Altaparmakov 			err = -EIO;
110598b27036SAnton Altaparmakov 			break;
110698b27036SAnton Altaparmakov 		}
110798b27036SAnton Altaparmakov 		/* Update the highest_vcn but only if it was not set. */
110898b27036SAnton Altaparmakov 		if (unlikely(!a->data.non_resident.highest_vcn))
110998b27036SAnton Altaparmakov 			a->data.non_resident.highest_vcn =
111098b27036SAnton Altaparmakov 					cpu_to_sle64(highest_vcn);
111198b27036SAnton Altaparmakov 		/*
111298b27036SAnton Altaparmakov 		 * If the attribute is sparse/compressed, update the compressed
111398b27036SAnton Altaparmakov 		 * size in the ntfs_inode structure and the attribute record.
111498b27036SAnton Altaparmakov 		 */
111598b27036SAnton Altaparmakov 		if (likely(NInoSparse(ni) || NInoCompressed(ni))) {
111698b27036SAnton Altaparmakov 			/*
111798b27036SAnton Altaparmakov 			 * If we are not in the first attribute extent, switch
111898b27036SAnton Altaparmakov 			 * to it, but first ensure the changes will make it to
111998b27036SAnton Altaparmakov 			 * disk later.
112098b27036SAnton Altaparmakov 			 */
112198b27036SAnton Altaparmakov 			if (a->data.non_resident.lowest_vcn) {
112298b27036SAnton Altaparmakov 				flush_dcache_mft_record_page(ctx->ntfs_ino);
112398b27036SAnton Altaparmakov 				mark_mft_record_dirty(ctx->ntfs_ino);
112498b27036SAnton Altaparmakov 				ntfs_attr_reinit_search_ctx(ctx);
112598b27036SAnton Altaparmakov 				err = ntfs_attr_lookup(ni->type, ni->name,
112698b27036SAnton Altaparmakov 						ni->name_len, CASE_SENSITIVE,
112798b27036SAnton Altaparmakov 						0, NULL, 0, ctx);
112898b27036SAnton Altaparmakov 				if (unlikely(err)) {
112998b27036SAnton Altaparmakov 					status.attr_switched = 1;
113098b27036SAnton Altaparmakov 					break;
113198b27036SAnton Altaparmakov 				}
113298b27036SAnton Altaparmakov 				/* @m is not used any more so do not set it. */
113398b27036SAnton Altaparmakov 				a = ctx->attr;
113498b27036SAnton Altaparmakov 			}
113598b27036SAnton Altaparmakov 			write_lock_irqsave(&ni->size_lock, flags);
113698b27036SAnton Altaparmakov 			ni->itype.compressed.size += vol->cluster_size;
113798b27036SAnton Altaparmakov 			a->data.non_resident.compressed_size =
113898b27036SAnton Altaparmakov 					cpu_to_sle64(ni->itype.compressed.size);
113998b27036SAnton Altaparmakov 			write_unlock_irqrestore(&ni->size_lock, flags);
114098b27036SAnton Altaparmakov 		}
114198b27036SAnton Altaparmakov 		/* Ensure the changes make it to disk. */
114298b27036SAnton Altaparmakov 		flush_dcache_mft_record_page(ctx->ntfs_ino);
114398b27036SAnton Altaparmakov 		mark_mft_record_dirty(ctx->ntfs_ino);
114498b27036SAnton Altaparmakov 		ntfs_attr_put_search_ctx(ctx);
114598b27036SAnton Altaparmakov 		unmap_mft_record(base_ni);
114698b27036SAnton Altaparmakov 		/* Successfully filled the hole. */
114798b27036SAnton Altaparmakov 		status.runlist_merged = 0;
114898b27036SAnton Altaparmakov 		status.mft_attr_mapped = 0;
114998b27036SAnton Altaparmakov 		status.mp_rebuilt = 0;
115098b27036SAnton Altaparmakov 		/* Setup the map cache and use that to deal with the buffer. */
1151c49c3111SRichard Knutsson 		was_hole = true;
115298b27036SAnton Altaparmakov 		vcn = bh_cpos;
115398b27036SAnton Altaparmakov 		vcn_len = 1;
115498b27036SAnton Altaparmakov 		lcn_block = lcn << (vol->cluster_size_bits - blocksize_bits);
115598b27036SAnton Altaparmakov 		cdelta = 0;
115698b27036SAnton Altaparmakov 		/*
115798b27036SAnton Altaparmakov 		 * If the number of remaining clusters in the @pages is smaller
115898b27036SAnton Altaparmakov 		 * or equal to the number of cached clusters, unlock the
115998b27036SAnton Altaparmakov 		 * runlist as the map cache will be used from now on.
116098b27036SAnton Altaparmakov 		 */
116198b27036SAnton Altaparmakov 		if (likely(vcn + vcn_len >= cend)) {
116298b27036SAnton Altaparmakov 			up_write(&ni->runlist.lock);
1163c49c3111SRichard Knutsson 			rl_write_locked = false;
116498b27036SAnton Altaparmakov 			rl = NULL;
116598b27036SAnton Altaparmakov 		}
116698b27036SAnton Altaparmakov 		goto map_buffer_cached;
116798b27036SAnton Altaparmakov 	} while (bh_pos += blocksize, (bh = bh->b_this_page) != head);
116898b27036SAnton Altaparmakov 	/* If there are no errors, do the next page. */
116998b27036SAnton Altaparmakov 	if (likely(!err && ++u < nr_pages))
117098b27036SAnton Altaparmakov 		goto do_next_page;
117198b27036SAnton Altaparmakov 	/* If there are no errors, release the runlist lock if we took it. */
117298b27036SAnton Altaparmakov 	if (likely(!err)) {
117398b27036SAnton Altaparmakov 		if (unlikely(rl_write_locked)) {
117498b27036SAnton Altaparmakov 			up_write(&ni->runlist.lock);
1175c49c3111SRichard Knutsson 			rl_write_locked = false;
117698b27036SAnton Altaparmakov 		} else if (unlikely(rl))
117798b27036SAnton Altaparmakov 			up_read(&ni->runlist.lock);
117898b27036SAnton Altaparmakov 		rl = NULL;
117998b27036SAnton Altaparmakov 	}
118098b27036SAnton Altaparmakov 	/* If we issued read requests, let them complete. */
118198b27036SAnton Altaparmakov 	read_lock_irqsave(&ni->size_lock, flags);
118298b27036SAnton Altaparmakov 	initialized_size = ni->initialized_size;
118398b27036SAnton Altaparmakov 	read_unlock_irqrestore(&ni->size_lock, flags);
118498b27036SAnton Altaparmakov 	while (wait_bh > wait) {
118598b27036SAnton Altaparmakov 		bh = *--wait_bh;
118698b27036SAnton Altaparmakov 		wait_on_buffer(bh);
118798b27036SAnton Altaparmakov 		if (likely(buffer_uptodate(bh))) {
118898b27036SAnton Altaparmakov 			page = bh->b_page;
118909cbfeafSKirill A. Shutemov 			bh_pos = ((s64)page->index << PAGE_SHIFT) +
119098b27036SAnton Altaparmakov 					bh_offset(bh);
119198b27036SAnton Altaparmakov 			/*
119298b27036SAnton Altaparmakov 			 * If the buffer overflows the initialized size, need
119398b27036SAnton Altaparmakov 			 * to zero the overflowing region.
119498b27036SAnton Altaparmakov 			 */
119598b27036SAnton Altaparmakov 			if (unlikely(bh_pos + blocksize > initialized_size)) {
119698b27036SAnton Altaparmakov 				int ofs = 0;
119798b27036SAnton Altaparmakov 
119898b27036SAnton Altaparmakov 				if (likely(bh_pos < initialized_size))
119998b27036SAnton Altaparmakov 					ofs = initialized_size - bh_pos;
1200eebd2aa3SChristoph Lameter 				zero_user_segment(page, bh_offset(bh) + ofs,
1201eebd2aa3SChristoph Lameter 						blocksize);
120298b27036SAnton Altaparmakov 			}
120398b27036SAnton Altaparmakov 		} else /* if (unlikely(!buffer_uptodate(bh))) */
120498b27036SAnton Altaparmakov 			err = -EIO;
120598b27036SAnton Altaparmakov 	}
120698b27036SAnton Altaparmakov 	if (likely(!err)) {
120798b27036SAnton Altaparmakov 		/* Clear buffer_new on all buffers. */
120898b27036SAnton Altaparmakov 		u = 0;
120998b27036SAnton Altaparmakov 		do {
121098b27036SAnton Altaparmakov 			bh = head = page_buffers(pages[u]);
121198b27036SAnton Altaparmakov 			do {
121298b27036SAnton Altaparmakov 				if (buffer_new(bh))
121398b27036SAnton Altaparmakov 					clear_buffer_new(bh);
121498b27036SAnton Altaparmakov 			} while ((bh = bh->b_this_page) != head);
121598b27036SAnton Altaparmakov 		} while (++u < nr_pages);
121698b27036SAnton Altaparmakov 		ntfs_debug("Done.");
121798b27036SAnton Altaparmakov 		return err;
121898b27036SAnton Altaparmakov 	}
121998b27036SAnton Altaparmakov 	if (status.attr_switched) {
122098b27036SAnton Altaparmakov 		/* Get back to the attribute extent we modified. */
122198b27036SAnton Altaparmakov 		ntfs_attr_reinit_search_ctx(ctx);
122298b27036SAnton Altaparmakov 		if (ntfs_attr_lookup(ni->type, ni->name, ni->name_len,
122398b27036SAnton Altaparmakov 				CASE_SENSITIVE, bh_cpos, NULL, 0, ctx)) {
122498b27036SAnton Altaparmakov 			ntfs_error(vol->sb, "Failed to find required "
122598b27036SAnton Altaparmakov 					"attribute extent of attribute in "
122698b27036SAnton Altaparmakov 					"error code path.  Run chkdsk to "
122798b27036SAnton Altaparmakov 					"recover.");
122898b27036SAnton Altaparmakov 			write_lock_irqsave(&ni->size_lock, flags);
122998b27036SAnton Altaparmakov 			ni->itype.compressed.size += vol->cluster_size;
123098b27036SAnton Altaparmakov 			write_unlock_irqrestore(&ni->size_lock, flags);
123198b27036SAnton Altaparmakov 			flush_dcache_mft_record_page(ctx->ntfs_ino);
123298b27036SAnton Altaparmakov 			mark_mft_record_dirty(ctx->ntfs_ino);
123398b27036SAnton Altaparmakov 			/*
123498b27036SAnton Altaparmakov 			 * The only thing that is now wrong is the compressed
123598b27036SAnton Altaparmakov 			 * size of the base attribute extent which chkdsk
123698b27036SAnton Altaparmakov 			 * should be able to fix.
123798b27036SAnton Altaparmakov 			 */
123898b27036SAnton Altaparmakov 			NVolSetErrors(vol);
123998b27036SAnton Altaparmakov 		} else {
124098b27036SAnton Altaparmakov 			m = ctx->mrec;
124198b27036SAnton Altaparmakov 			a = ctx->attr;
124298b27036SAnton Altaparmakov 			status.attr_switched = 0;
124398b27036SAnton Altaparmakov 		}
124498b27036SAnton Altaparmakov 	}
124598b27036SAnton Altaparmakov 	/*
124698b27036SAnton Altaparmakov 	 * If the runlist has been modified, need to restore it by punching a
124798b27036SAnton Altaparmakov 	 * hole into it and we then need to deallocate the on-disk cluster as
124898b27036SAnton Altaparmakov 	 * well.  Note, we only modify the runlist if we are able to generate a
124998b27036SAnton Altaparmakov 	 * new mapping pairs array, i.e. only when the mapped attribute extent
125098b27036SAnton Altaparmakov 	 * is not switched.
125198b27036SAnton Altaparmakov 	 */
125298b27036SAnton Altaparmakov 	if (status.runlist_merged && !status.attr_switched) {
125398b27036SAnton Altaparmakov 		BUG_ON(!rl_write_locked);
125498b27036SAnton Altaparmakov 		/* Make the file cluster we allocated sparse in the runlist. */
125598b27036SAnton Altaparmakov 		if (ntfs_rl_punch_nolock(vol, &ni->runlist, bh_cpos, 1)) {
125698b27036SAnton Altaparmakov 			ntfs_error(vol->sb, "Failed to punch hole into "
125798b27036SAnton Altaparmakov 					"attribute runlist in error code "
125898b27036SAnton Altaparmakov 					"path.  Run chkdsk to recover the "
125998b27036SAnton Altaparmakov 					"lost cluster.");
126098b27036SAnton Altaparmakov 			NVolSetErrors(vol);
126198b27036SAnton Altaparmakov 		} else /* if (success) */ {
126298b27036SAnton Altaparmakov 			status.runlist_merged = 0;
126398b27036SAnton Altaparmakov 			/*
126498b27036SAnton Altaparmakov 			 * Deallocate the on-disk cluster we allocated but only
126598b27036SAnton Altaparmakov 			 * if we succeeded in punching its vcn out of the
126698b27036SAnton Altaparmakov 			 * runlist.
126798b27036SAnton Altaparmakov 			 */
126898b27036SAnton Altaparmakov 			down_write(&vol->lcnbmp_lock);
126998b27036SAnton Altaparmakov 			if (ntfs_bitmap_clear_bit(vol->lcnbmp_ino, lcn)) {
127098b27036SAnton Altaparmakov 				ntfs_error(vol->sb, "Failed to release "
127198b27036SAnton Altaparmakov 						"allocated cluster in error "
127298b27036SAnton Altaparmakov 						"code path.  Run chkdsk to "
127398b27036SAnton Altaparmakov 						"recover the lost cluster.");
127498b27036SAnton Altaparmakov 				NVolSetErrors(vol);
127598b27036SAnton Altaparmakov 			}
127698b27036SAnton Altaparmakov 			up_write(&vol->lcnbmp_lock);
127798b27036SAnton Altaparmakov 		}
127898b27036SAnton Altaparmakov 	}
127998b27036SAnton Altaparmakov 	/*
128098b27036SAnton Altaparmakov 	 * Resize the attribute record to its old size and rebuild the mapping
128198b27036SAnton Altaparmakov 	 * pairs array.  Note, we only can do this if the runlist has been
128298b27036SAnton Altaparmakov 	 * restored to its old state which also implies that the mapped
128398b27036SAnton Altaparmakov 	 * attribute extent is not switched.
128498b27036SAnton Altaparmakov 	 */
128598b27036SAnton Altaparmakov 	if (status.mp_rebuilt && !status.runlist_merged) {
128698b27036SAnton Altaparmakov 		if (ntfs_attr_record_resize(m, a, attr_rec_len)) {
128798b27036SAnton Altaparmakov 			ntfs_error(vol->sb, "Failed to restore attribute "
128898b27036SAnton Altaparmakov 					"record in error code path.  Run "
128998b27036SAnton Altaparmakov 					"chkdsk to recover.");
129098b27036SAnton Altaparmakov 			NVolSetErrors(vol);
129198b27036SAnton Altaparmakov 		} else /* if (success) */ {
129298b27036SAnton Altaparmakov 			if (ntfs_mapping_pairs_build(vol, (u8*)a +
129398b27036SAnton Altaparmakov 					le16_to_cpu(a->data.non_resident.
129498b27036SAnton Altaparmakov 					mapping_pairs_offset), attr_rec_len -
129598b27036SAnton Altaparmakov 					le16_to_cpu(a->data.non_resident.
129698b27036SAnton Altaparmakov 					mapping_pairs_offset), ni->runlist.rl,
129798b27036SAnton Altaparmakov 					vcn, highest_vcn, NULL)) {
129898b27036SAnton Altaparmakov 				ntfs_error(vol->sb, "Failed to restore "
129998b27036SAnton Altaparmakov 						"mapping pairs array in error "
130098b27036SAnton Altaparmakov 						"code path.  Run chkdsk to "
130198b27036SAnton Altaparmakov 						"recover.");
130298b27036SAnton Altaparmakov 				NVolSetErrors(vol);
130398b27036SAnton Altaparmakov 			}
130498b27036SAnton Altaparmakov 			flush_dcache_mft_record_page(ctx->ntfs_ino);
130598b27036SAnton Altaparmakov 			mark_mft_record_dirty(ctx->ntfs_ino);
130698b27036SAnton Altaparmakov 		}
130798b27036SAnton Altaparmakov 	}
130898b27036SAnton Altaparmakov 	/* Release the mft record and the attribute. */
130998b27036SAnton Altaparmakov 	if (status.mft_attr_mapped) {
131098b27036SAnton Altaparmakov 		ntfs_attr_put_search_ctx(ctx);
131198b27036SAnton Altaparmakov 		unmap_mft_record(base_ni);
131298b27036SAnton Altaparmakov 	}
131398b27036SAnton Altaparmakov 	/* Release the runlist lock. */
131498b27036SAnton Altaparmakov 	if (rl_write_locked)
131598b27036SAnton Altaparmakov 		up_write(&ni->runlist.lock);
131698b27036SAnton Altaparmakov 	else if (rl)
131798b27036SAnton Altaparmakov 		up_read(&ni->runlist.lock);
131898b27036SAnton Altaparmakov 	/*
131998b27036SAnton Altaparmakov 	 * Zero out any newly allocated blocks to avoid exposing stale data.
132098b27036SAnton Altaparmakov 	 * If BH_New is set, we know that the block was newly allocated above
132198b27036SAnton Altaparmakov 	 * and that it has not been fully zeroed and marked dirty yet.
132298b27036SAnton Altaparmakov 	 */
132398b27036SAnton Altaparmakov 	nr_pages = u;
132498b27036SAnton Altaparmakov 	u = 0;
132598b27036SAnton Altaparmakov 	end = bh_cpos << vol->cluster_size_bits;
132698b27036SAnton Altaparmakov 	do {
132798b27036SAnton Altaparmakov 		page = pages[u];
132898b27036SAnton Altaparmakov 		bh = head = page_buffers(page);
132998b27036SAnton Altaparmakov 		do {
133098b27036SAnton Altaparmakov 			if (u == nr_pages &&
133109cbfeafSKirill A. Shutemov 					((s64)page->index << PAGE_SHIFT) +
133298b27036SAnton Altaparmakov 					bh_offset(bh) >= end)
133398b27036SAnton Altaparmakov 				break;
133498b27036SAnton Altaparmakov 			if (!buffer_new(bh))
133598b27036SAnton Altaparmakov 				continue;
133698b27036SAnton Altaparmakov 			clear_buffer_new(bh);
133798b27036SAnton Altaparmakov 			if (!buffer_uptodate(bh)) {
133898b27036SAnton Altaparmakov 				if (PageUptodate(page))
133998b27036SAnton Altaparmakov 					set_buffer_uptodate(bh);
134098b27036SAnton Altaparmakov 				else {
1341eebd2aa3SChristoph Lameter 					zero_user(page, bh_offset(bh),
1342eebd2aa3SChristoph Lameter 							blocksize);
134398b27036SAnton Altaparmakov 					set_buffer_uptodate(bh);
134498b27036SAnton Altaparmakov 				}
134598b27036SAnton Altaparmakov 			}
134698b27036SAnton Altaparmakov 			mark_buffer_dirty(bh);
134798b27036SAnton Altaparmakov 		} while ((bh = bh->b_this_page) != head);
134898b27036SAnton Altaparmakov 	} while (++u <= nr_pages);
134998b27036SAnton Altaparmakov 	ntfs_error(vol->sb, "Failed.  Returning error code %i.", err);
135098b27036SAnton Altaparmakov 	return err;
135198b27036SAnton Altaparmakov }
135298b27036SAnton Altaparmakov 
ntfs_flush_dcache_pages(struct page ** pages,unsigned nr_pages)135398b27036SAnton Altaparmakov static inline void ntfs_flush_dcache_pages(struct page **pages,
135498b27036SAnton Altaparmakov 		unsigned nr_pages)
135598b27036SAnton Altaparmakov {
135698b27036SAnton Altaparmakov 	BUG_ON(!nr_pages);
135798b27036SAnton Altaparmakov 	/*
1358f893afbeSAnton Altaparmakov 	 * Warning: Do not do the decrement at the same time as the call to
1359f893afbeSAnton Altaparmakov 	 * flush_dcache_page() because it is a NULL macro on i386 and hence the
1360f893afbeSAnton Altaparmakov 	 * decrement never happens so the loop never terminates.
136198b27036SAnton Altaparmakov 	 */
1362f893afbeSAnton Altaparmakov 	do {
1363f893afbeSAnton Altaparmakov 		--nr_pages;
136498b27036SAnton Altaparmakov 		flush_dcache_page(pages[nr_pages]);
1365f893afbeSAnton Altaparmakov 	} while (nr_pages > 0);
136698b27036SAnton Altaparmakov }
136798b27036SAnton Altaparmakov 
136898b27036SAnton Altaparmakov /**
136998b27036SAnton Altaparmakov  * ntfs_commit_pages_after_non_resident_write - commit the received data
137098b27036SAnton Altaparmakov  * @pages:	array of destination pages
137198b27036SAnton Altaparmakov  * @nr_pages:	number of pages in @pages
137298b27036SAnton Altaparmakov  * @pos:	byte position in file at which the write begins
137398b27036SAnton Altaparmakov  * @bytes:	number of bytes to be written
137498b27036SAnton Altaparmakov  *
137598b27036SAnton Altaparmakov  * See description of ntfs_commit_pages_after_write(), below.
137698b27036SAnton Altaparmakov  */
ntfs_commit_pages_after_non_resident_write(struct page ** pages,const unsigned nr_pages,s64 pos,size_t bytes)137798b27036SAnton Altaparmakov static inline int ntfs_commit_pages_after_non_resident_write(
137898b27036SAnton Altaparmakov 		struct page **pages, const unsigned nr_pages,
137998b27036SAnton Altaparmakov 		s64 pos, size_t bytes)
138098b27036SAnton Altaparmakov {
138198b27036SAnton Altaparmakov 	s64 end, initialized_size;
138298b27036SAnton Altaparmakov 	struct inode *vi;
138398b27036SAnton Altaparmakov 	ntfs_inode *ni, *base_ni;
138498b27036SAnton Altaparmakov 	struct buffer_head *bh, *head;
138598b27036SAnton Altaparmakov 	ntfs_attr_search_ctx *ctx;
138698b27036SAnton Altaparmakov 	MFT_RECORD *m;
138798b27036SAnton Altaparmakov 	ATTR_RECORD *a;
138898b27036SAnton Altaparmakov 	unsigned long flags;
138998b27036SAnton Altaparmakov 	unsigned blocksize, u;
139098b27036SAnton Altaparmakov 	int err;
139198b27036SAnton Altaparmakov 
139298b27036SAnton Altaparmakov 	vi = pages[0]->mapping->host;
139398b27036SAnton Altaparmakov 	ni = NTFS_I(vi);
139478af34f0SAnton Altaparmakov 	blocksize = vi->i_sb->s_blocksize;
139598b27036SAnton Altaparmakov 	end = pos + bytes;
139698b27036SAnton Altaparmakov 	u = 0;
139798b27036SAnton Altaparmakov 	do {
139898b27036SAnton Altaparmakov 		s64 bh_pos;
139998b27036SAnton Altaparmakov 		struct page *page;
1400c49c3111SRichard Knutsson 		bool partial;
140198b27036SAnton Altaparmakov 
140298b27036SAnton Altaparmakov 		page = pages[u];
140309cbfeafSKirill A. Shutemov 		bh_pos = (s64)page->index << PAGE_SHIFT;
140498b27036SAnton Altaparmakov 		bh = head = page_buffers(page);
1405c49c3111SRichard Knutsson 		partial = false;
140698b27036SAnton Altaparmakov 		do {
140798b27036SAnton Altaparmakov 			s64 bh_end;
140898b27036SAnton Altaparmakov 
140998b27036SAnton Altaparmakov 			bh_end = bh_pos + blocksize;
141098b27036SAnton Altaparmakov 			if (bh_end <= pos || bh_pos >= end) {
141198b27036SAnton Altaparmakov 				if (!buffer_uptodate(bh))
1412c49c3111SRichard Knutsson 					partial = true;
141398b27036SAnton Altaparmakov 			} else {
141498b27036SAnton Altaparmakov 				set_buffer_uptodate(bh);
141598b27036SAnton Altaparmakov 				mark_buffer_dirty(bh);
141698b27036SAnton Altaparmakov 			}
141798b27036SAnton Altaparmakov 		} while (bh_pos += blocksize, (bh = bh->b_this_page) != head);
141898b27036SAnton Altaparmakov 		/*
141998b27036SAnton Altaparmakov 		 * If all buffers are now uptodate but the page is not, set the
142098b27036SAnton Altaparmakov 		 * page uptodate.
142198b27036SAnton Altaparmakov 		 */
142298b27036SAnton Altaparmakov 		if (!partial && !PageUptodate(page))
142398b27036SAnton Altaparmakov 			SetPageUptodate(page);
142498b27036SAnton Altaparmakov 	} while (++u < nr_pages);
142598b27036SAnton Altaparmakov 	/*
142698b27036SAnton Altaparmakov 	 * Finally, if we do not need to update initialized_size or i_size we
142798b27036SAnton Altaparmakov 	 * are finished.
142898b27036SAnton Altaparmakov 	 */
142998b27036SAnton Altaparmakov 	read_lock_irqsave(&ni->size_lock, flags);
143098b27036SAnton Altaparmakov 	initialized_size = ni->initialized_size;
143198b27036SAnton Altaparmakov 	read_unlock_irqrestore(&ni->size_lock, flags);
143298b27036SAnton Altaparmakov 	if (end <= initialized_size) {
143398b27036SAnton Altaparmakov 		ntfs_debug("Done.");
143498b27036SAnton Altaparmakov 		return 0;
143598b27036SAnton Altaparmakov 	}
143698b27036SAnton Altaparmakov 	/*
143798b27036SAnton Altaparmakov 	 * Update initialized_size/i_size as appropriate, both in the inode and
143898b27036SAnton Altaparmakov 	 * the mft record.
143998b27036SAnton Altaparmakov 	 */
144098b27036SAnton Altaparmakov 	if (!NInoAttr(ni))
144198b27036SAnton Altaparmakov 		base_ni = ni;
144298b27036SAnton Altaparmakov 	else
144398b27036SAnton Altaparmakov 		base_ni = ni->ext.base_ntfs_ino;
144498b27036SAnton Altaparmakov 	/* Map, pin, and lock the mft record. */
144598b27036SAnton Altaparmakov 	m = map_mft_record(base_ni);
144698b27036SAnton Altaparmakov 	if (IS_ERR(m)) {
144798b27036SAnton Altaparmakov 		err = PTR_ERR(m);
144898b27036SAnton Altaparmakov 		m = NULL;
144998b27036SAnton Altaparmakov 		ctx = NULL;
145098b27036SAnton Altaparmakov 		goto err_out;
145198b27036SAnton Altaparmakov 	}
145298b27036SAnton Altaparmakov 	BUG_ON(!NInoNonResident(ni));
145398b27036SAnton Altaparmakov 	ctx = ntfs_attr_get_search_ctx(base_ni, m);
145498b27036SAnton Altaparmakov 	if (unlikely(!ctx)) {
145598b27036SAnton Altaparmakov 		err = -ENOMEM;
145698b27036SAnton Altaparmakov 		goto err_out;
145798b27036SAnton Altaparmakov 	}
145898b27036SAnton Altaparmakov 	err = ntfs_attr_lookup(ni->type, ni->name, ni->name_len,
145998b27036SAnton Altaparmakov 			CASE_SENSITIVE, 0, NULL, 0, ctx);
146098b27036SAnton Altaparmakov 	if (unlikely(err)) {
146198b27036SAnton Altaparmakov 		if (err == -ENOENT)
146298b27036SAnton Altaparmakov 			err = -EIO;
146398b27036SAnton Altaparmakov 		goto err_out;
146498b27036SAnton Altaparmakov 	}
146598b27036SAnton Altaparmakov 	a = ctx->attr;
146698b27036SAnton Altaparmakov 	BUG_ON(!a->non_resident);
146798b27036SAnton Altaparmakov 	write_lock_irqsave(&ni->size_lock, flags);
146898b27036SAnton Altaparmakov 	BUG_ON(end > ni->allocated_size);
146998b27036SAnton Altaparmakov 	ni->initialized_size = end;
147098b27036SAnton Altaparmakov 	a->data.non_resident.initialized_size = cpu_to_sle64(end);
147198b27036SAnton Altaparmakov 	if (end > i_size_read(vi)) {
147298b27036SAnton Altaparmakov 		i_size_write(vi, end);
147398b27036SAnton Altaparmakov 		a->data.non_resident.data_size =
147498b27036SAnton Altaparmakov 				a->data.non_resident.initialized_size;
147598b27036SAnton Altaparmakov 	}
147698b27036SAnton Altaparmakov 	write_unlock_irqrestore(&ni->size_lock, flags);
147798b27036SAnton Altaparmakov 	/* Mark the mft record dirty, so it gets written back. */
147898b27036SAnton Altaparmakov 	flush_dcache_mft_record_page(ctx->ntfs_ino);
147998b27036SAnton Altaparmakov 	mark_mft_record_dirty(ctx->ntfs_ino);
148098b27036SAnton Altaparmakov 	ntfs_attr_put_search_ctx(ctx);
148198b27036SAnton Altaparmakov 	unmap_mft_record(base_ni);
148298b27036SAnton Altaparmakov 	ntfs_debug("Done.");
148398b27036SAnton Altaparmakov 	return 0;
148498b27036SAnton Altaparmakov err_out:
148598b27036SAnton Altaparmakov 	if (ctx)
148698b27036SAnton Altaparmakov 		ntfs_attr_put_search_ctx(ctx);
148798b27036SAnton Altaparmakov 	if (m)
148898b27036SAnton Altaparmakov 		unmap_mft_record(base_ni);
148998b27036SAnton Altaparmakov 	ntfs_error(vi->i_sb, "Failed to update initialized_size/i_size (error "
149098b27036SAnton Altaparmakov 			"code %i).", err);
1491f95c4018SAnton Altaparmakov 	if (err != -ENOMEM)
149298b27036SAnton Altaparmakov 		NVolSetErrors(ni->vol);
149398b27036SAnton Altaparmakov 	return err;
149498b27036SAnton Altaparmakov }
149598b27036SAnton Altaparmakov 
149698b27036SAnton Altaparmakov /**
149798b27036SAnton Altaparmakov  * ntfs_commit_pages_after_write - commit the received data
149898b27036SAnton Altaparmakov  * @pages:	array of destination pages
149998b27036SAnton Altaparmakov  * @nr_pages:	number of pages in @pages
150098b27036SAnton Altaparmakov  * @pos:	byte position in file at which the write begins
150198b27036SAnton Altaparmakov  * @bytes:	number of bytes to be written
150298b27036SAnton Altaparmakov  *
15031b1dcc1bSJes Sorensen  * This is called from ntfs_file_buffered_write() with i_mutex held on the inode
150498b27036SAnton Altaparmakov  * (@pages[0]->mapping->host).  There are @nr_pages pages in @pages which are
150598b27036SAnton Altaparmakov  * locked but not kmap()ped.  The source data has already been copied into the
150698b27036SAnton Altaparmakov  * @page.  ntfs_prepare_pages_for_non_resident_write() has been called before
150798b27036SAnton Altaparmakov  * the data was copied (for non-resident attributes only) and it returned
150898b27036SAnton Altaparmakov  * success.
150998b27036SAnton Altaparmakov  *
151098b27036SAnton Altaparmakov  * Need to set uptodate and mark dirty all buffers within the boundary of the
151198b27036SAnton Altaparmakov  * write.  If all buffers in a page are uptodate we set the page uptodate, too.
151298b27036SAnton Altaparmakov  *
151398b27036SAnton Altaparmakov  * Setting the buffers dirty ensures that they get written out later when
151498b27036SAnton Altaparmakov  * ntfs_writepage() is invoked by the VM.
151598b27036SAnton Altaparmakov  *
151698b27036SAnton Altaparmakov  * Finally, we need to update i_size and initialized_size as appropriate both
151798b27036SAnton Altaparmakov  * in the inode and the mft record.
151898b27036SAnton Altaparmakov  *
151998b27036SAnton Altaparmakov  * This is modelled after fs/buffer.c::generic_commit_write(), which marks
152098b27036SAnton Altaparmakov  * buffers uptodate and dirty, sets the page uptodate if all buffers in the
152198b27036SAnton Altaparmakov  * page are uptodate, and updates i_size if the end of io is beyond i_size.  In
152298b27036SAnton Altaparmakov  * that case, it also marks the inode dirty.
152398b27036SAnton Altaparmakov  *
152498b27036SAnton Altaparmakov  * If things have gone as outlined in
152598b27036SAnton Altaparmakov  * ntfs_prepare_pages_for_non_resident_write(), we do not need to do any page
152698b27036SAnton Altaparmakov  * content modifications here for non-resident attributes.  For resident
152798b27036SAnton Altaparmakov  * attributes we need to do the uptodate bringing here which we combine with
152898b27036SAnton Altaparmakov  * the copying into the mft record which means we save one atomic kmap.
152998b27036SAnton Altaparmakov  *
153098b27036SAnton Altaparmakov  * Return 0 on success or -errno on error.
153198b27036SAnton Altaparmakov  */
ntfs_commit_pages_after_write(struct page ** pages,const unsigned nr_pages,s64 pos,size_t bytes)153298b27036SAnton Altaparmakov static int ntfs_commit_pages_after_write(struct page **pages,
153398b27036SAnton Altaparmakov 		const unsigned nr_pages, s64 pos, size_t bytes)
153498b27036SAnton Altaparmakov {
153598b27036SAnton Altaparmakov 	s64 end, initialized_size;
153698b27036SAnton Altaparmakov 	loff_t i_size;
153798b27036SAnton Altaparmakov 	struct inode *vi;
153898b27036SAnton Altaparmakov 	ntfs_inode *ni, *base_ni;
153998b27036SAnton Altaparmakov 	struct page *page;
154098b27036SAnton Altaparmakov 	ntfs_attr_search_ctx *ctx;
154198b27036SAnton Altaparmakov 	MFT_RECORD *m;
154298b27036SAnton Altaparmakov 	ATTR_RECORD *a;
154398b27036SAnton Altaparmakov 	char *kattr, *kaddr;
154498b27036SAnton Altaparmakov 	unsigned long flags;
154598b27036SAnton Altaparmakov 	u32 attr_len;
154698b27036SAnton Altaparmakov 	int err;
154798b27036SAnton Altaparmakov 
154898b27036SAnton Altaparmakov 	BUG_ON(!nr_pages);
154998b27036SAnton Altaparmakov 	BUG_ON(!pages);
155098b27036SAnton Altaparmakov 	page = pages[0];
155198b27036SAnton Altaparmakov 	BUG_ON(!page);
155298b27036SAnton Altaparmakov 	vi = page->mapping->host;
155398b27036SAnton Altaparmakov 	ni = NTFS_I(vi);
155498b27036SAnton Altaparmakov 	ntfs_debug("Entering for inode 0x%lx, attribute type 0x%x, start page "
1555d04bd1fbSAnton Altaparmakov 			"index 0x%lx, nr_pages 0x%x, pos 0x%llx, bytes 0x%zx.",
155698b27036SAnton Altaparmakov 			vi->i_ino, ni->type, page->index, nr_pages,
155798b27036SAnton Altaparmakov 			(long long)pos, bytes);
155898b27036SAnton Altaparmakov 	if (NInoNonResident(ni))
155998b27036SAnton Altaparmakov 		return ntfs_commit_pages_after_non_resident_write(pages,
156098b27036SAnton Altaparmakov 				nr_pages, pos, bytes);
156198b27036SAnton Altaparmakov 	BUG_ON(nr_pages > 1);
156298b27036SAnton Altaparmakov 	/*
156398b27036SAnton Altaparmakov 	 * Attribute is resident, implying it is not compressed, encrypted, or
156498b27036SAnton Altaparmakov 	 * sparse.
156598b27036SAnton Altaparmakov 	 */
156698b27036SAnton Altaparmakov 	if (!NInoAttr(ni))
156798b27036SAnton Altaparmakov 		base_ni = ni;
156898b27036SAnton Altaparmakov 	else
156998b27036SAnton Altaparmakov 		base_ni = ni->ext.base_ntfs_ino;
157098b27036SAnton Altaparmakov 	BUG_ON(NInoNonResident(ni));
157198b27036SAnton Altaparmakov 	/* Map, pin, and lock the mft record. */
157298b27036SAnton Altaparmakov 	m = map_mft_record(base_ni);
157398b27036SAnton Altaparmakov 	if (IS_ERR(m)) {
157498b27036SAnton Altaparmakov 		err = PTR_ERR(m);
157598b27036SAnton Altaparmakov 		m = NULL;
157698b27036SAnton Altaparmakov 		ctx = NULL;
157798b27036SAnton Altaparmakov 		goto err_out;
157898b27036SAnton Altaparmakov 	}
157998b27036SAnton Altaparmakov 	ctx = ntfs_attr_get_search_ctx(base_ni, m);
158098b27036SAnton Altaparmakov 	if (unlikely(!ctx)) {
158198b27036SAnton Altaparmakov 		err = -ENOMEM;
158298b27036SAnton Altaparmakov 		goto err_out;
158398b27036SAnton Altaparmakov 	}
158498b27036SAnton Altaparmakov 	err = ntfs_attr_lookup(ni->type, ni->name, ni->name_len,
158598b27036SAnton Altaparmakov 			CASE_SENSITIVE, 0, NULL, 0, ctx);
158698b27036SAnton Altaparmakov 	if (unlikely(err)) {
158798b27036SAnton Altaparmakov 		if (err == -ENOENT)
158898b27036SAnton Altaparmakov 			err = -EIO;
158998b27036SAnton Altaparmakov 		goto err_out;
159098b27036SAnton Altaparmakov 	}
159198b27036SAnton Altaparmakov 	a = ctx->attr;
159298b27036SAnton Altaparmakov 	BUG_ON(a->non_resident);
159398b27036SAnton Altaparmakov 	/* The total length of the attribute value. */
159498b27036SAnton Altaparmakov 	attr_len = le32_to_cpu(a->data.resident.value_length);
159598b27036SAnton Altaparmakov 	i_size = i_size_read(vi);
159698b27036SAnton Altaparmakov 	BUG_ON(attr_len != i_size);
159798b27036SAnton Altaparmakov 	BUG_ON(pos > attr_len);
159898b27036SAnton Altaparmakov 	end = pos + bytes;
159998b27036SAnton Altaparmakov 	BUG_ON(end > le32_to_cpu(a->length) -
160098b27036SAnton Altaparmakov 			le16_to_cpu(a->data.resident.value_offset));
160198b27036SAnton Altaparmakov 	kattr = (u8*)a + le16_to_cpu(a->data.resident.value_offset);
1602a3ac1414SCong Wang 	kaddr = kmap_atomic(page);
160398b27036SAnton Altaparmakov 	/* Copy the received data from the page to the mft record. */
160498b27036SAnton Altaparmakov 	memcpy(kattr + pos, kaddr + pos, bytes);
160598b27036SAnton Altaparmakov 	/* Update the attribute length if necessary. */
160698b27036SAnton Altaparmakov 	if (end > attr_len) {
160798b27036SAnton Altaparmakov 		attr_len = end;
160898b27036SAnton Altaparmakov 		a->data.resident.value_length = cpu_to_le32(attr_len);
160998b27036SAnton Altaparmakov 	}
161098b27036SAnton Altaparmakov 	/*
161198b27036SAnton Altaparmakov 	 * If the page is not uptodate, bring the out of bounds area(s)
161298b27036SAnton Altaparmakov 	 * uptodate by copying data from the mft record to the page.
161398b27036SAnton Altaparmakov 	 */
161498b27036SAnton Altaparmakov 	if (!PageUptodate(page)) {
161598b27036SAnton Altaparmakov 		if (pos > 0)
161698b27036SAnton Altaparmakov 			memcpy(kaddr, kattr, pos);
161798b27036SAnton Altaparmakov 		if (end < attr_len)
161898b27036SAnton Altaparmakov 			memcpy(kaddr + end, kattr + end, attr_len - end);
161998b27036SAnton Altaparmakov 		/* Zero the region outside the end of the attribute value. */
162009cbfeafSKirill A. Shutemov 		memset(kaddr + attr_len, 0, PAGE_SIZE - attr_len);
162198b27036SAnton Altaparmakov 		flush_dcache_page(page);
162298b27036SAnton Altaparmakov 		SetPageUptodate(page);
162398b27036SAnton Altaparmakov 	}
1624a3ac1414SCong Wang 	kunmap_atomic(kaddr);
162598b27036SAnton Altaparmakov 	/* Update initialized_size/i_size if necessary. */
162698b27036SAnton Altaparmakov 	read_lock_irqsave(&ni->size_lock, flags);
162798b27036SAnton Altaparmakov 	initialized_size = ni->initialized_size;
162898b27036SAnton Altaparmakov 	BUG_ON(end > ni->allocated_size);
162998b27036SAnton Altaparmakov 	read_unlock_irqrestore(&ni->size_lock, flags);
163098b27036SAnton Altaparmakov 	BUG_ON(initialized_size != i_size);
163198b27036SAnton Altaparmakov 	if (end > initialized_size) {
163298b27036SAnton Altaparmakov 		write_lock_irqsave(&ni->size_lock, flags);
163398b27036SAnton Altaparmakov 		ni->initialized_size = end;
163498b27036SAnton Altaparmakov 		i_size_write(vi, end);
163598b27036SAnton Altaparmakov 		write_unlock_irqrestore(&ni->size_lock, flags);
163698b27036SAnton Altaparmakov 	}
163798b27036SAnton Altaparmakov 	/* Mark the mft record dirty, so it gets written back. */
163898b27036SAnton Altaparmakov 	flush_dcache_mft_record_page(ctx->ntfs_ino);
163998b27036SAnton Altaparmakov 	mark_mft_record_dirty(ctx->ntfs_ino);
164098b27036SAnton Altaparmakov 	ntfs_attr_put_search_ctx(ctx);
164198b27036SAnton Altaparmakov 	unmap_mft_record(base_ni);
164298b27036SAnton Altaparmakov 	ntfs_debug("Done.");
164398b27036SAnton Altaparmakov 	return 0;
164498b27036SAnton Altaparmakov err_out:
164598b27036SAnton Altaparmakov 	if (err == -ENOMEM) {
164698b27036SAnton Altaparmakov 		ntfs_warning(vi->i_sb, "Error allocating memory required to "
164798b27036SAnton Altaparmakov 				"commit the write.");
164898b27036SAnton Altaparmakov 		if (PageUptodate(page)) {
164998b27036SAnton Altaparmakov 			ntfs_warning(vi->i_sb, "Page is uptodate, setting "
165098b27036SAnton Altaparmakov 					"dirty so the write will be retried "
165198b27036SAnton Altaparmakov 					"later on by the VM.");
165298b27036SAnton Altaparmakov 			/*
165398b27036SAnton Altaparmakov 			 * Put the page on mapping->dirty_pages, but leave its
165498b27036SAnton Altaparmakov 			 * buffers' dirty state as-is.
165598b27036SAnton Altaparmakov 			 */
165698b27036SAnton Altaparmakov 			__set_page_dirty_nobuffers(page);
165798b27036SAnton Altaparmakov 			err = 0;
165898b27036SAnton Altaparmakov 		} else
165998b27036SAnton Altaparmakov 			ntfs_error(vi->i_sb, "Page is not uptodate.  Written "
166098b27036SAnton Altaparmakov 					"data has been lost.");
166198b27036SAnton Altaparmakov 	} else {
166298b27036SAnton Altaparmakov 		ntfs_error(vi->i_sb, "Resident attribute commit write failed "
166398b27036SAnton Altaparmakov 				"with error %i.", err);
166498b27036SAnton Altaparmakov 		NVolSetErrors(ni->vol);
166598b27036SAnton Altaparmakov 	}
166698b27036SAnton Altaparmakov 	if (ctx)
166798b27036SAnton Altaparmakov 		ntfs_attr_put_search_ctx(ctx);
166898b27036SAnton Altaparmakov 	if (m)
166998b27036SAnton Altaparmakov 		unmap_mft_record(base_ni);
167098b27036SAnton Altaparmakov 	return err;
167198b27036SAnton Altaparmakov }
167298b27036SAnton Altaparmakov 
1673a632f559SAnton Altaparmakov /*
1674a632f559SAnton Altaparmakov  * Copy as much as we can into the pages and return the number of bytes which
1675a632f559SAnton Altaparmakov  * were successfully copied.  If a fault is encountered then clear the pages
1676a632f559SAnton Altaparmakov  * out to (ofs + bytes) and return the number of bytes which were copied.
1677a632f559SAnton Altaparmakov  */
ntfs_copy_from_user_iter(struct page ** pages,unsigned nr_pages,unsigned ofs,struct iov_iter * i,size_t bytes)1678a632f559SAnton Altaparmakov static size_t ntfs_copy_from_user_iter(struct page **pages, unsigned nr_pages,
1679a632f559SAnton Altaparmakov 		unsigned ofs, struct iov_iter *i, size_t bytes)
16809014da75SMarco Stornelli {
1681a632f559SAnton Altaparmakov 	struct page **last_page = pages + nr_pages;
1682a632f559SAnton Altaparmakov 	size_t total = 0;
1683a632f559SAnton Altaparmakov 	unsigned len, copied;
16849014da75SMarco Stornelli 
1685a632f559SAnton Altaparmakov 	do {
168609cbfeafSKirill A. Shutemov 		len = PAGE_SIZE - ofs;
1687a632f559SAnton Altaparmakov 		if (len > bytes)
1688a632f559SAnton Altaparmakov 			len = bytes;
1689f0b65f39SAl Viro 		copied = copy_page_from_iter_atomic(*pages, ofs, len, i);
1690a632f559SAnton Altaparmakov 		total += copied;
1691a632f559SAnton Altaparmakov 		bytes -= copied;
1692a632f559SAnton Altaparmakov 		if (!bytes)
1693a632f559SAnton Altaparmakov 			break;
1694a632f559SAnton Altaparmakov 		if (copied < len)
1695a632f559SAnton Altaparmakov 			goto err;
1696a632f559SAnton Altaparmakov 		ofs = 0;
1697a632f559SAnton Altaparmakov 	} while (++pages < last_page);
1698a632f559SAnton Altaparmakov out:
1699a632f559SAnton Altaparmakov 	return total;
1700a632f559SAnton Altaparmakov err:
1701a632f559SAnton Altaparmakov 	/* Zero the rest of the target like __copy_from_user(). */
170209cbfeafSKirill A. Shutemov 	len = PAGE_SIZE - copied;
1703a632f559SAnton Altaparmakov 	do {
1704a632f559SAnton Altaparmakov 		if (len > bytes)
1705a632f559SAnton Altaparmakov 			len = bytes;
1706a632f559SAnton Altaparmakov 		zero_user(*pages, copied, len);
1707a632f559SAnton Altaparmakov 		bytes -= len;
1708a632f559SAnton Altaparmakov 		copied = 0;
170909cbfeafSKirill A. Shutemov 		len = PAGE_SIZE;
1710a632f559SAnton Altaparmakov 	} while (++pages < last_page);
1711a632f559SAnton Altaparmakov 	goto out;
17129014da75SMarco Stornelli }
17139014da75SMarco Stornelli 
171498b27036SAnton Altaparmakov /**
1715a632f559SAnton Altaparmakov  * ntfs_perform_write - perform buffered write to a file
1716a632f559SAnton Altaparmakov  * @file:	file to write to
1717a632f559SAnton Altaparmakov  * @i:		iov_iter with data to write
1718a632f559SAnton Altaparmakov  * @pos:	byte offset in file at which to begin writing to
171998b27036SAnton Altaparmakov  */
ntfs_perform_write(struct file * file,struct iov_iter * i,loff_t pos)1720a632f559SAnton Altaparmakov static ssize_t ntfs_perform_write(struct file *file, struct iov_iter *i,
1721a632f559SAnton Altaparmakov 		loff_t pos)
172298b27036SAnton Altaparmakov {
172398b27036SAnton Altaparmakov 	struct address_space *mapping = file->f_mapping;
172498b27036SAnton Altaparmakov 	struct inode *vi = mapping->host;
172598b27036SAnton Altaparmakov 	ntfs_inode *ni = NTFS_I(vi);
172698b27036SAnton Altaparmakov 	ntfs_volume *vol = ni->vol;
172798b27036SAnton Altaparmakov 	struct page *pages[NTFS_MAX_PAGES_PER_CLUSTER];
172898b27036SAnton Altaparmakov 	struct page *cached_page = NULL;
172998b27036SAnton Altaparmakov 	VCN last_vcn;
173098b27036SAnton Altaparmakov 	LCN lcn;
1731a632f559SAnton Altaparmakov 	size_t bytes;
1732a632f559SAnton Altaparmakov 	ssize_t status, written = 0;
173398b27036SAnton Altaparmakov 	unsigned nr_pages;
173498b27036SAnton Altaparmakov 
1735a632f559SAnton Altaparmakov 	ntfs_debug("Entering for i_ino 0x%lx, attribute type 0x%x, pos "
1736a632f559SAnton Altaparmakov 			"0x%llx, count 0x%lx.", vi->i_ino,
1737a632f559SAnton Altaparmakov 			(unsigned)le32_to_cpu(ni->type),
1738a632f559SAnton Altaparmakov 			(unsigned long long)pos,
1739a632f559SAnton Altaparmakov 			(unsigned long)iov_iter_count(i));
174098b27036SAnton Altaparmakov 	/*
174198b27036SAnton Altaparmakov 	 * If a previous ntfs_truncate() failed, repeat it and abort if it
174298b27036SAnton Altaparmakov 	 * fails again.
174398b27036SAnton Altaparmakov 	 */
174498b27036SAnton Altaparmakov 	if (unlikely(NInoTruncateFailed(ni))) {
1745a632f559SAnton Altaparmakov 		int err;
1746a632f559SAnton Altaparmakov 
1747bd5fe6c5SChristoph Hellwig 		inode_dio_wait(vi);
174898b27036SAnton Altaparmakov 		err = ntfs_truncate(vi);
174998b27036SAnton Altaparmakov 		if (err || NInoTruncateFailed(ni)) {
175098b27036SAnton Altaparmakov 			if (!err)
175198b27036SAnton Altaparmakov 				err = -EIO;
175298b27036SAnton Altaparmakov 			ntfs_error(vol->sb, "Cannot perform write to inode "
175398b27036SAnton Altaparmakov 					"0x%lx, attribute type 0x%x, because "
175498b27036SAnton Altaparmakov 					"ntfs_truncate() failed (error code "
175598b27036SAnton Altaparmakov 					"%i).", vi->i_ino,
175698b27036SAnton Altaparmakov 					(unsigned)le32_to_cpu(ni->type), err);
175798b27036SAnton Altaparmakov 			return err;
175898b27036SAnton Altaparmakov 		}
175998b27036SAnton Altaparmakov 	}
176098b27036SAnton Altaparmakov 	/*
176198b27036SAnton Altaparmakov 	 * Determine the number of pages per cluster for non-resident
176298b27036SAnton Altaparmakov 	 * attributes.
176398b27036SAnton Altaparmakov 	 */
176498b27036SAnton Altaparmakov 	nr_pages = 1;
176509cbfeafSKirill A. Shutemov 	if (vol->cluster_size > PAGE_SIZE && NInoNonResident(ni))
176609cbfeafSKirill A. Shutemov 		nr_pages = vol->cluster_size >> PAGE_SHIFT;
176798b27036SAnton Altaparmakov 	last_vcn = -1;
176898b27036SAnton Altaparmakov 	do {
176998b27036SAnton Altaparmakov 		VCN vcn;
177069bc169eSColin Ian King 		pgoff_t start_idx;
177198b27036SAnton Altaparmakov 		unsigned ofs, do_pages, u;
177298b27036SAnton Altaparmakov 		size_t copied;
177398b27036SAnton Altaparmakov 
177469bc169eSColin Ian King 		start_idx = pos >> PAGE_SHIFT;
177509cbfeafSKirill A. Shutemov 		ofs = pos & ~PAGE_MASK;
177609cbfeafSKirill A. Shutemov 		bytes = PAGE_SIZE - ofs;
177798b27036SAnton Altaparmakov 		do_pages = 1;
177898b27036SAnton Altaparmakov 		if (nr_pages > 1) {
177998b27036SAnton Altaparmakov 			vcn = pos >> vol->cluster_size_bits;
178098b27036SAnton Altaparmakov 			if (vcn != last_vcn) {
178198b27036SAnton Altaparmakov 				last_vcn = vcn;
178298b27036SAnton Altaparmakov 				/*
178398b27036SAnton Altaparmakov 				 * Get the lcn of the vcn the write is in.  If
178498b27036SAnton Altaparmakov 				 * it is a hole, need to lock down all pages in
178598b27036SAnton Altaparmakov 				 * the cluster.
178698b27036SAnton Altaparmakov 				 */
178798b27036SAnton Altaparmakov 				down_read(&ni->runlist.lock);
178898b27036SAnton Altaparmakov 				lcn = ntfs_attr_vcn_to_lcn_nolock(ni, pos >>
1789c49c3111SRichard Knutsson 						vol->cluster_size_bits, false);
179098b27036SAnton Altaparmakov 				up_read(&ni->runlist.lock);
179198b27036SAnton Altaparmakov 				if (unlikely(lcn < LCN_HOLE)) {
179298b27036SAnton Altaparmakov 					if (lcn == LCN_ENOMEM)
179398b27036SAnton Altaparmakov 						status = -ENOMEM;
1794a632f559SAnton Altaparmakov 					else {
1795a632f559SAnton Altaparmakov 						status = -EIO;
179698b27036SAnton Altaparmakov 						ntfs_error(vol->sb, "Cannot "
179798b27036SAnton Altaparmakov 							"perform write to "
179898b27036SAnton Altaparmakov 							"inode 0x%lx, "
179998b27036SAnton Altaparmakov 							"attribute type 0x%x, "
180098b27036SAnton Altaparmakov 							"because the attribute "
180198b27036SAnton Altaparmakov 							"is corrupt.",
180298b27036SAnton Altaparmakov 							vi->i_ino, (unsigned)
180398b27036SAnton Altaparmakov 							le32_to_cpu(ni->type));
1804a632f559SAnton Altaparmakov 					}
180598b27036SAnton Altaparmakov 					break;
180698b27036SAnton Altaparmakov 				}
180798b27036SAnton Altaparmakov 				if (lcn == LCN_HOLE) {
180898b27036SAnton Altaparmakov 					start_idx = (pos & ~(s64)
180998b27036SAnton Altaparmakov 							vol->cluster_size_mask)
181009cbfeafSKirill A. Shutemov 							>> PAGE_SHIFT;
181198b27036SAnton Altaparmakov 					bytes = vol->cluster_size - (pos &
181298b27036SAnton Altaparmakov 							vol->cluster_size_mask);
181398b27036SAnton Altaparmakov 					do_pages = nr_pages;
181498b27036SAnton Altaparmakov 				}
181598b27036SAnton Altaparmakov 			}
181698b27036SAnton Altaparmakov 		}
1817a632f559SAnton Altaparmakov 		if (bytes > iov_iter_count(i))
1818a632f559SAnton Altaparmakov 			bytes = iov_iter_count(i);
1819a632f559SAnton Altaparmakov again:
182098b27036SAnton Altaparmakov 		/*
182198b27036SAnton Altaparmakov 		 * Bring in the user page(s) that we will copy from _first_.
182298b27036SAnton Altaparmakov 		 * Otherwise there is a nasty deadlock on copying from the same
182398b27036SAnton Altaparmakov 		 * page(s) as we are writing to, without it/them being marked
182498b27036SAnton Altaparmakov 		 * up-to-date.  Note, at present there is nothing to stop the
182598b27036SAnton Altaparmakov 		 * pages being swapped out between us bringing them into memory
182698b27036SAnton Altaparmakov 		 * and doing the actual copying.
182798b27036SAnton Altaparmakov 		 */
1828a6294593SAndreas Gruenbacher 		if (unlikely(fault_in_iov_iter_readable(i, bytes))) {
1829a632f559SAnton Altaparmakov 			status = -EFAULT;
1830a632f559SAnton Altaparmakov 			break;
1831a632f559SAnton Altaparmakov 		}
183298b27036SAnton Altaparmakov 		/* Get and lock @do_pages starting at index @start_idx. */
183398b27036SAnton Altaparmakov 		status = __ntfs_grab_cache_pages(mapping, start_idx, do_pages,
18344c99000aSMinchan Kim 				pages, &cached_page);
183598b27036SAnton Altaparmakov 		if (unlikely(status))
183698b27036SAnton Altaparmakov 			break;
183798b27036SAnton Altaparmakov 		/*
183898b27036SAnton Altaparmakov 		 * For non-resident attributes, we need to fill any holes with
183998b27036SAnton Altaparmakov 		 * actual clusters and ensure all bufferes are mapped.  We also
184098b27036SAnton Altaparmakov 		 * need to bring uptodate any buffers that are only partially
184198b27036SAnton Altaparmakov 		 * being written to.
184298b27036SAnton Altaparmakov 		 */
184398b27036SAnton Altaparmakov 		if (NInoNonResident(ni)) {
184498b27036SAnton Altaparmakov 			status = ntfs_prepare_pages_for_non_resident_write(
184598b27036SAnton Altaparmakov 					pages, do_pages, pos, bytes);
184698b27036SAnton Altaparmakov 			if (unlikely(status)) {
184798b27036SAnton Altaparmakov 				do {
184898b27036SAnton Altaparmakov 					unlock_page(pages[--do_pages]);
184909cbfeafSKirill A. Shutemov 					put_page(pages[do_pages]);
185098b27036SAnton Altaparmakov 				} while (do_pages);
185198b27036SAnton Altaparmakov 				break;
185298b27036SAnton Altaparmakov 			}
185398b27036SAnton Altaparmakov 		}
185409cbfeafSKirill A. Shutemov 		u = (pos >> PAGE_SHIFT) - pages[0]->index;
1855a632f559SAnton Altaparmakov 		copied = ntfs_copy_from_user_iter(pages + u, do_pages - u, ofs,
1856a632f559SAnton Altaparmakov 					i, bytes);
185798b27036SAnton Altaparmakov 		ntfs_flush_dcache_pages(pages + u, do_pages - u);
1858a632f559SAnton Altaparmakov 		status = 0;
1859a632f559SAnton Altaparmakov 		if (likely(copied == bytes)) {
1860a632f559SAnton Altaparmakov 			status = ntfs_commit_pages_after_write(pages, do_pages,
1861a632f559SAnton Altaparmakov 					pos, bytes);
186298b27036SAnton Altaparmakov 		}
186398b27036SAnton Altaparmakov 		do {
186498b27036SAnton Altaparmakov 			unlock_page(pages[--do_pages]);
186509cbfeafSKirill A. Shutemov 			put_page(pages[do_pages]);
186698b27036SAnton Altaparmakov 		} while (do_pages);
186790679312SAl Viro 		if (unlikely(status < 0)) {
186890679312SAl Viro 			iov_iter_revert(i, copied);
186998b27036SAnton Altaparmakov 			break;
187090679312SAl Viro 		}
187198b27036SAnton Altaparmakov 		cond_resched();
187290679312SAl Viro 		if (unlikely(copied < bytes)) {
187390679312SAl Viro 			iov_iter_revert(i, copied);
187490679312SAl Viro 			if (copied)
187590679312SAl Viro 				bytes = copied;
187690679312SAl Viro 			else if (bytes > PAGE_SIZE - ofs)
187790679312SAl Viro 				bytes = PAGE_SIZE - ofs;
1878a632f559SAnton Altaparmakov 			goto again;
1879a632f559SAnton Altaparmakov 		}
1880a632f559SAnton Altaparmakov 		pos += copied;
1881a632f559SAnton Altaparmakov 		written += copied;
1882a632f559SAnton Altaparmakov 		balance_dirty_pages_ratelimited(mapping);
1883a632f559SAnton Altaparmakov 		if (fatal_signal_pending(current)) {
1884a632f559SAnton Altaparmakov 			status = -EINTR;
1885a632f559SAnton Altaparmakov 			break;
1886a632f559SAnton Altaparmakov 		}
1887a632f559SAnton Altaparmakov 	} while (iov_iter_count(i));
188898b27036SAnton Altaparmakov 	if (cached_page)
188909cbfeafSKirill A. Shutemov 		put_page(cached_page);
189098b27036SAnton Altaparmakov 	ntfs_debug("Done.  Returning %s (written 0x%lx, status %li).",
189198b27036SAnton Altaparmakov 			written ? "written" : "status", (unsigned long)written,
189298b27036SAnton Altaparmakov 			(long)status);
189398b27036SAnton Altaparmakov 	return written ? written : status;
189498b27036SAnton Altaparmakov }
189598b27036SAnton Altaparmakov 
189698b27036SAnton Altaparmakov /**
1897a632f559SAnton Altaparmakov  * ntfs_file_write_iter - simple wrapper for ntfs_file_write_iter_nolock()
1898a632f559SAnton Altaparmakov  * @iocb:	IO state structure
1899a632f559SAnton Altaparmakov  * @from:	iov_iter with data to write
1900a632f559SAnton Altaparmakov  *
1901a632f559SAnton Altaparmakov  * Basically the same as generic_file_write_iter() except that it ends up
1902ccca2683SAl Viro  * up calling ntfs_perform_write() instead of generic_perform_write() and that
1903ccca2683SAl Viro  * O_DIRECT is not implemented.
190498b27036SAnton Altaparmakov  */
ntfs_file_write_iter(struct kiocb * iocb,struct iov_iter * from)1905a632f559SAnton Altaparmakov static ssize_t ntfs_file_write_iter(struct kiocb *iocb, struct iov_iter *from)
190698b27036SAnton Altaparmakov {
190798b27036SAnton Altaparmakov 	struct file *file = iocb->ki_filp;
1908a632f559SAnton Altaparmakov 	struct inode *vi = file_inode(file);
1909ccca2683SAl Viro 	ssize_t written = 0;
1910a632f559SAnton Altaparmakov 	ssize_t err;
1911a632f559SAnton Altaparmakov 
19125955102cSAl Viro 	inode_lock(vi);
1913ccca2683SAl Viro 	/* We can write back this queue in page reclaim. */
1914ccca2683SAl Viro 	err = ntfs_prepare_file_for_write(iocb, from);
1915ccca2683SAl Viro 	if (iov_iter_count(from) && !err)
1916ccca2683SAl Viro 		written = ntfs_perform_write(file, from, iocb->ki_pos);
19175955102cSAl Viro 	inode_unlock(vi);
1918ccca2683SAl Viro 	iocb->ki_pos += written;
1919e2592217SChristoph Hellwig 	if (likely(written > 0))
1920e2592217SChristoph Hellwig 		written = generic_write_sync(iocb, written);
1921ccca2683SAl Viro 	return written ? written : err;
192298b27036SAnton Altaparmakov }
192398b27036SAnton Altaparmakov 
192498b27036SAnton Altaparmakov /**
19251da177e4SLinus Torvalds  * ntfs_file_fsync - sync a file to disk
19261da177e4SLinus Torvalds  * @filp:	file to be synced
19271da177e4SLinus Torvalds  * @datasync:	if non-zero only flush user data and not metadata
19281da177e4SLinus Torvalds  *
19291da177e4SLinus Torvalds  * Data integrity sync of a file to disk.  Used for fsync, fdatasync, and msync
19301da177e4SLinus Torvalds  * system calls.  This function is inspired by fs/buffer.c::file_fsync().
19311da177e4SLinus Torvalds  *
19321da177e4SLinus Torvalds  * If @datasync is false, write the mft record and all associated extent mft
19331da177e4SLinus Torvalds  * records as well as the $DATA attribute and then sync the block device.
19341da177e4SLinus Torvalds  *
19351da177e4SLinus Torvalds  * If @datasync is true and the attribute is non-resident, we skip the writing
19361da177e4SLinus Torvalds  * of the mft record and all associated extent mft records (this might still
19371da177e4SLinus Torvalds  * happen due to the write_inode_now() call).
19381da177e4SLinus Torvalds  *
19391da177e4SLinus Torvalds  * Also, if @datasync is true, we do not wait on the inode to be written out
19401da177e4SLinus Torvalds  * but we always wait on the page cache pages to be written out.
19411da177e4SLinus Torvalds  *
19421b1dcc1bSJes Sorensen  * Locking: Caller must hold i_mutex on the inode.
19431da177e4SLinus Torvalds  *
19441da177e4SLinus Torvalds  * TODO: We should probably also write all attribute/index inodes associated
19451da177e4SLinus Torvalds  * with this inode but since we have no simple way of getting to them we ignore
19461da177e4SLinus Torvalds  * this problem for now.
19471da177e4SLinus Torvalds  */
ntfs_file_fsync(struct file * filp,loff_t start,loff_t end,int datasync)194802c24a82SJosef Bacik static int ntfs_file_fsync(struct file *filp, loff_t start, loff_t end,
194902c24a82SJosef Bacik 			   int datasync)
19501da177e4SLinus Torvalds {
19517ea80859SChristoph Hellwig 	struct inode *vi = filp->f_mapping->host;
19521da177e4SLinus Torvalds 	int err, ret = 0;
19531da177e4SLinus Torvalds 
19541da177e4SLinus Torvalds 	ntfs_debug("Entering for inode 0x%lx.", vi->i_ino);
195502c24a82SJosef Bacik 
19563b49c9a1SJeff Layton 	err = file_write_and_wait_range(filp, start, end);
195702c24a82SJosef Bacik 	if (err)
195802c24a82SJosef Bacik 		return err;
19595955102cSAl Viro 	inode_lock(vi);
196002c24a82SJosef Bacik 
19611da177e4SLinus Torvalds 	BUG_ON(S_ISDIR(vi->i_mode));
19621da177e4SLinus Torvalds 	if (!datasync || !NInoNonResident(NTFS_I(vi)))
1963a9185b41SChristoph Hellwig 		ret = __ntfs_write_inode(vi, 1);
19641da177e4SLinus Torvalds 	write_inode_now(vi, !datasync);
1965f25dfb5eSAnton Altaparmakov 	/*
1966f25dfb5eSAnton Altaparmakov 	 * NOTE: If we were to use mapping->private_list (see ext2 and
1967f25dfb5eSAnton Altaparmakov 	 * fs/buffer.c) for dirty blocks then we could optimize the below to be
1968f25dfb5eSAnton Altaparmakov 	 * sync_mapping_buffers(vi->i_mapping).
1969f25dfb5eSAnton Altaparmakov 	 */
19701da177e4SLinus Torvalds 	err = sync_blockdev(vi->i_sb->s_bdev);
19711da177e4SLinus Torvalds 	if (unlikely(err && !ret))
19721da177e4SLinus Torvalds 		ret = err;
19731da177e4SLinus Torvalds 	if (likely(!ret))
19741da177e4SLinus Torvalds 		ntfs_debug("Done.");
19751da177e4SLinus Torvalds 	else
19761da177e4SLinus Torvalds 		ntfs_warning(vi->i_sb, "Failed to f%ssync inode 0x%lx.  Error "
19771da177e4SLinus Torvalds 				"%u.", datasync ? "data" : "", vi->i_ino, -ret);
19785955102cSAl Viro 	inode_unlock(vi);
19791da177e4SLinus Torvalds 	return ret;
19801da177e4SLinus Torvalds }
19811da177e4SLinus Torvalds 
19821da177e4SLinus Torvalds #endif /* NTFS_RW */
19831da177e4SLinus Torvalds 
19844b6f5d20SArjan van de Ven const struct file_operations ntfs_file_ops = {
1985a632f559SAnton Altaparmakov 	.llseek		= generic_file_llseek,
1986a632f559SAnton Altaparmakov 	.read_iter	= generic_file_read_iter,
19871da177e4SLinus Torvalds #ifdef NTFS_RW
1988a632f559SAnton Altaparmakov 	.write_iter	= ntfs_file_write_iter,
1989a632f559SAnton Altaparmakov 	.fsync		= ntfs_file_fsync,
19901da177e4SLinus Torvalds #endif /* NTFS_RW */
1991a632f559SAnton Altaparmakov 	.mmap		= generic_file_mmap,
1992a632f559SAnton Altaparmakov 	.open		= ntfs_file_open,
1993*2cb1e089SDavid Howells 	.splice_read	= filemap_splice_read,
19941da177e4SLinus Torvalds };
19951da177e4SLinus Torvalds 
199692e1d5beSArjan van de Ven const struct inode_operations ntfs_file_inode_ops = {
19971da177e4SLinus Torvalds #ifdef NTFS_RW
19981da177e4SLinus Torvalds 	.setattr	= ntfs_setattr,
19991da177e4SLinus Torvalds #endif /* NTFS_RW */
20001da177e4SLinus Torvalds };
20011da177e4SLinus Torvalds 
20024b6f5d20SArjan van de Ven const struct file_operations ntfs_empty_file_ops = {};
20031da177e4SLinus Torvalds 
200492e1d5beSArjan van de Ven const struct inode_operations ntfs_empty_inode_ops = {};
2005