aboutsummaryrefslogtreecommitdiffstats
path: root/kernel
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2013-02-26 23:16:07 -0500
committerLinus Torvalds <torvalds@linux-foundation.org>2013-02-26 23:16:07 -0500
commitd895cb1af15c04c522a25c79cc429076987c089b (patch)
tree895dc9157e28f603d937a58be664e4e440d5530c /kernel
parent9626357371b519f2b955fef399647181034a77fe (diff)
parentd3d009cb965eae7e002ea5badf603ea8f4c34915 (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.c2
-rw-r--r--kernel/cgroup.c6
-rw-r--r--kernel/events/core.c2
-rw-r--r--kernel/fork.c2
-rw-r--r--kernel/irq/proc.c2
-rw-r--r--kernel/module.c2
-rw-r--r--kernel/nsproxy.c2
-rw-r--r--kernel/relay.c4
-rw-r--r--kernel/sys.c8
-rw-r--r--kernel/sysctl_binary.c39
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 */
2646static inline struct cftype *__file_cft(struct file *file) 2646static 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
3692static int perf_fasync(int fd, struct file *filp, int on) 3692static 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)
76static ssize_t write_irq_affinity(int type, struct file *file, 76static 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)
1794static int prctl_set_mm_exe_file(struct mm_struct *mm, unsigned int fd) 1794static 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:
970static ssize_t bin_intvec(struct file *file, 970static 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:
1048static ssize_t bin_ulongvec(struct file *file, 1041static 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:
1126static ssize_t bin_uuid(struct file *file, 1112static 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:
1174static ssize_t bin_dn_node_address(struct file *file, 1156static 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 }