Linux: Don't hide memory management
authorSimon Wilkinson <sxw@inf.ed.ac.uk>
Fri, 23 Apr 2010 16:07:40 +0000 (17:07 +0100)
committerDerrick Brashear <shadow@dementia.org>
Mon, 26 Apr 2010 20:21:08 +0000 (13:21 -0700)
Given that we now only switch from user space into kernel space in
one place, don't hide the mechanism we use to do so behind macros.
This makes it much easier to visually confirm the correctness of the
code.

Change-Id: Ie52e071c81a9178c792be1eaa7e36d8453ebb319
Reviewed-on: http://gerrit.openafs.org/1820
Reviewed-by: Simon Wilkinson <sxw@inf.ed.ac.uk>
Reviewed-by: Dan Hyde <drh@umich.edu>
Reviewed-by: Derrick Brashear <shadow@dementia.org>
Tested-by: Derrick Brashear <shadow@dementia.org>

src/afs/LINUX/osi_file.c
src/afs/LINUX/osi_machdep.h

index ba6c873..33c9667 100644 (file)
@@ -371,7 +371,7 @@ int
 osi_rdwr(struct osi_file *osifile, uio_t * uiop, int rw)
 {
     struct file *filp = osifile->filp;
-    KERNEL_SPACE_DECL;
+    mm_segment_t old_fs = {0};
     int code = 0;
     struct iovec *iov;
     size_t count;
@@ -381,8 +381,11 @@ osi_rdwr(struct osi_file *osifile, uio_t * uiop, int rw)
     savelim = current->TASK_STRUCT_RLIM[RLIMIT_FSIZE].rlim_cur;
     current->TASK_STRUCT_RLIM[RLIMIT_FSIZE].rlim_cur = RLIM_INFINITY;
 
-    if (uiop->uio_seg == AFS_UIOSYS)
-       TO_USER_SPACE();
+    if (uiop->uio_seg == AFS_UIOSYS) {
+       /* Switch into user space */
+       old_fs = get_fs();
+       set_fs(get_ds());
+    }
 
     /* seek to the desired position. Return -1 on error. */
     if (vfs_llseek(filp, (loff_t) uiop->uio_offset, 0) != uiop->uio_offset) {
@@ -427,8 +430,10 @@ osi_rdwr(struct osi_file *osifile, uio_t * uiop, int rw)
     }
 
 out:
-    if (uiop->uio_seg == AFS_UIOSYS)
-       TO_KERNEL_SPACE();
+    if (uiop->uio_seg == AFS_UIOSYS) {
+       /* Switch back into kernel space */
+       set_fs(old_fs);
+    }
 
     current->TASK_STRUCT_RLIM[RLIMIT_FSIZE].rlim_cur = savelim;
 
index 4222caf..528e862 100644 (file)
@@ -119,20 +119,8 @@ static inline time_t osi_Time(void) {
 #define IsAfsVnode(V) ((V)->i_sb == afs_globalVFS)     /* test superblock instead */
 #define SetAfsVnode(V)                                 /* unnecessary */
 
-/* We often need to pretend we're in user space to get memory transfers
- * right for the kernel calls we use.
- */
 #include <asm/uaccess.h>
 
-#ifdef KERNEL_SPACE_DECL
-#undef KERNEL_SPACE_DECL
-#undef TO_USER_SPACE
-#undef TO_KERNEL_SPACE
-#endif
-#define KERNEL_SPACE_DECL mm_segment_t _fs_space_decl={0}
-#define TO_USER_SPACE() { _fs_space_decl = get_fs(); set_fs(get_ds()); }
-#define TO_KERNEL_SPACE() set_fs(_fs_space_decl)
-
 #define copyin(F, T, C)  (copy_from_user ((char*)(T), (char*)(F), (C)) > 0 ? EFAULT : 0)
 static inline long copyinstr(char *from, char *to, int count, int *length) {
     long tmp;