1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23#include <linux/fs.h>
24#include <linux/init.h>
25#include <linux/vfs.h>
26#include <linux/mount.h>
27#include <linux/pagemap.h>
28#include <linux/file.h>
29#include <linux/mm.h>
30#include <linux/module.h>
31#include <linux/swap.h>
32#include <linux/ima.h>
33
34static struct vfsmount *shm_mnt;
35
36#ifdef CONFIG_SHMEM
37
38
39
40
41
42
43#include <linux/xattr.h>
44#include <linux/exportfs.h>
45#include <linux/generic_acl.h>
46#include <linux/mman.h>
47#include <linux/string.h>
48#include <linux/slab.h>
49#include <linux/backing-dev.h>
50#include <linux/shmem_fs.h>
51#include <linux/writeback.h>
52#include <linux/vfs.h>
53#include <linux/blkdev.h>
54#include <linux/security.h>
55#include <linux/swapops.h>
56#include <linux/mempolicy.h>
57#include <linux/namei.h>
58#include <linux/ctype.h>
59#include <linux/migrate.h>
60#include <linux/highmem.h>
61#include <linux/seq_file.h>
62#include <linux/magic.h>
63
64#include <asm/uaccess.h>
65#include <asm/div64.h>
66#include <asm/pgtable.h>
67
68
69
70
71
72
73
74
75
76
77
78
79
80#define ENTRIES_PER_PAGE (PAGE_CACHE_SIZE/sizeof(unsigned long))
81#define ENTRIES_PER_PAGEPAGE ((unsigned long long)ENTRIES_PER_PAGE*ENTRIES_PER_PAGE)
82
83#define SHMSWP_MAX_INDEX (SHMEM_NR_DIRECT + (ENTRIES_PER_PAGEPAGE/2) * (ENTRIES_PER_PAGE+1))
84#define SHMSWP_MAX_BYTES (SHMSWP_MAX_INDEX << PAGE_CACHE_SHIFT)
85
86#define SHMEM_MAX_BYTES min_t(unsigned long long, SHMSWP_MAX_BYTES, MAX_LFS_FILESIZE)
87#define SHMEM_MAX_INDEX ((unsigned long)((SHMEM_MAX_BYTES+1) >> PAGE_CACHE_SHIFT))
88
89#define BLOCKS_PER_PAGE (PAGE_CACHE_SIZE/512)
90#define VM_ACCT(size) (PAGE_CACHE_ALIGN(size) >> PAGE_SHIFT)
91
92
93#define SHMEM_PAGEIN VM_READ
94#define SHMEM_TRUNCATE VM_WRITE
95
96
97#define LATENCY_LIMIT 64
98
99
100#define BOGO_DIRENT_SIZE 20
101
102
103enum sgp_type {
104 SGP_READ,
105 SGP_CACHE,
106 SGP_DIRTY,
107 SGP_WRITE,
108};
109
110#ifdef CONFIG_TMPFS
111static unsigned long shmem_default_max_blocks(void)
112{
113 return totalram_pages / 2;
114}
115
116static unsigned long shmem_default_max_inodes(void)
117{
118 return min(totalram_pages - totalhigh_pages, totalram_pages / 2);
119}
120#endif
121
122static int shmem_getpage(struct inode *inode, unsigned long idx,
123 struct page **pagep, enum sgp_type sgp, int *type);
124
125static inline struct page *shmem_dir_alloc(gfp_t gfp_mask)
126{
127
128
129
130
131
132
133
134 return alloc_pages((gfp_mask & ~GFP_MOVABLE_MASK) | __GFP_ZERO,
135 PAGE_CACHE_SHIFT-PAGE_SHIFT);
136}
137
138static inline void shmem_dir_free(struct page *page)
139{
140 __free_pages(page, PAGE_CACHE_SHIFT-PAGE_SHIFT);
141}
142
143static struct page **shmem_dir_map(struct page *page)
144{
145 return (struct page **)kmap_atomic(page, KM_USER0);
146}
147
148static inline void shmem_dir_unmap(struct page **dir)
149{
150 kunmap_atomic(dir, KM_USER0);
151}
152
153static swp_entry_t *shmem_swp_map(struct page *page)
154{
155 return (swp_entry_t *)kmap_atomic(page, KM_USER1);
156}
157
158static inline void shmem_swp_balance_unmap(void)
159{
160
161
162
163
164
165
166
167 (void) kmap_atomic(ZERO_PAGE(0), KM_USER1);
168}
169
170static inline void shmem_swp_unmap(swp_entry_t *entry)
171{
172 kunmap_atomic(entry, KM_USER1);
173}
174
175static inline struct shmem_sb_info *SHMEM_SB(struct super_block *sb)
176{
177 return sb->s_fs_info;
178}
179
180
181
182
183
184
185
186static inline int shmem_acct_size(unsigned long flags, loff_t size)
187{
188 return (flags & VM_NORESERVE) ?
189 0 : security_vm_enough_memory_kern(VM_ACCT(size));
190}
191
192static inline void shmem_unacct_size(unsigned long flags, loff_t size)
193{
194 if (!(flags & VM_NORESERVE))
195 vm_unacct_memory(VM_ACCT(size));
196}
197
198
199
200
201
202
203
204static inline int shmem_acct_block(unsigned long flags)
205{
206 return (flags & VM_NORESERVE) ?
207 security_vm_enough_memory_kern(VM_ACCT(PAGE_CACHE_SIZE)) : 0;
208}
209
210static inline void shmem_unacct_blocks(unsigned long flags, long pages)
211{
212 if (flags & VM_NORESERVE)
213 vm_unacct_memory(pages * VM_ACCT(PAGE_CACHE_SIZE));
214}
215
216static const struct super_operations shmem_ops;
217static const struct address_space_operations shmem_aops;
218static const struct file_operations shmem_file_operations;
219static const struct inode_operations shmem_inode_operations;
220static const struct inode_operations shmem_dir_inode_operations;
221static const struct inode_operations shmem_special_inode_operations;
222static struct vm_operations_struct shmem_vm_ops;
223
224static struct backing_dev_info shmem_backing_dev_info __read_mostly = {
225 .ra_pages = 0,
226 .capabilities = BDI_CAP_NO_ACCT_AND_WRITEBACK | BDI_CAP_SWAP_BACKED,
227 .unplug_io_fn = default_unplug_io_fn,
228};
229
230static LIST_HEAD(shmem_swaplist);
231static DEFINE_MUTEX(shmem_swaplist_mutex);
232
233static void shmem_free_blocks(struct inode *inode, long pages)
234{
235 struct shmem_sb_info *sbinfo = SHMEM_SB(inode->i_sb);
236 if (sbinfo->max_blocks) {
237 spin_lock(&sbinfo->stat_lock);
238 sbinfo->free_blocks += pages;
239 inode->i_blocks -= pages*BLOCKS_PER_PAGE;
240 spin_unlock(&sbinfo->stat_lock);
241 }
242}
243
244static int shmem_reserve_inode(struct super_block *sb)
245{
246 struct shmem_sb_info *sbinfo = SHMEM_SB(sb);
247 if (sbinfo->max_inodes) {
248 spin_lock(&sbinfo->stat_lock);
249 if (!sbinfo->free_inodes) {
250 spin_unlock(&sbinfo->stat_lock);
251 return -ENOSPC;
252 }
253 sbinfo->free_inodes--;
254 spin_unlock(&sbinfo->stat_lock);
255 }
256 return 0;
257}
258
259static void shmem_free_inode(struct super_block *sb)
260{
261 struct shmem_sb_info *sbinfo = SHMEM_SB(sb);
262 if (sbinfo->max_inodes) {
263 spin_lock(&sbinfo->stat_lock);
264 sbinfo->free_inodes++;
265 spin_unlock(&sbinfo->stat_lock);
266 }
267}
268
269
270
271
272
273
274
275
276
277
278
279
280
281static void shmem_recalc_inode(struct inode *inode)
282{
283 struct shmem_inode_info *info = SHMEM_I(inode);
284 long freed;
285
286 freed = info->alloced - info->swapped - inode->i_mapping->nrpages;
287 if (freed > 0) {
288 info->alloced -= freed;
289 shmem_unacct_blocks(info->flags, freed);
290 shmem_free_blocks(inode, freed);
291 }
292}
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331static swp_entry_t *shmem_swp_entry(struct shmem_inode_info *info, unsigned long index, struct page **page)
332{
333 unsigned long offset;
334 struct page **dir;
335 struct page *subdir;
336
337 if (index < SHMEM_NR_DIRECT) {
338 shmem_swp_balance_unmap();
339 return info->i_direct+index;
340 }
341 if (!info->i_indirect) {
342 if (page) {
343 info->i_indirect = *page;
344 *page = NULL;
345 }
346 return NULL;
347 }
348
349 index -= SHMEM_NR_DIRECT;
350 offset = index % ENTRIES_PER_PAGE;
351 index /= ENTRIES_PER_PAGE;
352 dir = shmem_dir_map(info->i_indirect);
353
354 if (index >= ENTRIES_PER_PAGE/2) {
355 index -= ENTRIES_PER_PAGE/2;
356 dir += ENTRIES_PER_PAGE/2 + index/ENTRIES_PER_PAGE;
357 index %= ENTRIES_PER_PAGE;
358 subdir = *dir;
359 if (!subdir) {
360 if (page) {
361 *dir = *page;
362 *page = NULL;
363 }
364 shmem_dir_unmap(dir);
365 return NULL;
366 }
367 shmem_dir_unmap(dir);
368 dir = shmem_dir_map(subdir);
369 }
370
371 dir += index;
372 subdir = *dir;
373 if (!subdir) {
374 if (!page || !(subdir = *page)) {
375 shmem_dir_unmap(dir);
376 return NULL;
377 }
378 *dir = subdir;
379 *page = NULL;
380 }
381 shmem_dir_unmap(dir);
382 return shmem_swp_map(subdir) + offset;
383}
384
385static void shmem_swp_set(struct shmem_inode_info *info, swp_entry_t *entry, unsigned long value)
386{
387 long incdec = value? 1: -1;
388
389 entry->val = value;
390 info->swapped += incdec;
391 if ((unsigned long)(entry - info->i_direct) >= SHMEM_NR_DIRECT) {
392 struct page *page = kmap_atomic_to_page(entry);
393 set_page_private(page, page_private(page) + incdec);
394 }
395}
396
397
398
399
400
401
402
403
404
405static swp_entry_t *shmem_swp_alloc(struct shmem_inode_info *info, unsigned long index, enum sgp_type sgp)
406{
407 struct inode *inode = &info->vfs_inode;
408 struct shmem_sb_info *sbinfo = SHMEM_SB(inode->i_sb);
409 struct page *page = NULL;
410 swp_entry_t *entry;
411
412 if (sgp != SGP_WRITE &&
413 ((loff_t) index << PAGE_CACHE_SHIFT) >= i_size_read(inode))
414 return ERR_PTR(-EINVAL);
415
416 while (!(entry = shmem_swp_entry(info, index, &page))) {
417 if (sgp == SGP_READ)
418 return shmem_swp_map(ZERO_PAGE(0));
419
420
421
422
423
424 if (sbinfo->max_blocks) {
425 spin_lock(&sbinfo->stat_lock);
426 if (sbinfo->free_blocks <= 1) {
427 spin_unlock(&sbinfo->stat_lock);
428 return ERR_PTR(-ENOSPC);
429 }
430 sbinfo->free_blocks--;
431 inode->i_blocks += BLOCKS_PER_PAGE;
432 spin_unlock(&sbinfo->stat_lock);
433 }
434
435 spin_unlock(&info->lock);
436 page = shmem_dir_alloc(mapping_gfp_mask(inode->i_mapping));
437 if (page)
438 set_page_private(page, 0);
439 spin_lock(&info->lock);
440
441 if (!page) {
442 shmem_free_blocks(inode, 1);
443 return ERR_PTR(-ENOMEM);
444 }
445 if (sgp != SGP_WRITE &&
446 ((loff_t) index << PAGE_CACHE_SHIFT) >= i_size_read(inode)) {
447 entry = ERR_PTR(-EINVAL);
448 break;
449 }
450 if (info->next_index <= index)
451 info->next_index = index + 1;
452 }
453 if (page) {
454
455 shmem_free_blocks(inode, 1);
456 shmem_dir_free(page);
457 }
458 if (info->next_index <= index && !IS_ERR(entry))
459 info->next_index = index + 1;
460 return entry;
461}
462
463
464
465
466
467
468
469static int shmem_free_swp(swp_entry_t *dir, swp_entry_t *edir,
470 spinlock_t *punch_lock)
471{
472 spinlock_t *punch_unlock = NULL;
473 swp_entry_t *ptr;
474 int freed = 0;
475
476 for (ptr = dir; ptr < edir; ptr++) {
477 if (ptr->val) {
478 if (unlikely(punch_lock)) {
479 punch_unlock = punch_lock;
480 punch_lock = NULL;
481 spin_lock(punch_unlock);
482 if (!ptr->val)
483 continue;
484 }
485 free_swap_and_cache(*ptr);
486 *ptr = (swp_entry_t){0};
487 freed++;
488 }
489 }
490 if (punch_unlock)
491 spin_unlock(punch_unlock);
492 return freed;
493}
494
495static int shmem_map_and_free_swp(struct page *subdir, int offset,
496 int limit, struct page ***dir, spinlock_t *punch_lock)
497{
498 swp_entry_t *ptr;
499 int freed = 0;
500
501 ptr = shmem_swp_map(subdir);
502 for (; offset < limit; offset += LATENCY_LIMIT) {
503 int size = limit - offset;
504 if (size > LATENCY_LIMIT)
505 size = LATENCY_LIMIT;
506 freed += shmem_free_swp(ptr+offset, ptr+offset+size,
507 punch_lock);
508 if (need_resched()) {
509 shmem_swp_unmap(ptr);
510 if (*dir) {
511 shmem_dir_unmap(*dir);
512 *dir = NULL;
513 }
514 cond_resched();
515 ptr = shmem_swp_map(subdir);
516 }
517 }
518 shmem_swp_unmap(ptr);
519 return freed;
520}
521
522static void shmem_free_pages(struct list_head *next)
523{
524 struct page *page;
525 int freed = 0;
526
527 do {
528 page = container_of(next, struct page, lru);
529 next = next->next;
530 shmem_dir_free(page);
531 freed++;
532 if (freed >= LATENCY_LIMIT) {
533 cond_resched();
534 freed = 0;
535 }
536 } while (next);
537}
538
539static void shmem_truncate_range(struct inode *inode, loff_t start, loff_t end)
540{
541 struct shmem_inode_info *info = SHMEM_I(inode);
542 unsigned long idx;
543 unsigned long size;
544 unsigned long limit;
545 unsigned long stage;
546 unsigned long diroff;
547 struct page **dir;
548 struct page *topdir;
549 struct page *middir;
550 struct page *subdir;
551 swp_entry_t *ptr;
552 LIST_HEAD(pages_to_free);
553 long nr_pages_to_free = 0;
554 long nr_swaps_freed = 0;
555 int offset;
556 int freed;
557 int punch_hole;
558 spinlock_t *needs_lock;
559 spinlock_t *punch_lock;
560 unsigned long upper_limit;
561
562 inode->i_ctime = inode->i_mtime = CURRENT_TIME;
563 idx = (start + PAGE_CACHE_SIZE - 1) >> PAGE_CACHE_SHIFT;
564 if (idx >= info->next_index)
565 return;
566
567 spin_lock(&info->lock);
568 info->flags |= SHMEM_TRUNCATE;
569 if (likely(end == (loff_t) -1)) {
570 limit = info->next_index;
571 upper_limit = SHMEM_MAX_INDEX;
572 info->next_index = idx;
573 needs_lock = NULL;
574 punch_hole = 0;
575 } else {
576 if (end + 1 >= inode->i_size) {
577 limit = (inode->i_size + PAGE_CACHE_SIZE - 1) >>
578 PAGE_CACHE_SHIFT;
579 upper_limit = SHMEM_MAX_INDEX;
580 } else {
581 limit = (end + 1) >> PAGE_CACHE_SHIFT;
582 upper_limit = limit;
583 }
584 needs_lock = &info->lock;
585 punch_hole = 1;
586 }
587
588 topdir = info->i_indirect;
589 if (topdir && idx <= SHMEM_NR_DIRECT && !punch_hole) {
590 info->i_indirect = NULL;
591 nr_pages_to_free++;
592 list_add(&topdir->lru, &pages_to_free);
593 }
594 spin_unlock(&info->lock);
595
596 if (info->swapped && idx < SHMEM_NR_DIRECT) {
597 ptr = info->i_direct;
598 size = limit;
599 if (size > SHMEM_NR_DIRECT)
600 size = SHMEM_NR_DIRECT;
601 nr_swaps_freed = shmem_free_swp(ptr+idx, ptr+size, needs_lock);
602 }
603
604
605
606
607
608 if (!topdir || limit <= SHMEM_NR_DIRECT)
609 goto done2;
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624 upper_limit -= SHMEM_NR_DIRECT;
625 limit -= SHMEM_NR_DIRECT;
626 idx = (idx > SHMEM_NR_DIRECT)? (idx - SHMEM_NR_DIRECT): 0;
627 offset = idx % ENTRIES_PER_PAGE;
628 idx -= offset;
629
630 dir = shmem_dir_map(topdir);
631 stage = ENTRIES_PER_PAGEPAGE/2;
632 if (idx < ENTRIES_PER_PAGEPAGE/2) {
633 middir = topdir;
634 diroff = idx/ENTRIES_PER_PAGE;
635 } else {
636 dir += ENTRIES_PER_PAGE/2;
637 dir += (idx - ENTRIES_PER_PAGEPAGE/2)/ENTRIES_PER_PAGEPAGE;
638 while (stage <= idx)
639 stage += ENTRIES_PER_PAGEPAGE;
640 middir = *dir;
641 if (*dir) {
642 diroff = ((idx - ENTRIES_PER_PAGEPAGE/2) %
643 ENTRIES_PER_PAGEPAGE) / ENTRIES_PER_PAGE;
644 if (!diroff && !offset && upper_limit >= stage) {
645 if (needs_lock) {
646 spin_lock(needs_lock);
647 *dir = NULL;
648 spin_unlock(needs_lock);
649 needs_lock = NULL;
650 } else
651 *dir = NULL;
652 nr_pages_to_free++;
653 list_add(&middir->lru, &pages_to_free);
654 }
655 shmem_dir_unmap(dir);
656 dir = shmem_dir_map(middir);
657 } else {
658 diroff = 0;
659 offset = 0;
660 idx = stage;
661 }
662 }
663
664 for (; idx < limit; idx += ENTRIES_PER_PAGE, diroff++) {
665 if (unlikely(idx == stage)) {
666 shmem_dir_unmap(dir);
667 dir = shmem_dir_map(topdir) +
668 ENTRIES_PER_PAGE/2 + idx/ENTRIES_PER_PAGEPAGE;
669 while (!*dir) {
670 dir++;
671 idx += ENTRIES_PER_PAGEPAGE;
672 if (idx >= limit)
673 goto done1;
674 }
675 stage = idx + ENTRIES_PER_PAGEPAGE;
676 middir = *dir;
677 if (punch_hole)
678 needs_lock = &info->lock;
679 if (upper_limit >= stage) {
680 if (needs_lock) {
681 spin_lock(needs_lock);
682 *dir = NULL;
683 spin_unlock(needs_lock);
684 needs_lock = NULL;
685 } else
686 *dir = NULL;
687 nr_pages_to_free++;
688 list_add(&middir->lru, &pages_to_free);
689 }
690 shmem_dir_unmap(dir);
691 cond_resched();
692 dir = shmem_dir_map(middir);
693 diroff = 0;
694 }
695 punch_lock = needs_lock;
696 subdir = dir[diroff];
697 if (subdir && !offset && upper_limit-idx >= ENTRIES_PER_PAGE) {
698 if (needs_lock) {
699 spin_lock(needs_lock);
700 dir[diroff] = NULL;
701 spin_unlock(needs_lock);
702 punch_lock = NULL;
703 } else
704 dir[diroff] = NULL;
705 nr_pages_to_free++;
706 list_add(&subdir->lru, &pages_to_free);
707 }
708 if (subdir && page_private(subdir) ) {
709 size = limit - idx;
710 if (size > ENTRIES_PER_PAGE)
711 size = ENTRIES_PER_PAGE;
712 freed = shmem_map_and_free_swp(subdir,
713 offset, size, &dir, punch_lock);
714 if (!dir)
715 dir = shmem_dir_map(middir);
716 nr_swaps_freed += freed;
717 if (offset || punch_lock) {
718 spin_lock(&info->lock);
719 set_page_private(subdir,
720 page_private(subdir) - freed);
721 spin_unlock(&info->lock);
722 } else
723 BUG_ON(page_private(subdir) != freed);
724 }
725 offset = 0;
726 }
727done1:
728 shmem_dir_unmap(dir);
729done2:
730 if (inode->i_mapping->nrpages && (info->flags & SHMEM_PAGEIN)) {
731
732
733
734
735
736
737
738
739
740
741
742
743 truncate_inode_pages_range(inode->i_mapping, start, end);
744 if (punch_hole)
745 unmap_mapping_range(inode->i_mapping, start,
746 end - start, 1);
747 }
748
749 spin_lock(&info->lock);
750 info->flags &= ~SHMEM_TRUNCATE;
751 info->swapped -= nr_swaps_freed;
752 if (nr_pages_to_free)
753 shmem_free_blocks(inode, nr_pages_to_free);
754 shmem_recalc_inode(inode);
755 spin_unlock(&info->lock);
756
757
758
759
760 if (!list_empty(&pages_to_free)) {
761 pages_to_free.prev->next = NULL;
762 shmem_free_pages(pages_to_free.next);
763 }
764}
765
766static void shmem_truncate(struct inode *inode)
767{
768 shmem_truncate_range(inode, inode->i_size, (loff_t)-1);
769}
770
771static int shmem_notify_change(struct dentry *dentry, struct iattr *attr)
772{
773 struct inode *inode = dentry->d_inode;
774 struct page *page = NULL;
775 int error;
776
777 if (S_ISREG(inode->i_mode) && (attr->ia_valid & ATTR_SIZE)) {
778 if (attr->ia_size < inode->i_size) {
779
780
781
782
783
784
785
786 if (attr->ia_size & (PAGE_CACHE_SIZE-1)) {
787 (void) shmem_getpage(inode,
788 attr->ia_size>>PAGE_CACHE_SHIFT,
789 &page, SGP_READ, NULL);
790 if (page)
791 unlock_page(page);
792 }
793
794
795
796
797
798
799
800 if (attr->ia_size) {
801 struct shmem_inode_info *info = SHMEM_I(inode);
802 spin_lock(&info->lock);
803 info->flags &= ~SHMEM_PAGEIN;
804 spin_unlock(&info->lock);
805 }
806 }
807 }
808
809 error = inode_change_ok(inode, attr);
810 if (!error)
811 error = inode_setattr(inode, attr);
812#ifdef CONFIG_TMPFS_POSIX_ACL
813 if (!error && (attr->ia_valid & ATTR_MODE))
814 error = generic_acl_chmod(inode, &shmem_acl_ops);
815#endif
816 if (page)
817 page_cache_release(page);
818 return error;
819}
820
821static void shmem_delete_inode(struct inode *inode)
822{
823 struct shmem_inode_info *info = SHMEM_I(inode);
824
825 if (inode->i_op->truncate == shmem_truncate) {
826 truncate_inode_pages(inode->i_mapping, 0);
827 shmem_unacct_size(info->flags, inode->i_size);
828 inode->i_size = 0;
829 shmem_truncate(inode);
830 if (!list_empty(&info->swaplist)) {
831 mutex_lock(&shmem_swaplist_mutex);
832 list_del_init(&info->swaplist);
833 mutex_unlock(&shmem_swaplist_mutex);
834 }
835 }
836 BUG_ON(inode->i_blocks);
837 shmem_free_inode(inode->i_sb);
838 clear_inode(inode);
839}
840
841static inline int shmem_find_swp(swp_entry_t entry, swp_entry_t *dir, swp_entry_t *edir)
842{
843 swp_entry_t *ptr;
844
845 for (ptr = dir; ptr < edir; ptr++) {
846 if (ptr->val == entry.val)
847 return ptr - dir;
848 }
849 return -1;
850}
851
852static int shmem_unuse_inode(struct shmem_inode_info *info, swp_entry_t entry, struct page *page)
853{
854 struct inode *inode;
855 unsigned long idx;
856 unsigned long size;
857 unsigned long limit;
858 unsigned long stage;
859 struct page **dir;
860 struct page *subdir;
861 swp_entry_t *ptr;
862 int offset;
863 int error;
864
865 idx = 0;
866 ptr = info->i_direct;
867 spin_lock(&info->lock);
868 if (!info->swapped) {
869 list_del_init(&info->swaplist);
870 goto lost2;
871 }
872 limit = info->next_index;
873 size = limit;
874 if (size > SHMEM_NR_DIRECT)
875 size = SHMEM_NR_DIRECT;
876 offset = shmem_find_swp(entry, ptr, ptr+size);
877 if (offset >= 0)
878 goto found;
879 if (!info->i_indirect)
880 goto lost2;
881
882 dir = shmem_dir_map(info->i_indirect);
883 stage = SHMEM_NR_DIRECT + ENTRIES_PER_PAGEPAGE/2;
884
885 for (idx = SHMEM_NR_DIRECT; idx < limit; idx += ENTRIES_PER_PAGE, dir++) {
886 if (unlikely(idx == stage)) {
887 shmem_dir_unmap(dir-1);
888 if (cond_resched_lock(&info->lock)) {
889
890 if (limit > info->next_index) {
891 limit = info->next_index;
892 if (idx >= limit)
893 goto lost2;
894 }
895 }
896 dir = shmem_dir_map(info->i_indirect) +
897 ENTRIES_PER_PAGE/2 + idx/ENTRIES_PER_PAGEPAGE;
898 while (!*dir) {
899 dir++;
900 idx += ENTRIES_PER_PAGEPAGE;
901 if (idx >= limit)
902 goto lost1;
903 }
904 stage = idx + ENTRIES_PER_PAGEPAGE;
905 subdir = *dir;
906 shmem_dir_unmap(dir);
907 dir = shmem_dir_map(subdir);
908 }
909 subdir = *dir;
910 if (subdir && page_private(subdir)) {
911 ptr = shmem_swp_map(subdir);
912 size = limit - idx;
913 if (size > ENTRIES_PER_PAGE)
914 size = ENTRIES_PER_PAGE;
915 offset = shmem_find_swp(entry, ptr, ptr+size);
916 shmem_swp_unmap(ptr);
917 if (offset >= 0) {
918 shmem_dir_unmap(dir);
919 goto found;
920 }
921 }
922 }
923lost1:
924 shmem_dir_unmap(dir-1);
925lost2:
926 spin_unlock(&info->lock);
927 return 0;
928found:
929 idx += offset;
930 inode = igrab(&info->vfs_inode);
931 spin_unlock(&info->lock);
932
933
934
935
936
937
938
939
940 if (shmem_swaplist.next != &info->swaplist)
941 list_move_tail(&shmem_swaplist, &info->swaplist);
942 mutex_unlock(&shmem_swaplist_mutex);
943
944 error = 1;
945 if (!inode)
946 goto out;
947
948
949
950
951
952 error = mem_cgroup_cache_charge(page, current->mm, GFP_KERNEL);
953 if (error)
954 goto out;
955 error = radix_tree_preload(GFP_KERNEL);
956 if (error) {
957 mem_cgroup_uncharge_cache_page(page);
958 goto out;
959 }
960 error = 1;
961
962 spin_lock(&info->lock);
963 ptr = shmem_swp_entry(info, idx, NULL);
964 if (ptr && ptr->val == entry.val) {
965 error = add_to_page_cache_locked(page, inode->i_mapping,
966 idx, GFP_NOWAIT);
967
968 } else
969 mem_cgroup_uncharge_cache_page(page);
970
971 if (error == -EEXIST) {
972 struct page *filepage = find_get_page(inode->i_mapping, idx);
973 error = 1;
974 if (filepage) {
975
976
977
978
979 if (PageUptodate(filepage))
980 error = 0;
981 page_cache_release(filepage);
982 }
983 }
984 if (!error) {
985 delete_from_swap_cache(page);
986 set_page_dirty(page);
987 info->flags |= SHMEM_PAGEIN;
988 shmem_swp_set(info, ptr, 0);
989 swap_free(entry);
990 error = 1;
991 }
992 if (ptr)
993 shmem_swp_unmap(ptr);
994 spin_unlock(&info->lock);
995 radix_tree_preload_end();
996out:
997 unlock_page(page);
998 page_cache_release(page);
999 iput(inode);
1000 return error;
1001}
1002
1003
1004
1005
1006int shmem_unuse(swp_entry_t entry, struct page *page)
1007{
1008 struct list_head *p, *next;
1009 struct shmem_inode_info *info;
1010 int found = 0;
1011
1012 mutex_lock(&shmem_swaplist_mutex);
1013 list_for_each_safe(p, next, &shmem_swaplist) {
1014 info = list_entry(p, struct shmem_inode_info, swaplist);
1015 found = shmem_unuse_inode(info, entry, page);
1016 cond_resched();
1017 if (found)
1018 goto out;
1019 }
1020 mutex_unlock(&shmem_swaplist_mutex);
1021out: return found;
1022}
1023
1024
1025
1026
1027static int shmem_writepage(struct page *page, struct writeback_control *wbc)
1028{
1029 struct shmem_inode_info *info;
1030 swp_entry_t *entry, swap;
1031 struct address_space *mapping;
1032 unsigned long index;
1033 struct inode *inode;
1034
1035 BUG_ON(!PageLocked(page));
1036 mapping = page->mapping;
1037 index = page->index;
1038 inode = mapping->host;
1039 info = SHMEM_I(inode);
1040 if (info->flags & VM_LOCKED)
1041 goto redirty;
1042 if (!total_swap_pages)
1043 goto redirty;
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053 if (wbc->for_reclaim)
1054 swap = get_swap_page();
1055 else
1056 swap.val = 0;
1057
1058 spin_lock(&info->lock);
1059 if (index >= info->next_index) {
1060 BUG_ON(!(info->flags & SHMEM_TRUNCATE));
1061 goto unlock;
1062 }
1063 entry = shmem_swp_entry(info, index, NULL);
1064 if (entry->val) {
1065
1066
1067
1068
1069 free_swap_and_cache(*entry);
1070 shmem_swp_set(info, entry, 0);
1071 }
1072 shmem_recalc_inode(inode);
1073
1074 if (swap.val && add_to_swap_cache(page, swap, GFP_ATOMIC) == 0) {
1075 remove_from_page_cache(page);
1076 shmem_swp_set(info, entry, swap.val);
1077 shmem_swp_unmap(entry);
1078 if (list_empty(&info->swaplist))
1079 inode = igrab(inode);
1080 else
1081 inode = NULL;
1082 spin_unlock(&info->lock);
1083 swap_duplicate(swap);
1084 BUG_ON(page_mapped(page));
1085 page_cache_release(page);
1086 swap_writepage(page, wbc);
1087 if (inode) {
1088 mutex_lock(&shmem_swaplist_mutex);
1089
1090 list_move_tail(&info->swaplist, &shmem_swaplist);
1091 mutex_unlock(&shmem_swaplist_mutex);
1092 iput(inode);
1093 }
1094 return 0;
1095 }
1096
1097 shmem_swp_unmap(entry);
1098unlock:
1099 spin_unlock(&info->lock);
1100 swap_free(swap);
1101redirty:
1102 set_page_dirty(page);
1103 if (wbc->for_reclaim)
1104 return AOP_WRITEPAGE_ACTIVATE;
1105 unlock_page(page);
1106 return 0;
1107}
1108
1109#ifdef CONFIG_NUMA
1110#ifdef CONFIG_TMPFS
1111static void shmem_show_mpol(struct seq_file *seq, struct mempolicy *mpol)
1112{
1113 char buffer[64];
1114
1115 if (!mpol || mpol->mode == MPOL_DEFAULT)
1116 return;
1117
1118 mpol_to_str(buffer, sizeof(buffer), mpol, 1);
1119
1120 seq_printf(seq, ",mpol=%s", buffer);
1121}
1122
1123static struct mempolicy *shmem_get_sbmpol(struct shmem_sb_info *sbinfo)
1124{
1125 struct mempolicy *mpol = NULL;
1126 if (sbinfo->mpol) {
1127 spin_lock(&sbinfo->stat_lock);
1128 mpol = sbinfo->mpol;
1129 mpol_get(mpol);
1130 spin_unlock(&sbinfo->stat_lock);
1131 }
1132 return mpol;
1133}
1134#endif
1135
1136static struct page *shmem_swapin(swp_entry_t entry, gfp_t gfp,
1137 struct shmem_inode_info *info, unsigned long idx)
1138{
1139 struct mempolicy mpol, *spol;
1140 struct vm_area_struct pvma;
1141 struct page *page;
1142
1143 spol = mpol_cond_copy(&mpol,
1144 mpol_shared_policy_lookup(&info->policy, idx));
1145
1146
1147 pvma.vm_start = 0;
1148 pvma.vm_pgoff = idx;
1149 pvma.vm_ops = NULL;
1150 pvma.vm_policy = spol;
1151 page = swapin_readahead(entry, gfp, &pvma, 0);
1152 return page;
1153}
1154
1155static struct page *shmem_alloc_page(gfp_t gfp,
1156 struct shmem_inode_info *info, unsigned long idx)
1157{
1158 struct vm_area_struct pvma;
1159
1160
1161 pvma.vm_start = 0;
1162 pvma.vm_pgoff = idx;
1163 pvma.vm_ops = NULL;
1164 pvma.vm_policy = mpol_shared_policy_lookup(&info->policy, idx);
1165
1166
1167
1168
1169 return alloc_page_vma(gfp, &pvma, 0);
1170}
1171#else
1172#ifdef CONFIG_TMPFS
1173static inline void shmem_show_mpol(struct seq_file *seq, struct mempolicy *p)
1174{
1175}
1176#endif
1177
1178static inline struct page *shmem_swapin(swp_entry_t entry, gfp_t gfp,
1179 struct shmem_inode_info *info, unsigned long idx)
1180{
1181 return swapin_readahead(entry, gfp, NULL, 0);
1182}
1183
1184static inline struct page *shmem_alloc_page(gfp_t gfp,
1185 struct shmem_inode_info *info, unsigned long idx)
1186{
1187 return alloc_page(gfp);
1188}
1189#endif
1190
1191#if !defined(CONFIG_NUMA) || !defined(CONFIG_TMPFS)
1192static inline struct mempolicy *shmem_get_sbmpol(struct shmem_sb_info *sbinfo)
1193{
1194 return NULL;
1195}
1196#endif
1197
1198
1199
1200
1201
1202
1203
1204
1205static int shmem_getpage(struct inode *inode, unsigned long idx,
1206 struct page **pagep, enum sgp_type sgp, int *type)
1207{
1208 struct address_space *mapping = inode->i_mapping;
1209 struct shmem_inode_info *info = SHMEM_I(inode);
1210 struct shmem_sb_info *sbinfo;
1211 struct page *filepage = *pagep;
1212 struct page *swappage;
1213 swp_entry_t *entry;
1214 swp_entry_t swap;
1215 gfp_t gfp;
1216 int error;
1217
1218 if (idx >= SHMEM_MAX_INDEX)
1219 return -EFBIG;
1220
1221 if (type)
1222 *type = 0;
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232repeat:
1233 if (!filepage)
1234 filepage = find_lock_page(mapping, idx);
1235 if (filepage && PageUptodate(filepage))
1236 goto done;
1237 error = 0;
1238 gfp = mapping_gfp_mask(mapping);
1239 if (!filepage) {
1240
1241
1242
1243
1244 error = radix_tree_preload(gfp & ~__GFP_HIGHMEM);
1245 if (error)
1246 goto failed;
1247 radix_tree_preload_end();
1248 }
1249
1250 spin_lock(&info->lock);
1251 shmem_recalc_inode(inode);
1252 entry = shmem_swp_alloc(info, idx, sgp);
1253 if (IS_ERR(entry)) {
1254 spin_unlock(&info->lock);
1255 error = PTR_ERR(entry);
1256 goto failed;
1257 }
1258 swap = *entry;
1259
1260 if (swap.val) {
1261
1262 swappage = lookup_swap_cache(swap);
1263 if (!swappage) {
1264 shmem_swp_unmap(entry);
1265
1266 if (type && !(*type & VM_FAULT_MAJOR)) {
1267 __count_vm_event(PGMAJFAULT);
1268 *type |= VM_FAULT_MAJOR;
1269 }
1270 spin_unlock(&info->lock);
1271 swappage = shmem_swapin(swap, gfp, info, idx);
1272 if (!swappage) {
1273 spin_lock(&info->lock);
1274 entry = shmem_swp_alloc(info, idx, sgp);
1275 if (IS_ERR(entry))
1276 error = PTR_ERR(entry);
1277 else {
1278 if (entry->val == swap.val)
1279 error = -ENOMEM;
1280 shmem_swp_unmap(entry);
1281 }
1282 spin_unlock(&info->lock);
1283 if (error)
1284 goto failed;
1285 goto repeat;
1286 }
1287 wait_on_page_locked(swappage);
1288 page_cache_release(swappage);
1289 goto repeat;
1290 }
1291
1292
1293 if (!trylock_page(swappage)) {
1294 shmem_swp_unmap(entry);
1295 spin_unlock(&info->lock);
1296 wait_on_page_locked(swappage);
1297 page_cache_release(swappage);
1298 goto repeat;
1299 }
1300 if (PageWriteback(swappage)) {
1301 shmem_swp_unmap(entry);
1302 spin_unlock(&info->lock);
1303 wait_on_page_writeback(swappage);
1304 unlock_page(swappage);
1305 page_cache_release(swappage);
1306 goto repeat;
1307 }
1308 if (!PageUptodate(swappage)) {
1309 shmem_swp_unmap(entry);
1310 spin_unlock(&info->lock);
1311 unlock_page(swappage);
1312 page_cache_release(swappage);
1313 error = -EIO;
1314 goto failed;
1315 }
1316
1317 if (filepage) {
1318 shmem_swp_set(info, entry, 0);
1319 shmem_swp_unmap(entry);
1320 delete_from_swap_cache(swappage);
1321 spin_unlock(&info->lock);
1322 copy_highpage(filepage, swappage);
1323 unlock_page(swappage);
1324 page_cache_release(swappage);
1325 flush_dcache_page(filepage);
1326 SetPageUptodate(filepage);
1327 set_page_dirty(filepage);
1328 swap_free(swap);
1329 } else if (!(error = add_to_page_cache_locked(swappage, mapping,
1330 idx, GFP_NOWAIT))) {
1331 info->flags |= SHMEM_PAGEIN;
1332 shmem_swp_set(info, entry, 0);
1333 shmem_swp_unmap(entry);
1334 delete_from_swap_cache(swappage);
1335 spin_unlock(&info->lock);
1336 filepage = swappage;
1337 set_page_dirty(filepage);
1338 swap_free(swap);
1339 } else {
1340 shmem_swp_unmap(entry);
1341 spin_unlock(&info->lock);
1342 if (error == -ENOMEM) {
1343
1344
1345
1346
1347 error = mem_cgroup_shmem_charge_fallback(
1348 swappage,
1349 current->mm,
1350 gfp);
1351 if (error) {
1352 unlock_page(swappage);
1353 page_cache_release(swappage);
1354 goto failed;
1355 }
1356 }
1357 unlock_page(swappage);
1358 page_cache_release(swappage);
1359 goto repeat;
1360 }
1361 } else if (sgp == SGP_READ && !filepage) {
1362 shmem_swp_unmap(entry);
1363 filepage = find_get_page(mapping, idx);
1364 if (filepage &&
1365 (!PageUptodate(filepage) || !trylock_page(filepage))) {
1366 spin_unlock(&info->lock);
1367 wait_on_page_locked(filepage);
1368 page_cache_release(filepage);
1369 filepage = NULL;
1370 goto repeat;
1371 }
1372 spin_unlock(&info->lock);
1373 } else {
1374 shmem_swp_unmap(entry);
1375 sbinfo = SHMEM_SB(inode->i_sb);
1376 if (sbinfo->max_blocks) {
1377 spin_lock(&sbinfo->stat_lock);
1378 if (sbinfo->free_blocks == 0 ||
1379 shmem_acct_block(info->flags)) {
1380 spin_unlock(&sbinfo->stat_lock);
1381 spin_unlock(&info->lock);
1382 error = -ENOSPC;
1383 goto failed;
1384 }
1385 sbinfo->free_blocks--;
1386 inode->i_blocks += BLOCKS_PER_PAGE;
1387 spin_unlock(&sbinfo->stat_lock);
1388 } else if (shmem_acct_block(info->flags)) {
1389 spin_unlock(&info->lock);
1390 error = -ENOSPC;
1391 goto failed;
1392 }
1393
1394 if (!filepage) {
1395 int ret;
1396
1397 spin_unlock(&info->lock);
1398 filepage = shmem_alloc_page(gfp, info, idx);
1399 if (!filepage) {
1400 shmem_unacct_blocks(info->flags, 1);
1401 shmem_free_blocks(inode, 1);
1402 error = -ENOMEM;
1403 goto failed;
1404 }
1405 SetPageSwapBacked(filepage);
1406
1407
1408 error = mem_cgroup_cache_charge(filepage, current->mm,
1409 GFP_KERNEL);
1410 if (error) {
1411 page_cache_release(filepage);
1412 shmem_unacct_blocks(info->flags, 1);
1413 shmem_free_blocks(inode, 1);
1414 filepage = NULL;
1415 goto failed;
1416 }
1417
1418 spin_lock(&info->lock);
1419 entry = shmem_swp_alloc(info, idx, sgp);
1420 if (IS_ERR(entry))
1421 error = PTR_ERR(entry);
1422 else {
1423 swap = *entry;
1424 shmem_swp_unmap(entry);
1425 }
1426 ret = error || swap.val;
1427 if (ret)
1428 mem_cgroup_uncharge_cache_page(filepage);
1429 else
1430 ret = add_to_page_cache_lru(filepage, mapping,
1431 idx, GFP_NOWAIT);
1432
1433
1434
1435
1436 if (ret) {
1437 spin_unlock(&info->lock);
1438 page_cache_release(filepage);
1439 shmem_unacct_blocks(info->flags, 1);
1440 shmem_free_blocks(inode, 1);
1441 filepage = NULL;
1442 if (error)
1443 goto failed;
1444 goto repeat;
1445 }
1446 info->flags |= SHMEM_PAGEIN;
1447 }
1448
1449 info->alloced++;
1450 spin_unlock(&info->lock);
1451 clear_highpage(filepage);
1452 flush_dcache_page(filepage);
1453 SetPageUptodate(filepage);
1454 if (sgp == SGP_DIRTY)
1455 set_page_dirty(filepage);
1456 }
1457done:
1458 *pagep = filepage;
1459 return 0;
1460
1461failed:
1462 if (*pagep != filepage) {
1463 unlock_page(filepage);
1464 page_cache_release(filepage);
1465 }
1466 return error;
1467}
1468
1469static int shmem_fault(struct vm_area_struct *vma, struct vm_fault *vmf)
1470{
1471 struct inode *inode = vma->vm_file->f_path.dentry->d_inode;
1472 int error;
1473 int ret;
1474
1475 if (((loff_t)vmf->pgoff << PAGE_CACHE_SHIFT) >= i_size_read(inode))
1476 return VM_FAULT_SIGBUS;
1477
1478 error = shmem_getpage(inode, vmf->pgoff, &vmf->page, SGP_CACHE, &ret);
1479 if (error)
1480 return ((error == -ENOMEM) ? VM_FAULT_OOM : VM_FAULT_SIGBUS);
1481
1482 return ret | VM_FAULT_LOCKED;
1483}
1484
1485#ifdef CONFIG_NUMA
1486static int shmem_set_policy(struct vm_area_struct *vma, struct mempolicy *new)
1487{
1488 struct inode *i = vma->vm_file->f_path.dentry->d_inode;
1489 return mpol_set_shared_policy(&SHMEM_I(i)->policy, vma, new);
1490}
1491
1492static struct mempolicy *shmem_get_policy(struct vm_area_struct *vma,
1493 unsigned long addr)
1494{
1495 struct inode *i = vma->vm_file->f_path.dentry->d_inode;
1496 unsigned long idx;
1497
1498 idx = ((addr - vma->vm_start) >> PAGE_SHIFT) + vma->vm_pgoff;
1499 return mpol_shared_policy_lookup(&SHMEM_I(i)->policy, idx);
1500}
1501#endif
1502
1503int shmem_lock(struct file *file, int lock, struct user_struct *user)
1504{
1505 struct inode *inode = file->f_path.dentry->d_inode;
1506 struct shmem_inode_info *info = SHMEM_I(inode);
1507 int retval = -ENOMEM;
1508
1509 spin_lock(&info->lock);
1510 if (lock && !(info->flags & VM_LOCKED)) {
1511 if (!user_shm_lock(inode->i_size, user))
1512 goto out_nomem;
1513 info->flags |= VM_LOCKED;
1514 mapping_set_unevictable(file->f_mapping);
1515 }
1516 if (!lock && (info->flags & VM_LOCKED) && user) {
1517 user_shm_unlock(inode->i_size, user);
1518 info->flags &= ~VM_LOCKED;
1519 mapping_clear_unevictable(file->f_mapping);
1520 scan_mapping_unevictable_pages(file->f_mapping);
1521 }
1522 retval = 0;
1523
1524out_nomem:
1525 spin_unlock(&info->lock);
1526 return retval;
1527}
1528
1529static int shmem_mmap(struct file *file, struct vm_area_struct *vma)
1530{
1531 file_accessed(file);
1532 vma->vm_ops = &shmem_vm_ops;
1533 vma->vm_flags |= VM_CAN_NONLINEAR;
1534 return 0;
1535}
1536
1537static struct inode *shmem_get_inode(struct super_block *sb, int mode,
1538 dev_t dev, unsigned long flags)
1539{
1540 struct inode *inode;
1541 struct shmem_inode_info *info;
1542 struct shmem_sb_info *sbinfo = SHMEM_SB(sb);
1543
1544 if (shmem_reserve_inode(sb))
1545 return NULL;
1546
1547 inode = new_inode(sb);
1548 if (inode) {
1549 inode->i_mode = mode;
1550 inode->i_uid = current_fsuid();
1551 inode->i_gid = current_fsgid();
1552 inode->i_blocks = 0;
1553 inode->i_mapping->backing_dev_info = &shmem_backing_dev_info;
1554 inode->i_atime = inode->i_mtime = inode->i_ctime = CURRENT_TIME;
1555 inode->i_generation = get_seconds();
1556 info = SHMEM_I(inode);
1557 memset(info, 0, (char *)inode - (char *)info);
1558 spin_lock_init(&info->lock);
1559 info->flags = flags & VM_NORESERVE;
1560 INIT_LIST_HEAD(&info->swaplist);
1561
1562 switch (mode & S_IFMT) {
1563 default:
1564 inode->i_op = &shmem_special_inode_operations;
1565 init_special_inode(inode, mode, dev);
1566 break;
1567 case S_IFREG:
1568 inode->i_mapping->a_ops = &shmem_aops;
1569 inode->i_op = &shmem_inode_operations;
1570 inode->i_fop = &shmem_file_operations;
1571 mpol_shared_policy_init(&info->policy,
1572 shmem_get_sbmpol(sbinfo));
1573 break;
1574 case S_IFDIR:
1575 inc_nlink(inode);
1576
1577 inode->i_size = 2 * BOGO_DIRENT_SIZE;
1578 inode->i_op = &shmem_dir_inode_operations;
1579 inode->i_fop = &simple_dir_operations;
1580 break;
1581 case S_IFLNK:
1582
1583
1584
1585
1586 mpol_shared_policy_init(&info->policy, NULL);
1587 break;
1588 }
1589 } else
1590 shmem_free_inode(sb);
1591 return inode;
1592}
1593
1594#ifdef CONFIG_TMPFS
1595static const struct inode_operations shmem_symlink_inode_operations;
1596static const struct inode_operations shmem_symlink_inline_operations;
1597
1598
1599
1600
1601
1602
1603static int shmem_readpage(struct file *file, struct page *page)
1604{
1605 struct inode *inode = page->mapping->host;
1606 int error = shmem_getpage(inode, page->index, &page, SGP_CACHE, NULL);
1607 unlock_page(page);
1608 return error;
1609}
1610
1611static int
1612shmem_write_begin(struct file *file, struct address_space *mapping,
1613 loff_t pos, unsigned len, unsigned flags,
1614 struct page **pagep, void **fsdata)
1615{
1616 struct inode *inode = mapping->host;
1617 pgoff_t index = pos >> PAGE_CACHE_SHIFT;
1618 *pagep = NULL;
1619 return shmem_getpage(inode, index, pagep, SGP_WRITE, NULL);
1620}
1621
1622static int
1623shmem_write_end(struct file *file, struct address_space *mapping,
1624 loff_t pos, unsigned len, unsigned copied,
1625 struct page *page, void *fsdata)
1626{
1627 struct inode *inode = mapping->host;
1628
1629 if (pos + copied > inode->i_size)
1630 i_size_write(inode, pos + copied);
1631
1632 unlock_page(page);
1633 set_page_dirty(page);
1634 page_cache_release(page);
1635
1636 return copied;
1637}
1638
1639static void do_shmem_file_read(struct file *filp, loff_t *ppos, read_descriptor_t *desc, read_actor_t actor)
1640{
1641 struct inode *inode = filp->f_path.dentry->d_inode;
1642 struct address_space *mapping = inode->i_mapping;
1643 unsigned long index, offset;
1644 enum sgp_type sgp = SGP_READ;
1645
1646
1647
1648
1649
1650
1651 if (segment_eq(get_fs(), KERNEL_DS))
1652 sgp = SGP_DIRTY;
1653
1654 index = *ppos >> PAGE_CACHE_SHIFT;
1655 offset = *ppos & ~PAGE_CACHE_MASK;
1656
1657 for (;;) {
1658 struct page *page = NULL;
1659 unsigned long end_index, nr, ret;
1660 loff_t i_size = i_size_read(inode);
1661
1662 end_index = i_size >> PAGE_CACHE_SHIFT;
1663 if (index > end_index)
1664 break;
1665 if (index == end_index) {
1666 nr = i_size & ~PAGE_CACHE_MASK;
1667 if (nr <= offset)
1668 break;
1669 }
1670
1671 desc->error = shmem_getpage(inode, index, &page, sgp, NULL);
1672 if (desc->error) {
1673 if (desc->error == -EINVAL)
1674 desc->error = 0;
1675 break;
1676 }
1677 if (page)
1678 unlock_page(page);
1679
1680
1681
1682
1683
1684 nr = PAGE_CACHE_SIZE;
1685 i_size = i_size_read(inode);
1686 end_index = i_size >> PAGE_CACHE_SHIFT;
1687 if (index == end_index) {
1688 nr = i_size & ~PAGE_CACHE_MASK;
1689 if (nr <= offset) {
1690 if (page)
1691 page_cache_release(page);
1692 break;
1693 }
1694 }
1695 nr -= offset;
1696
1697 if (page) {
1698
1699
1700
1701
1702
1703 if (mapping_writably_mapped(mapping))
1704 flush_dcache_page(page);
1705
1706
1707
1708 if (!offset)
1709 mark_page_accessed(page);
1710 } else {
1711 page = ZERO_PAGE(0);
1712 page_cache_get(page);
1713 }
1714
1715
1716
1717
1718
1719
1720
1721
1722
1723
1724
1725 ret = actor(desc, page, offset, nr);
1726 offset += ret;
1727 index += offset >> PAGE_CACHE_SHIFT;
1728 offset &= ~PAGE_CACHE_MASK;
1729
1730 page_cache_release(page);
1731 if (ret != nr || !desc->count)
1732 break;
1733
1734 cond_resched();
1735 }
1736
1737 *ppos = ((loff_t) index << PAGE_CACHE_SHIFT) + offset;
1738 file_accessed(filp);
1739}
1740
1741static ssize_t shmem_file_aio_read(struct kiocb *iocb,
1742 const struct iovec *iov, unsigned long nr_segs, loff_t pos)
1743{
1744 struct file *filp = iocb->ki_filp;
1745 ssize_t retval;
1746 unsigned long seg;
1747 size_t count;
1748 loff_t *ppos = &iocb->ki_pos;
1749
1750 retval = generic_segment_checks(iov, &nr_segs, &count, VERIFY_WRITE);
1751 if (retval)
1752 return retval;
1753
1754 for (seg = 0; seg < nr_segs; seg++) {
1755 read_descriptor_t desc;
1756
1757 desc.written = 0;
1758 desc.arg.buf = iov[seg].iov_base;
1759 desc.count = iov[seg].iov_len;
1760 if (desc.count == 0)
1761 continue;
1762 desc.error = 0;
1763 do_shmem_file_read(filp, ppos, &desc, file_read_actor);
1764 retval += desc.written;
1765 if (desc.error) {
1766 retval = retval ?: desc.error;
1767 break;
1768 }
1769 if (desc.count > 0)
1770 break;
1771 }
1772 return retval;
1773}
1774
1775static int shmem_statfs(struct dentry *dentry, struct kstatfs *buf)
1776{
1777 struct shmem_sb_info *sbinfo = SHMEM_SB(dentry->d_sb);
1778
1779 buf->f_type = TMPFS_MAGIC;
1780 buf->f_bsize = PAGE_CACHE_SIZE;
1781 buf->f_namelen = NAME_MAX;
1782 spin_lock(&sbinfo->stat_lock);
1783 if (sbinfo->max_blocks) {
1784 buf->f_blocks = sbinfo->max_blocks;
1785 buf->f_bavail = buf->f_bfree = sbinfo->free_blocks;
1786 }
1787 if (sbinfo->max_inodes) {
1788 buf->f_files = sbinfo->max_inodes;
1789 buf->f_ffree = sbinfo->free_inodes;
1790 }
1791
1792 spin_unlock(&sbinfo->stat_lock);
1793 return 0;
1794}
1795
1796
1797
1798
1799static int
1800shmem_mknod(struct inode *dir, struct dentry *dentry, int mode, dev_t dev)
1801{
1802 struct inode *inode;
1803 int error = -ENOSPC;
1804
1805 inode = shmem_get_inode(dir->i_sb, mode, dev, VM_NORESERVE);
1806 if (inode) {
1807 error = security_inode_init_security(inode, dir, NULL, NULL,
1808 NULL);
1809 if (error) {
1810 if (error != -EOPNOTSUPP) {
1811 iput(inode);
1812 return error;
1813 }
1814 }
1815 error = shmem_acl_init(inode, dir);
1816 if (error) {
1817 iput(inode);
1818 return error;
1819 }
1820 if (dir->i_mode & S_ISGID) {
1821 inode->i_gid = dir->i_gid;
1822 if (S_ISDIR(mode))
1823 inode->i_mode |= S_ISGID;
1824 }
1825 dir->i_size += BOGO_DIRENT_SIZE;
1826 dir->i_ctime = dir->i_mtime = CURRENT_TIME;
1827 d_instantiate(dentry, inode);
1828 dget(dentry);
1829 }
1830 return error;
1831}
1832
1833static int shmem_mkdir(struct inode *dir, struct dentry *dentry, int mode)
1834{
1835 int error;
1836
1837 if ((error = shmem_mknod(dir, dentry, mode | S_IFDIR, 0)))
1838 return error;
1839 inc_nlink(dir);
1840 return 0;
1841}
1842
1843static int shmem_create(struct inode *dir, struct dentry *dentry, int mode,
1844 struct nameidata *nd)
1845{
1846 return shmem_mknod(dir, dentry, mode | S_IFREG, 0);
1847}
1848
1849
1850
1851
1852static int shmem_link(struct dentry *old_dentry, struct inode *dir, struct dentry *dentry)
1853{
1854 struct inode *inode = old_dentry->d_inode;
1855 int ret;
1856
1857
1858
1859
1860
1861
1862 ret = shmem_reserve_inode(inode->i_sb);
1863 if (ret)
1864 goto out;
1865
1866 dir->i_size += BOGO_DIRENT_SIZE;
1867 inode->i_ctime = dir->i_ctime = dir->i_mtime = CURRENT_TIME;
1868 inc_nlink(inode);
1869 atomic_inc(&inode->i_count);
1870 dget(dentry);
1871 d_instantiate(dentry, inode);
1872out:
1873 return ret;
1874}
1875
1876static int shmem_unlink(struct inode *dir, struct dentry *dentry)
1877{
1878 struct inode *inode = dentry->d_inode;
1879
1880 if (inode->i_nlink > 1 && !S_ISDIR(inode->i_mode))
1881 shmem_free_inode(inode->i_sb);
1882
1883 dir->i_size -= BOGO_DIRENT_SIZE;
1884 inode->i_ctime = dir->i_ctime = dir->i_mtime = CURRENT_TIME;
1885 drop_nlink(inode);
1886 dput(dentry);
1887 return 0;
1888}
1889
1890static int shmem_rmdir(struct inode *dir, struct dentry *dentry)
1891{
1892 if (!simple_empty(dentry))
1893 return -ENOTEMPTY;
1894
1895 drop_nlink(dentry->d_inode);
1896 drop_nlink(dir);
1897 return shmem_unlink(dir, dentry);
1898}
1899
1900
1901
1902
1903
1904
1905
1906static int shmem_rename(struct inode *old_dir, struct dentry *old_dentry, struct inode *new_dir, struct dentry *new_dentry)
1907{
1908 struct inode *inode = old_dentry->d_inode;
1909 int they_are_dirs = S_ISDIR(inode->i_mode);
1910
1911 if (!simple_empty(new_dentry))
1912 return -ENOTEMPTY;
1913
1914 if (new_dentry->d_inode) {
1915 (void) shmem_unlink(new_dir, new_dentry);
1916 if (they_are_dirs)
1917 drop_nlink(old_dir);
1918 } else if (they_are_dirs) {
1919 drop_nlink(old_dir);
1920 inc_nlink(new_dir);
1921 }
1922
1923 old_dir->i_size -= BOGO_DIRENT_SIZE;
1924 new_dir->i_size += BOGO_DIRENT_SIZE;
1925 old_dir->i_ctime = old_dir->i_mtime =
1926 new_dir->i_ctime = new_dir->i_mtime =
1927 inode->i_ctime = CURRENT_TIME;
1928 return 0;
1929}
1930
1931static int shmem_symlink(struct inode *dir, struct dentry *dentry, const char *symname)
1932{
1933 int error;
1934 int len;
1935 struct inode *inode;
1936 struct page *page = NULL;
1937 char *kaddr;
1938 struct shmem_inode_info *info;
1939
1940 len = strlen(symname) + 1;
1941 if (len > PAGE_CACHE_SIZE)
1942 return -ENAMETOOLONG;
1943
1944 inode = shmem_get_inode(dir->i_sb, S_IFLNK|S_IRWXUGO, 0, VM_NORESERVE);
1945 if (!inode)
1946 return -ENOSPC;
1947
1948 error = security_inode_init_security(inode, dir, NULL, NULL,
1949 NULL);
1950 if (error) {
1951 if (error != -EOPNOTSUPP) {
1952 iput(inode);
1953 return error;
1954 }
1955 error = 0;
1956 }
1957
1958 info = SHMEM_I(inode);
1959 inode->i_size = len-1;
1960 if (len <= (char *)inode - (char *)info) {
1961
1962 memcpy(info, symname, len);
1963 inode->i_op = &shmem_symlink_inline_operations;
1964 } else {
1965 error = shmem_getpage(inode, 0, &page, SGP_WRITE, NULL);
1966 if (error) {
1967 iput(inode);
1968 return error;
1969 }
1970 unlock_page(page);
1971 inode->i_mapping->a_ops = &shmem_aops;
1972 inode->i_op = &shmem_symlink_inode_operations;
1973 kaddr = kmap_atomic(page, KM_USER0);
1974 memcpy(kaddr, symname, len);
1975 kunmap_atomic(kaddr, KM_USER0);
1976 set_page_dirty(page);
1977 page_cache_release(page);
1978 }
1979 if (dir->i_mode & S_ISGID)
1980 inode->i_gid = dir->i_gid;
1981 dir->i_size += BOGO_DIRENT_SIZE;
1982 dir->i_ctime = dir->i_mtime = CURRENT_TIME;
1983 d_instantiate(dentry, inode);
1984 dget(dentry);
1985 return 0;
1986}
1987
1988static void *shmem_follow_link_inline(struct dentry *dentry, struct nameidata *nd)
1989{
1990 nd_set_link(nd, (char *)SHMEM_I(dentry->d_inode));
1991 return NULL;
1992}
1993
1994static void *shmem_follow_link(struct dentry *dentry, struct nameidata *nd)
1995{
1996 struct page *page = NULL;
1997 int res = shmem_getpage(dentry->d_inode, 0, &page, SGP_READ, NULL);
1998 nd_set_link(nd, res ? ERR_PTR(res) : kmap(page));
1999 if (page)
2000 unlock_page(page);
2001 return page;
2002}
2003
2004static void shmem_put_link(struct dentry *dentry, struct nameidata *nd, void *cookie)
2005{
2006 if (!IS_ERR(nd_get_link(nd))) {
2007 struct page *page = cookie;
2008 kunmap(page);
2009 mark_page_accessed(page);
2010 page_cache_release(page);
2011 }
2012}
2013
2014static const struct inode_operations shmem_symlink_inline_operations = {
2015 .readlink = generic_readlink,
2016 .follow_link = shmem_follow_link_inline,
2017};
2018
2019static const struct inode_operations shmem_symlink_inode_operations = {
2020 .truncate = shmem_truncate,
2021 .readlink = generic_readlink,
2022 .follow_link = shmem_follow_link,
2023 .put_link = shmem_put_link,
2024};
2025
2026#ifdef CONFIG_TMPFS_POSIX_ACL
2027
2028
2029
2030
2031
2032
2033
2034static size_t shmem_xattr_security_list(struct inode *inode, char *list,
2035 size_t list_len, const char *name,
2036 size_t name_len)
2037{
2038 return security_inode_listsecurity(inode, list, list_len);
2039}
2040
2041static int shmem_xattr_security_get(struct inode *inode, const char *name,
2042 void *buffer, size_t size)
2043{
2044 if (strcmp(name, "") == 0)
2045 return -EINVAL;
2046 return xattr_getsecurity(inode, name, buffer, size);
2047}
2048
2049static int shmem_xattr_security_set(struct inode *inode, const char *name,
2050 const void *value, size_t size, int flags)
2051{
2052 if (strcmp(name, "") == 0)
2053 return -EINVAL;
2054 return security_inode_setsecurity(inode, name, value, size, flags);
2055}
2056
2057static struct xattr_handler shmem_xattr_security_handler = {
2058 .prefix = XATTR_SECURITY_PREFIX,
2059 .list = shmem_xattr_security_list,
2060 .get = shmem_xattr_security_get,
2061 .set = shmem_xattr_security_set,
2062};
2063
2064static struct xattr_handler *shmem_xattr_handlers[] = {
2065 &shmem_xattr_acl_access_handler,
2066 &shmem_xattr_acl_default_handler,
2067 &shmem_xattr_security_handler,
2068 NULL
2069};
2070#endif
2071
2072static struct dentry *shmem_get_parent(struct dentry *child)
2073{
2074 return ERR_PTR(-ESTALE);
2075}
2076
2077static int shmem_match(struct inode *ino, void *vfh)
2078{
2079 __u32 *fh = vfh;
2080 __u64 inum = fh[2];
2081 inum = (inum << 32) | fh[1];
2082 return ino->i_ino == inum && fh[0] == ino->i_generation;
2083}
2084
2085static struct dentry *shmem_fh_to_dentry(struct super_block *sb,
2086 struct fid *fid, int fh_len, int fh_type)
2087{
2088 struct inode *inode;
2089 struct dentry *dentry = NULL;
2090 u64 inum = fid->raw[2];
2091 inum = (inum << 32) | fid->raw[1];
2092
2093 if (fh_len < 3)
2094 return NULL;
2095
2096 inode = ilookup5(sb, (unsigned long)(inum + fid->raw[0]),
2097 shmem_match, fid->raw);
2098 if (inode) {
2099 dentry = d_find_alias(inode);
2100 iput(inode);
2101 }
2102
2103 return dentry;
2104}
2105
2106static int shmem_encode_fh(struct dentry *dentry, __u32 *fh, int *len,
2107 int connectable)
2108{
2109 struct inode *inode = dentry->d_inode;
2110
2111 if (*len < 3)
2112 return 255;
2113
2114 if (hlist_unhashed(&inode->i_hash)) {
2115
2116
2117
2118
2119
2120 static DEFINE_SPINLOCK(lock);
2121 spin_lock(&lock);
2122 if (hlist_unhashed(&inode->i_hash))
2123 __insert_inode_hash(inode,
2124 inode->i_ino + inode->i_generation);
2125 spin_unlock(&lock);
2126 }
2127
2128 fh[0] = inode->i_generation;
2129 fh[1] = inode->i_ino;
2130 fh[2] = ((__u64)inode->i_ino) >> 32;
2131
2132 *len = 3;
2133 return 1;
2134}
2135
2136static const struct export_operations shmem_export_ops = {
2137 .get_parent = shmem_get_parent,
2138 .encode_fh = shmem_encode_fh,
2139 .fh_to_dentry = shmem_fh_to_dentry,
2140};
2141
2142static int shmem_parse_options(char *options, struct shmem_sb_info *sbinfo,
2143 bool remount)
2144{
2145 char *this_char, *value, *rest;
2146
2147 while (options != NULL) {
2148 this_char = options;
2149 for (;;) {
2150
2151
2152
2153
2154
2155 options = strchr(options, ',');
2156 if (options == NULL)
2157 break;
2158 options++;
2159 if (!isdigit(*options)) {
2160 options[-1] = '\0';
2161 break;
2162 }
2163 }
2164 if (!*this_char)
2165 continue;
2166 if ((value = strchr(this_char,'=')) != NULL) {
2167 *value++ = 0;
2168 } else {
2169 printk(KERN_ERR
2170 "tmpfs: No value for mount option '%s'\n",
2171 this_char);
2172 return 1;
2173 }
2174
2175 if (!strcmp(this_char,"size")) {
2176 unsigned long long size;
2177 size = memparse(value,&rest);
2178 if (*rest == '%') {
2179 size <<= PAGE_SHIFT;
2180 size *= totalram_pages;
2181 do_div(size, 100);
2182 rest++;
2183 }
2184 if (*rest)
2185 goto bad_val;
2186 sbinfo->max_blocks =
2187 DIV_ROUND_UP(size, PAGE_CACHE_SIZE);
2188 } else if (!strcmp(this_char,"nr_blocks")) {
2189 sbinfo->max_blocks = memparse(value, &rest);
2190 if (*rest)
2191 goto bad_val;
2192 } else if (!strcmp(this_char,"nr_inodes")) {
2193 sbinfo->max_inodes = memparse(value, &rest);
2194 if (*rest)
2195 goto bad_val;
2196 } else if (!strcmp(this_char,"mode")) {
2197 if (remount)
2198 continue;
2199 sbinfo->mode = simple_strtoul(value, &rest, 8) & 07777;
2200 if (*rest)
2201 goto bad_val;
2202 } else if (!strcmp(this_char,"uid")) {
2203 if (remount)
2204 continue;
2205 sbinfo->uid = simple_strtoul(value, &rest, 0);
2206 if (*rest)
2207 goto bad_val;
2208 } else if (!strcmp(this_char,"gid")) {
2209 if (remount)
2210 continue;
2211 sbinfo->gid = simple_strtoul(value, &rest, 0);
2212 if (*rest)
2213 goto bad_val;
2214 } else if (!strcmp(this_char,"mpol")) {
2215 if (mpol_parse_str(value, &sbinfo->mpol, 1))
2216 goto bad_val;
2217 } else {
2218 printk(KERN_ERR "tmpfs: Bad mount option %s\n",
2219 this_char);
2220 return 1;
2221 }
2222 }
2223 return 0;
2224
2225bad_val:
2226 printk(KERN_ERR "tmpfs: Bad value '%s' for mount option '%s'\n",
2227 value, this_char);
2228 return 1;
2229
2230}
2231
2232static int shmem_remount_fs(struct super_block *sb, int *flags, char *data)
2233{
2234 struct shmem_sb_info *sbinfo = SHMEM_SB(sb);
2235 struct shmem_sb_info config = *sbinfo;
2236 unsigned long blocks;
2237 unsigned long inodes;
2238 int error = -EINVAL;
2239
2240 if (shmem_parse_options(data, &config, true))
2241 return error;
2242
2243 spin_lock(&sbinfo->stat_lock);
2244 blocks = sbinfo->max_blocks - sbinfo->free_blocks;
2245 inodes = sbinfo->max_inodes - sbinfo->free_inodes;
2246 if (config.max_blocks < blocks)
2247 goto out;
2248 if (config.max_inodes < inodes)
2249 goto out;
2250
2251
2252
2253
2254
2255
2256 if (config.max_blocks && !sbinfo->max_blocks)
2257 goto out;
2258 if (config.max_inodes && !sbinfo->max_inodes)
2259 goto out;
2260
2261 error = 0;
2262 sbinfo->max_blocks = config.max_blocks;
2263 sbinfo->free_blocks = config.max_blocks - blocks;
2264 sbinfo->max_inodes = config.max_inodes;
2265 sbinfo->free_inodes = config.max_inodes - inodes;
2266
2267 mpol_put(sbinfo->mpol);
2268 sbinfo->mpol = config.mpol;
2269out:
2270 spin_unlock(&sbinfo->stat_lock);
2271 return error;
2272}
2273
2274static int shmem_show_options(struct seq_file *seq, struct vfsmount *vfs)
2275{
2276 struct shmem_sb_info *sbinfo = SHMEM_SB(vfs->mnt_sb);
2277
2278 if (sbinfo->max_blocks != shmem_default_max_blocks())
2279 seq_printf(seq, ",size=%luk",
2280 sbinfo->max_blocks << (PAGE_CACHE_SHIFT - 10));
2281 if (sbinfo->max_inodes != shmem_default_max_inodes())
2282 seq_printf(seq, ",nr_inodes=%lu", sbinfo->max_inodes);
2283 if (sbinfo->mode != (S_IRWXUGO | S_ISVTX))
2284 seq_printf(seq, ",mode=%03o", sbinfo->mode);
2285 if (sbinfo->uid != 0)
2286 seq_printf(seq, ",uid=%u", sbinfo->uid);
2287 if (sbinfo->gid != 0)
2288 seq_printf(seq, ",gid=%u", sbinfo->gid);
2289 shmem_show_mpol(seq, sbinfo->mpol);
2290 return 0;
2291}
2292#endif
2293
2294static void shmem_put_super(struct super_block *sb)
2295{
2296 kfree(sb->s_fs_info);
2297 sb->s_fs_info = NULL;
2298}
2299
2300static int shmem_fill_super(struct super_block *sb,
2301 void *data, int silent)
2302{
2303 struct inode *inode;
2304 struct dentry *root;
2305 struct shmem_sb_info *sbinfo;
2306 int err = -ENOMEM;
2307
2308
2309 sbinfo = kmalloc(max((int)sizeof(struct shmem_sb_info),
2310 L1_CACHE_BYTES), GFP_KERNEL);
2311 if (!sbinfo)
2312 return -ENOMEM;
2313
2314 sbinfo->max_blocks = 0;
2315 sbinfo->max_inodes = 0;
2316 sbinfo->mode = S_IRWXUGO | S_ISVTX;
2317 sbinfo->uid = current_fsuid();
2318 sbinfo->gid = current_fsgid();
2319 sbinfo->mpol = NULL;
2320 sb->s_fs_info = sbinfo;
2321
2322#ifdef CONFIG_TMPFS
2323
2324
2325
2326
2327
2328 if (!(sb->s_flags & MS_NOUSER)) {
2329 sbinfo->max_blocks = shmem_default_max_blocks();
2330 sbinfo->max_inodes = shmem_default_max_inodes();
2331 if (shmem_parse_options(data, sbinfo, false)) {
2332 err = -EINVAL;
2333 goto failed;
2334 }
2335 }
2336 sb->s_export_op = &shmem_export_ops;
2337#else
2338 sb->s_flags |= MS_NOUSER;
2339#endif
2340
2341 spin_lock_init(&sbinfo->stat_lock);
2342 sbinfo->free_blocks = sbinfo->max_blocks;
2343 sbinfo->free_inodes = sbinfo->max_inodes;
2344
2345 sb->s_maxbytes = SHMEM_MAX_BYTES;
2346 sb->s_blocksize = PAGE_CACHE_SIZE;
2347 sb->s_blocksize_bits = PAGE_CACHE_SHIFT;
2348 sb->s_magic = TMPFS_MAGIC;
2349 sb->s_op = &shmem_ops;
2350 sb->s_time_gran = 1;
2351#ifdef CONFIG_TMPFS_POSIX_ACL
2352 sb->s_xattr = shmem_xattr_handlers;
2353 sb->s_flags |= MS_POSIXACL;
2354#endif
2355
2356 inode = shmem_get_inode(sb, S_IFDIR | sbinfo->mode, 0, VM_NORESERVE);
2357 if (!inode)
2358 goto failed;
2359 inode->i_uid = sbinfo->uid;
2360 inode->i_gid = sbinfo->gid;
2361 root = d_alloc_root(inode);
2362 if (!root)
2363 goto failed_iput;
2364 sb->s_root = root;
2365 return 0;
2366
2367failed_iput:
2368 iput(inode);
2369failed:
2370 shmem_put_super(sb);
2371 return err;
2372}
2373
2374static struct kmem_cache *shmem_inode_cachep;
2375
2376static struct inode *shmem_alloc_inode(struct super_block *sb)
2377{
2378 struct shmem_inode_info *p;
2379 p = (struct shmem_inode_info *)kmem_cache_alloc(shmem_inode_cachep, GFP_KERNEL);
2380 if (!p)
2381 return NULL;
2382 return &p->vfs_inode;
2383}
2384
2385static void shmem_destroy_inode(struct inode *inode)
2386{
2387 if ((inode->i_mode & S_IFMT) == S_IFREG) {
2388
2389 mpol_free_shared_policy(&SHMEM_I(inode)->policy);
2390 }
2391 shmem_acl_destroy_inode(inode);
2392 kmem_cache_free(shmem_inode_cachep, SHMEM_I(inode));
2393}
2394
2395static void init_once(void *foo)
2396{
2397 struct shmem_inode_info *p = (struct shmem_inode_info *) foo;
2398
2399 inode_init_once(&p->vfs_inode);
2400#ifdef CONFIG_TMPFS_POSIX_ACL
2401 p->i_acl = NULL;
2402 p->i_default_acl = NULL;
2403#endif
2404}
2405
2406static int init_inodecache(void)
2407{
2408 shmem_inode_cachep = kmem_cache_create("shmem_inode_cache",
2409 sizeof(struct shmem_inode_info),
2410 0, SLAB_PANIC, init_once);
2411 return 0;
2412}
2413
2414static void destroy_inodecache(void)
2415{
2416 kmem_cache_destroy(shmem_inode_cachep);
2417}
2418
2419static const struct address_space_operations shmem_aops = {
2420 .writepage = shmem_writepage,
2421 .set_page_dirty = __set_page_dirty_no_writeback,
2422#ifdef CONFIG_TMPFS
2423 .readpage = shmem_readpage,
2424 .write_begin = shmem_write_begin,
2425 .write_end = shmem_write_end,
2426#endif
2427 .migratepage = migrate_page,
2428};
2429
2430static const struct file_operations shmem_file_operations = {
2431 .mmap = shmem_mmap,
2432#ifdef CONFIG_TMPFS
2433 .llseek = generic_file_llseek,
2434 .read = do_sync_read,
2435 .write = do_sync_write,
2436 .aio_read = shmem_file_aio_read,
2437 .aio_write = generic_file_aio_write,
2438 .fsync = simple_sync_file,
2439 .splice_read = generic_file_splice_read,
2440 .splice_write = generic_file_splice_write,
2441#endif
2442};
2443
2444static const struct inode_operations shmem_inode_operations = {
2445 .truncate = shmem_truncate,
2446 .setattr = shmem_notify_change,
2447 .truncate_range = shmem_truncate_range,
2448#ifdef CONFIG_TMPFS_POSIX_ACL
2449 .setxattr = generic_setxattr,
2450 .getxattr = generic_getxattr,
2451 .listxattr = generic_listxattr,
2452 .removexattr = generic_removexattr,
2453 .permission = shmem_permission,
2454#endif
2455
2456};
2457
2458static const struct inode_operations shmem_dir_inode_operations = {
2459#ifdef CONFIG_TMPFS
2460 .create = shmem_create,
2461 .lookup = simple_lookup,
2462 .link = shmem_link,
2463 .unlink = shmem_unlink,
2464 .symlink = shmem_symlink,
2465 .mkdir = shmem_mkdir,
2466 .rmdir = shmem_rmdir,
2467 .mknod = shmem_mknod,
2468 .rename = shmem_rename,
2469#endif
2470#ifdef CONFIG_TMPFS_POSIX_ACL
2471 .setattr = shmem_notify_change,
2472 .setxattr = generic_setxattr,
2473 .getxattr = generic_getxattr,
2474 .listxattr = generic_listxattr,
2475 .removexattr = generic_removexattr,
2476 .permission = shmem_permission,
2477#endif
2478};
2479
2480static const struct inode_operations shmem_special_inode_operations = {
2481#ifdef CONFIG_TMPFS_POSIX_ACL
2482 .setattr = shmem_notify_change,
2483 .setxattr = generic_setxattr,
2484 .getxattr = generic_getxattr,
2485 .listxattr = generic_listxattr,
2486 .removexattr = generic_removexattr,
2487 .permission = shmem_permission,
2488#endif
2489};
2490
2491static const struct super_operations shmem_ops = {
2492 .alloc_inode = shmem_alloc_inode,
2493 .destroy_inode = shmem_destroy_inode,
2494#ifdef CONFIG_TMPFS
2495 .statfs = shmem_statfs,
2496 .remount_fs = shmem_remount_fs,
2497 .show_options = shmem_show_options,
2498#endif
2499 .delete_inode = shmem_delete_inode,
2500 .drop_inode = generic_delete_inode,
2501 .put_super = shmem_put_super,
2502};
2503
2504static struct vm_operations_struct shmem_vm_ops = {
2505 .fault = shmem_fault,
2506#ifdef CONFIG_NUMA
2507 .set_policy = shmem_set_policy,
2508 .get_policy = shmem_get_policy,
2509#endif
2510};
2511
2512
2513static int shmem_get_sb(struct file_system_type *fs_type,
2514 int flags, const char *dev_name, void *data, struct vfsmount *mnt)
2515{
2516 return get_sb_nodev(fs_type, flags, data, shmem_fill_super, mnt);
2517}
2518
2519static struct file_system_type tmpfs_fs_type = {
2520 .owner = THIS_MODULE,
2521 .name = "tmpfs",
2522 .get_sb = shmem_get_sb,
2523 .kill_sb = kill_litter_super,
2524};
2525
2526static int __init init_tmpfs(void)
2527{
2528 int error;
2529
2530 error = bdi_init(&shmem_backing_dev_info);
2531 if (error)
2532 goto out4;
2533
2534 error = init_inodecache();
2535 if (error)
2536 goto out3;
2537
2538 error = register_filesystem(&tmpfs_fs_type);
2539 if (error) {
2540 printk(KERN_ERR "Could not register tmpfs\n");
2541 goto out2;
2542 }
2543
2544 shm_mnt = vfs_kern_mount(&tmpfs_fs_type, MS_NOUSER,
2545 tmpfs_fs_type.name, NULL);
2546 if (IS_ERR(shm_mnt)) {
2547 error = PTR_ERR(shm_mnt);
2548 printk(KERN_ERR "Could not kern_mount tmpfs\n");
2549 goto out1;
2550 }
2551 return 0;
2552
2553out1:
2554 unregister_filesystem(&tmpfs_fs_type);
2555out2:
2556 destroy_inodecache();
2557out3:
2558 bdi_destroy(&shmem_backing_dev_info);
2559out4:
2560 shm_mnt = ERR_PTR(error);
2561 return error;
2562}
2563
2564#else
2565
2566
2567
2568
2569
2570
2571
2572
2573
2574
2575#include <linux/ramfs.h>
2576
2577static struct file_system_type tmpfs_fs_type = {
2578 .name = "tmpfs",
2579 .get_sb = ramfs_get_sb,
2580 .kill_sb = kill_litter_super,
2581};
2582
2583static int __init init_tmpfs(void)
2584{
2585 BUG_ON(register_filesystem(&tmpfs_fs_type) != 0);
2586
2587 shm_mnt = kern_mount(&tmpfs_fs_type);
2588 BUG_ON(IS_ERR(shm_mnt));
2589
2590 return 0;
2591}
2592
2593int shmem_unuse(swp_entry_t entry, struct page *page)
2594{
2595 return 0;
2596}
2597
2598#define shmem_vm_ops generic_file_vm_ops
2599#define shmem_file_operations ramfs_file_operations
2600#define shmem_get_inode(sb, mode, dev, flags) ramfs_get_inode(sb, mode, dev)
2601#define shmem_acct_size(flags, size) 0
2602#define shmem_unacct_size(flags, size) do {} while (0)
2603#define SHMEM_MAX_BYTES MAX_LFS_FILESIZE
2604
2605#endif
2606
2607
2608
2609
2610
2611
2612
2613
2614
2615struct file *shmem_file_setup(char *name, loff_t size, unsigned long flags)
2616{
2617 int error;
2618 struct file *file;
2619 struct inode *inode;
2620 struct dentry *dentry, *root;
2621 struct qstr this;
2622
2623 if (IS_ERR(shm_mnt))
2624 return (void *)shm_mnt;
2625
2626 if (size < 0 || size > SHMEM_MAX_BYTES)
2627 return ERR_PTR(-EINVAL);
2628
2629 if (shmem_acct_size(flags, size))
2630 return ERR_PTR(-ENOMEM);
2631
2632 error = -ENOMEM;
2633 this.name = name;
2634 this.len = strlen(name);
2635 this.hash = 0;
2636 root = shm_mnt->mnt_root;
2637 dentry = d_alloc(root, &this);
2638 if (!dentry)
2639 goto put_memory;
2640
2641 error = -ENFILE;
2642 file = get_empty_filp();
2643 if (!file)
2644 goto put_dentry;
2645
2646 error = -ENOSPC;
2647 inode = shmem_get_inode(root->d_sb, S_IFREG | S_IRWXUGO, 0, flags);
2648 if (!inode)
2649 goto close_file;
2650
2651 d_instantiate(dentry, inode);
2652 inode->i_size = size;
2653 inode->i_nlink = 0;
2654 init_file(file, shm_mnt, dentry, FMODE_WRITE | FMODE_READ,
2655 &shmem_file_operations);
2656
2657#ifndef CONFIG_MMU
2658 error = ramfs_nommu_expand_for_mapping(inode, size);
2659 if (error)
2660 goto close_file;
2661#endif
2662 return file;
2663
2664close_file:
2665 put_filp(file);
2666put_dentry:
2667 dput(dentry);
2668put_memory:
2669 shmem_unacct_size(flags, size);
2670 return ERR_PTR(error);
2671}
2672EXPORT_SYMBOL_GPL(shmem_file_setup);
2673
2674
2675
2676
2677
2678int shmem_zero_setup(struct vm_area_struct *vma)
2679{
2680 struct file *file;
2681 loff_t size = vma->vm_end - vma->vm_start;
2682
2683 file = shmem_file_setup("dev/zero", size, vma->vm_flags);
2684 if (IS_ERR(file))
2685 return PTR_ERR(file);
2686
2687 ima_shm_check(file);
2688 if (vma->vm_file)
2689 fput(vma->vm_file);
2690 vma->vm_file = file;
2691 vma->vm_ops = &shmem_vm_ops;
2692 return 0;
2693}
2694
2695module_init(init_tmpfs)
2696