Whamcloud - gitweb
LU-3221 lov: remove set_fs() call from lov_getstripe()
authorJohn L. Hammond <john.hammond@intel.com>
Wed, 24 Apr 2013 21:13:08 +0000 (16:13 -0500)
committerOleg Drokin <oleg.drokin@intel.com>
Tue, 11 Jun 2013 15:59:46 +0000 (11:59 -0400)
lov_getstripe() calls set_fs(KERNEL_DS) so that it can handle a struct
lov_user_md pointer from user- or kernel-space.  This changes the
behavior of copy_from_user() on SPARC and may result in a misaligned
access exception which in turn oopses the kernel.  In fact the
relevant argument to lov_getstripe() is never called with a
kernel-space pointer and so changing the address limits is unnecessary
and so we remove the calls to save, set, and restore the address
limits.

Signed-off-by: John L. Hammond <john.hammond@intel.com>
Change-Id: Id23f429875c92f9d6ed5cd06cadd741d98c46074
Reviewed-on: http://review.whamcloud.com/6150
Tested-by: Hudson
Reviewed-by: Andreas Dilger <andreas.dilger@intel.com>
Tested-by: Maloo <whamcloud.maloo@gmail.com>
Reviewed-by: Li Wei <wei.g.li@intel.com>
lustre/lov/lov_pack.c

index 282b184..829c6ac 100644 (file)
@@ -602,19 +602,11 @@ int lov_getstripe(struct obd_export *exp, struct lov_stripe_md *lsm,
         struct lov_mds_md *lmmk = NULL;
         int rc, lmm_size;
         int lum_size;
-        mm_segment_t seg;
         ENTRY;
 
         if (!lsm)
                 RETURN(-ENODATA);
 
-        /*
-         * "Switch to kernel segment" to allow copying from kernel space by
-         * copy_{to,from}_user().
-         */
-        seg = get_fs();
-        set_fs(KERNEL_DS);
-
         /* we only need the header part from user space to get lmm_magic and
          * lmm_stripe_count, (the header part is common to v1 and v3) */
         lum_size = sizeof(struct lov_user_md_v1);
@@ -683,6 +675,5 @@ int lov_getstripe(struct obd_export *exp, struct lov_stripe_md *lsm,
 
        obd_free_diskmd(exp, &lmmk);
 out_set:
-       set_fs(seg);
        RETURN(rc);
 }