]> git.karo-electronics.de Git - mv-sheeva.git/blobdiff - mm/swapfile.c
sys_swapon: use vzalloc() instead of vmalloc/memset
[mv-sheeva.git] / mm / swapfile.c
index 0341c5700e346fa62401e9815720ed85af3a20c9..99eb5048b7a8adfbbf84882d23c931712de4a594 100644 (file)
@@ -2047,13 +2047,12 @@ SYSCALL_DEFINE2(swapon, const char __user *, specialfile, int, swap_flags)
                goto bad_swap;
 
        /* OK, set up the swap map and apply the bad block list */
-       swap_map = vmalloc(maxpages);
+       swap_map = vzalloc(maxpages);
        if (!swap_map) {
                error = -ENOMEM;
                goto bad_swap;
        }
 
-       memset(swap_map, 0, maxpages);
        nr_good_pages = maxpages - 1;   /* omit header page */
 
        for (i = 0; i < swap_header->info.nr_badpages; i++) {
@@ -2149,8 +2148,13 @@ bad_swap_2:
        p->flags = 0;
        spin_unlock(&swap_lock);
        vfree(swap_map);
-       if (swap_file)
+       if (swap_file) {
+               if (did_down) {
+                       mutex_unlock(&inode->i_mutex);
+                       did_down = 0;
+               }
                filp_close(swap_file, NULL);
+       }
 out:
        if (page && !IS_ERR(page)) {
                kunmap(page);