Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs

Pull vfs fixes from Al Viro:
"A couple of fixes, both -stable fodder. The O_SYNC bug is fairly
old..."

* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs:
fix a kmap leak in virtio_console
fix O_SYNC|O_APPEND syncing the wrong range on write()

+17 -31
+3 -6
drivers/char/virtio_console.c
··· 890 890 } else { 891 891 /* Failback to copying a page */ 892 892 struct page *page = alloc_page(GFP_KERNEL); 893 - char *src = buf->ops->map(pipe, buf, 1); 894 - char *dst; 893 + char *src; 895 894 896 895 if (!page) 897 896 return -ENOMEM; 898 - dst = kmap(page); 899 897 900 898 offset = sd->pos & ~PAGE_MASK; 901 899 ··· 901 903 if (len + offset > PAGE_SIZE) 902 904 len = PAGE_SIZE - offset; 903 905 904 - memcpy(dst + offset, src + buf->offset, len); 905 - 906 - kunmap(page); 906 + src = buf->ops->map(pipe, buf, 1); 907 + memcpy(page_address(page) + offset, src + buf->offset, len); 907 908 buf->ops->unmap(pipe, buf, src); 908 909 909 910 sg_set_page(&(sgl->sg[sgl->n]), page, len, offset);
+2 -2
fs/cifs/file.c
··· 2559 2559 if (rc > 0) { 2560 2560 ssize_t err; 2561 2561 2562 - err = generic_write_sync(file, pos, rc); 2563 - if (err < 0 && rc > 0) 2562 + err = generic_write_sync(file, iocb->ki_pos - rc, rc); 2563 + if (err < 0) 2564 2564 rc = err; 2565 2565 } 2566 2566
+1 -1
fs/ext4/file.c
··· 152 152 if (ret > 0) { 153 153 ssize_t err; 154 154 155 - err = generic_write_sync(file, pos, ret); 155 + err = generic_write_sync(file, iocb->ki_pos - ret, ret); 156 156 if (err < 0 && ret > 0) 157 157 ret = err; 158 158 }
+1 -1
fs/ntfs/file.c
··· 2134 2134 ret = ntfs_file_aio_write_nolock(iocb, iov, nr_segs, &iocb->ki_pos); 2135 2135 mutex_unlock(&inode->i_mutex); 2136 2136 if (ret > 0) { 2137 - int err = generic_write_sync(file, pos, ret); 2137 + int err = generic_write_sync(file, iocb->ki_pos - ret, ret); 2138 2138 if (err < 0) 2139 2139 ret = err; 2140 2140 }
-17
fs/sync.c
··· 222 222 return do_fsync(fd, 1); 223 223 } 224 224 225 - /** 226 - * generic_write_sync - perform syncing after a write if file / inode is sync 227 - * @file: file to which the write happened 228 - * @pos: offset where the write started 229 - * @count: length of the write 230 - * 231 - * This is just a simple wrapper about our general syncing function. 232 - */ 233 - int generic_write_sync(struct file *file, loff_t pos, loff_t count) 234 - { 235 - if (!(file->f_flags & O_DSYNC) && !IS_SYNC(file->f_mapping->host)) 236 - return 0; 237 - return vfs_fsync_range(file, pos, pos + count - 1, 238 - (file->f_flags & __O_SYNC) ? 0 : 1); 239 - } 240 - EXPORT_SYMBOL(generic_write_sync); 241 - 242 225 /* 243 226 * sys_sync_file_range() permits finely controlled syncing over a segment of 244 227 * a file in the range offset .. (offset+nbytes-1) inclusive. If nbytes is
+1 -1
fs/xfs/xfs_file.c
··· 799 799 XFS_STATS_ADD(xs_write_bytes, ret); 800 800 801 801 /* Handle various SYNC-type writes */ 802 - err = generic_write_sync(file, pos, ret); 802 + err = generic_write_sync(file, iocb->ki_pos - ret, ret); 803 803 if (err < 0) 804 804 ret = err; 805 805 }
+7 -1
include/linux/fs.h
··· 2274 2274 extern int vfs_fsync_range(struct file *file, loff_t start, loff_t end, 2275 2275 int datasync); 2276 2276 extern int vfs_fsync(struct file *file, int datasync); 2277 - extern int generic_write_sync(struct file *file, loff_t pos, loff_t count); 2277 + static inline int generic_write_sync(struct file *file, loff_t pos, loff_t count) 2278 + { 2279 + if (!(file->f_flags & O_DSYNC) && !IS_SYNC(file->f_mapping->host)) 2280 + return 0; 2281 + return vfs_fsync_range(file, pos, pos + count - 1, 2282 + (file->f_flags & __O_SYNC) ? 0 : 1); 2283 + } 2278 2284 extern void emergency_sync(void); 2279 2285 extern void emergency_remount(void); 2280 2286 #ifdef CONFIG_BLOCK
+2 -2
mm/filemap.c
··· 2553 2553 if (ret > 0) { 2554 2554 ssize_t err; 2555 2555 2556 - err = generic_write_sync(file, pos, ret); 2557 - if (err < 0 && ret > 0) 2556 + err = generic_write_sync(file, iocb->ki_pos - ret, ret); 2557 + if (err < 0) 2558 2558 ret = err; 2559 2559 } 2560 2560 return ret;