Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 2818ef50 authored by Anton Altaparmakov's avatar Anton Altaparmakov Committed by Linus Torvalds
Browse files

NTFS: writev() fix and maintenance/contact details update



Fix writev() to not keep writing the first segment over and over again
instead of moving onto subsequent segments and update the NTFS entry in
MAINTAINERS to reflect that Tuxera Inc. now supports the NTFS driver.

Signed-off-by: default avatarAnton Altaparmakov <anton@tuxera.com>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 4162cf64
Loading
Loading
Loading
Loading
+3 −0
Original line number Original line Diff line number Diff line
@@ -457,6 +457,9 @@ ChangeLog


Note, a technical ChangeLog aimed at kernel hackers is in fs/ntfs/ChangeLog.
Note, a technical ChangeLog aimed at kernel hackers is in fs/ntfs/ChangeLog.


2.1.30:
	- Fix writev() (it kept writing the first segment over and over again
	  instead of moving onto subsequent segments).
2.1.29:
2.1.29:
	- Fix a deadlock when mounting read-write.
	- Fix a deadlock when mounting read-write.
2.1.28:
2.1.28:
+3 −3
Original line number Original line Diff line number Diff line
@@ -4383,11 +4383,11 @@ F: Documentation/scsi/NinjaSCSI.txt
F:	drivers/scsi/nsp32*
F:	drivers/scsi/nsp32*


NTFS FILESYSTEM
NTFS FILESYSTEM
M:	Anton Altaparmakov <aia21@cantab.net>
M:	Anton Altaparmakov <anton@tuxera.com>
L:	linux-ntfs-dev@lists.sourceforge.net
L:	linux-ntfs-dev@lists.sourceforge.net
W:	http://www.linux-ntfs.org/
W:	http://www.tuxera.com/
T:	git git://git.kernel.org/pub/scm/linux/kernel/git/aia21/ntfs-2.6.git
T:	git git://git.kernel.org/pub/scm/linux/kernel/git/aia21/ntfs-2.6.git
S:	Maintained
S:	Supported
F:	Documentation/filesystems/ntfs.txt
F:	Documentation/filesystems/ntfs.txt
F:	fs/ntfs/
F:	fs/ntfs/


+1 −1
Original line number Original line Diff line number Diff line
@@ -6,7 +6,7 @@ ntfs-objs := aops.o attrib.o collate.o compress.o debug.o dir.o file.o \
	     index.o inode.o mft.o mst.o namei.o runlist.o super.o sysctl.o \
	     index.o inode.o mft.o mst.o namei.o runlist.o super.o sysctl.o \
	     unistr.o upcase.o
	     unistr.o upcase.o


EXTRA_CFLAGS = -DNTFS_VERSION=\"2.1.29\"
EXTRA_CFLAGS = -DNTFS_VERSION=\"2.1.30\"


ifeq ($(CONFIG_NTFS_DEBUG),y)
ifeq ($(CONFIG_NTFS_DEBUG),y)
EXTRA_CFLAGS += -DDEBUG
EXTRA_CFLAGS += -DDEBUG
+17 −18
Original line number Original line Diff line number Diff line
/*
/*
 * file.c - NTFS kernel file operations.  Part of the Linux-NTFS project.
 * file.c - NTFS kernel file operations.  Part of the Linux-NTFS project.
 *
 *
 * Copyright (c) 2001-2007 Anton Altaparmakov
 * Copyright (c) 2001-2011 Anton Altaparmakov and Tuxera Inc.
 *
 *
 * This program/include file is free software; you can redistribute it and/or
 * This program/include file is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License as published
 * modify it under the terms of the GNU General Public License as published
@@ -1380,15 +1380,14 @@ static inline void ntfs_set_next_iovec(const struct iovec **iovp,
 * pages (out to offset + bytes), to emulate ntfs_copy_from_user()'s
 * pages (out to offset + bytes), to emulate ntfs_copy_from_user()'s
 * single-segment behaviour.
 * single-segment behaviour.
 *
 *
 * We call the same helper (__ntfs_copy_from_user_iovec_inatomic()) both
 * We call the same helper (__ntfs_copy_from_user_iovec_inatomic()) both when
 * when atomic and when not atomic.  This is ok because
 * atomic and when not atomic.  This is ok because it calls
 * __ntfs_copy_from_user_iovec_inatomic() calls __copy_from_user_inatomic()
 * __copy_from_user_inatomic() and it is ok to call this when non-atomic.  In
 * and it is ok to call this when non-atomic.
 * fact, the only difference between __copy_from_user_inatomic() and
 * Infact, the only difference between __copy_from_user_inatomic() and
 * __copy_from_user() is that the latter calls might_sleep() and the former
 * __copy_from_user() is that the latter calls might_sleep() and the former
 * should not zero the tail of the buffer on error.  And on many
 * should not zero the tail of the buffer on error.  And on many architectures
 * architectures __copy_from_user_inatomic() is just defined to
 * __copy_from_user_inatomic() is just defined to __copy_from_user() so it
 * __copy_from_user() so it makes no difference at all on those architectures.
 * makes no difference at all on those architectures.
 */
 */
