This should hopefully fix the warnings reported.
[linux-2.6/linux-mips.git] / mm / swapfile.c
blobe8a2a0b2fc7271cb80da3f7d2f7dd8a557b2db51
1 /*
2 * linux/mm/swapfile.c
4 * Copyright (C) 1991, 1992, 1993, 1994 Linus Torvalds
5 * Swap reorganised 29.12.95, Stephen Tweedie
6 */
8 #include <linux/malloc.h>
9 #include <linux/smp_lock.h>
10 #include <linux/kernel_stat.h>
11 #include <linux/swap.h>
12 #include <linux/swapctl.h>
13 #include <linux/blkdev.h> /* for blk_size */
14 #include <linux/vmalloc.h>
15 #include <linux/pagemap.h>
16 #include <linux/shm.h>
18 #include <asm/pgtable.h>
20 spinlock_t swaplock = SPIN_LOCK_UNLOCKED;
21 unsigned int nr_swapfiles = 0;
23 struct swap_list_t swap_list = {-1, -1};
25 struct swap_info_struct swap_info[MAX_SWAPFILES];
27 #define SWAPFILE_CLUSTER 256
29 static inline int scan_swap_map(struct swap_info_struct *si, unsigned short count)
31 unsigned long offset;
32 /*
33 * We try to cluster swap pages by allocating them
34 * sequentially in swap. Once we've allocated
35 * SWAPFILE_CLUSTER pages this way, however, we resort to
36 * first-free allocation, starting a new cluster. This
37 * prevents us from scattering swap pages all over the entire
38 * swap partition, so that we reduce overall disk seek times
39 * between swap pages. -- sct */
40 if (si->cluster_nr) {
41 while (si->cluster_next <= si->highest_bit) {
42 offset = si->cluster_next++;
43 if (si->swap_map[offset])
44 continue;
45 si->cluster_nr--;
46 goto got_page;
49 si->cluster_nr = SWAPFILE_CLUSTER;
51 /* try to find an empty (even not aligned) cluster. */
52 offset = si->lowest_bit;
53 check_next_cluster:
54 if (offset+SWAPFILE_CLUSTER-1 <= si->highest_bit)
56 int nr;
57 for (nr = offset; nr < offset+SWAPFILE_CLUSTER; nr++)
58 if (si->swap_map[nr])
60 offset = nr+1;
61 goto check_next_cluster;
63 /* We found a completly empty cluster, so start
64 * using it.
66 goto got_page;
68 /* No luck, so now go finegrined as usual. -Andrea */
69 for (offset = si->lowest_bit; offset <= si->highest_bit ; offset++) {
70 if (si->swap_map[offset])
71 continue;
72 got_page:
73 if (offset == si->lowest_bit)
74 si->lowest_bit++;
75 if (offset == si->highest_bit)
76 si->highest_bit--;
77 si->swap_map[offset] = count;
78 nr_swap_pages--;
79 si->cluster_next = offset+1;
80 return offset;
82 return 0;
85 swp_entry_t __get_swap_page(unsigned short count)
87 struct swap_info_struct * p;
88 unsigned long offset;
89 swp_entry_t entry;
90 int type, wrapped = 0;
92 entry.val = 0; /* Out of memory */
93 if (count >= SWAP_MAP_MAX)
94 goto bad_count;
95 swap_list_lock();
96 type = swap_list.next;
97 if (type < 0)
98 goto out;
99 if (nr_swap_pages == 0)
100 goto out;
102 while (1) {
103 p = &swap_info[type];
104 if ((p->flags & SWP_WRITEOK) == SWP_WRITEOK) {
105 swap_device_lock(p);
106 offset = scan_swap_map(p, count);
107 swap_device_unlock(p);
108 if (offset) {
109 entry = SWP_ENTRY(type,offset);
110 type = swap_info[type].next;
111 if (type < 0 ||
112 p->prio != swap_info[type].prio) {
113 swap_list.next = swap_list.head;
114 } else {
115 swap_list.next = type;
117 goto out;
120 type = p->next;
121 if (!wrapped) {
122 if (type < 0 || p->prio != swap_info[type].prio) {
123 type = swap_list.head;
124 wrapped = 1;
126 } else
127 if (type < 0)
128 goto out; /* out of swap space */
130 out:
131 swap_list_unlock();
132 return entry;
134 bad_count:
135 printk(KERN_ERR "get_swap_page: bad count %hd from %p\n",
136 count, __builtin_return_address(0));
137 goto out;
142 * Caller has made sure that the swapdevice corresponding to entry
143 * is still around or has not been recycled.
145 void __swap_free(swp_entry_t entry, unsigned short count)
147 struct swap_info_struct * p;
148 unsigned long offset, type;
150 if (!entry.val)
151 goto out;
153 type = SWP_TYPE(entry);
154 if (type >= nr_swapfiles)
155 goto bad_nofile;
156 p = & swap_info[type];
157 if (!(p->flags & SWP_USED))
158 goto bad_device;
159 offset = SWP_OFFSET(entry);
160 if (offset >= p->max)
161 goto bad_offset;
162 if (!p->swap_map[offset])
163 goto bad_free;
164 swap_list_lock();
165 if (p->prio > swap_info[swap_list.next].prio)
166 swap_list.next = type;
167 swap_device_lock(p);
168 if (p->swap_map[offset] < SWAP_MAP_MAX) {
169 if (p->swap_map[offset] < count)
170 goto bad_count;
171 if (!(p->swap_map[offset] -= count)) {
172 if (offset < p->lowest_bit)
173 p->lowest_bit = offset;
174 if (offset > p->highest_bit)
175 p->highest_bit = offset;
176 nr_swap_pages++;
179 swap_device_unlock(p);
180 swap_list_unlock();
181 out:
182 return;
184 bad_nofile:
185 printk("swap_free: Trying to free nonexistent swap-page\n");
186 goto out;
187 bad_device:
188 printk("swap_free: Trying to free swap from unused swap-device\n");
189 goto out;
190 bad_offset:
191 printk("swap_free: offset exceeds max\n");
192 goto out;
193 bad_free:
194 printk("VM: Bad swap entry %08lx\n", entry.val);
195 goto out;
196 bad_count:
197 swap_device_unlock(p);
198 swap_list_unlock();
199 printk(KERN_ERR "VM: Bad count %hd current count %hd\n", count, p->swap_map[offset]);
200 goto out;
203 /* needs the big kernel lock */
204 swp_entry_t acquire_swap_entry(struct page *page)
206 struct swap_info_struct * p;
207 unsigned long offset, type;
208 swp_entry_t entry;
210 if (!test_bit(PG_swap_entry, &page->flags))
211 goto new_swap_entry;
213 /* We have the old entry in the page offset still */
214 if (!page->index)
215 goto new_swap_entry;
216 entry.val = page->index;
217 type = SWP_TYPE(entry);
218 if (type >= nr_swapfiles)
219 goto new_swap_entry;
220 p = type + swap_info;
221 if ((p->flags & SWP_WRITEOK) != SWP_WRITEOK)
222 goto new_swap_entry;
223 offset = SWP_OFFSET(entry);
224 if (offset >= p->max)
225 goto new_swap_entry;
226 /* Has it been re-used for something else? */
227 swap_list_lock();
228 swap_device_lock(p);
229 if (p->swap_map[offset])
230 goto unlock_new_swap_entry;
232 /* We're cool, we can just use the old one */
233 p->swap_map[offset] = 1;
234 swap_device_unlock(p);
235 nr_swap_pages--;
236 swap_list_unlock();
237 return entry;
239 unlock_new_swap_entry:
240 swap_device_unlock(p);
241 swap_list_unlock();
242 new_swap_entry:
243 return get_swap_page();
247 * The swap entry has been read in advance, and we return 1 to indicate
248 * that the page has been used or is no longer needed.
250 * Always set the resulting pte to be nowrite (the same as COW pages
251 * after one process has exited). We don't know just how many PTEs will
252 * share this swap entry, so be cautious and let do_wp_page work out
253 * what to do if a write is requested later.
255 static inline void unuse_pte(struct vm_area_struct * vma, unsigned long address,
256 pte_t *dir, swp_entry_t entry, struct page* page)
258 pte_t pte = *dir;
260 if (pte_none(pte))
261 return;
262 if (pte_present(pte)) {
263 /* If this entry is swap-cached, then page must already
264 hold the right address for any copies in physical
265 memory */
266 if (pte_page(pte) != page)
267 return;
268 /* We will be removing the swap cache in a moment, so... */
269 set_pte(dir, pte_mkdirty(pte));
270 return;
272 if (pte_val(pte) != entry.val)
273 return;
274 set_pte(dir, pte_mkdirty(mk_pte(page, vma->vm_page_prot)));
275 swap_free(entry);
276 get_page(page);
277 ++vma->vm_mm->rss;
280 static inline void unuse_pmd(struct vm_area_struct * vma, pmd_t *dir,
281 unsigned long address, unsigned long size, unsigned long offset,
282 swp_entry_t entry, struct page* page)
284 pte_t * pte;
285 unsigned long end;
287 if (pmd_none(*dir))
288 return;
289 if (pmd_bad(*dir)) {
290 pmd_ERROR(*dir);
291 pmd_clear(dir);
292 return;
294 pte = pte_offset(dir, address);
295 offset += address & PMD_MASK;
296 address &= ~PMD_MASK;
297 end = address + size;
298 if (end > PMD_SIZE)
299 end = PMD_SIZE;
300 do {
301 unuse_pte(vma, offset+address-vma->vm_start, pte, entry, page);
302 address += PAGE_SIZE;
303 pte++;
304 } while (address && (address < end));
307 static inline void unuse_pgd(struct vm_area_struct * vma, pgd_t *dir,
308 unsigned long address, unsigned long size,
309 swp_entry_t entry, struct page* page)
311 pmd_t * pmd;
312 unsigned long offset, end;
314 if (pgd_none(*dir))
315 return;
316 if (pgd_bad(*dir)) {
317 pgd_ERROR(*dir);
318 pgd_clear(dir);
319 return;
321 pmd = pmd_offset(dir, address);
322 offset = address & PGDIR_MASK;
323 address &= ~PGDIR_MASK;
324 end = address + size;
325 if (end > PGDIR_SIZE)
326 end = PGDIR_SIZE;
327 if (address >= end)
328 BUG();
329 do {
330 unuse_pmd(vma, pmd, address, end - address, offset, entry,
331 page);
332 address = (address + PMD_SIZE) & PMD_MASK;
333 pmd++;
334 } while (address && (address < end));
337 static void unuse_vma(struct vm_area_struct * vma, pgd_t *pgdir,
338 swp_entry_t entry, struct page* page)
340 unsigned long start = vma->vm_start, end = vma->vm_end;
342 if (start >= end)
343 BUG();
344 do {
345 unuse_pgd(vma, pgdir, start, end - start, entry, page);
346 start = (start + PGDIR_SIZE) & PGDIR_MASK;
347 pgdir++;
348 } while (start && (start < end));
351 static void unuse_process(struct mm_struct * mm,
352 swp_entry_t entry, struct page* page)
354 struct vm_area_struct* vma;
357 * Go through process' page directory.
359 if (!mm)
360 return;
361 for (vma = mm->mmap; vma; vma = vma->vm_next) {
362 pgd_t * pgd = pgd_offset(mm, vma->vm_start);
363 unuse_vma(vma, pgd, entry, page);
365 return;
369 * We completely avoid races by reading each swap page in advance,
370 * and then search for the process using it. All the necessary
371 * page table adjustments can then be made atomically.
373 static int try_to_unuse(unsigned int type)
375 struct swap_info_struct * si = &swap_info[type];
376 struct task_struct *p;
377 struct page *page;
378 swp_entry_t entry;
379 int i;
381 while (1) {
383 * Find a swap page in use and read it in.
385 swap_device_lock(si);
386 for (i = 1; i < si->max ; i++) {
387 if (si->swap_map[i] > 0 && si->swap_map[i] != SWAP_MAP_BAD) {
389 * Prevent swaphandle from being completely
390 * unused by swap_free while we are trying
391 * to read in the page - this prevents warning
392 * messages from rw_swap_page_base.
394 if (si->swap_map[i] != SWAP_MAP_MAX)
395 si->swap_map[i]++;
396 swap_device_unlock(si);
397 goto found_entry;
400 swap_device_unlock(si);
401 break;
403 found_entry:
404 entry = SWP_ENTRY(type, i);
406 /* Get a page for the entry, using the existing swap
407 cache page if there is one. Otherwise, get a clean
408 page and read the swap into it. */
409 page = read_swap_cache(entry);
410 if (!page) {
411 swap_free(entry);
412 return -ENOMEM;
414 read_lock(&tasklist_lock);
415 for_each_task(p)
416 unuse_process(p->mm, entry, page);
417 read_unlock(&tasklist_lock);
418 shm_unuse(entry, page);
419 /* Now get rid of the extra reference to the temporary
420 page we've been using. */
421 if (PageSwapCache(page))
422 delete_from_swap_cache(page);
423 __free_page(page);
425 * Check for and clear any overflowed swap map counts.
427 swap_free(entry);
428 swap_list_lock();
429 swap_device_lock(si);
430 if (si->swap_map[i] > 0) {
431 if (si->swap_map[i] != SWAP_MAP_MAX)
432 printk("VM: Undead swap entry %08lx\n",
433 entry.val);
434 nr_swap_pages++;
435 si->swap_map[i] = 0;
437 swap_device_unlock(si);
438 swap_list_unlock();
440 return 0;
443 asmlinkage long sys_swapoff(const char * specialfile)
445 struct swap_info_struct * p = NULL;
446 struct dentry * dentry;
447 int i, type, prev;
448 int err;
450 if (!capable(CAP_SYS_ADMIN))
451 return -EPERM;
453 lock_kernel();
454 dentry = namei(specialfile);
455 err = PTR_ERR(dentry);
456 if (IS_ERR(dentry))
457 goto out;
459 prev = -1;
460 swap_list_lock();
461 for (type = swap_list.head; type >= 0; type = swap_info[type].next) {
462 p = swap_info + type;
463 if ((p->flags & SWP_WRITEOK) == SWP_WRITEOK) {
464 if (p->swap_file) {
465 if (p->swap_file == dentry)
466 break;
467 } else {
468 if (S_ISBLK(dentry->d_inode->i_mode)
469 && (p->swap_device == dentry->d_inode->i_rdev))
470 break;
473 prev = type;
475 err = -EINVAL;
476 if (type < 0) {
477 swap_list_unlock();
478 goto out_dput;
481 if (prev < 0) {
482 swap_list.head = p->next;
483 } else {
484 swap_info[prev].next = p->next;
486 if (type == swap_list.next) {
487 /* just pick something that's safe... */
488 swap_list.next = swap_list.head;
490 nr_swap_pages -= p->pages;
491 swap_list_unlock();
492 p->flags = SWP_USED;
493 err = try_to_unuse(type);
494 if (err) {
495 /* re-insert swap space back into swap_list */
496 swap_list_lock();
497 for (prev = -1, i = swap_list.head; i >= 0; prev = i, i = swap_info[i].next)
498 if (p->prio >= swap_info[i].prio)
499 break;
500 p->next = i;
501 if (prev < 0)
502 swap_list.head = swap_list.next = p - swap_info;
503 else
504 swap_info[prev].next = p - swap_info;
505 nr_swap_pages += p->pages;
506 swap_list_unlock();
507 p->flags = SWP_WRITEOK;
508 goto out_dput;
510 if (p->swap_device)
511 blkdev_put(dentry->d_inode->i_bdev, BDEV_SWAP);
512 dput(dentry);
514 dentry = p->swap_file;
515 p->swap_file = NULL;
516 p->swap_device = 0;
517 vfree(p->swap_map);
518 p->swap_map = NULL;
519 p->flags = 0;
520 err = 0;
522 out_dput:
523 dput(dentry);
524 out:
525 unlock_kernel();
526 return err;
529 int get_swaparea_info(char *buf)
531 char * page = (char *) __get_free_page(GFP_KERNEL);
532 struct swap_info_struct *ptr = swap_info;
533 int i, j, len = 0, usedswap;
535 if (!page)
536 return -ENOMEM;
538 len += sprintf(buf, "Filename\t\t\tType\t\tSize\tUsed\tPriority\n");
539 for (i = 0 ; i < nr_swapfiles ; i++, ptr++) {
540 if (ptr->flags & SWP_USED) {
541 char * path = d_path(ptr->swap_file, page, PAGE_SIZE);
543 len += sprintf(buf + len, "%-31s ", path);
545 if (!ptr->swap_device)
546 len += sprintf(buf + len, "file\t\t");
547 else
548 len += sprintf(buf + len, "partition\t");
550 usedswap = 0;
551 for (j = 0; j < ptr->max; ++j)
552 switch (ptr->swap_map[j]) {
553 case SWAP_MAP_BAD:
554 case 0:
555 continue;
556 default:
557 usedswap++;
559 len += sprintf(buf + len, "%d\t%d\t%d\n", ptr->pages << (PAGE_SHIFT - 10),
560 usedswap << (PAGE_SHIFT - 10), ptr->prio);
563 free_page((unsigned long) page);
564 return len;
567 int is_swap_partition(kdev_t dev) {
568 struct swap_info_struct *ptr = swap_info;
569 int i;
571 for (i = 0 ; i < nr_swapfiles ; i++, ptr++) {
572 if (ptr->flags & SWP_USED)
573 if (ptr->swap_device == dev)
574 return 1;
576 return 0;
580 * Written 01/25/92 by Simmule Turner, heavily changed by Linus.
582 * The swapon system call
584 asmlinkage long sys_swapon(const char * specialfile, int swap_flags)
586 struct swap_info_struct * p;
587 struct dentry * swap_dentry;
588 unsigned int type;
589 int i, j, prev;
590 int error;
591 static int least_priority = 0;
592 union swap_header *swap_header = 0;
593 int swap_header_version;
594 int nr_good_pages = 0;
595 unsigned long maxpages;
596 int swapfilesize;
597 struct block_device *bdev = NULL;
599 if (!capable(CAP_SYS_ADMIN))
600 return -EPERM;
601 lock_kernel();
602 p = swap_info;
603 for (type = 0 ; type < nr_swapfiles ; type++,p++)
604 if (!(p->flags & SWP_USED))
605 break;
606 error = -EPERM;
607 if (type >= MAX_SWAPFILES)
608 goto out;
609 if (type >= nr_swapfiles)
610 nr_swapfiles = type+1;
611 p->flags = SWP_USED;
612 p->swap_file = NULL;
613 p->swap_device = 0;
614 p->swap_map = NULL;
615 p->lowest_bit = 0;
616 p->highest_bit = 0;
617 p->cluster_nr = 0;
618 p->sdev_lock = SPIN_LOCK_UNLOCKED;
619 p->max = 1;
620 p->next = -1;
621 if (swap_flags & SWAP_FLAG_PREFER) {
622 p->prio =
623 (swap_flags & SWAP_FLAG_PRIO_MASK)>>SWAP_FLAG_PRIO_SHIFT;
624 } else {
625 p->prio = --least_priority;
627 swap_dentry = namei(specialfile);
628 error = PTR_ERR(swap_dentry);
629 if (IS_ERR(swap_dentry))
630 goto bad_swap_2;
632 p->swap_file = swap_dentry;
633 error = -EINVAL;
635 if (S_ISBLK(swap_dentry->d_inode->i_mode)) {
636 kdev_t dev = swap_dentry->d_inode->i_rdev;
637 struct block_device_operations *bdops;
639 p->swap_device = dev;
640 set_blocksize(dev, PAGE_SIZE);
642 bdev = swap_dentry->d_inode->i_bdev;
643 bdops = devfs_get_ops ( devfs_get_handle_from_inode
644 (swap_dentry->d_inode) );
645 if (bdops) bdev->bd_op = bdops;
647 error = blkdev_get(bdev, FMODE_READ|FMODE_WRITE, 0, BDEV_SWAP);
648 if (error)
649 goto bad_swap_2;
650 set_blocksize(dev, PAGE_SIZE);
651 error = -ENODEV;
652 if (!dev || (blk_size[MAJOR(dev)] &&
653 !blk_size[MAJOR(dev)][MINOR(dev)]))
654 goto bad_swap;
655 error = -EBUSY;
656 for (i = 0 ; i < nr_swapfiles ; i++) {
657 if (i == type)
658 continue;
659 if (dev == swap_info[i].swap_device)
660 goto bad_swap;
662 swapfilesize = 0;
663 if (blk_size[MAJOR(dev)])
664 swapfilesize = blk_size[MAJOR(dev)][MINOR(dev)]
665 >> (PAGE_SHIFT - 10);
666 } else if (S_ISREG(swap_dentry->d_inode->i_mode)) {
667 error = -EBUSY;
668 for (i = 0 ; i < nr_swapfiles ; i++) {
669 if (i == type || !swap_info[i].swap_file)
670 continue;
671 if (swap_dentry->d_inode == swap_info[i].swap_file->d_inode)
672 goto bad_swap;
674 swapfilesize = swap_dentry->d_inode->i_size >> PAGE_SHIFT;
675 } else
676 goto bad_swap;
678 swap_header = (void *) __get_free_page(GFP_USER);
679 if (!swap_header) {
680 printk("Unable to start swapping: out of memory :-)\n");
681 error = -ENOMEM;
682 goto bad_swap;
685 lock_page(mem_map + MAP_NR(swap_header));
686 rw_swap_page_nolock(READ, SWP_ENTRY(type,0), (char *) swap_header, 1);
688 if (!memcmp("SWAP-SPACE",swap_header->magic.magic,10))
689 swap_header_version = 1;
690 else if (!memcmp("SWAPSPACE2",swap_header->magic.magic,10))
691 swap_header_version = 2;
692 else {
693 printk("Unable to find swap-space signature\n");
694 error = -EINVAL;
695 goto bad_swap;
698 switch (swap_header_version) {
699 case 1:
700 memset(((char *) swap_header)+PAGE_SIZE-10,0,10);
701 j = 0;
702 p->lowest_bit = 0;
703 p->highest_bit = 0;
704 for (i = 1 ; i < 8*PAGE_SIZE ; i++) {
705 if (test_bit(i,(char *) swap_header)) {
706 if (!p->lowest_bit)
707 p->lowest_bit = i;
708 p->highest_bit = i;
709 p->max = i+1;
710 j++;
713 nr_good_pages = j;
714 p->swap_map = vmalloc(p->max * sizeof(short));
715 if (!p->swap_map) {
716 error = -ENOMEM;
717 goto bad_swap;
719 for (i = 1 ; i < p->max ; i++) {
720 if (test_bit(i,(char *) swap_header))
721 p->swap_map[i] = 0;
722 else
723 p->swap_map[i] = SWAP_MAP_BAD;
725 break;
727 case 2:
728 /* Check the swap header's sub-version and the size of
729 the swap file and bad block lists */
730 if (swap_header->info.version != 1) {
731 printk(KERN_WARNING
732 "Unable to handle swap header version %d\n",
733 swap_header->info.version);
734 error = -EINVAL;
735 goto bad_swap;
738 p->lowest_bit = 1;
739 p->highest_bit = swap_header->info.last_page - 1;
740 p->max = swap_header->info.last_page;
742 maxpages = SWP_OFFSET(SWP_ENTRY(0,~0UL));
743 if (p->max >= maxpages)
744 p->max = maxpages-1;
746 error = -EINVAL;
747 if (swap_header->info.nr_badpages > MAX_SWAP_BADPAGES)
748 goto bad_swap;
750 /* OK, set up the swap map and apply the bad block list */
751 if (!(p->swap_map = vmalloc (p->max * sizeof(short)))) {
752 error = -ENOMEM;
753 goto bad_swap;
756 error = 0;
757 memset(p->swap_map, 0, p->max * sizeof(short));
758 for (i=0; i<swap_header->info.nr_badpages; i++) {
759 int page = swap_header->info.badpages[i];
760 if (page <= 0 || page >= swap_header->info.last_page)
761 error = -EINVAL;
762 else
763 p->swap_map[page] = SWAP_MAP_BAD;
765 nr_good_pages = swap_header->info.last_page -
766 swap_header->info.nr_badpages -
767 1 /* header page */;
768 if (error)
769 goto bad_swap;
772 if (swapfilesize && p->max > swapfilesize) {
773 printk(KERN_WARNING
774 "Swap area shorter than signature indicates\n");
775 error = -EINVAL;
776 goto bad_swap;
778 if (!nr_good_pages) {
779 printk(KERN_WARNING "Empty swap-file\n");
780 error = -EINVAL;
781 goto bad_swap;
783 p->swap_map[0] = SWAP_MAP_BAD;
784 p->flags = SWP_WRITEOK;
785 p->pages = nr_good_pages;
786 swap_list_lock();
787 nr_swap_pages += nr_good_pages;
788 printk(KERN_INFO "Adding Swap: %dk swap-space (priority %d)\n",
789 nr_good_pages<<(PAGE_SHIFT-10), p->prio);
791 /* insert swap space into swap_list: */
792 prev = -1;
793 for (i = swap_list.head; i >= 0; i = swap_info[i].next) {
794 if (p->prio >= swap_info[i].prio) {
795 break;
797 prev = i;
799 p->next = i;
800 if (prev < 0) {
801 swap_list.head = swap_list.next = p - swap_info;
802 } else {
803 swap_info[prev].next = p - swap_info;
805 swap_list_unlock();
806 error = 0;
807 goto out;
808 bad_swap:
809 if (bdev)
810 blkdev_put(bdev, BDEV_SWAP);
811 bad_swap_2:
812 if (p->swap_map)
813 vfree(p->swap_map);
814 dput(p->swap_file);
815 p->swap_device = 0;
816 p->swap_file = NULL;
817 p->swap_map = NULL;
818 p->flags = 0;
819 if (!(swap_flags & SWAP_FLAG_PREFER))
820 ++least_priority;
821 out:
822 if (swap_header)
823 free_page((long) swap_header);
824 unlock_kernel();
825 return error;
828 void si_swapinfo(struct sysinfo *val)
830 unsigned int i;
831 unsigned long freeswap = 0;
832 unsigned long totalswap = 0;
834 for (i = 0; i < nr_swapfiles; i++) {
835 unsigned int j;
836 if ((swap_info[i].flags & SWP_WRITEOK) != SWP_WRITEOK)
837 continue;
838 for (j = 0; j < swap_info[i].max; ++j) {
839 switch (swap_info[i].swap_map[j]) {
840 case SWAP_MAP_BAD:
841 continue;
842 case 0:
843 freeswap++;
844 default:
845 totalswap++;
849 val->freeswap = freeswap;
850 val->totalswap = totalswap;
851 return;
855 * Verify that a swap entry is valid and increment its swap map count.
856 * Kernel_lock is held, which guarantees existance of swap device.
858 * Note: if swap_map[] reaches SWAP_MAP_MAX the entries are treated as
859 * "permanent", but will be reclaimed by the next swapoff.
861 int swap_duplicate(swp_entry_t entry)
863 struct swap_info_struct * p;
864 unsigned long offset, type;
865 int result = 0;
867 /* Swap entry 0 is illegal */
868 if (!entry.val)
869 goto out;
870 type = SWP_TYPE(entry);
871 if (type >= nr_swapfiles)
872 goto bad_file;
873 p = type + swap_info;
874 offset = SWP_OFFSET(entry);
875 if (offset >= p->max)
876 goto bad_offset;
877 if (!p->swap_map[offset])
878 goto bad_unused;
880 * Entry is valid, so increment the map count.
882 swap_device_lock(p);
883 if (p->swap_map[offset] < SWAP_MAP_MAX)
884 p->swap_map[offset]++;
885 else {
886 static int overflow = 0;
887 if (overflow++ < 5)
888 printk("VM: swap entry overflow\n");
889 p->swap_map[offset] = SWAP_MAP_MAX;
891 swap_device_unlock(p);
892 result = 1;
893 out:
894 return result;
896 bad_file:
897 printk("Bad swap file entry %08lx\n", entry.val);
898 goto out;
899 bad_offset:
900 printk("Bad swap offset entry %08lx\n", entry.val);
901 goto out;
902 bad_unused:
903 printk("Unused swap offset entry in swap_dup %08lx\n", entry.val);
904 goto out;
908 * Page lock needs to be held in all cases to prevent races with
909 * swap file deletion.
911 int swap_count(struct page *page)
913 struct swap_info_struct * p;
914 unsigned long offset, type;
915 swp_entry_t entry;
916 int retval = 0;
918 entry.val = page->index;
919 if (!entry.val)
920 goto bad_entry;
921 type = SWP_TYPE(entry);
922 if (type >= nr_swapfiles)
923 goto bad_file;
924 p = type + swap_info;
925 offset = SWP_OFFSET(entry);
926 if (offset >= p->max)
927 goto bad_offset;
928 if (!p->swap_map[offset])
929 goto bad_unused;
930 retval = p->swap_map[offset];
931 out:
932 return retval;
934 bad_entry:
935 printk(KERN_ERR "swap_count: null entry!\n");
936 goto out;
937 bad_file:
938 printk("Bad swap file entry %08lx\n", entry.val);
939 goto out;
940 bad_offset:
941 printk("Bad swap offset entry %08lx\n", entry.val);
942 goto out;
943 bad_unused:
944 printk("Unused swap offset entry in swap_count %08lx\n", entry.val);
945 goto out;
949 * Kernel_lock protects against swap device deletion.
951 void get_swaphandle_info(swp_entry_t entry, unsigned long *offset,
952 kdev_t *dev, struct inode **swapf)
954 unsigned long type;
955 struct swap_info_struct *p;
957 type = SWP_TYPE(entry);
958 if (type >= nr_swapfiles) {
959 printk("Internal error: bad swap-device\n");
960 return;
963 p = &swap_info[type];
964 *offset = SWP_OFFSET(entry);
965 if (*offset >= p->max) {
966 printk("rw_swap_page: weirdness\n");
967 return;
969 if (p->swap_map && !p->swap_map[*offset]) {
970 printk("VM: Bad swap entry %08lx\n", entry.val);
971 return;
973 if (!(p->flags & SWP_USED)) {
974 printk(KERN_ERR "rw_swap_page: "
975 "Trying to swap to unused swap-device\n");
976 return;
979 if (p->swap_device) {
980 *dev = p->swap_device;
981 } else if (p->swap_file) {
982 *swapf = p->swap_file->d_inode;
983 } else {
984 printk(KERN_ERR "rw_swap_page: no swap file or device\n");
986 return;
990 * Kernel_lock protects against swap device deletion. Grab an extra
991 * reference on the swaphandle so that it dos not become unused.
993 int valid_swaphandles(swp_entry_t entry, unsigned long *offset)
995 int ret = 0, i = 1 << page_cluster;
996 unsigned long toff;
997 struct swap_info_struct *swapdev = SWP_TYPE(entry) + swap_info;
999 *offset = SWP_OFFSET(entry);
1000 toff = *offset = (*offset >> page_cluster) << page_cluster;
1002 swap_device_lock(swapdev);
1003 do {
1004 /* Don't read-ahead past the end of the swap area */
1005 if (toff >= swapdev->max)
1006 break;
1007 /* Don't read in bad or busy pages */
1008 if (!swapdev->swap_map[toff])
1009 break;
1010 if (swapdev->swap_map[toff] == SWAP_MAP_BAD)
1011 break;
1012 swapdev->swap_map[toff]++;
1013 toff++;
1014 ret++;
1015 } while (--i);
1016 swap_device_unlock(swapdev);
1017 return ret;