diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2013-02-26 23:16:07 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2013-02-26 23:16:07 -0500 |
commit | d895cb1af15c04c522a25c79cc429076987c089b (patch) | |
tree | 895dc9157e28f603d937a58be664e4e440d5530c /kernel | |
parent | 9626357371b519f2b955fef399647181034a77fe (diff) | |
parent | d3d009cb965eae7e002ea5badf603ea8f4c34915 (diff) |
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs
Pull vfs pile (part one) from Al Viro:
"Assorted stuff - cleaning namei.c up a bit, fixing ->d_name/->d_parent
locking violations, etc.
The most visible changes here are death of FS_REVAL_DOT (replaced with
"has ->d_weak_revalidate()") and a new helper getting from struct file
to inode. Some bits of preparation to xattr method interface changes.
Misc patches by various people sent this cycle *and* ocfs2 fixes from
several cycles ago that should've been upstream right then.
PS: the next vfs pile will be xattr stuff."
* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs: (46 commits)
saner proc_get_inode() calling conventions
proc: avoid extra pde_put() in proc_fill_super()
fs: change return values from -EACCES to -EPERM
fs/exec.c: make bprm_mm_init() static
ocfs2/dlm: use GFP_ATOMIC inside a spin_lock
ocfs2: fix possible use-after-free with AIO
ocfs2: Fix oops in ocfs2_fast_symlink_readpage() code path
get_empty_filp()/alloc_file() leave both ->f_pos and ->f_version zero
target: writev() on single-element vector is pointless
export kernel_write(), convert open-coded instances
fs: encode_fh: return FILEID_INVALID if invalid fid_type
kill f_vfsmnt
vfs: kill FS_REVAL_DOT by adding a d_weak_revalidate dentry op
nfsd: handle vfs_getattr errors in acl protocol
switch vfs_getattr() to struct path
default SET_PERSONALITY() in linux/elf.h
ceph: prepopulate inodes only when request is aborted
d_hash_and_lookup(): export, switch open-coded instances
9p: switch v9fs_set_create_acl() to inode+fid, do it before d_instantiate()
9p: split dropping the acls from v9fs_set_create_acl()
...
Diffstat (limited to 'kernel')
-rw-r--r-- | kernel/acct.c | 2 | ||||
-rw-r--r-- | kernel/cgroup.c | 6 | ||||
-rw-r--r-- | kernel/events/core.c | 2 | ||||
-rw-r--r-- | kernel/fork.c | 2 | ||||
-rw-r--r-- | kernel/irq/proc.c | 2 | ||||
-rw-r--r-- | kernel/module.c | 2 | ||||
-rw-r--r-- | kernel/nsproxy.c | 2 | ||||
-rw-r--r-- | kernel/relay.c | 4 | ||||
-rw-r--r-- | kernel/sys.c | 8 | ||||
-rw-r--r-- | kernel/sysctl_binary.c | 39 |
10 files changed, 22 insertions, 47 deletions
diff --git a/kernel/acct.c b/kernel/acct.c index e8b1627ab9c7..b9bd7f098ee5 100644 --- a/kernel/acct.c +++ b/kernel/acct.c | |||
@@ -205,7 +205,7 @@ static int acct_on(struct filename *pathname) | |||
205 | if (IS_ERR(file)) | 205 | if (IS_ERR(file)) |
206 | return PTR_ERR(file); | 206 | return PTR_ERR(file); |
207 | 207 | ||
208 | if (!S_ISREG(file->f_path.dentry->d_inode->i_mode)) { | 208 | if (!S_ISREG(file_inode(file)->i_mode)) { |
209 | filp_close(file, NULL); | 209 | filp_close(file, NULL); |
210 | return -EACCES; | 210 | return -EACCES; |
211 | } | 211 | } |
diff --git a/kernel/cgroup.c b/kernel/cgroup.c index b5c64327e712..fb2fb11fbb25 100644 --- a/kernel/cgroup.c +++ b/kernel/cgroup.c | |||
@@ -2645,7 +2645,7 @@ static struct dentry *cgroup_lookup(struct inode *dir, struct dentry *dentry, un | |||
2645 | */ | 2645 | */ |
2646 | static inline struct cftype *__file_cft(struct file *file) | 2646 | static inline struct cftype *__file_cft(struct file *file) |
2647 | { | 2647 | { |
2648 | if (file->f_dentry->d_inode->i_fop != &cgroup_file_operations) | 2648 | if (file_inode(file)->i_fop != &cgroup_file_operations) |
2649 | return ERR_PTR(-EINVAL); | 2649 | return ERR_PTR(-EINVAL); |
2650 | return __d_cft(file->f_dentry); | 2650 | return __d_cft(file->f_dentry); |
2651 | } | 2651 | } |
@@ -3902,7 +3902,7 @@ static int cgroup_write_event_control(struct cgroup *cgrp, struct cftype *cft, | |||
3902 | 3902 | ||
3903 | /* the process need read permission on control file */ | 3903 | /* the process need read permission on control file */ |
3904 | /* AV: shouldn't we check that it's been opened for read instead? */ | 3904 | /* AV: shouldn't we check that it's been opened for read instead? */ |
3905 | ret = inode_permission(cfile->f_path.dentry->d_inode, MAY_READ); | 3905 | ret = inode_permission(file_inode(cfile), MAY_READ); |
3906 | if (ret < 0) | 3906 | if (ret < 0) |
3907 | goto fail; | 3907 | goto fail; |
3908 | 3908 | ||
@@ -5489,7 +5489,7 @@ struct cgroup_subsys_state *cgroup_css_from_dir(struct file *f, int id) | |||
5489 | struct inode *inode; | 5489 | struct inode *inode; |
5490 | struct cgroup_subsys_state *css; | 5490 | struct cgroup_subsys_state *css; |
5491 | 5491 | ||
5492 | inode = f->f_dentry->d_inode; | 5492 | inode = file_inode(f); |
5493 | /* check in cgroup filesystem dir */ | 5493 | /* check in cgroup filesystem dir */ |
5494 | if (inode->i_op != &cgroup_dir_inode_operations) | 5494 | if (inode->i_op != &cgroup_dir_inode_operations) |
5495 | return ERR_PTR(-EBADF); | 5495 | return ERR_PTR(-EBADF); |
diff --git a/kernel/events/core.c b/kernel/events/core.c index 5c75791d7269..ccc457e36354 100644 --- a/kernel/events/core.c +++ b/kernel/events/core.c | |||
@@ -3691,7 +3691,7 @@ unlock: | |||
3691 | 3691 | ||
3692 | static int perf_fasync(int fd, struct file *filp, int on) | 3692 | static int perf_fasync(int fd, struct file *filp, int on) |
3693 | { | 3693 | { |
3694 | struct inode *inode = filp->f_path.dentry->d_inode; | 3694 | struct inode *inode = file_inode(filp); |
3695 | struct perf_event *event = filp->private_data; | 3695 | struct perf_event *event = filp->private_data; |
3696 | int retval; | 3696 | int retval; |
3697 | 3697 | ||
diff --git a/kernel/fork.c b/kernel/fork.c index 4133876d8cd2..8f62b2a0f120 100644 --- a/kernel/fork.c +++ b/kernel/fork.c | |||
@@ -413,7 +413,7 @@ static int dup_mmap(struct mm_struct *mm, struct mm_struct *oldmm) | |||
413 | tmp->vm_next = tmp->vm_prev = NULL; | 413 | tmp->vm_next = tmp->vm_prev = NULL; |
414 | file = tmp->vm_file; | 414 | file = tmp->vm_file; |
415 | if (file) { | 415 | if (file) { |
416 | struct inode *inode = file->f_path.dentry->d_inode; | 416 | struct inode *inode = file_inode(file); |
417 | struct address_space *mapping = file->f_mapping; | 417 | struct address_space *mapping = file->f_mapping; |
418 | 418 | ||
419 | get_file(file); | 419 | get_file(file); |
diff --git a/kernel/irq/proc.c b/kernel/irq/proc.c index 4bd4faa6323a..397db02209ed 100644 --- a/kernel/irq/proc.c +++ b/kernel/irq/proc.c | |||
@@ -76,7 +76,7 @@ static int irq_affinity_list_proc_show(struct seq_file *m, void *v) | |||
76 | static ssize_t write_irq_affinity(int type, struct file *file, | 76 | static ssize_t write_irq_affinity(int type, struct file *file, |
77 | const char __user *buffer, size_t count, loff_t *pos) | 77 | const char __user *buffer, size_t count, loff_t *pos) |
78 | { | 78 | { |
79 | unsigned int irq = (int)(long)PDE(file->f_path.dentry->d_inode)->data; | 79 | unsigned int irq = (int)(long)PDE(file_inode(file))->data; |
80 | cpumask_var_t new_value; | 80 | cpumask_var_t new_value; |
81 | int err; | 81 | int err; |
82 | 82 | ||
diff --git a/kernel/module.c b/kernel/module.c index 921bed4794e9..0925c9a71975 100644 --- a/kernel/module.c +++ b/kernel/module.c | |||
@@ -2541,7 +2541,7 @@ static int copy_module_from_fd(int fd, struct load_info *info) | |||
2541 | if (err) | 2541 | if (err) |
2542 | goto out; | 2542 | goto out; |
2543 | 2543 | ||
2544 | err = vfs_getattr(file->f_vfsmnt, file->f_dentry, &stat); | 2544 | err = vfs_getattr(&file->f_path, &stat); |
2545 | if (err) | 2545 | if (err) |
2546 | goto out; | 2546 | goto out; |
2547 | 2547 | ||
diff --git a/kernel/nsproxy.c b/kernel/nsproxy.c index b781e66a8f2c..afc0456f227a 100644 --- a/kernel/nsproxy.c +++ b/kernel/nsproxy.c | |||
@@ -250,7 +250,7 @@ SYSCALL_DEFINE2(setns, int, fd, int, nstype) | |||
250 | return PTR_ERR(file); | 250 | return PTR_ERR(file); |
251 | 251 | ||
252 | err = -EINVAL; | 252 | err = -EINVAL; |
253 | ei = PROC_I(file->f_dentry->d_inode); | 253 | ei = PROC_I(file_inode(file)); |
254 | ops = ei->ns_ops; | 254 | ops = ei->ns_ops; |
255 | if (nstype && (ops->type != nstype)) | 255 | if (nstype && (ops->type != nstype)) |
256 | goto out; | 256 | goto out; |
diff --git a/kernel/relay.c b/kernel/relay.c index e8cd2027abbd..01ab081ac53a 100644 --- a/kernel/relay.c +++ b/kernel/relay.c | |||
@@ -1139,7 +1139,7 @@ static ssize_t relay_file_read_subbufs(struct file *filp, loff_t *ppos, | |||
1139 | if (!desc->count) | 1139 | if (!desc->count) |
1140 | return 0; | 1140 | return 0; |
1141 | 1141 | ||
1142 | mutex_lock(&filp->f_path.dentry->d_inode->i_mutex); | 1142 | mutex_lock(&file_inode(filp)->i_mutex); |
1143 | do { | 1143 | do { |
1144 | if (!relay_file_read_avail(buf, *ppos)) | 1144 | if (!relay_file_read_avail(buf, *ppos)) |
1145 | break; | 1145 | break; |
@@ -1159,7 +1159,7 @@ static ssize_t relay_file_read_subbufs(struct file *filp, loff_t *ppos, | |||
1159 | *ppos = relay_file_read_end_pos(buf, read_start, ret); | 1159 | *ppos = relay_file_read_end_pos(buf, read_start, ret); |
1160 | } | 1160 | } |
1161 | } while (desc->count && ret); | 1161 | } while (desc->count && ret); |
1162 | mutex_unlock(&filp->f_path.dentry->d_inode->i_mutex); | 1162 | mutex_unlock(&file_inode(filp)->i_mutex); |
1163 | 1163 | ||
1164 | return desc->written; | 1164 | return desc->written; |
1165 | } | 1165 | } |
diff --git a/kernel/sys.c b/kernel/sys.c index 2e18d33ca775..e10566bee399 100644 --- a/kernel/sys.c +++ b/kernel/sys.c | |||
@@ -1794,14 +1794,14 @@ SYSCALL_DEFINE1(umask, int, mask) | |||
1794 | static int prctl_set_mm_exe_file(struct mm_struct *mm, unsigned int fd) | 1794 | static int prctl_set_mm_exe_file(struct mm_struct *mm, unsigned int fd) |
1795 | { | 1795 | { |
1796 | struct fd exe; | 1796 | struct fd exe; |
1797 | struct dentry *dentry; | 1797 | struct inode *inode; |
1798 | int err; | 1798 | int err; |
1799 | 1799 | ||
1800 | exe = fdget(fd); | 1800 | exe = fdget(fd); |
1801 | if (!exe.file) | 1801 | if (!exe.file) |
1802 | return -EBADF; | 1802 | return -EBADF; |
1803 | 1803 | ||
1804 | dentry = exe.file->f_path.dentry; | 1804 | inode = file_inode(exe.file); |
1805 | 1805 | ||
1806 | /* | 1806 | /* |
1807 | * Because the original mm->exe_file points to executable file, make | 1807 | * Because the original mm->exe_file points to executable file, make |
@@ -1809,11 +1809,11 @@ static int prctl_set_mm_exe_file(struct mm_struct *mm, unsigned int fd) | |||
1809 | * overall picture. | 1809 | * overall picture. |
1810 | */ | 1810 | */ |
1811 | err = -EACCES; | 1811 | err = -EACCES; |
1812 | if (!S_ISREG(dentry->d_inode->i_mode) || | 1812 | if (!S_ISREG(inode->i_mode) || |
1813 | exe.file->f_path.mnt->mnt_flags & MNT_NOEXEC) | 1813 | exe.file->f_path.mnt->mnt_flags & MNT_NOEXEC) |
1814 | goto exit; | 1814 | goto exit; |
1815 | 1815 | ||
1816 | err = inode_permission(dentry->d_inode, MAY_EXEC); | 1816 | err = inode_permission(inode, MAY_EXEC); |
1817 | if (err) | 1817 | if (err) |
1818 | goto exit; | 1818 | goto exit; |
1819 | 1819 | ||
diff --git a/kernel/sysctl_binary.c b/kernel/sysctl_binary.c index b669ca1fa103..b25115e8c7f3 100644 --- a/kernel/sysctl_binary.c +++ b/kernel/sysctl_binary.c | |||
@@ -970,7 +970,6 @@ out: | |||
970 | static ssize_t bin_intvec(struct file *file, | 970 | static ssize_t bin_intvec(struct file *file, |
971 | void __user *oldval, size_t oldlen, void __user *newval, size_t newlen) | 971 | void __user *oldval, size_t oldlen, void __user *newval, size_t newlen) |
972 | { | 972 | { |
973 | mm_segment_t old_fs = get_fs(); | ||
974 | ssize_t copied = 0; | 973 | ssize_t copied = 0; |
975 | char *buffer; | 974 | char *buffer; |
976 | ssize_t result; | 975 | ssize_t result; |
@@ -983,13 +982,10 @@ static ssize_t bin_intvec(struct file *file, | |||
983 | if (oldval && oldlen) { | 982 | if (oldval && oldlen) { |
984 | unsigned __user *vec = oldval; | 983 | unsigned __user *vec = oldval; |
985 | size_t length = oldlen / sizeof(*vec); | 984 | size_t length = oldlen / sizeof(*vec); |
986 | loff_t pos = 0; | ||
987 | char *str, *end; | 985 | char *str, *end; |
988 | int i; | 986 | int i; |
989 | 987 | ||
990 | set_fs(KERNEL_DS); | 988 | result = kernel_read(file, 0, buffer, BUFSZ - 1); |
991 | result = vfs_read(file, buffer, BUFSZ - 1, &pos); | ||
992 | set_fs(old_fs); | ||
993 | if (result < 0) | 989 | if (result < 0) |
994 | goto out_kfree; | 990 | goto out_kfree; |
995 | 991 | ||
@@ -1016,7 +1012,6 @@ static ssize_t bin_intvec(struct file *file, | |||
1016 | if (newval && newlen) { | 1012 | if (newval && newlen) { |
1017 | unsigned __user *vec = newval; | 1013 | unsigned __user *vec = newval; |
1018 | size_t length = newlen / sizeof(*vec); | 1014 | size_t length = newlen / sizeof(*vec); |
1019 | loff_t pos = 0; | ||
1020 | char *str, *end; | 1015 | char *str, *end; |
1021 | int i; | 1016 | int i; |
1022 | 1017 | ||
@@ -1032,9 +1027,7 @@ static ssize_t bin_intvec(struct file *file, | |||
1032 | str += snprintf(str, end - str, "%lu\t", value); | 1027 | str += snprintf(str, end - str, "%lu\t", value); |
1033 | } | 1028 | } |
1034 | 1029 | ||
1035 | set_fs(KERNEL_DS); | 1030 | result = kernel_write(file, buffer, str - buffer, 0); |
1036 | result = vfs_write(file, buffer, str - buffer, &pos); | ||
1037 | set_fs(old_fs); | ||
1038 | if (result < 0) | 1031 | if (result < 0) |
1039 | goto out_kfree; | 1032 | goto out_kfree; |
1040 | } | 1033 | } |
@@ -1048,7 +1041,6 @@ out: | |||
1048 | static ssize_t bin_ulongvec(struct file *file, | 1041 | static ssize_t bin_ulongvec(struct file *file, |
1049 | void __user *oldval, size_t oldlen, void __user *newval, size_t newlen) | 1042 | void __user *oldval, size_t oldlen, void __user *newval, size_t newlen) |
1050 | { | 1043 | { |
1051 | mm_segment_t old_fs = get_fs(); | ||
1052 | ssize_t copied = 0; | 1044 | ssize_t copied = 0; |
1053 | char *buffer; | 1045 | char *buffer; |
1054 | ssize_t result; | 1046 | ssize_t result; |
@@ -1061,13 +1053,10 @@ static ssize_t bin_ulongvec(struct file *file, | |||
1061 | if (oldval && oldlen) { | 1053 | if (oldval && oldlen) { |
1062 | unsigned long __user *vec = oldval; | 1054 | unsigned long __user *vec = oldval; |
1063 | size_t length = oldlen / sizeof(*vec); | 1055 | size_t length = oldlen / sizeof(*vec); |
1064 | loff_t pos = 0; | ||
1065 | char *str, *end; | 1056 | char *str, *end; |
1066 | int i; | 1057 | int i; |
1067 | 1058 | ||
1068 | set_fs(KERNEL_DS); | 1059 | result = kernel_read(file, 0, buffer, BUFSZ - 1); |
1069 | result = vfs_read(file, buffer, BUFSZ - 1, &pos); | ||
1070 | set_fs(old_fs); | ||
1071 | if (result < 0) | 1060 | if (result < 0) |
1072 | goto out_kfree; | 1061 | goto out_kfree; |
1073 | 1062 | ||
@@ -1094,7 +1083,6 @@ static ssize_t bin_ulongvec(struct file *file, | |||
1094 | if (newval && newlen) { | 1083 | if (newval && newlen) { |
1095 | unsigned long __user *vec = newval; | 1084 | unsigned long __user *vec = newval; |
1096 | size_t length = newlen / sizeof(*vec); | 1085 | size_t length = newlen / sizeof(*vec); |
1097 | loff_t pos = 0; | ||
1098 | char *str, *end; | 1086 | char *str, *end; |
1099 | int i; | 1087 | int i; |
1100 | 1088 | ||
@@ -1110,9 +1098,7 @@ static ssize_t bin_ulongvec(struct file *file, | |||
1110 | str += snprintf(str, end - str, "%lu\t", value); | 1098 | str += snprintf(str, end - str, "%lu\t", value); |
1111 | } | 1099 | } |
1112 | 1100 | ||
1113 | set_fs(KERNEL_DS); | 1101 | result = kernel_write(file, buffer, str - buffer, 0); |
1114 | result = vfs_write(file, buffer, str - buffer, &pos); | ||
1115 | set_fs(old_fs); | ||
1116 | if (result < 0) | 1102 | if (result < 0) |
1117 | goto out_kfree; | 1103 | goto out_kfree; |
1118 | } | 1104 | } |
@@ -1126,19 +1112,15 @@ out: | |||
1126 | static ssize_t bin_uuid(struct file *file, | 1112 | static ssize_t bin_uuid(struct file *file, |
1127 | void __user *oldval, size_t oldlen, void __user *newval, size_t newlen) | 1113 | void __user *oldval, size_t oldlen, void __user *newval, size_t newlen) |
1128 | { | 1114 | { |
1129 | mm_segment_t old_fs = get_fs(); | ||
1130 | ssize_t result, copied = 0; | 1115 | ssize_t result, copied = 0; |
1131 | 1116 | ||
1132 | /* Only supports reads */ | 1117 | /* Only supports reads */ |
1133 | if (oldval && oldlen) { | 1118 | if (oldval && oldlen) { |
1134 | loff_t pos = 0; | ||
1135 | char buf[40], *str = buf; | 1119 | char buf[40], *str = buf; |
1136 | unsigned char uuid[16]; | 1120 | unsigned char uuid[16]; |
1137 | int i; | 1121 | int i; |
1138 | 1122 | ||
1139 | set_fs(KERNEL_DS); | 1123 | result = kernel_read(file, 0, buf, sizeof(buf) - 1); |
1140 | result = vfs_read(file, buf, sizeof(buf) - 1, &pos); | ||
1141 | set_fs(old_fs); | ||
1142 | if (result < 0) | 1124 | if (result < 0) |
1143 | goto out; | 1125 | goto out; |
1144 | 1126 | ||
@@ -1174,18 +1156,14 @@ out: | |||
1174 | static ssize_t bin_dn_node_address(struct file *file, | 1156 | static ssize_t bin_dn_node_address(struct file *file, |
1175 | void __user *oldval, size_t oldlen, void __user *newval, size_t newlen) | 1157 | void __user *oldval, size_t oldlen, void __user *newval, size_t newlen) |
1176 | { | 1158 | { |
1177 | mm_segment_t old_fs = get_fs(); | ||
1178 | ssize_t result, copied = 0; | 1159 | ssize_t result, copied = 0; |
1179 | 1160 | ||
1180 | if (oldval && oldlen) { | 1161 | if (oldval && oldlen) { |
1181 | loff_t pos = 0; | ||
1182 | char buf[15], *nodep; | 1162 | char buf[15], *nodep; |
1183 | unsigned long area, node; | 1163 | unsigned long area, node; |
1184 | __le16 dnaddr; | 1164 | __le16 dnaddr; |
1185 | 1165 | ||
1186 | set_fs(KERNEL_DS); | 1166 | result = kernel_read(file, 0, buf, sizeof(buf) - 1); |
1187 | result = vfs_read(file, buf, sizeof(buf) - 1, &pos); | ||
1188 | set_fs(old_fs); | ||
1189 | if (result < 0) | 1167 | if (result < 0) |
1190 | goto out; | 1168 | goto out; |
1191 | 1169 | ||
@@ -1214,7 +1192,6 @@ static ssize_t bin_dn_node_address(struct file *file, | |||
1214 | } | 1192 | } |
1215 | 1193 | ||
1216 | if (newval && newlen) { | 1194 | if (newval && newlen) { |
1217 | loff_t pos = 0; | ||
1218 | __le16 dnaddr; | 1195 | __le16 dnaddr; |
1219 | char buf[15]; | 1196 | char buf[15]; |
1220 | int len; | 1197 | int len; |
@@ -1231,9 +1208,7 @@ static ssize_t bin_dn_node_address(struct file *file, | |||
1231 | le16_to_cpu(dnaddr) >> 10, | 1208 | le16_to_cpu(dnaddr) >> 10, |
1232 | le16_to_cpu(dnaddr) & 0x3ff); | 1209 | le16_to_cpu(dnaddr) & 0x3ff); |
1233 | 1210 | ||
1234 | set_fs(KERNEL_DS); | 1211 | result = kernel_write(file, buf, len, 0); |
1235 | result = vfs_write(file, buf, len, &pos); | ||
1236 | set_fs(old_fs); | ||
1237 | if (result < 0) | 1212 | if (result < 0) |
1238 | goto out; | 1213 | goto out; |
1239 | } | 1214 | } |