static inline size_t ntfs_copy_from_user_iovec(struct page **pages,
static inline size_t ntfs_copy_from_user_iovec(struct page **pages,
		unsigned nr_pages, unsigned ofs, const struct iovec **iov,
		unsigned nr_pages, unsigned ofs, const struct iovec **iov,
@@ -1409,28 +1408,28 @@ static inline size_t ntfs_copy_from_user_iovec(struct page **pages,
		if (unlikely(copied != len)) {
		if (unlikely(copied != len)) {
			/* Do it the slow way. */
			/* Do it the slow way. */
			addr = kmap(*pages);
			addr = kmap(*pages);
			copied = __ntfs_copy_from_user_iovec_inatomic(addr + ofs,
			copied = __ntfs_copy_from_user_iovec_inatomic(addr +
					*iov, *iov_ofs, len);
					ofs, *iov, *iov_ofs, len);
			/*
			 * Zero the rest of the target like __copy_from_user().
			 */
			memset(addr + ofs + copied, 0, len - copied);
			kunmap(*pages);
			if (unlikely(copied != len))
			if (unlikely(copied != len))
				goto err_out;
				goto err_out;
			kunmap(*pages);
		}
		}
		total += len;
		total += len;
		ntfs_set_next_iovec(iov, iov_ofs, len);
		bytes -= len;
		bytes -= len;
		if (!bytes)
		if (!bytes)
			break;
			break;
		ntfs_set_next_iovec(iov, iov_ofs, len);
		ofs = 0;
		ofs = 0;
	} while (++pages < last_page);
	} while (++pages < last_page);
out:
out:
	return total;
	return total;
err_out:
err_out:
	total += copied;
	BUG_ON(copied > len);
	/* Zero the rest of the target like __copy_from_user(). */
	/* Zero the rest of the target like __copy_from_user(). */
	memset(addr + ofs + copied, 0, len - copied);
	kunmap(*pages);
	total += copied;
	ntfs_set_next_iovec(iov, iov_ofs, copied);
	while (++pages < last_page) {
	while (++pages < last_page) {
		bytes -= len;
		bytes -= len;
		if (!bytes)
		if (!bytes)
+3 −3
Original line number Original line Diff line number Diff line
/*
/*
 * super.c - NTFS kernel super block handling. Part of the Linux-NTFS project.
 * super.c - NTFS kernel super block handling. Part of the Linux-NTFS project.
 *
 *
 * Copyright (c) 2001-2007 Anton Altaparmakov
 * Copyright (c) 2001-2011 Anton Altaparmakov and Tuxera Inc.
 * Copyright (c) 2001,2002 Richard Russon
 * Copyright (c) 2001,2002 Richard Russon
 *
 *
 * This program/include file is free software; you can redistribute it and/or
 * This program/include file is free software; you can redistribute it and/or
@@ -3193,8 +3193,8 @@ static void __exit exit_ntfs_fs(void)
	ntfs_sysctl(0);
	ntfs_sysctl(0);
}
}


MODULE_AUTHOR("Anton Altaparmakov <aia21@cantab.net>");
MODULE_AUTHOR("Anton Altaparmakov <anton@tuxera.com>");
MODULE_DESCRIPTION("NTFS 1.2/3.x driver - Copyright (c) 2001-2007 Anton Altaparmakov");
MODULE_DESCRIPTION("NTFS 1.2/3.x driver - Copyright (c) 2001-2011 Anton Altaparmakov and Tuxera Inc.");
MODULE_VERSION(NTFS_VERSION);
MODULE_VERSION(NTFS_VERSION);
MODULE_LICENSE("GPL");
MODULE_LICENSE("GPL");
#ifdef DEBUG
#ifdef DEBUG