aboutsummaryrefslogtreecommitdiffstats
path: root/fs/ntfs/file.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/ntfs/file.c')
-rw-r--r--fs/ntfs/file.c23
1 files changed, 8 insertions, 15 deletions
diff --git a/fs/ntfs/file.c b/fs/ntfs/file.c
index cdedc84e1372..cf3e6ced2d01 100644
--- a/fs/ntfs/file.c
+++ b/fs/ntfs/file.c
@@ -78,12 +78,8 @@ static int ntfs_file_open(struct inode *vi, struct file *filp)
78 * Extend the initialized size of an attribute described by the ntfs inode @ni 78 * Extend the initialized size of an attribute described by the ntfs inode @ni
79 * to @new_init_size bytes. This involves zeroing any non-sparse space between 79 * to @new_init_size bytes. This involves zeroing any non-sparse space between
80 * the old initialized size and @new_init_size both in the page cache and on 80 * the old initialized size and @new_init_size both in the page cache and on
81 * disk (if relevant complete pages are zeroed in the page cache then these may 81 * disk (if relevant complete pages are already uptodate in the page cache then
82 * simply be marked dirty for later writeout). There is one caveat and that is 82 * these are simply marked dirty).
83 * that if any uptodate page cache pages between the old initialized size and
84 * the smaller of @new_init_size and the file size (vfs inode->i_size) are in
85 * memory, these need to be marked dirty without being zeroed since they could
86 * be non-zero due to mmap() based writes.
87 * 83 *
88 * As a side-effect, the file size (vfs inode->i_size) may be incremented as, 84 * As a side-effect, the file size (vfs inode->i_size) may be incremented as,
89 * in the resident attribute case, it is tied to the initialized size and, in 85 * in the resident attribute case, it is tied to the initialized size and, in
@@ -98,10 +94,10 @@ static int ntfs_file_open(struct inode *vi, struct file *filp)
98 * with new data via mmap() based writes, so we cannot just zero it. And since 94 * with new data via mmap() based writes, so we cannot just zero it. And since
99 * POSIX specifies that the behaviour of resizing a file whilst it is mmap()ped 95 * POSIX specifies that the behaviour of resizing a file whilst it is mmap()ped
100 * is unspecified, we choose not to do zeroing and thus we do not need to touch 96 * is unspecified, we choose not to do zeroing and thus we do not need to touch
101 * the page at all. For a more detailed explanation see ntfs_truncate() which 97 * the page at all. For a more detailed explanation see ntfs_truncate() in
102 * is in fs/ntfs/inode.c. 98 * fs/ntfs/inode.c.
103 * 99 *
104 * @cached_page and @lru_pvec are just optimisations for dealing with multiple 100 * @cached_page and @lru_pvec are just optimizations for dealing with multiple
105 * pages. 101 * pages.
106 * 102 *
107 * Return 0 on success and -errno on error. In the case that an error is 103 * Return 0 on success and -errno on error. In the case that an error is
@@ -110,9 +106,8 @@ static int ntfs_file_open(struct inode *vi, struct file *filp)
110 * this is the case, the necessary zeroing will also have happened and that all 106 * this is the case, the necessary zeroing will also have happened and that all
111 * metadata is self-consistent. 107 * metadata is self-consistent.
112 * 108 *
113 * Locking: This function locks the mft record of the base ntfs inode and 109 * Locking: i_sem on the vfs inode corrseponsind to the ntfs inode @ni must be
114 * maintains the lock throughout execution of the function. This is required 110 * held by the caller.
115 * so that the initialized size of the attribute can be modified safely.
116 */ 111 */
117static int ntfs_attr_extend_initialized(ntfs_inode *ni, const s64 new_init_size, 112static int ntfs_attr_extend_initialized(ntfs_inode *ni, const s64 new_init_size,
118 struct page **cached_page, struct pagevec *lru_pvec) 113 struct page **cached_page, struct pagevec *lru_pvec)
@@ -1836,7 +1831,7 @@ static ssize_t ntfs_file_buffered_write(struct kiocb *iocb,
1836 VCN last_vcn; 1831 VCN last_vcn;
1837 LCN lcn; 1832 LCN lcn;
1838 unsigned long flags; 1833 unsigned long flags;
1839 size_t bytes, iov_ofs; 1834 size_t bytes, iov_ofs = 0; /* Offset in the current iovec. */
1840 ssize_t status, written; 1835 ssize_t status, written;
1841 unsigned nr_pages; 1836 unsigned nr_pages;
1842 int err; 1837 int err;
@@ -1988,8 +1983,6 @@ static ssize_t ntfs_file_buffered_write(struct kiocb *iocb,
1988 last_vcn = -1; 1983 last_vcn = -1;
1989 if (likely(nr_segs == 1)) 1984 if (likely(nr_segs == 1))
1990 buf = iov->iov_base; 1985 buf = iov->iov_base;
1991 else
1992 iov_ofs = 0; /* Offset in the current iovec. */
1993 do { 1986 do {
1994 VCN vcn; 1987 VCN vcn;
1995 pgoff_t idx, start_idx; 1988 pgoff_t idx, start_idx;