swapfile.c
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:32k
源码类别:

嵌入式Linux

开发平台:

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