diff options
Diffstat (limited to 'fs/ntfs')
-rw-r--r-- | fs/ntfs/Makefile | 2 | ||||
-rw-r--r-- | fs/ntfs/file.c | 35 | ||||
-rw-r--r-- | fs/ntfs/super.c | 6 |
3 files changed, 21 insertions, 22 deletions
diff --git a/fs/ntfs/Makefile b/fs/ntfs/Makefile index 58b6be992544..4ff028fcfd6e 100644 --- a/fs/ntfs/Makefile +++ b/fs/ntfs/Makefile | |||
@@ -6,7 +6,7 @@ ntfs-objs := aops.o attrib.o collate.o compress.o debug.o dir.o file.o \ | |||
6 | index.o inode.o mft.o mst.o namei.o runlist.o super.o sysctl.o \ | 6 | index.o inode.o mft.o mst.o namei.o runlist.o super.o sysctl.o \ |
7 | unistr.o upcase.o | 7 | unistr.o upcase.o |
8 | 8 | ||
9 | EXTRA_CFLAGS = -DNTFS_VERSION=\"2.1.29\" | 9 | EXTRA_CFLAGS = -DNTFS_VERSION=\"2.1.30\" |
10 | 10 | ||
11 | ifeq ($(CONFIG_NTFS_DEBUG),y) | 11 | ifeq ($(CONFIG_NTFS_DEBUG),y) |
12 | EXTRA_CFLAGS += -DDEBUG | 12 | EXTRA_CFLAGS += -DDEBUG |
diff --git a/fs/ntfs/file.c b/fs/ntfs/file.c index 113ebd9f25a4..f4b1057abdd2 100644 --- a/fs/ntfs/file.c +++ b/fs/ntfs/file.c | |||
@@ -1,7 +1,7 @@ | |||
1 | /* | 1 | /* |
2 | * file.c - NTFS kernel file operations. Part of the Linux-NTFS project. | 2 | * file.c - NTFS kernel file operations. Part of the Linux-NTFS project. |
3 | * | 3 | * |
4 | * Copyright (c) 2001-2007 Anton Altaparmakov | 4 | * Copyright (c) 2001-2011 Anton Altaparmakov and Tuxera Inc. |
5 | * | 5 | * |
6 | * This program/include file is free software; you can redistribute it and/or | 6 | * This program/include file is free software; you can redistribute it and/or |
7 | * modify it under the terms of the GNU General Public License as published | 7 | * 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, | |||
1380 | * pages (out to offset + bytes), to emulate ntfs_copy_from_user()'s | 1380 | * pages (out to offset + bytes), to emulate ntfs_copy_from_user()'s |
1381 | * single-segment behaviour. | 1381 | * single-segment behaviour. |
1382 | * | 1382 | * |
1383 | * We call the same helper (__ntfs_copy_from_user_iovec_inatomic()) both | 1383 | * We call the same helper (__ntfs_copy_from_user_iovec_inatomic()) both when |
1384 | * when atomic and when not atomic. This is ok because | 1384 | * atomic and when not atomic. This is ok because it calls |
1385 | * __ntfs_copy_from_user_iovec_inatomic() calls __copy_from_user_inatomic() | 1385 | * __copy_from_user_inatomic() and it is ok to call this when non-atomic. In |
1386 | * and it is ok to call this when non-atomic. | 1386 | * fact, the only difference between __copy_from_user_inatomic() and |
1387 | * Infact, the only difference between __copy_from_user_inatomic() and | ||
1388 | * __copy_from_user() is that the latter calls might_sleep() and the former | 1387 | * __copy_from_user() is that the latter calls might_sleep() and the former |
1389 | * should not zero the tail of the buffer on error. And on many | 1388 | * should not zero the tail of the buffer on error. And on many architectures |
1390 | * architectures __copy_from_user_inatomic() is just defined to | 1389 | * __copy_from_user_inatomic() is just defined to __copy_from_user() so it |
1391 | * __copy_from_user() so it makes no difference at all on those architectures. | 1390 | * makes no difference at all on those architectures. |
1392 | */ | 1391 | */ |
1393 | static inline size_t ntfs_copy_from_user_iovec(struct page **pages, | 1392 | static inline size_t ntfs_copy_from_user_iovec(struct page **pages, |
1394 | unsigned nr_pages, unsigned ofs, const struct iovec **iov, | 1393 | 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, | |||
1409 | if (unlikely(copied != len)) { | 1408 | if (unlikely(copied != len)) { |
1410 | /* Do it the slow way. */ | 1409 | /* Do it the slow way. */ |
1411 | addr = kmap(*pages); | 1410 | addr = kmap(*pages); |
1412 | copied = __ntfs_copy_from_user_iovec_inatomic(addr + ofs, | 1411 | copied = __ntfs_copy_from_user_iovec_inatomic(addr + |
1413 | *iov, *iov_ofs, len); | 1412 | ofs, *iov, *iov_ofs, len); |
1414 | /* | ||
1415 | * Zero the rest of the target like __copy_from_user(). | ||
1416 | */ | ||
1417 | memset(addr + ofs + copied, 0, len - copied); | ||
1418 | kunmap(*pages); | ||
1419 | if (unlikely(copied != len)) | 1413 | if (unlikely(copied != len)) |
1420 | goto err_out; | 1414 | goto err_out; |
1415 | kunmap(*pages); | ||
1421 | } | 1416 | } |
1422 | total += len; | 1417 | total += len; |
1418 | ntfs_set_next_iovec(iov, iov_ofs, len); | ||
1423 | bytes -= len; | 1419 | bytes -= len; |
1424 | if (!bytes) | 1420 | if (!bytes) |
1425 | break; | 1421 | break; |
1426 | ntfs_set_next_iovec(iov, iov_ofs, len); | ||
1427 | ofs = 0; | 1422 | ofs = 0; |
1428 | } while (++pages < last_page); | 1423 | } while (++pages < last_page); |
1429 | out: | 1424 | out: |
1430 | return total; | 1425 | return total; |
1431 | err_out: | 1426 | err_out: |
1432 | total += copied; | 1427 | BUG_ON(copied > len); |
1433 | /* Zero the rest of the target like __copy_from_user(). */ | 1428 | /* Zero the rest of the target like __copy_from_user(). */ |
1429 | memset(addr + ofs + copied, 0, len - copied); | ||
1430 | kunmap(*pages); | ||
1431 | total += copied; | ||
1432 | ntfs_set_next_iovec(iov, iov_ofs, copied); | ||
1434 | while (++pages < last_page) { | 1433 | while (++pages < last_page) { |
1435 | bytes -= len; | 1434 | bytes -= len; |
1436 | if (!bytes) | 1435 | if (!bytes) |
diff --git a/fs/ntfs/super.c b/fs/ntfs/super.c index a30ecacc01f2..29099a07b9fe 100644 --- a/fs/ntfs/super.c +++ b/fs/ntfs/super.c | |||
@@ -1,7 +1,7 @@ | |||
1 | /* | 1 | /* |
2 | * super.c - NTFS kernel super block handling. Part of the Linux-NTFS project. | 2 | * super.c - NTFS kernel super block handling. Part of the Linux-NTFS project. |
3 | * | 3 | * |
4 | * Copyright (c) 2001-2007 Anton Altaparmakov | 4 | * Copyright (c) 2001-2011 Anton Altaparmakov and Tuxera Inc. |
5 | * Copyright (c) 2001,2002 Richard Russon | 5 | * Copyright (c) 2001,2002 Richard Russon |
6 | * | 6 | * |
7 | * This program/include file is free software; you can redistribute it and/or | 7 | * This program/include file is free software; you can redistribute it and/or |
@@ -3193,8 +3193,8 @@ static void __exit exit_ntfs_fs(void) | |||
3193 | ntfs_sysctl(0); | 3193 | ntfs_sysctl(0); |
3194 | } | 3194 | } |
3195 | 3195 | ||
3196 | MODULE_AUTHOR("Anton Altaparmakov <aia21@cantab.net>"); | 3196 | MODULE_AUTHOR("Anton Altaparmakov <anton@tuxera.com>"); |
3197 | MODULE_DESCRIPTION("NTFS 1.2/3.x driver - Copyright (c) 2001-2007 Anton Altaparmakov"); | 3197 | MODULE_DESCRIPTION("NTFS 1.2/3.x driver - Copyright (c) 2001-2011 Anton Altaparmakov and Tuxera Inc."); |
3198 | MODULE_VERSION(NTFS_VERSION); | 3198 | MODULE_VERSION(NTFS_VERSION); |
3199 | MODULE_LICENSE("GPL"); | 3199 | MODULE_LICENSE("GPL"); |
3200 | #ifdef DEBUG | 3200 | #ifdef DEBUG |