aboutsummaryrefslogtreecommitdiffstats
path: root/arch/sparc
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2016-01-12 20:11:47 -0500
committerLinus Torvalds <torvalds@linux-foundation.org>2016-01-12 20:11:47 -0500
commit33caf82acf4dc420bf0f0136b886f7b27ecf90c5 (patch)
treeb24b0b5c8f257ae7db3b8df939821a0856869895 /arch/sparc
parentca9706a282943899981e83604f2ed13e88ce4239 (diff)
parentbbddca8e8fac07ece3938e03526b5d00fa791a4c (diff)
Merge branch 'work.misc' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs
Pull misc vfs updates from Al Viro: "All kinds of stuff. That probably should've been 5 or 6 separate branches, but by the time I'd realized how large and mixed that bag had become it had been too close to -final to play with rebasing. Some fs/namei.c cleanups there, memdup_user_nul() introduction and switching open-coded instances, burying long-dead code, whack-a-mole of various kinds, several new helpers for ->llseek(), assorted cleanups and fixes from various people, etc. One piece probably deserves special mention - Neil's lookup_one_len_unlocked(). Similar to lookup_one_len(), but gets called without ->i_mutex and tries to avoid ever taking it. That, of course, means that it's not useful for any directory modifications, but things like getting inode attributes in nfds readdirplus are fine with that. I really should've asked for moratorium on lookup-related changes this cycle, but since I hadn't done that early enough... I *am* asking for that for the coming cycle, though - I'm going to try and get conversion of i_mutex to rwsem with ->lookup() done under lock taken shared. There will be a patch closer to the end of the window, along the lines of the one Linus had posted last May - mechanical conversion of ->i_mutex accesses to inode_lock()/inode_unlock()/inode_trylock()/ inode_is_locked()/inode_lock_nested(). To quote Linus back then: ----- | This is an automated patch using | | sed 's/mutex_lock(&\(.*\)->i_mutex)/inode_lock(\1)/' | sed 's/mutex_unlock(&\(.*\)->i_mutex)/inode_unlock(\1)/' | sed 's/mutex_lock_nested(&\(.*\)->i_mutex,[ ]*I_MUTEX_\([A-Z0-9_]*\))/inode_lock_nested(\1, I_MUTEX_\2)/' | sed 's/mutex_is_locked(&\(.*\)->i_mutex)/inode_is_locked(\1)/' | sed 's/mutex_trylock(&\(.*\)->i_mutex)/inode_trylock(\1)/' | | with a very few manual fixups ----- I'm going to send that once the ->i_mutex-affecting stuff in -next gets mostly merged (or when Linus says he's about to stop taking merges)" * 'work.misc' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs: (63 commits) nfsd: don't hold i_mutex over userspace upcalls fs:affs:Replace time_t with time64_t fs/9p: use fscache mutex rather than spinlock proc: add a reschedule point in proc_readfd_common() logfs: constify logfs_block_ops structures fcntl: allow to set O_DIRECT flag on pipe fs: __generic_file_splice_read retry lookup on AOP_TRUNCATED_PAGE fs: xattr: Use kvfree() [s390] page_to_phys() always returns a multiple of PAGE_SIZE nbd: use ->compat_ioctl() fs: use block_device name vsprintf helper lib/vsprintf: add %*pg format specifier fs: use gendisk->disk_name where possible poll: plug an unused argument to do_poll amdkfd: don't open-code memdup_user() cdrom: don't open-code memdup_user() rsxx: don't open-code memdup_user() mtip32xx: don't open-code memdup_user() [um] mconsole: don't open-code memdup_user_nul() [um] hostaudio: don't open-code memdup_user() ...
Diffstat (limited to 'arch/sparc')
-rw-r--r--arch/sparc/include/asm/uaccess_32.h65
-rw-r--r--arch/sparc/include/asm/uaccess_64.h40
-rw-r--r--arch/sparc/kernel/mdesc.c20
3 files changed, 2 insertions, 123 deletions
diff --git a/arch/sparc/include/asm/uaccess_32.h b/arch/sparc/include/asm/uaccess_32.h
index 64ee103dc29d..57aca2792d29 100644
--- a/arch/sparc/include/asm/uaccess_32.h
+++ b/arch/sparc/include/asm/uaccess_32.h
@@ -205,31 +205,6 @@ int __put_user_bad(void);
205 __gu_ret; \ 205 __gu_ret; \
206}) 206})
207 207
208#define __get_user_check_ret(x, addr, size, type, retval) ({ \
209 register unsigned long __gu_val __asm__ ("l1"); \
210 if (__access_ok(addr, size)) { \
211 switch (size) { \
212 case 1: \
213 __get_user_asm_ret(__gu_val, ub, addr, retval); \
214 break; \
215 case 2: \
216 __get_user_asm_ret(__gu_val, uh, addr, retval); \
217 break; \
218 case 4: \
219 __get_user_asm_ret(__gu_val, , addr, retval); \
220 break; \
221 case 8: \
222 __get_user_asm_ret(__gu_val, d, addr, retval); \
223 break; \
224 default: \
225 if (__get_user_bad()) \
226 return retval; \
227 } \
228 x = (__force type) __gu_val; \
229 } else \
230 return retval; \
231})
232
233#define __get_user_nocheck(x, addr, size, type) ({ \ 208#define __get_user_nocheck(x, addr, size, type) ({ \
234 register int __gu_ret; \ 209 register int __gu_ret; \
235 register unsigned long __gu_val; \ 210 register unsigned long __gu_val; \
@@ -247,20 +222,6 @@ int __put_user_bad(void);
247 __gu_ret; \ 222 __gu_ret; \
248}) 223})
249 224
250#define __get_user_nocheck_ret(x, addr, size, type, retval) ({ \
251 register unsigned long __gu_val __asm__ ("l1"); \
252 switch (size) { \
253 case 1: __get_user_asm_ret(__gu_val, ub, addr, retval); break; \
254 case 2: __get_user_asm_ret(__gu_val, uh, addr, retval); break; \
255 case 4: __get_user_asm_ret(__gu_val, , addr, retval); break; \
256 case 8: __get_user_asm_ret(__gu_val, d, addr, retval); break; \
257 default: \
258 if (__get_user_bad()) \
259 return retval; \
260 } \
261 x = (__force type) __gu_val; \
262})
263
264#define __get_user_asm(x, size, addr, ret) \ 225#define __get_user_asm(x, size, addr, ret) \
265__asm__ __volatile__( \ 226__asm__ __volatile__( \
266 "/* Get user asm, inline. */\n" \ 227 "/* Get user asm, inline. */\n" \
@@ -281,32 +242,6 @@ __asm__ __volatile__( \
281 : "=&r" (ret), "=&r" (x) : "m" (*__m(addr)), \ 242 : "=&r" (ret), "=&r" (x) : "m" (*__m(addr)), \
282 "i" (-EFAULT)) 243 "i" (-EFAULT))
283 244
284#define __get_user_asm_ret(x, size, addr, retval) \
285if (__builtin_constant_p(retval) && retval == -EFAULT) \
286 __asm__ __volatile__( \
287 "/* Get user asm ret, inline. */\n" \
288 "1:\t" "ld"#size " %1, %0\n\n\t" \
289 ".section __ex_table,#alloc\n\t" \
290 ".align 4\n\t" \
291 ".word 1b,__ret_efault\n\n\t" \
292 ".previous\n\t" \
293 : "=&r" (x) : "m" (*__m(addr))); \
294else \
295 __asm__ __volatile__( \
296 "/* Get user asm ret, inline. */\n" \
297 "1:\t" "ld"#size " %1, %0\n\n\t" \
298 ".section .fixup,#alloc,#execinstr\n\t" \
299 ".align 4\n" \
300 "3:\n\t" \
301 "ret\n\t" \
302 " restore %%g0, %2, %%o0\n\n\t" \
303 ".previous\n\t" \
304 ".section __ex_table,#alloc\n\t" \
305 ".align 4\n\t" \
306 ".word 1b, 3b\n\n\t" \
307 ".previous\n\t" \
308 : "=&r" (x) : "m" (*__m(addr)), "i" (retval))
309
310int __get_user_bad(void); 245int __get_user_bad(void);
311 246
312unsigned long __copy_user(void __user *to, const void __user *from, unsigned long size); 247unsigned long __copy_user(void __user *to, const void __user *from, unsigned long size);
diff --git a/arch/sparc/include/asm/uaccess_64.h b/arch/sparc/include/asm/uaccess_64.h
index ea6e9a20f3ff..e9a51d64974d 100644
--- a/arch/sparc/include/asm/uaccess_64.h
+++ b/arch/sparc/include/asm/uaccess_64.h
@@ -179,20 +179,6 @@ int __put_user_bad(void);
179 __gu_ret; \ 179 __gu_ret; \
180}) 180})
181 181
182#define __get_user_nocheck_ret(data, addr, size, type, retval) ({ \
183 register unsigned long __gu_val __asm__ ("l1"); \
184 switch (size) { \
185 case 1: __get_user_asm_ret(__gu_val, ub, addr, retval); break; \
186 case 2: __get_user_asm_ret(__gu_val, uh, addr, retval); break; \
187 case 4: __get_user_asm_ret(__gu_val, uw, addr, retval); break; \
188 case 8: __get_user_asm_ret(__gu_val, x, addr, retval); break; \
189 default: \
190 if (__get_user_bad()) \
191 return retval; \
192 } \
193 data = (__force type) __gu_val; \
194})
195
196#define __get_user_asm(x, size, addr, ret) \ 182#define __get_user_asm(x, size, addr, ret) \
197__asm__ __volatile__( \ 183__asm__ __volatile__( \
198 "/* Get user asm, inline. */\n" \ 184 "/* Get user asm, inline. */\n" \
@@ -214,32 +200,6 @@ __asm__ __volatile__( \
214 : "=r" (ret), "=r" (x) : "r" (__m(addr)), \ 200 : "=r" (ret), "=r" (x) : "r" (__m(addr)), \
215 "i" (-EFAULT)) 201 "i" (-EFAULT))
216 202
217#define __get_user_asm_ret(x, size, addr, retval) \
218if (__builtin_constant_p(retval) && retval == -EFAULT) \
219 __asm__ __volatile__( \
220 "/* Get user asm ret, inline. */\n" \
221 "1:\t" "ld"#size "a [%1] %%asi, %0\n\n\t" \
222 ".section __ex_table,\"a\"\n\t" \
223 ".align 4\n\t" \
224 ".word 1b,__ret_efault\n\n\t" \
225 ".previous\n\t" \
226 : "=r" (x) : "r" (__m(addr))); \
227else \
228 __asm__ __volatile__( \
229 "/* Get user asm ret, inline. */\n" \
230 "1:\t" "ld"#size "a [%1] %%asi, %0\n\n\t" \
231 ".section .fixup,#alloc,#execinstr\n\t" \
232 ".align 4\n" \
233 "3:\n\t" \
234 "ret\n\t" \
235 " restore %%g0, %2, %%o0\n\n\t" \
236 ".previous\n\t" \
237 ".section __ex_table,\"a\"\n\t" \
238 ".align 4\n\t" \
239 ".word 1b, 3b\n\n\t" \
240 ".previous\n\t" \
241 : "=r" (x) : "r" (__m(addr)), "i" (retval))
242
243int __get_user_bad(void); 203int __get_user_bad(void);
244 204
245unsigned long __must_check ___copy_from_user(void *to, 205unsigned long __must_check ___copy_from_user(void *to,
diff --git a/arch/sparc/kernel/mdesc.c b/arch/sparc/kernel/mdesc.c
index 6f80936e0eea..11228861d9b4 100644
--- a/arch/sparc/kernel/mdesc.c
+++ b/arch/sparc/kernel/mdesc.c
@@ -1033,25 +1033,9 @@ static ssize_t mdesc_read(struct file *file, char __user *buf,
1033 1033
1034static loff_t mdesc_llseek(struct file *file, loff_t offset, int whence) 1034static loff_t mdesc_llseek(struct file *file, loff_t offset, int whence)
1035{ 1035{
1036 struct mdesc_handle *hp; 1036 struct mdesc_handle *hp = file->private_data;
1037
1038 switch (whence) {
1039 case SEEK_CUR:
1040 offset += file->f_pos;
1041 break;
1042 case SEEK_SET:
1043 break;
1044 default:
1045 return -EINVAL;
1046 }
1047
1048 hp = file->private_data;
1049 if (offset > hp->handle_size)
1050 return -EINVAL;
1051 else
1052 file->f_pos = offset;
1053 1037
1054 return offset; 1038 return no_seek_end_llseek_size(file, offset, whence, hp->handle_size);
1055} 1039}
1056 1040
1057/* mdesc_close() - /dev/mdesc is being closed, release the reference to 1041/* mdesc_close() - /dev/mdesc is being closed, release the reference to