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

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  * Resizable virtual memory filesystem for Linux.
  3.  *
  4.  * Copyright (C) 2000 Linus Torvalds.
  5.  *  2000 Transmeta Corp.
  6.  *  2000-2001 Christoph Rohland
  7.  *  2000-2001 SAP AG
  8.  * 
  9.  * This file is released under the GPL.
  10.  */
  11. /*
  12.  * This virtual memory filesystem is heavily based on the ramfs. It
  13.  * extends ramfs by the ability to use swap and honor resource limits
  14.  * which makes it a completely usable filesystem.
  15.  */
  16. #include <linux/config.h>
  17. #include <linux/module.h>
  18. #include <linux/init.h>
  19. #include <linux/devfs_fs_kernel.h>
  20. #include <linux/fs.h>
  21. #include <linux/mm.h>
  22. #include <linux/file.h>
  23. #include <linux/swap.h>
  24. #include <linux/pagemap.h>
  25. #include <linux/string.h>
  26. #include <linux/locks.h>
  27. #include <linux/smp_lock.h>
  28. #include <asm/uaccess.h>
  29. /* This magic number is used in glibc for posix shared memory */
  30. #define TMPFS_MAGIC 0x01021994
  31. #define ENTRIES_PER_PAGE (PAGE_CACHE_SIZE/sizeof(unsigned long))
  32. #define SHMEM_SB(sb) (&sb->u.shmem_sb)
  33. static struct super_operations shmem_ops;
  34. static struct address_space_operations shmem_aops;
  35. static struct file_operations shmem_file_operations;
  36. static struct inode_operations shmem_inode_operations;
  37. static struct file_operations shmem_dir_operations;
  38. static struct inode_operations shmem_dir_inode_operations;
  39. static struct vm_operations_struct shmem_vm_ops;
  40. LIST_HEAD (shmem_inodes);
  41. static spinlock_t shmem_ilock = SPIN_LOCK_UNLOCKED;
  42. atomic_t shmem_nrpages = ATOMIC_INIT(0); /* Not used right now */
  43. #define BLOCKS_PER_PAGE (PAGE_CACHE_SIZE/512)
  44. /*
  45.  * shmem_recalc_inode - recalculate the size of an inode
  46.  *
  47.  * @inode: inode to recalc
  48.  * @swap:  additional swap pages freed externally
  49.  *
  50.  * We have to calculate the free blocks since the mm can drop pages
  51.  * behind our back
  52.  *
  53.  * But we know that normally
  54.  * inodes->i_blocks/BLOCKS_PER_PAGE == 
  55.  *  inode->i_mapping->nrpages + info->swapped
  56.  *
  57.  * So the mm freed 
  58.  * inodes->i_blocks/BLOCKS_PER_PAGE - 
  59.  *  (inode->i_mapping->nrpages + info->swapped)
  60.  *
  61.  * It has to be called with the spinlock held.
  62.  */
  63. static void shmem_recalc_inode(struct inode * inode)
  64. {
  65. unsigned long freed;
  66. freed = (inode->i_blocks/BLOCKS_PER_PAGE) -
  67. (inode->i_mapping->nrpages + SHMEM_I(inode)->swapped);
  68. if (freed){
  69. struct shmem_sb_info * sbinfo = SHMEM_SB(inode->i_sb);
  70. inode->i_blocks -= freed*BLOCKS_PER_PAGE;
  71. spin_lock (&sbinfo->stat_lock);
  72. sbinfo->free_blocks += freed;
  73. spin_unlock (&sbinfo->stat_lock);
  74. }
  75. }
  76. /*
  77.  * shmem_swp_entry - find the swap vector position in the info structure
  78.  *
  79.  * @info:  info structure for the inode
  80.  * @index: index of the page to find
  81.  * @page:  optional page to add to the structure. Has to be preset to
  82.  *         all zeros
  83.  *
  84.  * If there is no space allocated yet it will return -ENOMEM when
  85.  * page == 0 else it will use the page for the needed block.
  86.  *
  87.  * returns -EFBIG if the index is too big.
  88.  *
  89.  *
  90.  * The swap vector is organized the following way:
  91.  *
  92.  * There are SHMEM_NR_DIRECT entries directly stored in the
  93.  * shmem_inode_info structure. So small files do not need an addional
  94.  * allocation.
  95.  *
  96.  * For pages with index > SHMEM_NR_DIRECT there is the pointer
  97.  * i_indirect which points to a page which holds in the first half
  98.  * doubly indirect blocks, in the second half triple indirect blocks:
  99.  *
  100.  * For an artificial ENTRIES_PER_PAGE = 4 this would lead to the
  101.  * following layout (for SHMEM_NR_DIRECT == 16):
  102.  *
  103.  * i_indirect -> dir --> 16-19
  104.  *        |      +-> 20-23
  105.  *        |
  106.  *        +-->dir2 --> 24-27
  107.  *        |        +-> 28-31
  108.  *        |        +-> 32-35
  109.  *        |        +-> 36-39
  110.  *        |
  111.  *        +-->dir3 --> 40-43
  112.  *                 +-> 44-47
  113.  *                +-> 48-51
  114.  *                +-> 52-55
  115.  */
  116. #define SHMEM_MAX_BLOCKS (SHMEM_NR_DIRECT + ENTRIES_PER_PAGE * ENTRIES_PER_PAGE/2*(ENTRIES_PER_PAGE+1))
  117. static swp_entry_t * shmem_swp_entry (struct shmem_inode_info *info, unsigned long index, unsigned long page) 
  118. {
  119. unsigned long offset;
  120. void **dir;
  121. if (index < SHMEM_NR_DIRECT)
  122. return info->i_direct+index;
  123. index -= SHMEM_NR_DIRECT;
  124. offset = index % ENTRIES_PER_PAGE;
  125. index /= ENTRIES_PER_PAGE;
  126. if (!info->i_indirect) {
  127. info->i_indirect = (void *) page;
  128. return ERR_PTR(-ENOMEM);
  129. }
  130. dir = info->i_indirect + index;
  131. if (index >= ENTRIES_PER_PAGE/2) {
  132. index -= ENTRIES_PER_PAGE/2;
  133. dir = info->i_indirect + ENTRIES_PER_PAGE/2 
  134. + index/ENTRIES_PER_PAGE;
  135. index %= ENTRIES_PER_PAGE;
  136. if(!*dir) {
  137. *dir = (void *) page;
  138. /* We return since we will need another page
  139.                            in the next step */
  140. return ERR_PTR(-ENOMEM);
  141. }
  142. dir = ((void **)*dir) + index;
  143. }
  144. if (!*dir) {
  145. if (!page)
  146. return ERR_PTR(-ENOMEM);
  147. *dir = (void *)page;
  148. }
  149. return ((swp_entry_t *)*dir) + offset;
  150. }
  151. /*
  152.  * shmem_alloc_entry - get the position of the swap entry for the
  153.  *                     page. If it does not exist allocate the entry
  154.  *
  155.  * @info: info structure for the inode
  156.  * @index: index of the page to find
  157.  */
  158. static inline swp_entry_t * shmem_alloc_entry (struct shmem_inode_info *info, unsigned long index)
  159. {
  160. unsigned long page = 0;
  161. swp_entry_t * res;
  162. if (index >= SHMEM_MAX_BLOCKS)
  163. return ERR_PTR(-EFBIG);
  164. if (info->next_index <= index)
  165. info->next_index = index + 1;
  166. while ((res = shmem_swp_entry(info,index,page)) == ERR_PTR(-ENOMEM)) {
  167. page = get_zeroed_page(GFP_USER);
  168. if (!page)
  169. break;
  170. }
  171. return res;
  172. }
  173. /*
  174.  * shmem_free_swp - free some swap entries in a directory
  175.  *
  176.  * @dir:   pointer to the directory
  177.  * @count: number of entries to scan
  178.  */
  179. static int shmem_free_swp(swp_entry_t *dir, unsigned int count)
  180. {
  181. swp_entry_t *ptr, entry;
  182. int freed = 0;
  183. for (ptr = dir; ptr < dir + count; ptr++) {
  184. if (!ptr->val)
  185. continue;
  186. entry = *ptr;
  187. *ptr = (swp_entry_t){0};
  188. freed++;
  189. free_swap_and_cache(entry);
  190. }
  191. return freed;
  192. }
  193. /*
  194.  * shmem_truncate_direct - free the swap entries of a whole doubly
  195.  *                         indirect block
  196.  *
  197.  * @dir: pointer to the pointer to the block
  198.  * @start: offset to start from (in pages)
  199.  * @len: how many pages are stored in this block
  200.  *
  201.  * Returns the number of freed swap entries.
  202.  */
  203. static inline unsigned long 
  204. shmem_truncate_direct(swp_entry_t *** dir, unsigned long start, unsigned long len) {
  205. swp_entry_t **last, **ptr;
  206. unsigned long off, freed = 0;
  207.  
  208. if (!*dir)
  209. return 0;
  210. last = *dir + (len + ENTRIES_PER_PAGE-1) / ENTRIES_PER_PAGE;
  211. off = start % ENTRIES_PER_PAGE;
  212. for (ptr = *dir + start/ENTRIES_PER_PAGE; ptr < last; ptr++) {
  213. if (!*ptr) {
  214. off = 0;
  215. continue;
  216. }
  217. if (!off) {
  218. freed += shmem_free_swp(*ptr, ENTRIES_PER_PAGE);
  219. free_page ((unsigned long) *ptr);
  220. *ptr = 0;
  221. } else {
  222. freed += shmem_free_swp(*ptr+off,ENTRIES_PER_PAGE-off);
  223. off = 0;
  224. }
  225. }
  226. if (!start) {
  227. free_page((unsigned long) *dir);
  228. *dir = 0;
  229. }
  230. return freed;
  231. }
  232. /*
  233.  * shmem_truncate_indirect - truncate an inode
  234.  *
  235.  * @info:  the info structure of the inode
  236.  * @index: the index to truncate
  237.  *
  238.  * This function locates the last doubly indirect block and calls
  239.  * then shmem_truncate_direct to do the real work
  240.  */
  241. static inline unsigned long
  242. shmem_truncate_indirect(struct shmem_inode_info *info, unsigned long index)
  243. {
  244. swp_entry_t ***base;
  245. unsigned long baseidx, len, start;
  246. unsigned long max = info->next_index-1;
  247. if (max < SHMEM_NR_DIRECT) {
  248. info->next_index = index;
  249. return shmem_free_swp(info->i_direct + index,
  250.       SHMEM_NR_DIRECT - index);
  251. }
  252. if (max < ENTRIES_PER_PAGE * ENTRIES_PER_PAGE/2 + SHMEM_NR_DIRECT) {
  253. max -= SHMEM_NR_DIRECT;
  254. base = (swp_entry_t ***) &info->i_indirect;
  255. baseidx = SHMEM_NR_DIRECT;
  256. len = max+1;
  257. } else {
  258. max -= ENTRIES_PER_PAGE*ENTRIES_PER_PAGE/2+SHMEM_NR_DIRECT;
  259. if (max >= ENTRIES_PER_PAGE*ENTRIES_PER_PAGE*ENTRIES_PER_PAGE/2)
  260. BUG();
  261. baseidx = max & ~(ENTRIES_PER_PAGE*ENTRIES_PER_PAGE-1);
  262. base = (swp_entry_t ***) info->i_indirect + ENTRIES_PER_PAGE/2 + baseidx/ENTRIES_PER_PAGE/ENTRIES_PER_PAGE ;
  263. len = max - baseidx + 1;
  264. baseidx += ENTRIES_PER_PAGE*ENTRIES_PER_PAGE/2+SHMEM_NR_DIRECT;
  265. }
  266. if (index > baseidx) {
  267. info->next_index = index;
  268. start = index - baseidx;
  269. } else {
  270. info->next_index = baseidx;
  271. start = 0;
  272. }
  273. return shmem_truncate_direct(base, start, len);
  274. }
  275. static void shmem_truncate (struct inode * inode)
  276. {
  277. unsigned long index;
  278. unsigned long freed = 0;
  279. struct shmem_inode_info * info = SHMEM_I(inode);
  280. down(&info->sem);
  281. inode->i_ctime = inode->i_mtime = CURRENT_TIME;
  282. spin_lock (&info->lock);
  283. index = (inode->i_size + PAGE_CACHE_SIZE - 1) >> PAGE_CACHE_SHIFT;
  284. while (index < info->next_index) 
  285. freed += shmem_truncate_indirect(info, index);
  286. info->swapped -= freed;
  287. shmem_recalc_inode(inode);
  288. spin_unlock (&info->lock);
  289. up(&info->sem);
  290. }
  291. static void shmem_delete_inode(struct inode * inode)
  292. {
  293. struct shmem_sb_info *sbinfo = SHMEM_SB(inode->i_sb);
  294. inode->i_size = 0;
  295. if (inode->i_op->truncate == shmem_truncate){ 
  296. spin_lock (&shmem_ilock);
  297. list_del (&SHMEM_I(inode)->list);
  298. spin_unlock (&shmem_ilock);
  299. shmem_truncate (inode);
  300. }
  301. spin_lock (&sbinfo->stat_lock);
  302. sbinfo->free_inodes++;
  303. spin_unlock (&sbinfo->stat_lock);
  304. clear_inode(inode);
  305. }
  306. static int shmem_clear_swp (swp_entry_t entry, swp_entry_t *ptr, int size) {
  307. swp_entry_t *test;
  308. for (test = ptr; test < ptr + size; test++) {
  309. if (test->val == entry.val) {
  310. swap_free (entry);
  311. *test = (swp_entry_t) {0};
  312. return test - ptr;
  313. }
  314. }
  315. return -1;
  316. }
  317. static int shmem_unuse_inode (struct shmem_inode_info *info, swp_entry_t entry, struct page *page)
  318. {
  319. swp_entry_t *ptr;
  320. unsigned long idx;
  321. int offset;
  322. idx = 0;
  323. spin_lock (&info->lock);
  324. offset = shmem_clear_swp (entry, info->i_direct, SHMEM_NR_DIRECT);
  325. if (offset >= 0)
  326. goto found;
  327. for (idx = SHMEM_NR_DIRECT; idx < info->next_index; 
  328.      idx += ENTRIES_PER_PAGE) {
  329. ptr = shmem_swp_entry(info, idx, 0);
  330. if (IS_ERR(ptr))
  331. continue;
  332. offset = shmem_clear_swp (entry, ptr, ENTRIES_PER_PAGE);
  333. if (offset >= 0)
  334. goto found;
  335. }
  336. spin_unlock (&info->lock);
  337. return 0;
  338. found:
  339. delete_from_swap_cache(page);
  340. add_to_page_cache(page, info->inode->i_mapping, offset + idx);
  341. SetPageDirty(page);
  342. SetPageUptodate(page);
  343. info->swapped--;
  344. spin_unlock(&info->lock);
  345. return 1;
  346. }
  347. /*
  348.  * unuse_shmem() search for an eventually swapped out shmem page.
  349.  */
  350. void shmem_unuse(swp_entry_t entry, struct page *page)
  351. {
  352. struct list_head *p;
  353. struct shmem_inode_info * info;
  354. spin_lock (&shmem_ilock);
  355. list_for_each(p, &shmem_inodes) {
  356. info = list_entry(p, struct shmem_inode_info, list);
  357. if (shmem_unuse_inode(info, entry, page))
  358. break;
  359. }
  360. spin_unlock (&shmem_ilock);
  361. }
  362. /*
  363.  * Move the page from the page cache to the swap cache.
  364.  *
  365.  * The page lock prevents multiple occurences of shmem_writepage at
  366.  * once.  We still need to guard against racing with
  367.  * shmem_getpage_locked().  
  368.  */
  369. static int shmem_writepage(struct page * page)
  370. {
  371. struct shmem_inode_info *info;
  372. swp_entry_t *entry, swap;
  373. struct address_space *mapping;
  374. unsigned long index;
  375. struct inode *inode;
  376. if (!PageLocked(page))
  377. BUG();
  378. if (!PageLaunder(page))
  379. return fail_writepage(page);
  380. mapping = page->mapping;
  381. index = page->index;
  382. inode = mapping->host;
  383. info = SHMEM_I(inode);
  384. if (info->locked)
  385. return fail_writepage(page);
  386. getswap:
  387. swap = get_swap_page();
  388. if (!swap.val)
  389. return fail_writepage(page);
  390. spin_lock(&info->lock);
  391. entry = shmem_swp_entry(info, index, 0);
  392. if (IS_ERR(entry)) /* this had been allocated on page allocation */
  393. BUG();
  394. shmem_recalc_inode(inode);
  395. if (entry->val)
  396. BUG();
  397. /* Remove it from the page cache */
  398. remove_inode_page(page);
  399. page_cache_release(page);
  400. /* Add it to the swap cache */
  401. if (add_to_swap_cache(page, swap) != 0) {
  402. /*
  403.  * Raced with "speculative" read_swap_cache_async.
  404.  * Add page back to page cache, unref swap, try again.
  405.  */
  406. add_to_page_cache_locked(page, mapping, index);
  407. spin_unlock(&info->lock);
  408. swap_free(swap);
  409. goto getswap;
  410. }
  411. *entry = swap;
  412. info->swapped++;
  413. spin_unlock(&info->lock);
  414. SetPageUptodate(page);
  415. set_page_dirty(page);
  416. UnlockPage(page);
  417. return 0;
  418. }
  419. /*
  420.  * shmem_getpage_locked - either get the page from swap or allocate a new one
  421.  *
  422.  * If we allocate a new one we do not mark it dirty. That's up to the
  423.  * vm. If we swap it in we mark it dirty since we also free the swap
  424.  * entry since a page cannot live in both the swap and page cache
  425.  *
  426.  * Called with the inode locked, so it cannot race with itself, but we
  427.  * still need to guard against racing with shm_writepage(), which might
  428.  * be trying to move the page to the swap cache as we run.
  429.  */
  430. static struct page * shmem_getpage_locked(struct shmem_inode_info *info, struct inode * inode, unsigned long idx)
  431. {
  432. struct address_space * mapping = inode->i_mapping;
  433. struct shmem_sb_info *sbinfo;
  434. struct page * page;
  435. swp_entry_t *entry;
  436. repeat:
  437. page = find_lock_page(mapping, idx);
  438. if (page)
  439. return page;
  440. entry = shmem_alloc_entry (info, idx);
  441. if (IS_ERR(entry))
  442. return (void *)entry;
  443. spin_lock (&info->lock);
  444. /* The shmem_alloc_entry() call may have blocked, and
  445.  * shmem_writepage may have been moving a page between the page
  446.  * cache and swap cache.  We need to recheck the page cache
  447.  * under the protection of the info->lock spinlock. */
  448. page = find_get_page(mapping, idx);
  449. if (page) {
  450. if (TryLockPage(page))
  451. goto wait_retry;
  452. spin_unlock (&info->lock);
  453. return page;
  454. }
  455. shmem_recalc_inode(inode);
  456. if (entry->val) {
  457. unsigned long flags;
  458. /* Look it up and read it in.. */
  459. page = find_get_page(&swapper_space, entry->val);
  460. if (!page) {
  461. swp_entry_t swap = *entry;
  462. spin_unlock (&info->lock);
  463. swapin_readahead(*entry);
  464. page = read_swap_cache_async(*entry);
  465. if (!page) {
  466. if (entry->val != swap.val)
  467. goto repeat;
  468. return ERR_PTR(-ENOMEM);
  469. }
  470. wait_on_page(page);
  471. if (!Page_Uptodate(page) && entry->val == swap.val) {
  472. page_cache_release(page);
  473. return ERR_PTR(-EIO);
  474. }
  475. /* Too bad we can't trust this page, because we
  476.  * dropped the info->lock spinlock */
  477. page_cache_release(page);
  478. goto repeat;
  479. }
  480. /* We have to this with page locked to prevent races */
  481. if (TryLockPage(page)) 
  482. goto wait_retry;
  483. swap_free(*entry);
  484. *entry = (swp_entry_t) {0};
  485. delete_from_swap_cache(page);
  486. flags = page->flags & ~((1 << PG_uptodate) | (1 << PG_error) | (1 << PG_referenced) | (1 << PG_arch_1));
  487. page->flags = flags | (1 << PG_dirty);
  488. add_to_page_cache_locked(page, mapping, idx);
  489. info->swapped--;
  490. spin_unlock (&info->lock);
  491. } else {
  492. sbinfo = SHMEM_SB(inode->i_sb);
  493. spin_unlock (&info->lock);
  494. spin_lock (&sbinfo->stat_lock);
  495. if (sbinfo->free_blocks == 0)
  496. goto no_space;
  497. sbinfo->free_blocks--;
  498. spin_unlock (&sbinfo->stat_lock);
  499. /* Ok, get a new page.  We don't have to worry about the
  500.  * info->lock spinlock here: we cannot race against
  501.  * shm_writepage because we have already verified that
  502.  * there is no page present either in memory or in the
  503.  * swap cache, so we are guaranteed to be populating a
  504.  * new shm entry.  The inode semaphore we already hold
  505.  * is enough to make this atomic. */
  506. page = page_cache_alloc(mapping);
  507. if (!page)
  508. return ERR_PTR(-ENOMEM);
  509. clear_highpage(page);
  510. inode->i_blocks += BLOCKS_PER_PAGE;
  511. add_to_page_cache (page, mapping, idx);
  512. }
  513. /* We have the page */
  514. SetPageUptodate(page);
  515. return page;
  516. no_space:
  517. spin_unlock (&sbinfo->stat_lock);
  518. return ERR_PTR(-ENOSPC);
  519. wait_retry:
  520. spin_unlock (&info->lock);
  521. wait_on_page(page);
  522. page_cache_release(page);
  523. goto repeat;
  524. }
  525. static int shmem_getpage(struct inode * inode, unsigned long idx, struct page **ptr)
  526. {
  527. struct shmem_inode_info *info = SHMEM_I(inode);
  528. int error;
  529. down (&info->sem);
  530. *ptr = ERR_PTR(-EFAULT);
  531. if (inode->i_size <= (loff_t) idx * PAGE_CACHE_SIZE)
  532. goto failed;
  533. *ptr = shmem_getpage_locked(info, inode, idx);
  534. if (IS_ERR (*ptr))
  535. goto failed;
  536. UnlockPage(*ptr);
  537. up (&info->sem);
  538. return 0;
  539. failed:
  540. up (&info->sem);
  541. error = PTR_ERR(*ptr);
  542. *ptr = NOPAGE_SIGBUS;
  543. if (error == -ENOMEM)
  544. *ptr = NOPAGE_OOM;
  545. return error;
  546. }
  547. struct page * shmem_nopage(struct vm_area_struct * vma, unsigned long address, int unused)
  548. {
  549. struct page * page;
  550. unsigned int idx;
  551. struct inode * inode = vma->vm_file->f_dentry->d_inode;
  552. idx = (address - vma->vm_start) >> PAGE_CACHE_SHIFT;
  553. idx += vma->vm_pgoff;
  554. if (shmem_getpage(inode, idx, &page))
  555. return page;
  556. flush_page_to_ram(page);
  557. return(page);
  558. }
  559. void shmem_lock(struct file * file, int lock)
  560. {
  561. struct inode * inode = file->f_dentry->d_inode;
  562. struct shmem_inode_info * info = SHMEM_I(inode);
  563. down(&info->sem);
  564. info->locked = lock;
  565. up(&info->sem);
  566. }
  567. static int shmem_mmap(struct file * file, struct vm_area_struct * vma)
  568. {
  569. struct vm_operations_struct * ops;
  570. struct inode *inode = file->f_dentry->d_inode;
  571. ops = &shmem_vm_ops;
  572. if (!inode->i_sb || !S_ISREG(inode->i_mode))
  573. return -EACCES;
  574. UPDATE_ATIME(inode);
  575. vma->vm_ops = ops;
  576. return 0;
  577. }
  578. struct inode *shmem_get_inode(struct super_block *sb, int mode, int dev)
  579. {
  580. struct inode * inode;
  581. struct shmem_inode_info *info;
  582. struct shmem_sb_info *sbinfo = SHMEM_SB(sb);
  583. spin_lock (&sbinfo->stat_lock);
  584. if (!sbinfo->free_inodes) {
  585. spin_unlock (&sbinfo->stat_lock);
  586. return NULL;
  587. }
  588. sbinfo->free_inodes--;
  589. spin_unlock (&sbinfo->stat_lock);
  590. inode = new_inode(sb);
  591. if (inode) {
  592. inode->i_mode = mode;
  593. inode->i_uid = current->fsuid;
  594. inode->i_gid = current->fsgid;
  595. inode->i_blksize = PAGE_CACHE_SIZE;
  596. inode->i_blocks = 0;
  597. inode->i_rdev = NODEV;
  598. inode->i_mapping->a_ops = &shmem_aops;
  599. inode->i_atime = inode->i_mtime = inode->i_ctime = CURRENT_TIME;
  600. info = SHMEM_I(inode);
  601. info->inode = inode;
  602. spin_lock_init (&info->lock);
  603. sema_init (&info->sem, 1);
  604. switch (mode & S_IFMT) {
  605. default:
  606. init_special_inode(inode, mode, dev);
  607. break;
  608. case S_IFREG:
  609. inode->i_op = &shmem_inode_operations;
  610. inode->i_fop = &shmem_file_operations;
  611. spin_lock (&shmem_ilock);
  612. list_add (&SHMEM_I(inode)->list, &shmem_inodes);
  613. spin_unlock (&shmem_ilock);
  614. break;
  615. case S_IFDIR:
  616. inode->i_nlink++;
  617. inode->i_op = &shmem_dir_inode_operations;
  618. inode->i_fop = &shmem_dir_operations;
  619. break;
  620. case S_IFLNK:
  621. break;
  622. }
  623. }
  624. return inode;
  625. }
  626. static int shmem_set_size(struct shmem_sb_info *info,
  627.   unsigned long max_blocks, unsigned long max_inodes)
  628. {
  629. int error;
  630. unsigned long blocks, inodes;
  631. spin_lock(&info->stat_lock);
  632. blocks = info->max_blocks - info->free_blocks;
  633. inodes = info->max_inodes - info->free_inodes;
  634. error = -EINVAL;
  635. if (max_blocks < blocks)
  636. goto out;
  637. if (max_inodes < inodes)
  638. goto out;
  639. error = 0;
  640. info->max_blocks  = max_blocks;
  641. info->free_blocks = max_blocks - blocks;
  642. info->max_inodes  = max_inodes;
  643. info->free_inodes = max_inodes - inodes;
  644. out:
  645. spin_unlock(&info->stat_lock);
  646. return error;
  647. }
  648. #ifdef CONFIG_TMPFS
  649. static struct inode_operations shmem_symlink_inode_operations;
  650. static struct inode_operations shmem_symlink_inline_operations;
  651. static ssize_t
  652. shmem_file_write(struct file *file,const char *buf,size_t count,loff_t *ppos)
  653. {
  654. struct inode *inode = file->f_dentry->d_inode; 
  655. struct shmem_inode_info *info;
  656. unsigned long limit = current->rlim[RLIMIT_FSIZE].rlim_cur;
  657. loff_t pos;
  658. struct page *page;
  659. unsigned long written;
  660. long status;
  661. int err;
  662. if ((ssize_t) count < 0)
  663. return -EINVAL;
  664. if (!access_ok(VERIFY_READ, buf, count))
  665. return -EFAULT;
  666. down(&inode->i_sem);
  667. pos = *ppos;
  668. err = -EINVAL;
  669. if (pos < 0)
  670. goto out;
  671. err = file->f_error;
  672. if (err) {
  673. file->f_error = 0;
  674. goto out;
  675. }
  676. written = 0;
  677. if (file->f_flags & O_APPEND)
  678. pos = inode->i_size;
  679. /*
  680.  * Check whether we've reached the file size limit.
  681.  */
  682. err = -EFBIG;
  683. if (limit != RLIM_INFINITY) {
  684. if (pos >= limit) {
  685. send_sig(SIGXFSZ, current, 0);
  686. goto out;
  687. }
  688. if (count > limit - pos) {
  689. send_sig(SIGXFSZ, current, 0);
  690. count = limit - pos;
  691. }
  692. }
  693. status = 0;
  694. if (count) {
  695. remove_suid(inode);
  696. inode->i_ctime = inode->i_mtime = CURRENT_TIME;
  697. }
  698. while (count) {
  699. unsigned long bytes, index, offset;
  700. char *kaddr;
  701. /*
  702.  * Try to find the page in the cache. If it isn't there,
  703.  * allocate a free page.
  704.  */
  705. offset = (pos & (PAGE_CACHE_SIZE -1)); /* Within page */
  706. index = pos >> PAGE_CACHE_SHIFT;
  707. bytes = PAGE_CACHE_SIZE - offset;
  708. if (bytes > count) {
  709. bytes = count;
  710. }
  711. /*
  712.  * Bring in the user page that we will copy from _first_.
  713.  * Otherwise there's a nasty deadlock on copying from the
  714.  * same page as we're writing to, without it being marked
  715.  * up-to-date.
  716.  */
  717. { volatile unsigned char dummy;
  718. __get_user(dummy, buf);
  719. __get_user(dummy, buf+bytes-1);
  720. }
  721. info = SHMEM_I(inode);
  722. down (&info->sem);
  723. page = shmem_getpage_locked(info, inode, index);
  724. up (&info->sem);
  725. status = PTR_ERR(page);
  726. if (IS_ERR(page))
  727. break;
  728. /* We have exclusive IO access to the page.. */
  729. if (!PageLocked(page)) {
  730. PAGE_BUG(page);
  731. }
  732. kaddr = kmap(page);
  733. status = copy_from_user(kaddr+offset, buf, bytes);
  734. kunmap(page);
  735. if (status)
  736. goto fail_write;
  737. flush_dcache_page(page);
  738. if (bytes > 0) {
  739. SetPageDirty(page);
  740. written += bytes;
  741. count -= bytes;
  742. pos += bytes;
  743. buf += bytes;
  744. if (pos > inode->i_size) 
  745. inode->i_size = pos;
  746. }
  747. unlock:
  748. /* Mark it unlocked again and drop the page.. */
  749. UnlockPage(page);
  750. page_cache_release(page);
  751. if (status < 0)
  752. break;
  753. }
  754. *ppos = pos;
  755. err = written ? written : status;
  756. out:
  757. up(&inode->i_sem);
  758. return err;
  759. fail_write:
  760. status = -EFAULT;
  761. ClearPageUptodate(page);
  762. kunmap(page);
  763. goto unlock;
  764. }
  765. static void do_shmem_file_read(struct file * filp, loff_t *ppos, read_descriptor_t * desc)
  766. {
  767. struct inode *inode = filp->f_dentry->d_inode;
  768. struct address_space *mapping = inode->i_mapping;
  769. unsigned long index, offset;
  770. int nr = 1;
  771. index = *ppos >> PAGE_CACHE_SHIFT;
  772. offset = *ppos & ~PAGE_CACHE_MASK;
  773. while (nr && desc->count) {
  774. struct page *page;
  775. unsigned long end_index, nr;
  776. end_index = inode->i_size >> PAGE_CACHE_SHIFT;
  777. if (index > end_index)
  778. break;
  779. nr = PAGE_CACHE_SIZE;
  780. if (index == end_index) {
  781. nr = inode->i_size & ~PAGE_CACHE_MASK;
  782. if (nr <= offset)
  783. break;
  784. }
  785. nr = nr - offset;
  786. if ((desc->error = shmem_getpage(inode, index, &page)))
  787. break;
  788. if (mapping->i_mmap_shared != NULL)
  789. flush_dcache_page(page);
  790. /*
  791.  * Ok, we have the page, and it's up-to-date, so
  792.  * now we can copy it to user space...
  793.  *
  794.  * The actor routine returns how many bytes were actually used..
  795.  * NOTE! This may not be the same as how much of a user buffer
  796.  * we filled up (we may be padding etc), so we can only update
  797.  * "pos" here (the actor routine has to update the user buffer
  798.  * pointers and the remaining count).
  799.  */
  800. nr = file_read_actor(desc, page, offset, nr);
  801. offset += nr;
  802. index += offset >> PAGE_CACHE_SHIFT;
  803. offset &= ~PAGE_CACHE_MASK;
  804. page_cache_release(page);
  805. }
  806. *ppos = ((loff_t) index << PAGE_CACHE_SHIFT) + offset;
  807. UPDATE_ATIME(inode);
  808. }
  809. static ssize_t shmem_file_read(struct file * filp, char * buf, size_t count, loff_t *ppos)
  810. {
  811. ssize_t retval;
  812. retval = -EFAULT;
  813. if (access_ok(VERIFY_WRITE, buf, count)) {
  814. retval = 0;
  815. if (count) {
  816. read_descriptor_t desc;
  817. desc.written = 0;
  818. desc.count = count;
  819. desc.buf = buf;
  820. desc.error = 0;
  821. do_shmem_file_read(filp, ppos, &desc);
  822. retval = desc.written;
  823. if (!retval)
  824. retval = desc.error;
  825. }
  826. }
  827. return retval;
  828. }
  829. static int shmem_statfs(struct super_block *sb, struct statfs *buf)
  830. {
  831. struct shmem_sb_info *sbinfo = SHMEM_SB(sb);
  832. buf->f_type = TMPFS_MAGIC;
  833. buf->f_bsize = PAGE_CACHE_SIZE;
  834. spin_lock (&sbinfo->stat_lock);
  835. buf->f_blocks = sbinfo->max_blocks;
  836. buf->f_bavail = buf->f_bfree = sbinfo->free_blocks;
  837. buf->f_files = sbinfo->max_inodes;
  838. buf->f_ffree = sbinfo->free_inodes;
  839. spin_unlock (&sbinfo->stat_lock);
  840. buf->f_namelen = 255;
  841. return 0;
  842. }
  843. /*
  844.  * Lookup the data. This is trivial - if the dentry didn't already
  845.  * exist, we know it is negative.
  846.  */
  847. static struct dentry * shmem_lookup(struct inode *dir, struct dentry *dentry)
  848. {
  849. d_add(dentry, NULL);
  850. return NULL;
  851. }
  852. /*
  853.  * File creation. Allocate an inode, and we're done..
  854.  */
  855. static int shmem_mknod(struct inode *dir, struct dentry *dentry, int mode, int dev)
  856. {
  857. struct inode * inode = shmem_get_inode(dir->i_sb, mode, dev);
  858. int error = -ENOSPC;
  859. dir->i_ctime = dir->i_mtime = CURRENT_TIME;
  860. if (inode) {
  861. d_instantiate(dentry, inode);
  862. dget(dentry); /* Extra count - pin the dentry in core */
  863. error = 0;
  864. }
  865. return error;
  866. }
  867. static int shmem_mkdir(struct inode * dir, struct dentry * dentry, int mode)
  868. {
  869. int error;
  870. if ((error = shmem_mknod(dir, dentry, mode | S_IFDIR, 0)))
  871. return error;
  872. dir->i_nlink++;
  873. return 0;
  874. }
  875. static int shmem_create(struct inode *dir, struct dentry *dentry, int mode)
  876. {
  877. return shmem_mknod(dir, dentry, mode | S_IFREG, 0);
  878. }
  879. /*
  880.  * Link a file..
  881.  */
  882. static int shmem_link(struct dentry *old_dentry, struct inode * dir, struct dentry * dentry)
  883. {
  884. struct inode *inode = old_dentry->d_inode;
  885. if (S_ISDIR(inode->i_mode))
  886. return -EPERM;
  887. inode->i_ctime = dir->i_ctime = dir->i_mtime = CURRENT_TIME;
  888. inode->i_nlink++;
  889. atomic_inc(&inode->i_count); /* New dentry reference */
  890. dget(dentry); /* Extra pinning count for the created dentry */
  891. d_instantiate(dentry, inode);
  892. return 0;
  893. }
  894. static inline int shmem_positive(struct dentry *dentry)
  895. {
  896. return dentry->d_inode && !d_unhashed(dentry);
  897. }
  898. /*
  899.  * Check that a directory is empty (this works
  900.  * for regular files too, they'll just always be
  901.  * considered empty..).
  902.  *
  903.  * Note that an empty directory can still have
  904.  * children, they just all have to be negative..
  905.  */
  906. static int shmem_empty(struct dentry *dentry)
  907. {
  908. struct list_head *list;
  909. spin_lock(&dcache_lock);
  910. list = dentry->d_subdirs.next;
  911. while (list != &dentry->d_subdirs) {
  912. struct dentry *de = list_entry(list, struct dentry, d_child);
  913. if (shmem_positive(de)) {
  914. spin_unlock(&dcache_lock);
  915. return 0;
  916. }
  917. list = list->next;
  918. }
  919. spin_unlock(&dcache_lock);
  920. return 1;
  921. }
  922. static int shmem_unlink(struct inode * dir, struct dentry *dentry)
  923. {
  924. struct inode *inode = dentry->d_inode;
  925. inode->i_ctime = dir->i_ctime = dir->i_mtime = CURRENT_TIME;
  926. inode->i_nlink--;
  927. dput(dentry); /* Undo the count from "create" - this does all the work */
  928. return 0;
  929. }
  930. static int shmem_rmdir(struct inode * dir, struct dentry *dentry)
  931. {
  932. if (!shmem_empty(dentry))
  933. return -ENOTEMPTY;
  934. dir->i_nlink--;
  935. return shmem_unlink(dir, dentry);
  936. }
  937. /*
  938.  * The VFS layer already does all the dentry stuff for rename,
  939.  * we just have to decrement the usage count for the target if
  940.  * it exists so that the VFS layer correctly free's it when it
  941.  * gets overwritten.
  942.  */
  943. static int shmem_rename(struct inode * old_dir, struct dentry *old_dentry, struct inode * new_dir,struct dentry *new_dentry)
  944. {
  945. int error = -ENOTEMPTY;
  946. if (shmem_empty(new_dentry)) {
  947. struct inode *inode = new_dentry->d_inode;
  948. if (inode) {
  949. inode->i_ctime = CURRENT_TIME;
  950. inode->i_nlink--;
  951. dput(new_dentry);
  952. }
  953. error = 0;
  954. old_dentry->d_inode->i_ctime = old_dir->i_ctime = old_dir->i_mtime = CURRENT_TIME;
  955. }
  956. return error;
  957. }
  958. static int shmem_symlink(struct inode * dir, struct dentry *dentry, const char * symname)
  959. {
  960. int error;
  961. int len;
  962. struct inode *inode;
  963. struct page *page;
  964. char *kaddr;
  965. struct shmem_inode_info * info;
  966. error = shmem_mknod(dir, dentry, S_IFLNK | S_IRWXUGO, 0);
  967. if (error)
  968. return error;
  969. len = strlen(symname) + 1;
  970. if (len > PAGE_CACHE_SIZE)
  971. return -ENAMETOOLONG;
  972. inode = dentry->d_inode;
  973. info = SHMEM_I(inode);
  974. inode->i_size = len-1;
  975. if (len <= sizeof(struct shmem_inode_info)) {
  976. /* do it inline */
  977. memcpy(info, symname, len);
  978. inode->i_op = &shmem_symlink_inline_operations;
  979. } else {
  980. spin_lock (&shmem_ilock);
  981. list_add (&info->list, &shmem_inodes);
  982. spin_unlock (&shmem_ilock);
  983. down(&info->sem);
  984. page = shmem_getpage_locked(info, inode, 0);
  985. if (IS_ERR(page)) {
  986. up(&info->sem);
  987. return PTR_ERR(page);
  988. }
  989. kaddr = kmap(page);
  990. memcpy(kaddr, symname, len);
  991. kunmap(page);
  992. SetPageDirty(page);
  993. UnlockPage(page);
  994. page_cache_release(page);
  995. up(&info->sem);
  996. inode->i_op = &shmem_symlink_inode_operations;
  997. }
  998. dir->i_ctime = dir->i_mtime = CURRENT_TIME;
  999. return 0;
  1000. }
  1001. static int shmem_readlink_inline(struct dentry *dentry, char *buffer, int buflen)
  1002. {
  1003. return vfs_readlink(dentry,buffer,buflen, (const char *)SHMEM_I(dentry->d_inode));
  1004. }
  1005. static int shmem_follow_link_inline(struct dentry *dentry, struct nameidata *nd)
  1006. {
  1007. return vfs_follow_link(nd, (const char *)SHMEM_I(dentry->d_inode));
  1008. }
  1009. static int shmem_readlink(struct dentry *dentry, char *buffer, int buflen)
  1010. {
  1011. struct page * page;
  1012. int res = shmem_getpage(dentry->d_inode, 0, &page);
  1013. if (res)
  1014. return res;
  1015. res = vfs_readlink(dentry,buffer,buflen, kmap(page));
  1016. kunmap(page);
  1017. page_cache_release(page);
  1018. return res;
  1019. }
  1020. static int shmem_follow_link(struct dentry *dentry, struct nameidata *nd)
  1021. {
  1022. struct page * page;
  1023. int res = shmem_getpage(dentry->d_inode, 0, &page);
  1024. if (res)
  1025. return res;
  1026. res = vfs_follow_link(nd, kmap(page));
  1027. kunmap(page);
  1028. page_cache_release(page);
  1029. return res;
  1030. }
  1031. static struct inode_operations shmem_symlink_inline_operations = {
  1032. readlink: shmem_readlink_inline,
  1033. follow_link: shmem_follow_link_inline,
  1034. };
  1035. static struct inode_operations shmem_symlink_inode_operations = {
  1036. truncate: shmem_truncate,
  1037. readlink: shmem_readlink,
  1038. follow_link: shmem_follow_link,
  1039. };
  1040. static int shmem_parse_options(char *options, int *mode, uid_t *uid, gid_t *gid, unsigned long * blocks, unsigned long *inodes)
  1041. {
  1042. char *this_char, *value, *rest;
  1043. this_char = NULL;
  1044. if ( options )
  1045. this_char = strtok(options,",");
  1046. for ( ; this_char; this_char = strtok(NULL,",")) {
  1047. if ((value = strchr(this_char,'=')) != NULL) {
  1048. *value++ = 0;
  1049. } else {
  1050. printk(KERN_ERR 
  1051.     "tmpfs: No value for mount option '%s'n", 
  1052.     this_char);
  1053. return 1;
  1054. }
  1055. if (!strcmp(this_char,"size")) {
  1056. unsigned long long size;
  1057. size = memparse(value,&rest);
  1058. if (*rest)
  1059. goto bad_val;
  1060. *blocks = size >> PAGE_CACHE_SHIFT;
  1061. } else if (!strcmp(this_char,"nr_blocks")) {
  1062. *blocks = memparse(value,&rest);
  1063. if (*rest)
  1064. goto bad_val;
  1065. } else if (!strcmp(this_char,"nr_inodes")) {
  1066. *inodes = memparse(value,&rest);
  1067. if (*rest)
  1068. goto bad_val;
  1069. } else if (!strcmp(this_char,"mode")) {
  1070. if (!mode)
  1071. continue;
  1072. *mode = simple_strtoul(value,&rest,8);
  1073. if (*rest)
  1074. goto bad_val;
  1075. } else if (!strcmp(this_char,"uid")) {
  1076. if (!uid)
  1077. continue;
  1078. *uid = simple_strtoul(value,&rest,0);
  1079. if (*rest)
  1080. goto bad_val;
  1081. } else if (!strcmp(this_char,"gid")) {
  1082. if (!gid)
  1083. continue;
  1084. *gid = simple_strtoul(value,&rest,0);
  1085. if (*rest)
  1086. goto bad_val;
  1087. } else {
  1088. printk(KERN_ERR "tmpfs: Bad mount option %sn",
  1089.        this_char);
  1090. return 1;
  1091. }
  1092. }
  1093. return 0;
  1094. bad_val:
  1095. printk(KERN_ERR "tmpfs: Bad value '%s' for mount option '%s'n", 
  1096.        value, this_char);
  1097. return 1;
  1098. }
  1099. static int shmem_remount_fs (struct super_block *sb, int *flags, char *data)
  1100. {
  1101. struct shmem_sb_info *sbinfo = &sb->u.shmem_sb;
  1102. unsigned long max_blocks = sbinfo->max_blocks;
  1103. unsigned long max_inodes = sbinfo->max_inodes;
  1104. if (shmem_parse_options (data, NULL, NULL, NULL, &max_blocks, &max_inodes))
  1105. return -EINVAL;
  1106. return shmem_set_size(sbinfo, max_blocks, max_inodes);
  1107. }
  1108. int shmem_sync_file(struct file * file, struct dentry *dentry, int datasync)
  1109. {
  1110. return 0;
  1111. }
  1112. #endif
  1113. static struct super_block *shmem_read_super(struct super_block * sb, void * data, int silent)
  1114. {
  1115. struct inode * inode;
  1116. struct dentry * root;
  1117. unsigned long blocks, inodes;
  1118. int mode   = S_IRWXUGO | S_ISVTX;
  1119. uid_t uid = current->fsuid;
  1120. gid_t gid = current->fsgid;
  1121. struct shmem_sb_info *sbinfo = SHMEM_SB(sb);
  1122. struct sysinfo si;
  1123. /*
  1124.  * Per default we only allow half of the physical ram per
  1125.  * tmpfs instance
  1126.  */
  1127. si_meminfo(&si);
  1128. blocks = inodes = si.totalram / 2;
  1129. #ifdef CONFIG_TMPFS
  1130. if (shmem_parse_options (data, &mode, &uid, &gid, &blocks, &inodes))
  1131. return NULL;
  1132. #endif
  1133. spin_lock_init (&sbinfo->stat_lock);
  1134. sbinfo->max_blocks = blocks;
  1135. sbinfo->free_blocks = blocks;
  1136. sbinfo->max_inodes = inodes;
  1137. sbinfo->free_inodes = inodes;
  1138. sb->s_maxbytes = (unsigned long long) SHMEM_MAX_BLOCKS << PAGE_CACHE_SHIFT;
  1139. sb->s_blocksize = PAGE_CACHE_SIZE;
  1140. sb->s_blocksize_bits = PAGE_CACHE_SHIFT;
  1141. sb->s_magic = TMPFS_MAGIC;
  1142. sb->s_op = &shmem_ops;
  1143. inode = shmem_get_inode(sb, S_IFDIR | mode, 0);
  1144. if (!inode)
  1145. return NULL;
  1146. inode->i_uid = uid;
  1147. inode->i_gid = gid;
  1148. root = d_alloc_root(inode);
  1149. if (!root) {
  1150. iput(inode);
  1151. return NULL;
  1152. }
  1153. sb->s_root = root;
  1154. return sb;
  1155. }
  1156. static struct address_space_operations shmem_aops = {
  1157. writepage: shmem_writepage,
  1158. };
  1159. static struct file_operations shmem_file_operations = {
  1160. mmap: shmem_mmap,
  1161. #ifdef CONFIG_TMPFS
  1162. read: shmem_file_read,
  1163. write: shmem_file_write,
  1164. fsync: shmem_sync_file,
  1165. #endif
  1166. };
  1167. static struct inode_operations shmem_inode_operations = {
  1168. truncate: shmem_truncate,
  1169. };
  1170. static struct file_operations shmem_dir_operations = {
  1171. read: generic_read_dir,
  1172. readdir: dcache_readdir,
  1173. #ifdef CONFIG_TMPFS
  1174. fsync: shmem_sync_file,
  1175. #endif
  1176. };
  1177. static struct inode_operations shmem_dir_inode_operations = {
  1178. #ifdef CONFIG_TMPFS
  1179. create: shmem_create,
  1180. lookup: shmem_lookup,
  1181. link: shmem_link,
  1182. unlink: shmem_unlink,
  1183. symlink: shmem_symlink,
  1184. mkdir: shmem_mkdir,
  1185. rmdir: shmem_rmdir,
  1186. mknod: shmem_mknod,
  1187. rename: shmem_rename,
  1188. #endif
  1189. };
  1190. static struct super_operations shmem_ops = {
  1191. #ifdef CONFIG_TMPFS
  1192. statfs: shmem_statfs,
  1193. remount_fs: shmem_remount_fs,
  1194. #endif
  1195. delete_inode: shmem_delete_inode,
  1196. put_inode: force_delete,
  1197. };
  1198. static struct vm_operations_struct shmem_vm_ops = {
  1199. nopage: shmem_nopage,
  1200. };
  1201. #ifdef CONFIG_TMPFS
  1202. /* type "shm" will be tagged obsolete in 2.5 */
  1203. static DECLARE_FSTYPE(shmem_fs_type, "shm", shmem_read_super, FS_LITTER);
  1204. static DECLARE_FSTYPE(tmpfs_fs_type, "tmpfs", shmem_read_super, FS_LITTER);
  1205. #else
  1206. static DECLARE_FSTYPE(tmpfs_fs_type, "tmpfs", shmem_read_super, FS_LITTER|FS_NOMOUNT);
  1207. #endif
  1208. static struct vfsmount *shm_mnt;
  1209. static int __init init_shmem_fs(void)
  1210. {
  1211. int error;
  1212. struct vfsmount * res;
  1213. if ((error = register_filesystem(&tmpfs_fs_type))) {
  1214. printk (KERN_ERR "Could not register tmpfsn");
  1215. return error;
  1216. }
  1217. #ifdef CONFIG_TMPFS
  1218. if ((error = register_filesystem(&shmem_fs_type))) {
  1219. printk (KERN_ERR "Could not register shm fsn");
  1220. return error;
  1221. }
  1222. devfs_mk_dir (NULL, "shm", NULL);
  1223. #endif
  1224. res = kern_mount(&tmpfs_fs_type);
  1225. if (IS_ERR (res)) {
  1226. printk (KERN_ERR "could not kern_mount tmpfsn");
  1227. unregister_filesystem(&tmpfs_fs_type);
  1228. return PTR_ERR(res);
  1229. }
  1230. shm_mnt = res;
  1231. /* The internal instance should not do size checking */
  1232. if ((error = shmem_set_size(SHMEM_SB(res->mnt_sb), ULONG_MAX, ULONG_MAX)))
  1233. printk (KERN_ERR "could not set limits on internal tmpfsn");
  1234. return 0;
  1235. }
  1236. static void __exit exit_shmem_fs(void)
  1237. {
  1238. #ifdef CONFIG_TMPFS
  1239. unregister_filesystem(&shmem_fs_type);
  1240. #endif
  1241. unregister_filesystem(&tmpfs_fs_type);
  1242. mntput(shm_mnt);
  1243. }
  1244. module_init(init_shmem_fs)
  1245. module_exit(exit_shmem_fs)
  1246. /*
  1247.  * shmem_file_setup - get an unlinked file living in shmem fs
  1248.  *
  1249.  * @name: name for dentry (to be seen in /proc/<pid>/maps
  1250.  * @size: size to be set for the file
  1251.  *
  1252.  */
  1253. struct file *shmem_file_setup(char * name, loff_t size)
  1254. {
  1255. int error;
  1256. struct file *file;
  1257. struct inode * inode;
  1258. struct dentry *dentry, *root;
  1259. struct qstr this;
  1260. int vm_enough_memory(long pages);
  1261. if (size > (unsigned long long) SHMEM_MAX_BLOCKS << PAGE_CACHE_SHIFT)
  1262. return ERR_PTR(-EINVAL);
  1263. if (!vm_enough_memory((size) >> PAGE_CACHE_SHIFT))
  1264. return ERR_PTR(-ENOMEM);
  1265. this.name = name;
  1266. this.len = strlen(name);
  1267. this.hash = 0; /* will go */
  1268. root = shm_mnt->mnt_root;
  1269. dentry = d_alloc(root, &this);
  1270. if (!dentry)
  1271. return ERR_PTR(-ENOMEM);
  1272. error = -ENFILE;
  1273. file = get_empty_filp();
  1274. if (!file)
  1275. goto put_dentry;
  1276. error = -ENOSPC;
  1277. inode = shmem_get_inode(root->d_sb, S_IFREG | S_IRWXUGO, 0);
  1278. if (!inode) 
  1279. goto close_file;
  1280. d_instantiate(dentry, inode);
  1281. dentry->d_inode->i_size = size;
  1282. shmem_truncate(inode);
  1283. file->f_vfsmnt = mntget(shm_mnt);
  1284. file->f_dentry = dentry;
  1285. file->f_op = &shmem_file_operations;
  1286. file->f_mode = FMODE_WRITE | FMODE_READ;
  1287. inode->i_nlink = 0; /* It is unlinked */
  1288. return(file);
  1289. close_file:
  1290. put_filp(file);
  1291. put_dentry:
  1292. dput (dentry);
  1293. return ERR_PTR(error);
  1294. }
  1295. /*
  1296.  * shmem_zero_setup - setup a shared anonymous mapping
  1297.  *
  1298.  * @vma: the vma to be mmapped is prepared by do_mmap_pgoff
  1299.  */
  1300. int shmem_zero_setup(struct vm_area_struct *vma)
  1301. {
  1302. struct file *file;
  1303. loff_t size = vma->vm_end - vma->vm_start;
  1304. file = shmem_file_setup("dev/zero", size);
  1305. if (IS_ERR(file))
  1306. return PTR_ERR(file);
  1307. if (vma->vm_file)
  1308. fput (vma->vm_file);
  1309. vma->vm_file = file;
  1310. vma->vm_ops = &shmem_vm_ops;
  1311. return 0;
  1312. }
  1313. EXPORT_SYMBOL(shmem_file_setup);