]> pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - fs/exec.c
Merge git://git.kernel.org/pub/scm/linux/kernel/git/paulus/powerpc-merge
[linux-2.6-omap-h63xx.git] / fs / exec.c
index 1f8a9fd2c9ed1de1cb8d8413bcfdc197024ab7fe..b5bcf1aae0abe61a6d7524b2614bcda7c78e18da 100644 (file)
--- a/fs/exec.c
+++ b/fs/exec.c
@@ -306,9 +306,6 @@ void install_arg_page(struct vm_area_struct *vma,
                        struct page *page, unsigned long address)
 {
        struct mm_struct *mm = vma->vm_mm;
-       pgd_t * pgd;
-       pud_t * pud;
-       pmd_t * pmd;
        pte_t * pte;
        spinlock_t *ptl;
 
@@ -316,14 +313,7 @@ void install_arg_page(struct vm_area_struct *vma,
                goto out;
 
        flush_dcache_page(page);
-       pgd = pgd_offset(mm, address);
-       pud = pud_alloc(mm, pgd, address);
-       if (!pud)
-               goto out;
-       pmd = pmd_alloc(mm, pud, address);
-       if (!pmd)
-               goto out;
-       pte = pte_alloc_map_lock(mm, pmd, address, &ptl);
+       pte = get_locked_pte(mm, address, &ptl);
        if (!pte)
                goto out;
        if (!pte_none(*pte)) {
@@ -334,7 +324,7 @@ void install_arg_page(struct vm_area_struct *vma,
        lru_cache_add_active(page);
        set_pte_at(mm, address, pte, pte_mkdirty(pte_mkwrite(mk_pte(
                                        page, vma->vm_page_prot))));
-       page_add_anon_rmap(page, vma, address);
+       page_add_new_anon_rmap(page, vma, address);
        pte_unmap_unlock(pte, ptl);
 
        /* no need for flush_tlb */
@@ -642,10 +632,10 @@ static inline int de_thread(struct task_struct *tsk)
                 * synchronize with any firing (by calling del_timer_sync)
                 * before we can safely let the old group leader die.
                 */
-               sig->real_timer.data = (unsigned long)current;
+               sig->real_timer.data = current;
                spin_unlock_irq(lock);
-               if (del_timer_sync(&sig->real_timer))
-                       add_timer(&sig->real_timer);
+               if (hrtimer_cancel(&sig->real_timer))
+                       hrtimer_restart(&sig->real_timer);
                spin_lock_irq(lock);
        }
        while (atomic_read(&sig->count) > count) {
@@ -770,7 +760,7 @@ no_thread_group:
                spin_lock(&oldsighand->siglock);
                spin_lock(&newsighand->siglock);
 
-               current->sighand = newsighand;
+               rcu_assign_pointer(current->sighand, newsighand);
                recalc_sigpending();
 
                spin_unlock(&newsighand->siglock);
@@ -778,7 +768,7 @@ no_thread_group:
                write_unlock_irq(&tasklist_lock);
 
                if (atomic_dec_and_test(&oldsighand->count))
-                       kmem_cache_free(sighand_cachep, oldsighand);
+                       sighand_free(oldsighand);
        }
 
        BUG_ON(!thread_group_leader(current));
@@ -1472,6 +1462,7 @@ int do_coredump(long signr, int exit_code, struct pt_regs * regs)
        if (!(current->signal->flags & SIGNAL_GROUP_EXIT)) {
                current->signal->flags = SIGNAL_GROUP_EXIT;
                current->signal->group_exit_code = exit_code;
+               current->signal->group_stop_count = 0;
                retval = 0;
        }
        spin_unlock_irq(&current->sighand->siglock);
@@ -1487,7 +1478,6 @@ int do_coredump(long signr, int exit_code, struct pt_regs * regs)
         * Clear any false indication of pending signals that might
         * be seen by the filesystem code called to write the core file.
         */
-       current->signal->group_stop_count = 0;
        clear_thread_flag(TIF_SIGPENDING);
 
        if (current->signal->rlim[RLIMIT_CORE].rlim_cur < binfmt->min_coredump)
@@ -1515,7 +1505,7 @@ int do_coredump(long signr, int exit_code, struct pt_regs * regs)
                goto close_fail;
        if (!file->f_op->write)
                goto close_fail;
-       if (do_truncate(file->f_dentry, 0, file) != 0)
+       if (do_truncate(file->f_dentry, 0, 0, file) != 0)
                goto close_fail;
 
        retval = binfmt->core_dump(signr, regs, file);