diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2015-04-15 19:39:15 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2015-04-15 19:39:15 -0400 |
commit | eea3a00264cf243a28e4331566ce67b86059339d (patch) | |
tree | 487f16389e0dfa32e9caa7604d1274a7dcda8f04 /fs | |
parent | e7c82412433a8039616c7314533a0a1c025d99bf (diff) | |
parent | e693d73c20ffdb06840c9378f367bad849ac0d5d (diff) |
Merge branch 'akpm' (patches from Andrew)
Merge second patchbomb from Andrew Morton:
- the rest of MM
- various misc bits
- add ability to run /sbin/reboot at reboot time
- printk/vsprintf changes
- fiddle with seq_printf() return value
* akpm: (114 commits)
parisc: remove use of seq_printf return value
lru_cache: remove use of seq_printf return value
tracing: remove use of seq_printf return value
cgroup: remove use of seq_printf return value
proc: remove use of seq_printf return value
s390: remove use of seq_printf return value
cris fasttimer: remove use of seq_printf return value
cris: remove use of seq_printf return value
openrisc: remove use of seq_printf return value
ARM: plat-pxa: remove use of seq_printf return value
nios2: cpuinfo: remove use of seq_printf return value
microblaze: mb: remove use of seq_printf return value
ipc: remove use of seq_printf return value
rtc: remove use of seq_printf return value
power: wakeup: remove use of seq_printf return value
x86: mtrr: if: remove use of seq_printf return value
linux/bitmap.h: improve BITMAP_{LAST,FIRST}_WORD_MASK
MAINTAINERS: CREDITS: remove Stefano Brivio from B43
.mailmap: add Ricardo Ribalda
CREDITS: add Ricardo Ribalda Delgado
...
Diffstat (limited to 'fs')
-rw-r--r-- | fs/dax.c | 17 | ||||
-rw-r--r-- | fs/ext2/ext2.h | 1 | ||||
-rw-r--r-- | fs/ext2/file.c | 17 | ||||
-rw-r--r-- | fs/ext2/inode.c | 5 | ||||
-rw-r--r-- | fs/ext2/namei.c | 10 | ||||
-rw-r--r-- | fs/ext4/ext4.h | 1 | ||||
-rw-r--r-- | fs/ext4/file.c | 19 | ||||
-rw-r--r-- | fs/ext4/inode.c | 5 | ||||
-rw-r--r-- | fs/ext4/namei.c | 10 | ||||
-rw-r--r-- | fs/hugetlbfs/inode.c | 90 | ||||
-rw-r--r-- | fs/jfs/jfs_metapage.c | 31 | ||||
-rw-r--r-- | fs/jfs/jfs_metapage.h | 1 | ||||
-rw-r--r-- | fs/nfs/Kconfig | 2 | ||||
-rw-r--r-- | fs/nfsd/Kconfig | 1 | ||||
-rw-r--r-- | fs/proc/array.c | 26 | ||||
-rw-r--r-- | fs/proc/base.c | 82 | ||||
-rw-r--r-- | fs/splice.c | 3 |
17 files changed, 183 insertions, 138 deletions
@@ -464,6 +464,23 @@ int dax_fault(struct vm_area_struct *vma, struct vm_fault *vmf, | |||
464 | EXPORT_SYMBOL_GPL(dax_fault); | 464 | EXPORT_SYMBOL_GPL(dax_fault); |
465 | 465 | ||
466 | /** | 466 | /** |
467 | * dax_pfn_mkwrite - handle first write to DAX page | ||
468 | * @vma: The virtual memory area where the fault occurred | ||
469 | * @vmf: The description of the fault | ||
470 | * | ||
471 | */ | ||
472 | int dax_pfn_mkwrite(struct vm_area_struct *vma, struct vm_fault *vmf) | ||
473 | { | ||
474 | struct super_block *sb = file_inode(vma->vm_file)->i_sb; | ||
475 | |||
476 | sb_start_pagefault(sb); | ||
477 | file_update_time(vma->vm_file); | ||
478 | sb_end_pagefault(sb); | ||
479 | return VM_FAULT_NOPAGE; | ||
480 | } | ||
481 | EXPORT_SYMBOL_GPL(dax_pfn_mkwrite); | ||
482 | |||
483 | /** | ||
467 | * dax_zero_page_range - zero a range within a page of a DAX file | 484 | * dax_zero_page_range - zero a range within a page of a DAX file |
468 | * @inode: The file being truncated | 485 | * @inode: The file being truncated |
469 | * @from: The file offset that is being truncated to | 486 | * @from: The file offset that is being truncated to |
diff --git a/fs/ext2/ext2.h b/fs/ext2/ext2.h index 678f9ab08c48..8d15febd0aa3 100644 --- a/fs/ext2/ext2.h +++ b/fs/ext2/ext2.h | |||
@@ -793,7 +793,6 @@ extern int ext2_fsync(struct file *file, loff_t start, loff_t end, | |||
793 | int datasync); | 793 | int datasync); |
794 | extern const struct inode_operations ext2_file_inode_operations; | 794 | extern const struct inode_operations ext2_file_inode_operations; |
795 | extern const struct file_operations ext2_file_operations; | 795 | extern const struct file_operations ext2_file_operations; |
796 | extern const struct file_operations ext2_dax_file_operations; | ||
797 | 796 | ||
798 | /* inode.c */ | 797 | /* inode.c */ |
799 | extern const struct address_space_operations ext2_aops; | 798 | extern const struct address_space_operations ext2_aops; |
diff --git a/fs/ext2/file.c b/fs/ext2/file.c index ef04fdb57dbf..3a0a6c6406d0 100644 --- a/fs/ext2/file.c +++ b/fs/ext2/file.c | |||
@@ -39,6 +39,7 @@ static int ext2_dax_mkwrite(struct vm_area_struct *vma, struct vm_fault *vmf) | |||
39 | static const struct vm_operations_struct ext2_dax_vm_ops = { | 39 | static const struct vm_operations_struct ext2_dax_vm_ops = { |
40 | .fault = ext2_dax_fault, | 40 | .fault = ext2_dax_fault, |
41 | .page_mkwrite = ext2_dax_mkwrite, | 41 | .page_mkwrite = ext2_dax_mkwrite, |
42 | .pfn_mkwrite = dax_pfn_mkwrite, | ||
42 | }; | 43 | }; |
43 | 44 | ||
44 | static int ext2_file_mmap(struct file *file, struct vm_area_struct *vma) | 45 | static int ext2_file_mmap(struct file *file, struct vm_area_struct *vma) |
@@ -106,22 +107,6 @@ const struct file_operations ext2_file_operations = { | |||
106 | .splice_write = iter_file_splice_write, | 107 | .splice_write = iter_file_splice_write, |
107 | }; | 108 | }; |
108 | 109 | ||
109 | #ifdef CONFIG_FS_DAX | ||
110 | const struct file_operations ext2_dax_file_operations = { | ||
111 | .llseek = generic_file_llseek, | ||
112 | .read_iter = generic_file_read_iter, | ||
113 | .write_iter = generic_file_write_iter, | ||
114 | .unlocked_ioctl = ext2_ioctl, | ||
115 | #ifdef CONFIG_COMPAT | ||
116 | .compat_ioctl = ext2_compat_ioctl, | ||
117 | #endif | ||
118 | .mmap = ext2_file_mmap, | ||
119 | .open = dquot_file_open, | ||
120 | .release = ext2_release_file, | ||
121 | .fsync = ext2_fsync, | ||
122 | }; | ||
123 | #endif | ||
124 | |||
125 | const struct inode_operations ext2_file_inode_operations = { | 110 | const struct inode_operations ext2_file_inode_operations = { |
126 | #ifdef CONFIG_EXT2_FS_XATTR | 111 | #ifdef CONFIG_EXT2_FS_XATTR |
127 | .setxattr = generic_setxattr, | 112 | .setxattr = generic_setxattr, |
diff --git a/fs/ext2/inode.c b/fs/ext2/inode.c index df9d6afbc5d5..b29eb6747116 100644 --- a/fs/ext2/inode.c +++ b/fs/ext2/inode.c | |||
@@ -1388,10 +1388,7 @@ struct inode *ext2_iget (struct super_block *sb, unsigned long ino) | |||
1388 | 1388 | ||
1389 | if (S_ISREG(inode->i_mode)) { | 1389 | if (S_ISREG(inode->i_mode)) { |
1390 | inode->i_op = &ext2_file_inode_operations; | 1390 | inode->i_op = &ext2_file_inode_operations; |
1391 | if (test_opt(inode->i_sb, DAX)) { | 1391 | if (test_opt(inode->i_sb, NOBH)) { |
1392 | inode->i_mapping->a_ops = &ext2_aops; | ||
1393 | inode->i_fop = &ext2_dax_file_operations; | ||
1394 | } else if (test_opt(inode->i_sb, NOBH)) { | ||
1395 | inode->i_mapping->a_ops = &ext2_nobh_aops; | 1392 | inode->i_mapping->a_ops = &ext2_nobh_aops; |
1396 | inode->i_fop = &ext2_file_operations; | 1393 | inode->i_fop = &ext2_file_operations; |
1397 | } else { | 1394 | } else { |
diff --git a/fs/ext2/namei.c b/fs/ext2/namei.c index 148f6e3789ea..ce422931f411 100644 --- a/fs/ext2/namei.c +++ b/fs/ext2/namei.c | |||
@@ -104,10 +104,7 @@ static int ext2_create (struct inode * dir, struct dentry * dentry, umode_t mode | |||
104 | return PTR_ERR(inode); | 104 | return PTR_ERR(inode); |
105 | 105 | ||
106 | inode->i_op = &ext2_file_inode_operations; | 106 | inode->i_op = &ext2_file_inode_operations; |
107 | if (test_opt(inode->i_sb, DAX)) { | 107 | if (test_opt(inode->i_sb, NOBH)) { |
108 | inode->i_mapping->a_ops = &ext2_aops; | ||
109 | inode->i_fop = &ext2_dax_file_operations; | ||
110 | } else if (test_opt(inode->i_sb, NOBH)) { | ||
111 | inode->i_mapping->a_ops = &ext2_nobh_aops; | 108 | inode->i_mapping->a_ops = &ext2_nobh_aops; |
112 | inode->i_fop = &ext2_file_operations; | 109 | inode->i_fop = &ext2_file_operations; |
113 | } else { | 110 | } else { |
@@ -125,10 +122,7 @@ static int ext2_tmpfile(struct inode *dir, struct dentry *dentry, umode_t mode) | |||
125 | return PTR_ERR(inode); | 122 | return PTR_ERR(inode); |
126 | 123 | ||
127 | inode->i_op = &ext2_file_inode_operations; | 124 | inode->i_op = &ext2_file_inode_operations; |
128 | if (test_opt(inode->i_sb, DAX)) { | 125 | if (test_opt(inode->i_sb, NOBH)) { |
129 | inode->i_mapping->a_ops = &ext2_aops; | ||
130 | inode->i_fop = &ext2_dax_file_operations; | ||
131 | } else if (test_opt(inode->i_sb, NOBH)) { | ||
132 | inode->i_mapping->a_ops = &ext2_nobh_aops; | 126 | inode->i_mapping->a_ops = &ext2_nobh_aops; |
133 | inode->i_fop = &ext2_file_operations; | 127 | inode->i_fop = &ext2_file_operations; |
134 | } else { | 128 | } else { |
diff --git a/fs/ext4/ext4.h b/fs/ext4/ext4.h index f63c3d5805c4..8a3981ea35d8 100644 --- a/fs/ext4/ext4.h +++ b/fs/ext4/ext4.h | |||
@@ -2593,7 +2593,6 @@ extern const struct file_operations ext4_dir_operations; | |||
2593 | /* file.c */ | 2593 | /* file.c */ |
2594 | extern const struct inode_operations ext4_file_inode_operations; | 2594 | extern const struct inode_operations ext4_file_inode_operations; |
2595 | extern const struct file_operations ext4_file_operations; | 2595 | extern const struct file_operations ext4_file_operations; |
2596 | extern const struct file_operations ext4_dax_file_operations; | ||
2597 | extern loff_t ext4_llseek(struct file *file, loff_t offset, int origin); | 2596 | extern loff_t ext4_llseek(struct file *file, loff_t offset, int origin); |
2598 | 2597 | ||
2599 | /* inline.c */ | 2598 | /* inline.c */ |
diff --git a/fs/ext4/file.c b/fs/ext4/file.c index 9ad03036d9f5..7a6defcf3352 100644 --- a/fs/ext4/file.c +++ b/fs/ext4/file.c | |||
@@ -206,6 +206,7 @@ static int ext4_dax_mkwrite(struct vm_area_struct *vma, struct vm_fault *vmf) | |||
206 | static const struct vm_operations_struct ext4_dax_vm_ops = { | 206 | static const struct vm_operations_struct ext4_dax_vm_ops = { |
207 | .fault = ext4_dax_fault, | 207 | .fault = ext4_dax_fault, |
208 | .page_mkwrite = ext4_dax_mkwrite, | 208 | .page_mkwrite = ext4_dax_mkwrite, |
209 | .pfn_mkwrite = dax_pfn_mkwrite, | ||
209 | }; | 210 | }; |
210 | #else | 211 | #else |
211 | #define ext4_dax_vm_ops ext4_file_vm_ops | 212 | #define ext4_dax_vm_ops ext4_file_vm_ops |
@@ -622,24 +623,6 @@ const struct file_operations ext4_file_operations = { | |||
622 | .fallocate = ext4_fallocate, | 623 | .fallocate = ext4_fallocate, |
623 | }; | 624 | }; |
624 | 625 | ||
625 | #ifdef CONFIG_FS_DAX | ||
626 | const struct file_operations ext4_dax_file_operations = { | ||
627 | .llseek = ext4_llseek, | ||
628 | .read_iter = generic_file_read_iter, | ||
629 | .write_iter = ext4_file_write_iter, | ||
630 | .unlocked_ioctl = ext4_ioctl, | ||
631 | #ifdef CONFIG_COMPAT | ||
632 | .compat_ioctl = ext4_compat_ioctl, | ||
633 | #endif | ||
634 | .mmap = ext4_file_mmap, | ||
635 | .open = ext4_file_open, | ||
636 | .release = ext4_release_file, | ||
637 | .fsync = ext4_sync_file, | ||
638 | /* Splice not yet supported with DAX */ | ||
639 | .fallocate = ext4_fallocate, | ||
640 | }; | ||
641 | #endif | ||
642 | |||
643 | const struct inode_operations ext4_file_inode_operations = { | 626 | const struct inode_operations ext4_file_inode_operations = { |
644 | .setattr = ext4_setattr, | 627 | .setattr = ext4_setattr, |
645 | .getattr = ext4_getattr, | 628 | .getattr = ext4_getattr, |
diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c index a3f451370bef..035b7a06f1c3 100644 --- a/fs/ext4/inode.c +++ b/fs/ext4/inode.c | |||
@@ -4090,10 +4090,7 @@ struct inode *ext4_iget(struct super_block *sb, unsigned long ino) | |||
4090 | 4090 | ||
4091 | if (S_ISREG(inode->i_mode)) { | 4091 | if (S_ISREG(inode->i_mode)) { |
4092 | inode->i_op = &ext4_file_inode_operations; | 4092 | inode->i_op = &ext4_file_inode_operations; |
4093 | if (test_opt(inode->i_sb, DAX)) | 4093 | inode->i_fop = &ext4_file_operations; |
4094 | inode->i_fop = &ext4_dax_file_operations; | ||
4095 | else | ||
4096 | inode->i_fop = &ext4_file_operations; | ||
4097 | ext4_set_aops(inode); | 4094 | ext4_set_aops(inode); |
4098 | } else if (S_ISDIR(inode->i_mode)) { | 4095 | } else if (S_ISDIR(inode->i_mode)) { |
4099 | inode->i_op = &ext4_dir_inode_operations; | 4096 | inode->i_op = &ext4_dir_inode_operations; |
diff --git a/fs/ext4/namei.c b/fs/ext4/namei.c index 28fe71a2904c..2291923dae4e 100644 --- a/fs/ext4/namei.c +++ b/fs/ext4/namei.c | |||
@@ -2235,10 +2235,7 @@ retry: | |||
2235 | err = PTR_ERR(inode); | 2235 | err = PTR_ERR(inode); |
2236 | if (!IS_ERR(inode)) { | 2236 | if (!IS_ERR(inode)) { |
2237 | inode->i_op = &ext4_file_inode_operations; | 2237 | inode->i_op = &ext4_file_inode_operations; |
2238 | if (test_opt(inode->i_sb, DAX)) | 2238 | inode->i_fop = &ext4_file_operations; |
2239 | inode->i_fop = &ext4_dax_file_operations; | ||
2240 | else | ||
2241 | inode->i_fop = &ext4_file_operations; | ||
2242 | ext4_set_aops(inode); | 2239 | ext4_set_aops(inode); |
2243 | err = ext4_add_nondir(handle, dentry, inode); | 2240 | err = ext4_add_nondir(handle, dentry, inode); |
2244 | if (!err && IS_DIRSYNC(dir)) | 2241 | if (!err && IS_DIRSYNC(dir)) |
@@ -2302,10 +2299,7 @@ retry: | |||
2302 | err = PTR_ERR(inode); | 2299 | err = PTR_ERR(inode); |
2303 | if (!IS_ERR(inode)) { | 2300 | if (!IS_ERR(inode)) { |
2304 | inode->i_op = &ext4_file_inode_operations; | 2301 | inode->i_op = &ext4_file_inode_operations; |
2305 | if (test_opt(inode->i_sb, DAX)) | 2302 | inode->i_fop = &ext4_file_operations; |
2306 | inode->i_fop = &ext4_dax_file_operations; | ||
2307 | else | ||
2308 | inode->i_fop = &ext4_file_operations; | ||
2309 | ext4_set_aops(inode); | 2303 | ext4_set_aops(inode); |
2310 | d_tmpfile(dentry, inode); | 2304 | d_tmpfile(dentry, inode); |
2311 | err = ext4_orphan_add(handle, inode); | 2305 | err = ext4_orphan_add(handle, inode); |
diff --git a/fs/hugetlbfs/inode.c b/fs/hugetlbfs/inode.c index 45e34908bdb5..2640d88b0e63 100644 --- a/fs/hugetlbfs/inode.c +++ b/fs/hugetlbfs/inode.c | |||
@@ -48,9 +48,10 @@ struct hugetlbfs_config { | |||
48 | kuid_t uid; | 48 | kuid_t uid; |
49 | kgid_t gid; | 49 | kgid_t gid; |
50 | umode_t mode; | 50 | umode_t mode; |
51 | long nr_blocks; | 51 | long max_hpages; |
52 | long nr_inodes; | 52 | long nr_inodes; |
53 | struct hstate *hstate; | 53 | struct hstate *hstate; |
54 | long min_hpages; | ||
54 | }; | 55 | }; |
55 | 56 | ||
56 | struct hugetlbfs_inode_info { | 57 | struct hugetlbfs_inode_info { |
@@ -68,7 +69,7 @@ int sysctl_hugetlb_shm_group; | |||
68 | enum { | 69 | enum { |
69 | Opt_size, Opt_nr_inodes, | 70 | Opt_size, Opt_nr_inodes, |
70 | Opt_mode, Opt_uid, Opt_gid, | 71 | Opt_mode, Opt_uid, Opt_gid, |
71 | Opt_pagesize, | 72 | Opt_pagesize, Opt_min_size, |
72 | Opt_err, | 73 | Opt_err, |
73 | }; | 74 | }; |
74 | 75 | ||
@@ -79,6 +80,7 @@ static const match_table_t tokens = { | |||
79 | {Opt_uid, "uid=%u"}, | 80 | {Opt_uid, "uid=%u"}, |
80 | {Opt_gid, "gid=%u"}, | 81 | {Opt_gid, "gid=%u"}, |
81 | {Opt_pagesize, "pagesize=%s"}, | 82 | {Opt_pagesize, "pagesize=%s"}, |
83 | {Opt_min_size, "min_size=%s"}, | ||
82 | {Opt_err, NULL}, | 84 | {Opt_err, NULL}, |
83 | }; | 85 | }; |
84 | 86 | ||
@@ -729,14 +731,38 @@ static const struct super_operations hugetlbfs_ops = { | |||
729 | .show_options = generic_show_options, | 731 | .show_options = generic_show_options, |
730 | }; | 732 | }; |
731 | 733 | ||
734 | enum { NO_SIZE, SIZE_STD, SIZE_PERCENT }; | ||
735 | |||
736 | /* | ||
737 | * Convert size option passed from command line to number of huge pages | ||
738 | * in the pool specified by hstate. Size option could be in bytes | ||
739 | * (val_type == SIZE_STD) or percentage of the pool (val_type == SIZE_PERCENT). | ||
740 | */ | ||
741 | static long long | ||
742 | hugetlbfs_size_to_hpages(struct hstate *h, unsigned long long size_opt, | ||
743 | int val_type) | ||
744 | { | ||
745 | if (val_type == NO_SIZE) | ||
746 | return -1; | ||
747 | |||
748 | if (val_type == SIZE_PERCENT) { | ||
749 | size_opt <<= huge_page_shift(h); | ||
750 | size_opt *= h->max_huge_pages; | ||
751 | do_div(size_opt, 100); | ||
752 | } | ||
753 | |||
754 | size_opt >>= huge_page_shift(h); | ||
755 | return size_opt; | ||
756 | } | ||
757 | |||
732 | static int | 758 | static int |
733 | hugetlbfs_parse_options(char *options, struct hugetlbfs_config *pconfig) | 759 | hugetlbfs_parse_options(char *options, struct hugetlbfs_config *pconfig) |
734 | { | 760 | { |
735 | char *p, *rest; | 761 | char *p, *rest; |
736 | substring_t args[MAX_OPT_ARGS]; | 762 | substring_t args[MAX_OPT_ARGS]; |
737 | int option; | 763 | int option; |
738 | unsigned long long size = 0; | 764 | unsigned long long max_size_opt = 0, min_size_opt = 0; |
739 | enum { NO_SIZE, SIZE_STD, SIZE_PERCENT } setsize = NO_SIZE; | 765 | int max_val_type = NO_SIZE, min_val_type = NO_SIZE; |
740 | 766 | ||
741 | if (!options) | 767 | if (!options) |
742 | return 0; | 768 | return 0; |
@@ -774,10 +800,10 @@ hugetlbfs_parse_options(char *options, struct hugetlbfs_config *pconfig) | |||
774 | /* memparse() will accept a K/M/G without a digit */ | 800 | /* memparse() will accept a K/M/G without a digit */ |
775 | if (!isdigit(*args[0].from)) | 801 | if (!isdigit(*args[0].from)) |
776 | goto bad_val; | 802 | goto bad_val; |
777 | size = memparse(args[0].from, &rest); | 803 | max_size_opt = memparse(args[0].from, &rest); |
778 | setsize = SIZE_STD; | 804 | max_val_type = SIZE_STD; |
779 | if (*rest == '%') | 805 | if (*rest == '%') |
780 | setsize = SIZE_PERCENT; | 806 | max_val_type = SIZE_PERCENT; |
781 | break; | 807 | break; |
782 | } | 808 | } |
783 | 809 | ||
@@ -800,6 +826,17 @@ hugetlbfs_parse_options(char *options, struct hugetlbfs_config *pconfig) | |||
800 | break; | 826 | break; |
801 | } | 827 | } |
802 | 828 | ||
829 | case Opt_min_size: { | ||
830 | /* memparse() will accept a K/M/G without a digit */ | ||
831 | if (!isdigit(*args[0].from)) | ||
832 | goto bad_val; | ||
833 | min_size_opt = memparse(args[0].from, &rest); | ||
834 | min_val_type = SIZE_STD; | ||
835 | if (*rest == '%') | ||
836 | min_val_type = SIZE_PERCENT; | ||
837 | break; | ||
838 | } | ||
839 | |||
803 | default: | 840 | default: |
804 | pr_err("Bad mount option: \"%s\"\n", p); | 841 | pr_err("Bad mount option: \"%s\"\n", p); |
805 | return -EINVAL; | 842 | return -EINVAL; |
@@ -807,15 +844,22 @@ hugetlbfs_parse_options(char *options, struct hugetlbfs_config *pconfig) | |||
807 | } | 844 | } |
808 | } | 845 | } |
809 | 846 | ||
810 | /* Do size after hstate is set up */ | 847 | /* |
811 | if (setsize > NO_SIZE) { | 848 | * Use huge page pool size (in hstate) to convert the size |
812 | struct hstate *h = pconfig->hstate; | 849 | * options to number of huge pages. If NO_SIZE, -1 is returned. |
813 | if (setsize == SIZE_PERCENT) { | 850 | */ |
814 | size <<= huge_page_shift(h); | 851 | pconfig->max_hpages = hugetlbfs_size_to_hpages(pconfig->hstate, |
815 | size *= h->max_huge_pages; | 852 | max_size_opt, max_val_type); |
816 | do_div(size, 100); | 853 | pconfig->min_hpages = hugetlbfs_size_to_hpages(pconfig->hstate, |
817 | } | 854 | min_size_opt, min_val_type); |
818 | pconfig->nr_blocks = (size >> huge_page_shift(h)); | 855 | |
856 | /* | ||
857 | * If max_size was specified, then min_size must be smaller | ||
858 | */ | ||
859 | if (max_val_type > NO_SIZE && | ||
860 | pconfig->min_hpages > pconfig->max_hpages) { | ||
861 | pr_err("minimum size can not be greater than maximum size\n"); | ||
862 | return -EINVAL; | ||
819 | } | 863 | } |
820 | 864 | ||
821 | return 0; | 865 | return 0; |
@@ -834,12 +878,13 @@ hugetlbfs_fill_super(struct super_block *sb, void *data, int silent) | |||
834 | 878 | ||
835 | save_mount_options(sb, data); | 879 | save_mount_options(sb, data); |
836 | 880 | ||
837 | config.nr_blocks = -1; /* No limit on size by default */ | 881 | config.max_hpages = -1; /* No limit on size by default */ |
838 | config.nr_inodes = -1; /* No limit on number of inodes by default */ | 882 | config.nr_inodes = -1; /* No limit on number of inodes by default */ |
839 | config.uid = current_fsuid(); | 883 | config.uid = current_fsuid(); |
840 | config.gid = current_fsgid(); | 884 | config.gid = current_fsgid(); |
841 | config.mode = 0755; | 885 | config.mode = 0755; |
842 | config.hstate = &default_hstate; | 886 | config.hstate = &default_hstate; |
887 | config.min_hpages = -1; /* No default minimum size */ | ||
843 | ret = hugetlbfs_parse_options(data, &config); | 888 | ret = hugetlbfs_parse_options(data, &config); |
844 | if (ret) | 889 | if (ret) |
845 | return ret; | 890 | return ret; |
@@ -853,8 +898,15 @@ hugetlbfs_fill_super(struct super_block *sb, void *data, int silent) | |||
853 | sbinfo->max_inodes = config.nr_inodes; | 898 | sbinfo->max_inodes = config.nr_inodes; |
854 | sbinfo->free_inodes = config.nr_inodes; | 899 | sbinfo->free_inodes = config.nr_inodes; |
855 | sbinfo->spool = NULL; | 900 | sbinfo->spool = NULL; |
856 | if (config.nr_blocks != -1) { | 901 | /* |
857 | sbinfo->spool = hugepage_new_subpool(config.nr_blocks); | 902 | * Allocate and initialize subpool if maximum or minimum size is |
903 | * specified. Any needed reservations (for minimim size) are taken | ||
904 | * taken when the subpool is created. | ||
905 | */ | ||
906 | if (config.max_hpages != -1 || config.min_hpages != -1) { | ||
907 | sbinfo->spool = hugepage_new_subpool(config.hstate, | ||
908 | config.max_hpages, | ||
909 | config.min_hpages); | ||
858 | if (!sbinfo->spool) | 910 | if (!sbinfo->spool) |
859 | goto out_free; | 911 | goto out_free; |
860 | } | 912 | } |
diff --git a/fs/jfs/jfs_metapage.c b/fs/jfs/jfs_metapage.c index 49ba7ff1bbb9..16a0922beb59 100644 --- a/fs/jfs/jfs_metapage.c +++ b/fs/jfs/jfs_metapage.c | |||
@@ -183,30 +183,23 @@ static inline void remove_metapage(struct page *page, struct metapage *mp) | |||
183 | 183 | ||
184 | #endif | 184 | #endif |
185 | 185 | ||
186 | static void init_once(void *foo) | ||
187 | { | ||
188 | struct metapage *mp = (struct metapage *)foo; | ||
189 | |||
190 | mp->lid = 0; | ||
191 | mp->lsn = 0; | ||
192 | mp->flag = 0; | ||
193 | mp->data = NULL; | ||
194 | mp->clsn = 0; | ||
195 | mp->log = NULL; | ||
196 | set_bit(META_free, &mp->flag); | ||
197 | init_waitqueue_head(&mp->wait); | ||
198 | } | ||
199 | |||
200 | static inline struct metapage *alloc_metapage(gfp_t gfp_mask) | 186 | static inline struct metapage *alloc_metapage(gfp_t gfp_mask) |
201 | { | 187 | { |
202 | return mempool_alloc(metapage_mempool, gfp_mask); | 188 | struct metapage *mp = mempool_alloc(metapage_mempool, gfp_mask); |
189 | |||
190 | if (mp) { | ||
191 | mp->lid = 0; | ||
192 | mp->lsn = 0; | ||
193 | mp->data = NULL; | ||
194 | mp->clsn = 0; | ||
195 | mp->log = NULL; | ||
196 | init_waitqueue_head(&mp->wait); | ||
197 | } | ||
198 | return mp; | ||
203 | } | 199 | } |
204 | 200 | ||
205 | static inline void free_metapage(struct metapage *mp) | 201 | static inline void free_metapage(struct metapage *mp) |
206 | { | 202 | { |
207 | mp->flag = 0; | ||
208 | set_bit(META_free, &mp->flag); | ||
209 | |||
210 | mempool_free(mp, metapage_mempool); | 203 | mempool_free(mp, metapage_mempool); |
211 | } | 204 | } |
212 | 205 | ||
@@ -216,7 +209,7 @@ int __init metapage_init(void) | |||
216 | * Allocate the metapage structures | 209 | * Allocate the metapage structures |
217 | */ | 210 | */ |
218 | metapage_cache = kmem_cache_create("jfs_mp", sizeof(struct metapage), | 211 | metapage_cache = kmem_cache_create("jfs_mp", sizeof(struct metapage), |
219 | 0, 0, init_once); | 212 | 0, 0, NULL); |
220 | if (metapage_cache == NULL) | 213 | if (metapage_cache == NULL) |
221 | return -ENOMEM; | 214 | return -ENOMEM; |
222 | 215 | ||
diff --git a/fs/jfs/jfs_metapage.h b/fs/jfs/jfs_metapage.h index a78beda85f68..337e9e51ac06 100644 --- a/fs/jfs/jfs_metapage.h +++ b/fs/jfs/jfs_metapage.h | |||
@@ -48,7 +48,6 @@ struct metapage { | |||
48 | 48 | ||
49 | /* metapage flag */ | 49 | /* metapage flag */ |
50 | #define META_locked 0 | 50 | #define META_locked 0 |
51 | #define META_free 1 | ||
52 | #define META_dirty 2 | 51 | #define META_dirty 2 |
53 | #define META_sync 3 | 52 | #define META_sync 3 |
54 | #define META_discard 4 | 53 | #define META_discard 4 |
diff --git a/fs/nfs/Kconfig b/fs/nfs/Kconfig index c7abc10279af..f31fd0dd92c6 100644 --- a/fs/nfs/Kconfig +++ b/fs/nfs/Kconfig | |||
@@ -1,6 +1,6 @@ | |||
1 | config NFS_FS | 1 | config NFS_FS |
2 | tristate "NFS client support" | 2 | tristate "NFS client support" |
3 | depends on INET && FILE_LOCKING | 3 | depends on INET && FILE_LOCKING && MULTIUSER |
4 | select LOCKD | 4 | select LOCKD |
5 | select SUNRPC | 5 | select SUNRPC |
6 | select NFS_ACL_SUPPORT if NFS_V3_ACL | 6 | select NFS_ACL_SUPPORT if NFS_V3_ACL |
diff --git a/fs/nfsd/Kconfig b/fs/nfsd/Kconfig index 683bf718aead..fc2d108f5272 100644 --- a/fs/nfsd/Kconfig +++ b/fs/nfsd/Kconfig | |||
@@ -6,6 +6,7 @@ config NFSD | |||
6 | select SUNRPC | 6 | select SUNRPC |
7 | select EXPORTFS | 7 | select EXPORTFS |
8 | select NFS_ACL_SUPPORT if NFSD_V2_ACL | 8 | select NFS_ACL_SUPPORT if NFSD_V2_ACL |
9 | depends on MULTIUSER | ||
9 | help | 10 | help |
10 | Choose Y here if you want to allow other computers to access | 11 | Choose Y here if you want to allow other computers to access |
11 | files residing on this system using Sun's Network File System | 12 | files residing on this system using Sun's Network File System |
diff --git a/fs/proc/array.c b/fs/proc/array.c index 1295a00ca316..fd02a9ebfc30 100644 --- a/fs/proc/array.c +++ b/fs/proc/array.c | |||
@@ -99,8 +99,8 @@ static inline void task_name(struct seq_file *m, struct task_struct *p) | |||
99 | buf = m->buf + m->count; | 99 | buf = m->buf + m->count; |
100 | 100 | ||
101 | /* Ignore error for now */ | 101 | /* Ignore error for now */ |
102 | string_escape_str(tcomm, &buf, m->size - m->count, | 102 | buf += string_escape_str(tcomm, buf, m->size - m->count, |
103 | ESCAPE_SPACE | ESCAPE_SPECIAL, "\n\\"); | 103 | ESCAPE_SPACE | ESCAPE_SPECIAL, "\n\\"); |
104 | 104 | ||
105 | m->count = buf - m->buf; | 105 | m->count = buf - m->buf; |
106 | seq_putc(m, '\n'); | 106 | seq_putc(m, '\n'); |
@@ -188,6 +188,24 @@ static inline void task_state(struct seq_file *m, struct pid_namespace *ns, | |||
188 | from_kgid_munged(user_ns, GROUP_AT(group_info, g))); | 188 | from_kgid_munged(user_ns, GROUP_AT(group_info, g))); |
189 | put_cred(cred); | 189 | put_cred(cred); |
190 | 190 | ||
191 | #ifdef CONFIG_PID_NS | ||
192 | seq_puts(m, "\nNStgid:"); | ||
193 | for (g = ns->level; g <= pid->level; g++) | ||
194 | seq_printf(m, "\t%d", | ||
195 | task_tgid_nr_ns(p, pid->numbers[g].ns)); | ||
196 | seq_puts(m, "\nNSpid:"); | ||
197 | for (g = ns->level; g <= pid->level; g++) | ||
198 | seq_printf(m, "\t%d", | ||
199 | task_pid_nr_ns(p, pid->numbers[g].ns)); | ||
200 | seq_puts(m, "\nNSpgid:"); | ||
201 | for (g = ns->level; g <= pid->level; g++) | ||
202 | seq_printf(m, "\t%d", | ||
203 | task_pgrp_nr_ns(p, pid->numbers[g].ns)); | ||
204 | seq_puts(m, "\nNSsid:"); | ||
205 | for (g = ns->level; g <= pid->level; g++) | ||
206 | seq_printf(m, "\t%d", | ||
207 | task_session_nr_ns(p, pid->numbers[g].ns)); | ||
208 | #endif | ||
191 | seq_putc(m, '\n'); | 209 | seq_putc(m, '\n'); |
192 | } | 210 | } |
193 | 211 | ||
@@ -614,7 +632,9 @@ static int children_seq_show(struct seq_file *seq, void *v) | |||
614 | pid_t pid; | 632 | pid_t pid; |
615 | 633 | ||
616 | pid = pid_nr_ns(v, inode->i_sb->s_fs_info); | 634 | pid = pid_nr_ns(v, inode->i_sb->s_fs_info); |
617 | return seq_printf(seq, "%d ", pid); | 635 | seq_printf(seq, "%d ", pid); |
636 | |||
637 | return 0; | ||
618 | } | 638 | } |
619 | 639 | ||
620 | static void *children_seq_start(struct seq_file *seq, loff_t *pos) | 640 | static void *children_seq_start(struct seq_file *seq, loff_t *pos) |
diff --git a/fs/proc/base.c b/fs/proc/base.c index 3f3d7aeb0712..7a3b82f986dd 100644 --- a/fs/proc/base.c +++ b/fs/proc/base.c | |||
@@ -238,13 +238,15 @@ static int proc_pid_wchan(struct seq_file *m, struct pid_namespace *ns, | |||
238 | 238 | ||
239 | wchan = get_wchan(task); | 239 | wchan = get_wchan(task); |
240 | 240 | ||
241 | if (lookup_symbol_name(wchan, symname) < 0) | 241 | if (lookup_symbol_name(wchan, symname) < 0) { |
242 | if (!ptrace_may_access(task, PTRACE_MODE_READ)) | 242 | if (!ptrace_may_access(task, PTRACE_MODE_READ)) |
243 | return 0; | 243 | return 0; |
244 | else | 244 | seq_printf(m, "%lu", wchan); |
245 | return seq_printf(m, "%lu", wchan); | 245 | } else { |
246 | else | 246 | seq_printf(m, "%s", symname); |
247 | return seq_printf(m, "%s", symname); | 247 | } |
248 | |||
249 | return 0; | ||
248 | } | 250 | } |
249 | #endif /* CONFIG_KALLSYMS */ | 251 | #endif /* CONFIG_KALLSYMS */ |
250 | 252 | ||
@@ -309,10 +311,12 @@ static int proc_pid_stack(struct seq_file *m, struct pid_namespace *ns, | |||
309 | static int proc_pid_schedstat(struct seq_file *m, struct pid_namespace *ns, | 311 | static int proc_pid_schedstat(struct seq_file *m, struct pid_namespace *ns, |
310 | struct pid *pid, struct task_struct *task) | 312 | struct pid *pid, struct task_struct *task) |
311 | { | 313 | { |
312 | return seq_printf(m, "%llu %llu %lu\n", | 314 | seq_printf(m, "%llu %llu %lu\n", |
313 | (unsigned long long)task->se.sum_exec_runtime, | 315 | (unsigned long long)task->se.sum_exec_runtime, |
314 | (unsigned long long)task->sched_info.run_delay, | 316 | (unsigned long long)task->sched_info.run_delay, |
315 | task->sched_info.pcount); | 317 | task->sched_info.pcount); |
318 | |||
319 | return 0; | ||
316 | } | 320 | } |
317 | #endif | 321 | #endif |
318 | 322 | ||
@@ -387,7 +391,9 @@ static int proc_oom_score(struct seq_file *m, struct pid_namespace *ns, | |||
387 | points = oom_badness(task, NULL, NULL, totalpages) * | 391 | points = oom_badness(task, NULL, NULL, totalpages) * |
388 | 1000 / totalpages; | 392 | 1000 / totalpages; |
389 | read_unlock(&tasklist_lock); | 393 | read_unlock(&tasklist_lock); |
390 | return seq_printf(m, "%lu\n", points); | 394 | seq_printf(m, "%lu\n", points); |
395 | |||
396 | return 0; | ||
391 | } | 397 | } |
392 | 398 | ||
393 | struct limit_names { | 399 | struct limit_names { |
@@ -432,15 +438,15 @@ static int proc_pid_limits(struct seq_file *m, struct pid_namespace *ns, | |||
432 | * print the file header | 438 | * print the file header |
433 | */ | 439 | */ |
434 | seq_printf(m, "%-25s %-20s %-20s %-10s\n", | 440 | seq_printf(m, "%-25s %-20s %-20s %-10s\n", |
435 | "Limit", "Soft Limit", "Hard Limit", "Units"); | 441 | "Limit", "Soft Limit", "Hard Limit", "Units"); |
436 | 442 | ||
437 | for (i = 0; i < RLIM_NLIMITS; i++) { | 443 | for (i = 0; i < RLIM_NLIMITS; i++) { |
438 | if (rlim[i].rlim_cur == RLIM_INFINITY) | 444 | if (rlim[i].rlim_cur == RLIM_INFINITY) |
439 | seq_printf(m, "%-25s %-20s ", | 445 | seq_printf(m, "%-25s %-20s ", |
440 | lnames[i].name, "unlimited"); | 446 | lnames[i].name, "unlimited"); |
441 | else | 447 | else |
442 | seq_printf(m, "%-25s %-20lu ", | 448 | seq_printf(m, "%-25s %-20lu ", |
443 | lnames[i].name, rlim[i].rlim_cur); | 449 | lnames[i].name, rlim[i].rlim_cur); |
444 | 450 | ||
445 | if (rlim[i].rlim_max == RLIM_INFINITY) | 451 | if (rlim[i].rlim_max == RLIM_INFINITY) |
446 | seq_printf(m, "%-20s ", "unlimited"); | 452 | seq_printf(m, "%-20s ", "unlimited"); |
@@ -462,7 +468,9 @@ static int proc_pid_syscall(struct seq_file *m, struct pid_namespace *ns, | |||
462 | { | 468 | { |
463 | long nr; | 469 | long nr; |
464 | unsigned long args[6], sp, pc; | 470 | unsigned long args[6], sp, pc; |
465 | int res = lock_trace(task); | 471 | int res; |
472 | |||
473 | res = lock_trace(task); | ||
466 | if (res) | 474 | if (res) |
467 | return res; | 475 | return res; |
468 | 476 | ||
@@ -477,7 +485,8 @@ static int proc_pid_syscall(struct seq_file *m, struct pid_namespace *ns, | |||
477 | args[0], args[1], args[2], args[3], args[4], args[5], | 485 | args[0], args[1], args[2], args[3], args[4], args[5], |
478 | sp, pc); | 486 | sp, pc); |
479 | unlock_trace(task); | 487 | unlock_trace(task); |
480 | return res; | 488 | |
489 | return 0; | ||
481 | } | 490 | } |
482 | #endif /* CONFIG_HAVE_ARCH_TRACEHOOK */ | 491 | #endif /* CONFIG_HAVE_ARCH_TRACEHOOK */ |
483 | 492 | ||
@@ -2002,12 +2011,13 @@ static int show_timer(struct seq_file *m, void *v) | |||
2002 | notify = timer->it_sigev_notify; | 2011 | notify = timer->it_sigev_notify; |
2003 | 2012 | ||
2004 | seq_printf(m, "ID: %d\n", timer->it_id); | 2013 | seq_printf(m, "ID: %d\n", timer->it_id); |
2005 | seq_printf(m, "signal: %d/%p\n", timer->sigq->info.si_signo, | 2014 | seq_printf(m, "signal: %d/%p\n", |
2006 | timer->sigq->info.si_value.sival_ptr); | 2015 | timer->sigq->info.si_signo, |
2016 | timer->sigq->info.si_value.sival_ptr); | ||
2007 | seq_printf(m, "notify: %s/%s.%d\n", | 2017 | seq_printf(m, "notify: %s/%s.%d\n", |
2008 | nstr[notify & ~SIGEV_THREAD_ID], | 2018 | nstr[notify & ~SIGEV_THREAD_ID], |
2009 | (notify & SIGEV_THREAD_ID) ? "tid" : "pid", | 2019 | (notify & SIGEV_THREAD_ID) ? "tid" : "pid", |
2010 | pid_nr_ns(timer->it_pid, tp->ns)); | 2020 | pid_nr_ns(timer->it_pid, tp->ns)); |
2011 | seq_printf(m, "ClockID: %d\n", timer->it_clock); | 2021 | seq_printf(m, "ClockID: %d\n", timer->it_clock); |
2012 | 2022 | ||
2013 | return 0; | 2023 | return 0; |
@@ -2352,21 +2362,23 @@ static int do_io_accounting(struct task_struct *task, struct seq_file *m, int wh | |||
2352 | 2362 | ||
2353 | unlock_task_sighand(task, &flags); | 2363 | unlock_task_sighand(task, &flags); |
2354 | } | 2364 | } |
2355 | result = seq_printf(m, | 2365 | seq_printf(m, |
2356 | "rchar: %llu\n" | 2366 | "rchar: %llu\n" |
2357 | "wchar: %llu\n" | 2367 | "wchar: %llu\n" |
2358 | "syscr: %llu\n" | 2368 | "syscr: %llu\n" |
2359 | "syscw: %llu\n" | 2369 | "syscw: %llu\n" |
2360 | "read_bytes: %llu\n" | 2370 | "read_bytes: %llu\n" |
2361 | "write_bytes: %llu\n" | 2371 | "write_bytes: %llu\n" |
2362 | "cancelled_write_bytes: %llu\n", | 2372 | "cancelled_write_bytes: %llu\n", |
2363 | (unsigned long long)acct.rchar, | 2373 | (unsigned long long)acct.rchar, |
2364 | (unsigned long long)acct.wchar, | 2374 | (unsigned long long)acct.wchar, |
2365 | (unsigned long long)acct.syscr, | 2375 | (unsigned long long)acct.syscr, |
2366 | (unsigned long long)acct.syscw, | 2376 | (unsigned long long)acct.syscw, |
2367 | (unsigned long long)acct.read_bytes, | 2377 | (unsigned long long)acct.read_bytes, |
2368 | (unsigned long long)acct.write_bytes, | 2378 | (unsigned long long)acct.write_bytes, |
2369 | (unsigned long long)acct.cancelled_write_bytes); | 2379 | (unsigned long long)acct.cancelled_write_bytes); |
2380 | result = 0; | ||
2381 | |||
2370 | out_unlock: | 2382 | out_unlock: |
2371 | mutex_unlock(&task->signal->cred_guard_mutex); | 2383 | mutex_unlock(&task->signal->cred_guard_mutex); |
2372 | return result; | 2384 | return result; |
diff --git a/fs/splice.c b/fs/splice.c index 41cbb16299e0..476024bb6546 100644 --- a/fs/splice.c +++ b/fs/splice.c | |||
@@ -523,6 +523,9 @@ ssize_t generic_file_splice_read(struct file *in, loff_t *ppos, | |||
523 | loff_t isize, left; | 523 | loff_t isize, left; |
524 | int ret; | 524 | int ret; |
525 | 525 | ||
526 | if (IS_DAX(in->f_mapping->host)) | ||
527 | return default_file_splice_read(in, ppos, pipe, len, flags); | ||
528 | |||
526 | isize = i_size_read(in->f_mapping->host); | 529 | isize = i_size_read(in->f_mapping->host); |
527 | if (unlikely(*ppos >= isize)) | 530 | if (unlikely(*ppos >= isize)) |
528 | return 0; | 531 | return 0; |