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

Linux/Unix编程

开发平台:

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