diff options
Diffstat (limited to 'fs/ntfs/file.c')
-rw-r--r-- | fs/ntfs/file.c | 23 |
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 | */ |
117 | static int ntfs_attr_extend_initialized(ntfs_inode *ni, const s64 new_init_size, | 112 | static 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; |