swapfile.c
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:31k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. /*
  2.  *  linux/mm/swapfile.c
  3.  *
  4.  *  Copyright (C) 1991, 1992, 1993, 1994  Linus Torvalds
  5.  *  Swap reorganised 29.12.95, Stephen Tweedie
  6.  */
  7. #include <linux/slab.h>
  8. #include <linux/smp_lock.h>
  9. #include <linux/kernel_stat.h>
  10. #include <linux/swap.h>
  11. #include <linux/swapctl.h>
  12. #include <linux/blkdev.h> /* for blk_size */
  13. #include <linux/vmalloc.h>
  14. #include <linux/pagemap.h>
  15. #include <linux/shm.h>
  16. #include <asm/pgtable.h>
  17. spinlock_t swaplock = SPIN_LOCK_UNLOCKED;
  18. unsigned int nr_swapfiles;
  19. int total_swap_pages;
  20. static int swap_overflow;
  21. static const char Bad_file[] = "Bad swap file entry ";
  22. static const char Unused_file[] = "Unused swap file entry ";
  23. static const char Bad_offset[] = "Bad swap offset entry ";
  24. static const char Unused_offset[] = "Unused swap offset entry ";
  25. struct swap_list_t swap_list = {-1, -1};
  26. struct swap_info_struct swap_info[MAX_SWAPFILES];
  27. #define SWAPFILE_CLUSTER 256
  28. static inline int scan_swap_map(struct swap_info_struct *si)
  29. {
  30. unsigned long offset;
  31. /* 
  32.  * We try to cluster swap pages by allocating them
  33.  * sequentially in swap.  Once we've allocated
  34.  * SWAPFILE_CLUSTER pages this way, however, we resort to
  35.  * first-free allocation, starting a new cluster.  This
  36.  * prevents us from scattering swap pages all over the entire
  37.  * swap partition, so that we reduce overall disk seek times
  38.  * between swap pages.  -- sct */
  39. if (si->cluster_nr) {
  40. while (si->cluster_next <= si->highest_bit) {
  41. offset = si->cluster_next++;
  42. if (si->swap_map[offset])
  43. continue;
  44. si->cluster_nr--;
  45. goto got_page;
  46. }
  47. }
  48. si->cluster_nr = SWAPFILE_CLUSTER;
  49. /* try to find an empty (even not aligned) cluster. */
  50. offset = si->lowest_bit;
  51.  check_next_cluster:
  52. if (offset+SWAPFILE_CLUSTER-1 <= si->highest_bit)
  53. {
  54. int nr;
  55. for (nr = offset; nr < offset+SWAPFILE_CLUSTER; nr++)
  56. if (si->swap_map[nr])
  57. {
  58. offset = nr+1;
  59. goto check_next_cluster;
  60. }
  61. /* We found a completly empty cluster, so start
  62.  * using it.
  63.  */
  64. goto got_page;
  65. }
  66. /* No luck, so now go finegrined as usual. -Andrea */
  67. for (offset = si->lowest_bit; offset <= si->highest_bit ; offset++) {
  68. if (si->swap_map[offset])
  69. continue;
  70. si->lowest_bit = offset+1;
  71. got_page:
  72. if (offset == si->lowest_bit)
  73. si->lowest_bit++;
  74. if (offset == si->highest_bit)
  75. si->highest_bit--;
  76. if (si->lowest_bit > si->highest_bit) {
  77. si->lowest_bit = si->max;
  78. si->highest_bit = 0;
  79. }
  80. si->swap_map[offset] = 1;
  81. nr_swap_pages--;
  82. si->cluster_next = offset+1;
  83. return offset;
  84. }
  85. si->lowest_bit = si->max;
  86. si->highest_bit = 0;
  87. return 0;
  88. }
  89. swp_entry_t get_swap_page(void)
  90. {
  91. struct swap_info_struct * p;
  92. unsigned long offset;
  93. swp_entry_t entry;
  94. int type, wrapped = 0;
  95. entry.val = 0; /* Out of memory */
  96. swap_list_lock();
  97. type = swap_list.next;
  98. if (type < 0)
  99. goto out;
  100. if (nr_swap_pages <= 0)
  101. 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);
  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;
  116. }
  117. goto out;
  118. }
  119. }
  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;
  125. }
  126. } else
  127. if (type < 0)
  128. goto out; /* out of swap space */
  129. }
  130. out:
  131. swap_list_unlock();
  132. return entry;
  133. }
  134. static struct swap_info_struct * swap_info_get(swp_entry_t entry)
  135. {
  136. struct swap_info_struct * p;
  137. unsigned long offset, type;
  138. if (!entry.val)
  139. goto out;
  140. type = SWP_TYPE(entry);
  141. if (type >= nr_swapfiles)
  142. goto bad_nofile;
  143. p = & swap_info[type];
  144. if (!(p->flags & SWP_USED))
  145. goto bad_device;
  146. offset = SWP_OFFSET(entry);
  147. if (offset >= p->max)
  148. goto bad_offset;
  149. if (!p->swap_map[offset])
  150. goto bad_free;
  151. swap_list_lock();
  152. if (p->prio > swap_info[swap_list.next].prio)
  153. swap_list.next = type;
  154. swap_device_lock(p);
  155. return p;
  156. bad_free:
  157. printk(KERN_ERR "swap_free: %s%08lxn", Unused_offset, entry.val);
  158. goto out;
  159. bad_offset:
  160. printk(KERN_ERR "swap_free: %s%08lxn", Bad_offset, entry.val);
  161. goto out;
  162. bad_device:
  163. printk(KERN_ERR "swap_free: %s%08lxn", Unused_file, entry.val);
  164. goto out;
  165. bad_nofile:
  166. printk(KERN_ERR "swap_free: %s%08lxn", Bad_file, entry.val);
  167. out:
  168. return NULL;
  169. }
  170. static void swap_info_put(struct swap_info_struct * p)
  171. {
  172. swap_device_unlock(p);
  173. swap_list_unlock();
  174. }
  175. static int swap_entry_free(struct swap_info_struct *p, unsigned long offset)
  176. {
  177. int count = p->swap_map[offset];
  178. if (count < SWAP_MAP_MAX) {
  179. count--;
  180. p->swap_map[offset] = count;
  181. if (!count) {
  182. if (offset < p->lowest_bit)
  183. p->lowest_bit = offset;
  184. if (offset > p->highest_bit)
  185. p->highest_bit = offset;
  186. nr_swap_pages++;
  187. }
  188. }
  189. return count;
  190. }
  191. /*
  192.  * Caller has made sure that the swapdevice corresponding to entry
  193.  * is still around or has not been recycled.
  194.  */
  195. void swap_free(swp_entry_t entry)
  196. {
  197. struct swap_info_struct * p;
  198. p = swap_info_get(entry);
  199. if (p) {
  200. swap_entry_free(p, SWP_OFFSET(entry));
  201. swap_info_put(p);
  202. }
  203. }
  204. /*
  205.  * Check if we're the only user of a swap page,
  206.  * when the page is locked.
  207.  */
  208. static int exclusive_swap_page(struct page *page)
  209. {
  210. int retval = 0;
  211. struct swap_info_struct * p;
  212. swp_entry_t entry;
  213. entry.val = page->index;
  214. p = swap_info_get(entry);
  215. if (p) {
  216. /* Is the only swap cache user the cache itself? */
  217. if (p->swap_map[SWP_OFFSET(entry)] == 1) {
  218. /* Recheck the page count with the pagecache lock held.. */
  219. spin_lock(&pagecache_lock);
  220. if (page_count(page) - !!page->buffers == 2)
  221. retval = 1;
  222. spin_unlock(&pagecache_lock);
  223. }
  224. swap_info_put(p);
  225. }
  226. return retval;
  227. }
  228. /*
  229.  * We can use this swap cache entry directly
  230.  * if there are no other references to it.
  231.  *
  232.  * Here "exclusive_swap_page()" does the real
  233.  * work, but we opportunistically check whether
  234.  * we need to get all the locks first..
  235.  */
  236. int can_share_swap_page(struct page *page)
  237. {
  238. int retval = 0;
  239. if (!PageLocked(page))
  240. BUG();
  241. switch (page_count(page)) {
  242. case 3:
  243. if (!page->buffers)
  244. break;
  245. /* Fallthrough */
  246. case 2:
  247. if (!PageSwapCache(page))
  248. break;
  249. retval = exclusive_swap_page(page);
  250. break;
  251. case 1:
  252. if (PageReserved(page))
  253. break;
  254. retval = 1;
  255. }
  256. return retval;
  257. }
  258. /*
  259.  * Work out if there are any other processes sharing this
  260.  * swap cache page. Free it if you can. Return success.
  261.  */
  262. int remove_exclusive_swap_page(struct page *page)
  263. {
  264. int retval;
  265. struct swap_info_struct * p;
  266. swp_entry_t entry;
  267. if (!PageLocked(page))
  268. BUG();
  269. if (!PageSwapCache(page))
  270. return 0;
  271. if (page_count(page) - !!page->buffers != 2) /* 2: us + cache */
  272. return 0;
  273. entry.val = page->index;
  274. p = swap_info_get(entry);
  275. if (!p)
  276. return 0;
  277. /* Is the only swap cache user the cache itself? */
  278. retval = 0;
  279. if (p->swap_map[SWP_OFFSET(entry)] == 1) {
  280. /* Recheck the page count with the pagecache lock held.. */
  281. spin_lock(&pagecache_lock);
  282. if (page_count(page) - !!page->buffers == 2) {
  283. __delete_from_swap_cache(page);
  284. SetPageDirty(page);
  285. retval = 1;
  286. }
  287. spin_unlock(&pagecache_lock);
  288. }
  289. swap_info_put(p);
  290. if (retval) {
  291. block_flushpage(page, 0);
  292. swap_free(entry);
  293. page_cache_release(page);
  294. }
  295. return retval;
  296. }
  297. /*
  298.  * Free the swap entry like above, but also try to
  299.  * free the page cache entry if it is the last user.
  300.  */
  301. void free_swap_and_cache(swp_entry_t entry)
  302. {
  303. struct swap_info_struct * p;
  304. struct page *page = NULL;
  305. p = swap_info_get(entry);
  306. if (p) {
  307. if (swap_entry_free(p, SWP_OFFSET(entry)) == 1)
  308. page = find_trylock_page(&swapper_space, entry.val);
  309. swap_info_put(p);
  310. }
  311. if (page) {
  312. page_cache_get(page);
  313. /* Only cache user (+us), or swap space full? Free it! */
  314. if (page_count(page) - !!page->buffers == 2 || vm_swap_full()) {
  315. delete_from_swap_cache(page);
  316. SetPageDirty(page);
  317. }
  318. UnlockPage(page);
  319. page_cache_release(page);
  320. }
  321. }
  322. /*
  323.  * The swap entry has been read in advance, and we return 1 to indicate
  324.  * that the page has been used or is no longer needed.
  325.  *
  326.  * Always set the resulting pte to be nowrite (the same as COW pages
  327.  * after one process has exited).  We don't know just how many PTEs will
  328.  * share this swap entry, so be cautious and let do_wp_page work out
  329.  * what to do if a write is requested later.
  330.  */
  331. /* mmlist_lock and vma->vm_mm->page_table_lock are held */
  332. static inline void unuse_pte(struct vm_area_struct * vma, unsigned long address,
  333. pte_t *dir, swp_entry_t entry, struct page* page)
  334. {
  335. pte_t pte = *dir;
  336. if (likely(pte_to_swp_entry(pte).val != entry.val))
  337. return;
  338. if (unlikely(pte_none(pte) || pte_present(pte)))
  339. return;
  340. get_page(page);
  341. set_pte(dir, pte_mkold(mk_pte(page, vma->vm_page_prot)));
  342. swap_free(entry);
  343. ++vma->vm_mm->rss;
  344. }
  345. /* mmlist_lock and vma->vm_mm->page_table_lock are held */
  346. static inline void unuse_pmd(struct vm_area_struct * vma, pmd_t *dir,
  347. unsigned long address, unsigned long size, unsigned long offset,
  348. swp_entry_t entry, struct page* page)
  349. {
  350. pte_t * pte;
  351. unsigned long end;
  352. if (pmd_none(*dir))
  353. return;
  354. if (pmd_bad(*dir)) {
  355. pmd_ERROR(*dir);
  356. pmd_clear(dir);
  357. return;
  358. }
  359. pte = pte_offset(dir, address);
  360. offset += address & PMD_MASK;
  361. address &= ~PMD_MASK;
  362. end = address + size;
  363. if (end > PMD_SIZE)
  364. end = PMD_SIZE;
  365. do {
  366. unuse_pte(vma, offset+address-vma->vm_start, pte, entry, page);
  367. address += PAGE_SIZE;
  368. pte++;
  369. } while (address && (address < end));
  370. }
  371. /* mmlist_lock and vma->vm_mm->page_table_lock are held */
  372. static inline void unuse_pgd(struct vm_area_struct * vma, pgd_t *dir,
  373. unsigned long address, unsigned long size,
  374. swp_entry_t entry, struct page* page)
  375. {
  376. pmd_t * pmd;
  377. unsigned long offset, end;
  378. if (pgd_none(*dir))
  379. return;
  380. if (pgd_bad(*dir)) {
  381. pgd_ERROR(*dir);
  382. pgd_clear(dir);
  383. return;
  384. }
  385. pmd = pmd_offset(dir, address);
  386. offset = address & PGDIR_MASK;
  387. address &= ~PGDIR_MASK;
  388. end = address + size;
  389. if (end > PGDIR_SIZE)
  390. end = PGDIR_SIZE;
  391. if (address >= end)
  392. BUG();
  393. do {
  394. unuse_pmd(vma, pmd, address, end - address, offset, entry,
  395.   page);
  396. address = (address + PMD_SIZE) & PMD_MASK;
  397. pmd++;
  398. } while (address && (address < end));
  399. }
  400. /* mmlist_lock and vma->vm_mm->page_table_lock are held */
  401. static void unuse_vma(struct vm_area_struct * vma, pgd_t *pgdir,
  402. swp_entry_t entry, struct page* page)
  403. {
  404. unsigned long start = vma->vm_start, end = vma->vm_end;
  405. if (start >= end)
  406. BUG();
  407. do {
  408. unuse_pgd(vma, pgdir, start, end - start, entry, page);
  409. start = (start + PGDIR_SIZE) & PGDIR_MASK;
  410. pgdir++;
  411. } while (start && (start < end));
  412. }
  413. static void unuse_process(struct mm_struct * mm,
  414. swp_entry_t entry, struct page* page)
  415. {
  416. struct vm_area_struct* vma;
  417. /*
  418.  * Go through process' page directory.
  419.  */
  420. spin_lock(&mm->page_table_lock);
  421. for (vma = mm->mmap; vma; vma = vma->vm_next) {
  422. pgd_t * pgd = pgd_offset(mm, vma->vm_start);
  423. unuse_vma(vma, pgd, entry, page);
  424. }
  425. spin_unlock(&mm->page_table_lock);
  426. return;
  427. }
  428. /*
  429.  * Scan swap_map from current position to next entry still in use.
  430.  * Recycle to start on reaching the end, returning 0 when empty.
  431.  */
  432. static int find_next_to_unuse(struct swap_info_struct *si, int prev)
  433. {
  434. int max = si->max;
  435. int i = prev;
  436. int count;
  437. /*
  438.  * No need for swap_device_lock(si) here: we're just looking
  439.  * for whether an entry is in use, not modifying it; false
  440.  * hits are okay, and sys_swapoff() has already prevented new
  441.  * allocations from this area (while holding swap_list_lock()).
  442.  */
  443. for (;;) {
  444. if (++i >= max) {
  445. if (!prev) {
  446. i = 0;
  447. break;
  448. }
  449. /*
  450.  * No entries in use at top of swap_map,
  451.  * loop back to start and recheck there.
  452.  */
  453. max = prev + 1;
  454. prev = 0;
  455. i = 1;
  456. }
  457. count = si->swap_map[i];
  458. if (count && count != SWAP_MAP_BAD)
  459. break;
  460. }
  461. return i;
  462. }
  463. /*
  464.  * We completely avoid races by reading each swap page in advance,
  465.  * and then search for the process using it.  All the necessary
  466.  * page table adjustments can then be made atomically.
  467.  */
  468. static int try_to_unuse(unsigned int type)
  469. {
  470. struct swap_info_struct * si = &swap_info[type];
  471. struct mm_struct *start_mm;
  472. unsigned short *swap_map;
  473. unsigned short swcount;
  474. struct page *page;
  475. swp_entry_t entry;
  476. int i = 0;
  477. int retval = 0;
  478. int reset_overflow = 0;
  479. /*
  480.  * When searching mms for an entry, a good strategy is to
  481.  * start at the first mm we freed the previous entry from
  482.  * (though actually we don't notice whether we or coincidence
  483.  * freed the entry).  Initialize this start_mm with a hold.
  484.  *
  485.  * A simpler strategy would be to start at the last mm we
  486.  * freed the previous entry from; but that would take less
  487.  * advantage of mmlist ordering (now preserved by swap_out()),
  488.  * which clusters forked address spaces together, most recent
  489.  * child immediately after parent.  If we race with dup_mmap(),
  490.  * we very much want to resolve parent before child, otherwise
  491.  * we may miss some entries: using last mm would invert that.
  492.  */
  493. start_mm = &init_mm;
  494. atomic_inc(&init_mm.mm_users);
  495. /*
  496.  * Keep on scanning until all entries have gone.  Usually,
  497.  * one pass through swap_map is enough, but not necessarily:
  498.  * mmput() removes mm from mmlist before exit_mmap() and its
  499.  * zap_page_range().  That's not too bad, those entries are
  500.  * on their way out, and handled faster there than here.
  501.  * do_munmap() behaves similarly, taking the range out of mm's
  502.  * vma list before zap_page_range().  But unfortunately, when
  503.  * unmapping a part of a vma, it takes the whole out first,
  504.  * then reinserts what's left after (might even reschedule if
  505.  * open() method called) - so swap entries may be invisible
  506.  * to swapoff for a while, then reappear - but that is rare.
  507.  */
  508. while ((i = find_next_to_unuse(si, i))) {
  509. /* 
  510.  * Get a page for the entry, using the existing swap
  511.  * cache page if there is one.  Otherwise, get a clean
  512.  * page and read the swap into it. 
  513.  */
  514. swap_map = &si->swap_map[i];
  515. entry = SWP_ENTRY(type, i);
  516. page = read_swap_cache_async(entry);
  517. if (!page) {
  518. /*
  519.  * Either swap_duplicate() failed because entry
  520.  * has been freed independently, and will not be
  521.  * reused since sys_swapoff() already disabled
  522.  * allocation from here, or alloc_page() failed.
  523.  */
  524. if (!*swap_map)
  525. continue;
  526. retval = -ENOMEM;
  527. break;
  528. }
  529. /*
  530.  * Don't hold on to start_mm if it looks like exiting.
  531.  */
  532. if (atomic_read(&start_mm->mm_users) == 1) {
  533. mmput(start_mm);
  534. start_mm = &init_mm;
  535. atomic_inc(&init_mm.mm_users);
  536. }
  537. /*
  538.  * Wait for and lock page.  When do_swap_page races with
  539.  * try_to_unuse, do_swap_page can handle the fault much
  540.  * faster than try_to_unuse can locate the entry.  This
  541.  * apparently redundant "wait_on_page" lets try_to_unuse
  542.  * defer to do_swap_page in such a case - in some tests,
  543.  * do_swap_page and try_to_unuse repeatedly compete.
  544.  */
  545. wait_on_page(page);
  546. lock_page(page);
  547. /*
  548.  * Remove all references to entry, without blocking.
  549.  * Whenever we reach init_mm, there's no address space
  550.  * to search, but use it as a reminder to search shmem.
  551.  */
  552. swcount = *swap_map;
  553. if (swcount > 1) {
  554. flush_page_to_ram(page);
  555. if (start_mm == &init_mm)
  556. shmem_unuse(entry, page);
  557. else
  558. unuse_process(start_mm, entry, page);
  559. }
  560. if (*swap_map > 1) {
  561. int set_start_mm = (*swap_map >= swcount);
  562. struct list_head *p = &start_mm->mmlist;
  563. struct mm_struct *new_start_mm = start_mm;
  564. struct mm_struct *mm;
  565. spin_lock(&mmlist_lock);
  566. while (*swap_map > 1 &&
  567. (p = p->next) != &start_mm->mmlist) {
  568. mm = list_entry(p, struct mm_struct, mmlist);
  569. swcount = *swap_map;
  570. if (mm == &init_mm) {
  571. set_start_mm = 1;
  572. shmem_unuse(entry, page);
  573. } else
  574. unuse_process(mm, entry, page);
  575. if (set_start_mm && *swap_map < swcount) {
  576. new_start_mm = mm;
  577. set_start_mm = 0;
  578. }
  579. }
  580. atomic_inc(&new_start_mm->mm_users);
  581. spin_unlock(&mmlist_lock);
  582. mmput(start_mm);
  583. start_mm = new_start_mm;
  584. }
  585. /*
  586.  * How could swap count reach 0x7fff when the maximum
  587.  * pid is 0x7fff, and there's no way to repeat a swap
  588.  * page within an mm (except in shmem, where it's the
  589.  * shared object which takes the reference count)?
  590.  * We believe SWAP_MAP_MAX cannot occur in Linux 2.4.
  591.  *
  592.  * If that's wrong, then we should worry more about
  593.  * exit_mmap() and do_munmap() cases described above:
  594.  * we might be resetting SWAP_MAP_MAX too early here.
  595.  * We know "Undead"s can happen, they're okay, so don't
  596.  * report them; but do report if we reset SWAP_MAP_MAX.
  597.  */
  598. if (*swap_map == SWAP_MAP_MAX) {
  599. swap_list_lock();
  600. swap_device_lock(si);
  601. nr_swap_pages++;
  602. *swap_map = 1;
  603. swap_device_unlock(si);
  604. swap_list_unlock();
  605. reset_overflow = 1;
  606. }
  607. /*
  608.  * If a reference remains (rare), we would like to leave
  609.  * the page in the swap cache; but try_to_swap_out could
  610.  * then re-duplicate the entry once we drop page lock,
  611.  * so we might loop indefinitely; also, that page could
  612.  * not be swapped out to other storage meanwhile.  So:
  613.  * delete from cache even if there's another reference,
  614.  * after ensuring that the data has been saved to disk -
  615.  * since if the reference remains (rarer), it will be
  616.  * read from disk into another page.  Splitting into two
  617.  * pages would be incorrect if swap supported "shared
  618.  * private" pages, but they are handled by tmpfs files.
  619.  * Note shmem_unuse already deleted its from swap cache.
  620.  */
  621. if ((*swap_map > 1) && PageDirty(page) && PageSwapCache(page)) {
  622. rw_swap_page(WRITE, page);
  623. lock_page(page);
  624. }
  625. if (PageSwapCache(page))
  626. delete_from_swap_cache(page);
  627. /*
  628.  * So we could skip searching mms once swap count went
  629.  * to 1, we did not mark any present ptes as dirty: must
  630.  * mark page dirty so try_to_swap_out will preserve it.
  631.  */
  632. SetPageDirty(page);
  633. UnlockPage(page);
  634. page_cache_release(page);
  635. /*
  636.  * Make sure that we aren't completely killing
  637.  * interactive performance.  Interruptible check on
  638.  * signal_pending() would be nice, but changes the spec?
  639.  */
  640. if (current->need_resched)
  641. schedule();
  642. }
  643. mmput(start_mm);
  644. if (reset_overflow) {
  645. printk(KERN_WARNING "swapoff: cleared swap entry overflown");
  646. swap_overflow = 0;
  647. }
  648. return retval;
  649. }
  650. asmlinkage long sys_swapoff(const char * specialfile)
  651. {
  652. struct swap_info_struct * p = NULL;
  653. unsigned short *swap_map;
  654. struct nameidata nd;
  655. int i, type, prev;
  656. int err;
  657. if (!capable(CAP_SYS_ADMIN))
  658. return -EPERM;
  659. err = user_path_walk(specialfile, &nd);
  660. if (err)
  661. goto out;
  662. lock_kernel();
  663. prev = -1;
  664. swap_list_lock();
  665. for (type = swap_list.head; type >= 0; type = swap_info[type].next) {
  666. p = swap_info + type;
  667. if ((p->flags & SWP_WRITEOK) == SWP_WRITEOK) {
  668. if (p->swap_file == nd.dentry)
  669.   break;
  670. }
  671. prev = type;
  672. }
  673. err = -EINVAL;
  674. if (type < 0) {
  675. swap_list_unlock();
  676. goto out_dput;
  677. }
  678. if (prev < 0) {
  679. swap_list.head = p->next;
  680. } else {
  681. swap_info[prev].next = p->next;
  682. }
  683. if (type == swap_list.next) {
  684. /* just pick something that's safe... */
  685. swap_list.next = swap_list.head;
  686. }
  687. nr_swap_pages -= p->pages;
  688. total_swap_pages -= p->pages;
  689. p->flags = SWP_USED;
  690. swap_list_unlock();
  691. unlock_kernel();
  692. err = try_to_unuse(type);
  693. lock_kernel();
  694. if (err) {
  695. /* re-insert swap space back into swap_list */
  696. swap_list_lock();
  697. for (prev = -1, i = swap_list.head; i >= 0; prev = i, i = swap_info[i].next)
  698. if (p->prio >= swap_info[i].prio)
  699. break;
  700. p->next = i;
  701. if (prev < 0)
  702. swap_list.head = swap_list.next = p - swap_info;
  703. else
  704. swap_info[prev].next = p - swap_info;
  705. nr_swap_pages += p->pages;
  706. total_swap_pages += p->pages;
  707. p->flags = SWP_WRITEOK;
  708. swap_list_unlock();
  709. goto out_dput;
  710. }
  711. if (p->swap_device)
  712. blkdev_put(p->swap_file->d_inode->i_bdev, BDEV_SWAP);
  713. path_release(&nd);
  714. swap_list_lock();
  715. swap_device_lock(p);
  716. nd.mnt = p->swap_vfsmnt;
  717. nd.dentry = p->swap_file;
  718. p->swap_vfsmnt = NULL;
  719. p->swap_file = NULL;
  720. p->swap_device = 0;
  721. p->max = 0;
  722. swap_map = p->swap_map;
  723. p->swap_map = NULL;
  724. p->flags = 0;
  725. swap_device_unlock(p);
  726. swap_list_unlock();
  727. vfree(swap_map);
  728. err = 0;
  729. out_dput:
  730. unlock_kernel();
  731. path_release(&nd);
  732. out:
  733. return err;
  734. }
  735. int get_swaparea_info(char *buf)
  736. {
  737. char * page = (char *) __get_free_page(GFP_KERNEL);
  738. struct swap_info_struct *ptr = swap_info;
  739. int i, j, len = 0, usedswap;
  740. if (!page)
  741. return -ENOMEM;
  742. len += sprintf(buf, "FilenametttTypettSizetUsedtPriorityn");
  743. for (i = 0 ; i < nr_swapfiles ; i++, ptr++) {
  744. if ((ptr->flags & SWP_USED) && ptr->swap_map) {
  745. char * path = d_path(ptr->swap_file, ptr->swap_vfsmnt,
  746. page, PAGE_SIZE);
  747. len += sprintf(buf + len, "%-31s ", path);
  748. if (!ptr->swap_device)
  749. len += sprintf(buf + len, "filett");
  750. else
  751. len += sprintf(buf + len, "partitiont");
  752. usedswap = 0;
  753. for (j = 0; j < ptr->max; ++j)
  754. switch (ptr->swap_map[j]) {
  755. case SWAP_MAP_BAD:
  756. case 0:
  757. continue;
  758. default:
  759. usedswap++;
  760. }
  761. len += sprintf(buf + len, "%dt%dt%dn", ptr->pages << (PAGE_SHIFT - 10), 
  762. usedswap << (PAGE_SHIFT - 10), ptr->prio);
  763. }
  764. }
  765. free_page((unsigned long) page);
  766. return len;
  767. }
  768. int is_swap_partition(kdev_t dev) {
  769. struct swap_info_struct *ptr = swap_info;
  770. int i;
  771. for (i = 0 ; i < nr_swapfiles ; i++, ptr++) {
  772. if (ptr->flags & SWP_USED)
  773. if (ptr->swap_device == dev)
  774. return 1;
  775. }
  776. return 0;
  777. }
  778. /*
  779.  * Written 01/25/92 by Simmule Turner, heavily changed by Linus.
  780.  *
  781.  * The swapon system call
  782.  */
  783. asmlinkage long sys_swapon(const char * specialfile, int swap_flags)
  784. {
  785. struct swap_info_struct * p;
  786. struct nameidata nd;
  787. struct inode * swap_inode;
  788. unsigned int type;
  789. int i, j, prev;
  790. int error;
  791. static int least_priority = 0;
  792. union swap_header *swap_header = 0;
  793. int swap_header_version;
  794. int nr_good_pages = 0;
  795. unsigned long maxpages = 1;
  796. int swapfilesize;
  797. struct block_device *bdev = NULL;
  798. unsigned short *swap_map;
  799. if (!capable(CAP_SYS_ADMIN))
  800. return -EPERM;
  801. lock_kernel();
  802. swap_list_lock();
  803. p = swap_info;
  804. for (type = 0 ; type < nr_swapfiles ; type++,p++)
  805. if (!(p->flags & SWP_USED))
  806. break;
  807. error = -EPERM;
  808. if (type >= MAX_SWAPFILES) {
  809. swap_list_unlock();
  810. goto out;
  811. }
  812. if (type >= nr_swapfiles)
  813. nr_swapfiles = type+1;
  814. p->flags = SWP_USED;
  815. p->swap_file = NULL;
  816. p->swap_vfsmnt = NULL;
  817. p->swap_device = 0;
  818. p->swap_map = NULL;
  819. p->lowest_bit = 0;
  820. p->highest_bit = 0;
  821. p->cluster_nr = 0;
  822. p->sdev_lock = SPIN_LOCK_UNLOCKED;
  823. p->next = -1;
  824. if (swap_flags & SWAP_FLAG_PREFER) {
  825. p->prio =
  826.   (swap_flags & SWAP_FLAG_PRIO_MASK)>>SWAP_FLAG_PRIO_SHIFT;
  827. } else {
  828. p->prio = --least_priority;
  829. }
  830. swap_list_unlock();
  831. error = user_path_walk(specialfile, &nd);
  832. if (error)
  833. goto bad_swap_2;
  834. p->swap_file = nd.dentry;
  835. p->swap_vfsmnt = nd.mnt;
  836. swap_inode = nd.dentry->d_inode;
  837. error = -EINVAL;
  838. if (S_ISBLK(swap_inode->i_mode)) {
  839. kdev_t dev = swap_inode->i_rdev;
  840. struct block_device_operations *bdops;
  841. devfs_handle_t de;
  842. p->swap_device = dev;
  843. set_blocksize(dev, PAGE_SIZE);
  844. bd_acquire(swap_inode);
  845. bdev = swap_inode->i_bdev;
  846. de = devfs_get_handle_from_inode(swap_inode);
  847. bdops = devfs_get_ops(de);  /*  Increments module use count  */
  848. if (bdops) bdev->bd_op = bdops;
  849. error = blkdev_get(bdev, FMODE_READ|FMODE_WRITE, 0, BDEV_SWAP);
  850. devfs_put_ops(de);/*Decrement module use count now we're safe*/
  851. if (error)
  852. goto bad_swap_2;
  853. set_blocksize(dev, PAGE_SIZE);
  854. error = -ENODEV;
  855. if (!dev || (blk_size[MAJOR(dev)] &&
  856.      !blk_size[MAJOR(dev)][MINOR(dev)]))
  857. goto bad_swap;
  858. swapfilesize = 0;
  859. if (blk_size[MAJOR(dev)])
  860. swapfilesize = blk_size[MAJOR(dev)][MINOR(dev)]
  861. >> (PAGE_SHIFT - 10);
  862. } else if (S_ISREG(swap_inode->i_mode))
  863. swapfilesize = swap_inode->i_size >> PAGE_SHIFT;
  864. else
  865. goto bad_swap;
  866. error = -EBUSY;
  867. for (i = 0 ; i < nr_swapfiles ; i++) {
  868. struct swap_info_struct *q = &swap_info[i];
  869. if (i == type || !q->swap_file)
  870. continue;
  871. if (swap_inode->i_mapping == q->swap_file->d_inode->i_mapping)
  872. goto bad_swap;
  873. }
  874. swap_header = (void *) __get_free_page(GFP_USER);
  875. if (!swap_header) {
  876. printk("Unable to start swapping: out of memory :-)n");
  877. error = -ENOMEM;
  878. goto bad_swap;
  879. }
  880. lock_page(virt_to_page(swap_header));
  881. rw_swap_page_nolock(READ, SWP_ENTRY(type,0), (char *) swap_header);
  882. if (!memcmp("SWAP-SPACE",swap_header->magic.magic,10))
  883. swap_header_version = 1;
  884. else if (!memcmp("SWAPSPACE2",swap_header->magic.magic,10))
  885. swap_header_version = 2;
  886. else {
  887. printk("Unable to find swap-space signaturen");
  888. error = -EINVAL;
  889. goto bad_swap;
  890. }
  891. switch (swap_header_version) {
  892. case 1:
  893. memset(((char *) swap_header)+PAGE_SIZE-10,0,10);
  894. j = 0;
  895. p->lowest_bit = 0;
  896. p->highest_bit = 0;
  897. for (i = 1 ; i < 8*PAGE_SIZE ; i++) {
  898. if (test_bit(i,(char *) swap_header)) {
  899. if (!p->lowest_bit)
  900. p->lowest_bit = i;
  901. p->highest_bit = i;
  902. maxpages = i+1;
  903. j++;
  904. }
  905. }
  906. nr_good_pages = j;
  907. p->swap_map = vmalloc(maxpages * sizeof(short));
  908. if (!p->swap_map) {
  909. error = -ENOMEM;
  910. goto bad_swap;
  911. }
  912. for (i = 1 ; i < maxpages ; i++) {
  913. if (test_bit(i,(char *) swap_header))
  914. p->swap_map[i] = 0;
  915. else
  916. p->swap_map[i] = SWAP_MAP_BAD;
  917. }
  918. break;
  919. case 2:
  920. /* Check the swap header's sub-version and the size of
  921.                    the swap file and bad block lists */
  922. if (swap_header->info.version != 1) {
  923. printk(KERN_WARNING
  924.        "Unable to handle swap header version %dn",
  925.        swap_header->info.version);
  926. error = -EINVAL;
  927. goto bad_swap;
  928. }
  929. p->lowest_bit  = 1;
  930. maxpages = SWP_OFFSET(SWP_ENTRY(0,~0UL)) - 1;
  931. if (maxpages > swap_header->info.last_page)
  932. maxpages = swap_header->info.last_page;
  933. p->highest_bit = maxpages - 1;
  934. error = -EINVAL;
  935. if (swap_header->info.nr_badpages > MAX_SWAP_BADPAGES)
  936. goto bad_swap;
  937. /* OK, set up the swap map and apply the bad block list */
  938. if (!(p->swap_map = vmalloc(maxpages * sizeof(short)))) {
  939. error = -ENOMEM;
  940. goto bad_swap;
  941. }
  942. error = 0;
  943. memset(p->swap_map, 0, maxpages * sizeof(short));
  944. for (i=0; i<swap_header->info.nr_badpages; i++) {
  945. int page = swap_header->info.badpages[i];
  946. if (page <= 0 || page >= swap_header->info.last_page)
  947. error = -EINVAL;
  948. else
  949. p->swap_map[page] = SWAP_MAP_BAD;
  950. }
  951. nr_good_pages = swap_header->info.last_page -
  952. swap_header->info.nr_badpages -
  953. 1 /* header page */;
  954. if (error) 
  955. goto bad_swap;
  956. }
  957. if (swapfilesize && maxpages > swapfilesize) {
  958. printk(KERN_WARNING
  959.        "Swap area shorter than signature indicatesn");
  960. error = -EINVAL;
  961. goto bad_swap;
  962. }
  963. if (!nr_good_pages) {
  964. printk(KERN_WARNING "Empty swap-filen");
  965. error = -EINVAL;
  966. goto bad_swap;
  967. }
  968. p->swap_map[0] = SWAP_MAP_BAD;
  969. swap_list_lock();
  970. swap_device_lock(p);
  971. p->max = maxpages;
  972. p->flags = SWP_WRITEOK;
  973. p->pages = nr_good_pages;
  974. nr_swap_pages += nr_good_pages;
  975. total_swap_pages += nr_good_pages;
  976. printk(KERN_INFO "Adding Swap: %dk swap-space (priority %d)n",
  977.        nr_good_pages<<(PAGE_SHIFT-10), p->prio);
  978. /* insert swap space into swap_list: */
  979. prev = -1;
  980. for (i = swap_list.head; i >= 0; i = swap_info[i].next) {
  981. if (p->prio >= swap_info[i].prio) {
  982. break;
  983. }
  984. prev = i;
  985. }
  986. p->next = i;
  987. if (prev < 0) {
  988. swap_list.head = swap_list.next = p - swap_info;
  989. } else {
  990. swap_info[prev].next = p - swap_info;
  991. }
  992. swap_device_unlock(p);
  993. swap_list_unlock();
  994. error = 0;
  995. goto out;
  996. bad_swap:
  997. if (bdev)
  998. blkdev_put(bdev, BDEV_SWAP);
  999. bad_swap_2:
  1000. swap_list_lock();
  1001. swap_map = p->swap_map;
  1002. nd.mnt = p->swap_vfsmnt;
  1003. nd.dentry = p->swap_file;
  1004. p->swap_device = 0;
  1005. p->swap_file = NULL;
  1006. p->swap_vfsmnt = NULL;
  1007. p->swap_map = NULL;
  1008. p->flags = 0;
  1009. if (!(swap_flags & SWAP_FLAG_PREFER))
  1010. ++least_priority;
  1011. swap_list_unlock();
  1012. if (swap_map)
  1013. vfree(swap_map);
  1014. path_release(&nd);
  1015. out:
  1016. if (swap_header)
  1017. free_page((long) swap_header);
  1018. unlock_kernel();
  1019. return error;
  1020. }
  1021. void si_swapinfo(struct sysinfo *val)
  1022. {
  1023. unsigned int i;
  1024. unsigned long nr_to_be_unused = 0;
  1025. swap_list_lock();
  1026. for (i = 0; i < nr_swapfiles; i++) {
  1027. unsigned int j;
  1028. if (swap_info[i].flags != SWP_USED)
  1029. continue;
  1030. for (j = 0; j < swap_info[i].max; ++j) {
  1031. switch (swap_info[i].swap_map[j]) {
  1032. case 0:
  1033. case SWAP_MAP_BAD:
  1034. continue;
  1035. default:
  1036. nr_to_be_unused++;
  1037. }
  1038. }
  1039. }
  1040. val->freeswap = nr_swap_pages + nr_to_be_unused;
  1041. val->totalswap = total_swap_pages + nr_to_be_unused;
  1042. swap_list_unlock();
  1043. }
  1044. /*
  1045.  * Verify that a swap entry is valid and increment its swap map count.
  1046.  *
  1047.  * Note: if swap_map[] reaches SWAP_MAP_MAX the entries are treated as
  1048.  * "permanent", but will be reclaimed by the next swapoff.
  1049.  */
  1050. int swap_duplicate(swp_entry_t entry)
  1051. {
  1052. struct swap_info_struct * p;
  1053. unsigned long offset, type;
  1054. int result = 0;
  1055. type = SWP_TYPE(entry);
  1056. if (type >= nr_swapfiles)
  1057. goto bad_file;
  1058. p = type + swap_info;
  1059. offset = SWP_OFFSET(entry);
  1060. swap_device_lock(p);
  1061. if (offset < p->max && p->swap_map[offset]) {
  1062. if (p->swap_map[offset] < SWAP_MAP_MAX - 1) {
  1063. p->swap_map[offset]++;
  1064. result = 1;
  1065. } else if (p->swap_map[offset] <= SWAP_MAP_MAX) {
  1066. if (swap_overflow++ < 5)
  1067. printk(KERN_WARNING "swap_dup: swap entry overflown");
  1068. p->swap_map[offset] = SWAP_MAP_MAX;
  1069. result = 1;
  1070. }
  1071. }
  1072. swap_device_unlock(p);
  1073. out:
  1074. return result;
  1075. bad_file:
  1076. printk(KERN_ERR "swap_dup: %s%08lxn", Bad_file, entry.val);
  1077. goto out;
  1078. }
  1079. /*
  1080.  * Page lock needs to be held in all cases to prevent races with
  1081.  * swap file deletion.
  1082.  */
  1083. int swap_count(struct page *page)
  1084. {
  1085. struct swap_info_struct * p;
  1086. unsigned long offset, type;
  1087. swp_entry_t entry;
  1088. int retval = 0;
  1089. entry.val = page->index;
  1090. if (!entry.val)
  1091. goto bad_entry;
  1092. type = SWP_TYPE(entry);
  1093. if (type >= nr_swapfiles)
  1094. goto bad_file;
  1095. p = type + swap_info;
  1096. offset = SWP_OFFSET(entry);
  1097. if (offset >= p->max)
  1098. goto bad_offset;
  1099. if (!p->swap_map[offset])
  1100. goto bad_unused;
  1101. retval = p->swap_map[offset];
  1102. out:
  1103. return retval;
  1104. bad_entry:
  1105. printk(KERN_ERR "swap_count: null entry!n");
  1106. goto out;
  1107. bad_file:
  1108. printk(KERN_ERR "swap_count: %s%08lxn", Bad_file, entry.val);
  1109. goto out;
  1110. bad_offset:
  1111. printk(KERN_ERR "swap_count: %s%08lxn", Bad_offset, entry.val);
  1112. goto out;
  1113. bad_unused:
  1114. printk(KERN_ERR "swap_count: %s%08lxn", Unused_offset, entry.val);
  1115. goto out;
  1116. }
  1117. /*
  1118.  * Prior swap_duplicate protects against swap device deletion.
  1119.  */
  1120. void get_swaphandle_info(swp_entry_t entry, unsigned long *offset, 
  1121. kdev_t *dev, struct inode **swapf)
  1122. {
  1123. unsigned long type;
  1124. struct swap_info_struct *p;
  1125. type = SWP_TYPE(entry);
  1126. if (type >= nr_swapfiles) {
  1127. printk(KERN_ERR "rw_swap_page: %s%08lxn", Bad_file, entry.val);
  1128. return;
  1129. }
  1130. p = &swap_info[type];
  1131. *offset = SWP_OFFSET(entry);
  1132. if (*offset >= p->max && *offset != 0) {
  1133. printk(KERN_ERR "rw_swap_page: %s%08lxn", Bad_offset, entry.val);
  1134. return;
  1135. }
  1136. if (p->swap_map && !p->swap_map[*offset]) {
  1137. printk(KERN_ERR "rw_swap_page: %s%08lxn", Unused_offset, entry.val);
  1138. return;
  1139. }
  1140. if (!(p->flags & SWP_USED)) {
  1141. printk(KERN_ERR "rw_swap_page: %s%08lxn", Unused_file, entry.val);
  1142. return;
  1143. }
  1144. if (p->swap_device) {
  1145. *dev = p->swap_device;
  1146. } else if (p->swap_file) {
  1147. *swapf = p->swap_file->d_inode;
  1148. } else {
  1149. printk(KERN_ERR "rw_swap_page: no swap file or devicen");
  1150. }
  1151. return;
  1152. }
  1153. /*
  1154.  * swap_device_lock prevents swap_map being freed. Don't grab an extra
  1155.  * reference on the swaphandle, it doesn't matter if it becomes unused.
  1156.  */
  1157. int valid_swaphandles(swp_entry_t entry, unsigned long *offset)
  1158. {
  1159. int ret = 0, i = 1 << page_cluster;
  1160. unsigned long toff;
  1161. struct swap_info_struct *swapdev = SWP_TYPE(entry) + swap_info;
  1162. if (!page_cluster) /* no readahead */
  1163. return 0;
  1164. toff = (SWP_OFFSET(entry) >> page_cluster) << page_cluster;
  1165. if (!toff) /* first page is swap header */
  1166. toff++, i--;
  1167. *offset = toff;
  1168. swap_device_lock(swapdev);
  1169. do {
  1170. /* Don't read-ahead past the end of the swap area */
  1171. if (toff >= swapdev->max)
  1172. break;
  1173. /* Don't read in free or bad pages */
  1174. if (!swapdev->swap_map[toff])
  1175. break;
  1176. if (swapdev->swap_map[toff] == SWAP_MAP_BAD)
  1177. break;
  1178. toff++;
  1179. ret++;
  1180. } while (--i);
  1181. swap_device_unlock(swapdev);
  1182. return ret;
  1183. }