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; |
