[Bluetooth] Add hci_recv_fragment() helper function
[pandora-kernel.git] / fs / binfmt_flat.c
index b1c902e..861141b 100644 (file)
@@ -16,7 +16,6 @@
  */
 
 #include <linux/module.h>
-#include <linux/config.h>
 #include <linux/kernel.h>
 #include <linux/sched.h>
 #include <linux/mm.h>
@@ -420,7 +419,7 @@ static int load_flat_file(struct linux_binprm * bprm,
        unsigned long textpos = 0, datapos = 0, result;
        unsigned long realdatastart = 0;
        unsigned long text_len, data_len, bss_len, stack_len, flags;
-       unsigned long memp = 0; /* for finding the brk area */
+       unsigned long len, reallen, memp = 0;
        unsigned long extra, rlim;
        unsigned long *reloc = 0, *rp;
        struct inode *inode;
@@ -430,7 +429,7 @@ static int load_flat_file(struct linux_binprm * bprm,
        int ret;
 
        hdr = ((struct flat_hdr *) bprm->buf);          /* exec-header */
-       inode = bprm->file->f_dentry->d_inode;
+       inode = bprm->file->f_path.dentry->d_inode;
 
        text_len  = ntohl(hdr->data_start);
        data_len  = ntohl(hdr->data_end) - ntohl(hdr->data_start);
@@ -510,7 +509,7 @@ static int load_flat_file(struct linux_binprm * bprm,
                }
 
                /* OK, This is the point of no return */
-               set_personality(PER_LINUX);
+               set_personality(PER_LINUX_32BIT);
        }
 
        /*
@@ -541,17 +540,25 @@ static int load_flat_file(struct linux_binprm * bprm,
                        goto err;
                }
 
+               len = data_len + extra + MAX_SHARED_LIBS * sizeof(unsigned long);
                down_write(&current->mm->mmap_sem);
-               realdatastart = do_mmap(0, 0, data_len + extra +
-                               MAX_SHARED_LIBS * sizeof(unsigned long),
-                               PROT_READ|PROT_WRITE|PROT_EXEC, MAP_PRIVATE, 0);
+               realdatastart = do_mmap(0, 0, len,
+                       PROT_READ|PROT_WRITE|PROT_EXEC, MAP_PRIVATE, 0);
+               /* Remap to use all availabe slack region space */
+               if (realdatastart && (realdatastart < (unsigned long)-4096)) {
+                       reallen = ksize(realdatastart);
+                       if (reallen > len) {
+                               realdatastart = do_mremap(realdatastart, len,
+                                       reallen, MREMAP_FIXED, realdatastart);
+                       }
+               }
                up_write(&current->mm->mmap_sem);
 
                if (realdatastart == 0 || realdatastart >= (unsigned long)-4096) {
                        if (!realdatastart)
                                realdatastart = (unsigned long) -ENOMEM;
                        printk("Unable to allocate RAM for process data, errno %d\n",
-                                       (int)-datapos);
+                                       (int)-realdatastart);
                        do_munmap(current->mm, textpos, text_len);
                        ret = realdatastart;
                        goto err;
@@ -585,11 +592,20 @@ static int load_flat_file(struct linux_binprm * bprm,
 
        } else {
 
+               len = text_len + data_len + extra + MAX_SHARED_LIBS * sizeof(unsigned long);
                down_write(&current->mm->mmap_sem);
-               textpos = do_mmap(0, 0, text_len + data_len + extra +
-                                       MAX_SHARED_LIBS * sizeof(unsigned long),
-                               PROT_READ | PROT_EXEC | PROT_WRITE, MAP_PRIVATE, 0);
+               textpos = do_mmap(0, 0, len,
+                       PROT_READ | PROT_EXEC | PROT_WRITE, MAP_PRIVATE, 0);
+               /* Remap to use all availabe slack region space */
+               if (textpos && (textpos < (unsigned long) -4096)) {
+                       reallen = ksize(textpos);
+                       if (reallen > len) {
+                               textpos = do_mremap(textpos, len, reallen,
+                                       MREMAP_FIXED, textpos);
+                       }
+               }
                up_write(&current->mm->mmap_sem);
+
                if (!textpos  || textpos >= (unsigned long) -4096) {
                        if (!textpos)
                                textpos = (unsigned long) -ENOMEM;