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