aboutsummaryrefslogtreecommitdiffstats
path: root/mm/shmem.c
diff options
context:
space:
mode:
Diffstat (limited to 'mm/shmem.c')
-rw-r--r--mm/shmem.c140
1 files changed, 97 insertions, 43 deletions
diff --git a/mm/shmem.c b/mm/shmem.c
index eef4ebea5158..7e5030ae18ff 100644
--- a/mm/shmem.c
+++ b/mm/shmem.c
@@ -433,8 +433,6 @@ static swp_entry_t *shmem_swp_alloc(struct shmem_inode_info *info, unsigned long
433 433
434 spin_unlock(&info->lock); 434 spin_unlock(&info->lock);
435 page = shmem_dir_alloc(mapping_gfp_mask(inode->i_mapping)); 435 page = shmem_dir_alloc(mapping_gfp_mask(inode->i_mapping));
436 if (page)
437 set_page_private(page, 0);
438 spin_lock(&info->lock); 436 spin_lock(&info->lock);
439 437
440 if (!page) { 438 if (!page) {
@@ -729,10 +727,11 @@ done2:
729 if (inode->i_mapping->nrpages && (info->flags & SHMEM_PAGEIN)) { 727 if (inode->i_mapping->nrpages && (info->flags & SHMEM_PAGEIN)) {
730 /* 728 /*
731 * Call truncate_inode_pages again: racing shmem_unuse_inode 729 * Call truncate_inode_pages again: racing shmem_unuse_inode
732 * may have swizzled a page in from swap since vmtruncate or 730 * may have swizzled a page in from swap since
733 * generic_delete_inode did it, before we lowered next_index. 731 * truncate_pagecache or generic_delete_inode did it, before we
734 * Also, though shmem_getpage checks i_size before adding to 732 * lowered next_index. Also, though shmem_getpage checks
735 * cache, no recheck after: so fix the narrow window there too. 733 * i_size before adding to cache, no recheck after: so fix the
734 * narrow window there too.
736 * 735 *
737 * Recalling truncate_inode_pages_range and unmap_mapping_range 736 * Recalling truncate_inode_pages_range and unmap_mapping_range
738 * every time for punch_hole (which never got a chance to clear 737 * every time for punch_hole (which never got a chance to clear
@@ -762,19 +761,16 @@ done2:
762 } 761 }
763} 762}
764 763
765static void shmem_truncate(struct inode *inode)
766{
767 shmem_truncate_range(inode, inode->i_size, (loff_t)-1);
768}
769
770static int shmem_notify_change(struct dentry *dentry, struct iattr *attr) 764static int shmem_notify_change(struct dentry *dentry, struct iattr *attr)
771{ 765{
772 struct inode *inode = dentry->d_inode; 766 struct inode *inode = dentry->d_inode;
773 struct page *page = NULL;
774 int error; 767 int error;
775 768
776 if (S_ISREG(inode->i_mode) && (attr->ia_valid & ATTR_SIZE)) { 769 if (S_ISREG(inode->i_mode) && (attr->ia_valid & ATTR_SIZE)) {
777 if (attr->ia_size < inode->i_size) { 770 loff_t newsize = attr->ia_size;
771 struct page *page = NULL;
772
773 if (newsize < inode->i_size) {
778 /* 774 /*
779 * If truncating down to a partial page, then 775 * If truncating down to a partial page, then
780 * if that page is already allocated, hold it 776 * if that page is already allocated, hold it
@@ -782,9 +778,9 @@ static int shmem_notify_change(struct dentry *dentry, struct iattr *attr)
782 * truncate_partial_page cannnot miss it were 778 * truncate_partial_page cannnot miss it were
783 * it assigned to swap. 779 * it assigned to swap.
784 */ 780 */
785 if (attr->ia_size & (PAGE_CACHE_SIZE-1)) { 781 if (newsize & (PAGE_CACHE_SIZE-1)) {
786 (void) shmem_getpage(inode, 782 (void) shmem_getpage(inode,
787 attr->ia_size>>PAGE_CACHE_SHIFT, 783 newsize >> PAGE_CACHE_SHIFT,
788 &page, SGP_READ, NULL); 784 &page, SGP_READ, NULL);
789 if (page) 785 if (page)
790 unlock_page(page); 786 unlock_page(page);
@@ -796,24 +792,29 @@ static int shmem_notify_change(struct dentry *dentry, struct iattr *attr)
796 * if it's being fully truncated to zero-length: the 792 * if it's being fully truncated to zero-length: the
797 * nrpages check is efficient enough in that case. 793 * nrpages check is efficient enough in that case.
798 */ 794 */
799 if (attr->ia_size) { 795 if (newsize) {
800 struct shmem_inode_info *info = SHMEM_I(inode); 796 struct shmem_inode_info *info = SHMEM_I(inode);
801 spin_lock(&info->lock); 797 spin_lock(&info->lock);
802 info->flags &= ~SHMEM_PAGEIN; 798 info->flags &= ~SHMEM_PAGEIN;
803 spin_unlock(&info->lock); 799 spin_unlock(&info->lock);
804 } 800 }
805 } 801 }
802
803 error = simple_setsize(inode, newsize);
804 if (page)
805 page_cache_release(page);
806 if (error)
807 return error;
808 shmem_truncate_range(inode, newsize, (loff_t)-1);
806 } 809 }
807 810
808 error = inode_change_ok(inode, attr); 811 error = inode_change_ok(inode, attr);
809 if (!error) 812 if (!error)
810 error = inode_setattr(inode, attr); 813 generic_setattr(inode, attr);
811#ifdef CONFIG_TMPFS_POSIX_ACL 814#ifdef CONFIG_TMPFS_POSIX_ACL
812 if (!error && (attr->ia_valid & ATTR_MODE)) 815 if (!error && (attr->ia_valid & ATTR_MODE))
813 error = generic_acl_chmod(inode); 816 error = generic_acl_chmod(inode);
814#endif 817#endif
815 if (page)
816 page_cache_release(page);
817 return error; 818 return error;
818} 819}
819 820
@@ -821,11 +822,11 @@ static void shmem_delete_inode(struct inode *inode)
821{ 822{
822 struct shmem_inode_info *info = SHMEM_I(inode); 823 struct shmem_inode_info *info = SHMEM_I(inode);
823 824
824 if (inode->i_op->truncate == shmem_truncate) { 825 if (inode->i_mapping->a_ops == &shmem_aops) {
825 truncate_inode_pages(inode->i_mapping, 0); 826 truncate_inode_pages(inode->i_mapping, 0);
826 shmem_unacct_size(info->flags, inode->i_size); 827 shmem_unacct_size(info->flags, inode->i_size);
827 inode->i_size = 0; 828 inode->i_size = 0;
828 shmem_truncate(inode); 829 shmem_truncate_range(inode, 0, (loff_t)-1);
829 if (!list_empty(&info->swaplist)) { 830 if (!list_empty(&info->swaplist)) {
830 mutex_lock(&shmem_swaplist_mutex); 831 mutex_lock(&shmem_swaplist_mutex);
831 list_del_init(&info->swaplist); 832 list_del_init(&info->swaplist);
@@ -1545,8 +1546,8 @@ static int shmem_mmap(struct file *file, struct vm_area_struct *vma)
1545 return 0; 1546 return 0;
1546} 1547}
1547 1548
1548static struct inode *shmem_get_inode(struct super_block *sb, int mode, 1549static struct inode *shmem_get_inode(struct super_block *sb, const struct inode *dir,
1549 dev_t dev, unsigned long flags) 1550 int mode, dev_t dev, unsigned long flags)
1550{ 1551{
1551 struct inode *inode; 1552 struct inode *inode;
1552 struct shmem_inode_info *info; 1553 struct shmem_inode_info *info;
@@ -1557,9 +1558,7 @@ static struct inode *shmem_get_inode(struct super_block *sb, int mode,
1557 1558
1558 inode = new_inode(sb); 1559 inode = new_inode(sb);
1559 if (inode) { 1560 if (inode) {
1560 inode->i_mode = mode; 1561 inode_init_owner(inode, dir, mode);
1561 inode->i_uid = current_fsuid();
1562 inode->i_gid = current_fsgid();
1563 inode->i_blocks = 0; 1562 inode->i_blocks = 0;
1564 inode->i_mapping->backing_dev_info = &shmem_backing_dev_info; 1563 inode->i_mapping->backing_dev_info = &shmem_backing_dev_info;
1565 inode->i_atime = inode->i_mtime = inode->i_ctime = CURRENT_TIME; 1564 inode->i_atime = inode->i_mtime = inode->i_ctime = CURRENT_TIME;
@@ -1814,7 +1813,7 @@ shmem_mknod(struct inode *dir, struct dentry *dentry, int mode, dev_t dev)
1814 struct inode *inode; 1813 struct inode *inode;
1815 int error = -ENOSPC; 1814 int error = -ENOSPC;
1816 1815
1817 inode = shmem_get_inode(dir->i_sb, mode, dev, VM_NORESERVE); 1816 inode = shmem_get_inode(dir->i_sb, dir, mode, dev, VM_NORESERVE);
1818 if (inode) { 1817 if (inode) {
1819 error = security_inode_init_security(inode, dir, NULL, NULL, 1818 error = security_inode_init_security(inode, dir, NULL, NULL,
1820 NULL); 1819 NULL);
@@ -1833,11 +1832,6 @@ shmem_mknod(struct inode *dir, struct dentry *dentry, int mode, dev_t dev)
1833#else 1832#else
1834 error = 0; 1833 error = 0;
1835#endif 1834#endif
1836 if (dir->i_mode & S_ISGID) {
1837 inode->i_gid = dir->i_gid;
1838 if (S_ISDIR(mode))
1839 inode->i_mode |= S_ISGID;
1840 }
1841 dir->i_size += BOGO_DIRENT_SIZE; 1835 dir->i_size += BOGO_DIRENT_SIZE;
1842 dir->i_ctime = dir->i_mtime = CURRENT_TIME; 1836 dir->i_ctime = dir->i_mtime = CURRENT_TIME;
1843 d_instantiate(dentry, inode); 1837 d_instantiate(dentry, inode);
@@ -1957,7 +1951,7 @@ static int shmem_symlink(struct inode *dir, struct dentry *dentry, const char *s
1957 if (len > PAGE_CACHE_SIZE) 1951 if (len > PAGE_CACHE_SIZE)
1958 return -ENAMETOOLONG; 1952 return -ENAMETOOLONG;
1959 1953
1960 inode = shmem_get_inode(dir->i_sb, S_IFLNK|S_IRWXUGO, 0, VM_NORESERVE); 1954 inode = shmem_get_inode(dir->i_sb, dir, S_IFLNK|S_IRWXUGO, 0, VM_NORESERVE);
1961 if (!inode) 1955 if (!inode)
1962 return -ENOSPC; 1956 return -ENOSPC;
1963 1957
@@ -1992,8 +1986,6 @@ static int shmem_symlink(struct inode *dir, struct dentry *dentry, const char *s
1992 unlock_page(page); 1986 unlock_page(page);
1993 page_cache_release(page); 1987 page_cache_release(page);
1994 } 1988 }
1995 if (dir->i_mode & S_ISGID)
1996 inode->i_gid = dir->i_gid;
1997 dir->i_size += BOGO_DIRENT_SIZE; 1989 dir->i_size += BOGO_DIRENT_SIZE;
1998 dir->i_ctime = dir->i_mtime = CURRENT_TIME; 1990 dir->i_ctime = dir->i_mtime = CURRENT_TIME;
1999 d_instantiate(dentry, inode); 1991 d_instantiate(dentry, inode);
@@ -2033,7 +2025,6 @@ static const struct inode_operations shmem_symlink_inline_operations = {
2033}; 2025};
2034 2026
2035static const struct inode_operations shmem_symlink_inode_operations = { 2027static const struct inode_operations shmem_symlink_inode_operations = {
2036 .truncate = shmem_truncate,
2037 .readlink = generic_readlink, 2028 .readlink = generic_readlink,
2038 .follow_link = shmem_follow_link, 2029 .follow_link = shmem_follow_link,
2039 .put_link = shmem_put_link, 2030 .put_link = shmem_put_link,
@@ -2071,14 +2062,14 @@ static int shmem_xattr_security_set(struct dentry *dentry, const char *name,
2071 size, flags); 2062 size, flags);
2072} 2063}
2073 2064
2074static struct xattr_handler shmem_xattr_security_handler = { 2065static const struct xattr_handler shmem_xattr_security_handler = {
2075 .prefix = XATTR_SECURITY_PREFIX, 2066 .prefix = XATTR_SECURITY_PREFIX,
2076 .list = shmem_xattr_security_list, 2067 .list = shmem_xattr_security_list,
2077 .get = shmem_xattr_security_get, 2068 .get = shmem_xattr_security_get,
2078 .set = shmem_xattr_security_set, 2069 .set = shmem_xattr_security_set,
2079}; 2070};
2080 2071
2081static struct xattr_handler *shmem_xattr_handlers[] = { 2072static const struct xattr_handler *shmem_xattr_handlers[] = {
2082 &generic_acl_access_handler, 2073 &generic_acl_access_handler,
2083 &generic_acl_default_handler, 2074 &generic_acl_default_handler,
2084 &shmem_xattr_security_handler, 2075 &shmem_xattr_security_handler,
@@ -2366,7 +2357,7 @@ int shmem_fill_super(struct super_block *sb, void *data, int silent)
2366 sb->s_flags |= MS_POSIXACL; 2357 sb->s_flags |= MS_POSIXACL;
2367#endif 2358#endif
2368 2359
2369 inode = shmem_get_inode(sb, S_IFDIR | sbinfo->mode, 0, VM_NORESERVE); 2360 inode = shmem_get_inode(sb, NULL, S_IFDIR | sbinfo->mode, 0, VM_NORESERVE);
2370 if (!inode) 2361 if (!inode)
2371 goto failed; 2362 goto failed;
2372 inode->i_uid = sbinfo->uid; 2363 inode->i_uid = sbinfo->uid;
@@ -2444,14 +2435,13 @@ static const struct file_operations shmem_file_operations = {
2444 .write = do_sync_write, 2435 .write = do_sync_write,
2445 .aio_read = shmem_file_aio_read, 2436 .aio_read = shmem_file_aio_read,
2446 .aio_write = generic_file_aio_write, 2437 .aio_write = generic_file_aio_write,
2447 .fsync = simple_sync_file, 2438 .fsync = noop_fsync,
2448 .splice_read = generic_file_splice_read, 2439 .splice_read = generic_file_splice_read,
2449 .splice_write = generic_file_splice_write, 2440 .splice_write = generic_file_splice_write,
2450#endif 2441#endif
2451}; 2442};
2452 2443
2453static const struct inode_operations shmem_inode_operations = { 2444static const struct inode_operations shmem_inode_operations = {
2454 .truncate = shmem_truncate,
2455 .setattr = shmem_notify_change, 2445 .setattr = shmem_notify_change,
2456 .truncate_range = shmem_truncate_range, 2446 .truncate_range = shmem_truncate_range,
2457#ifdef CONFIG_TMPFS_POSIX_ACL 2447#ifdef CONFIG_TMPFS_POSIX_ACL
@@ -2570,6 +2560,45 @@ out4:
2570 return error; 2560 return error;
2571} 2561}
2572 2562
2563#ifdef CONFIG_CGROUP_MEM_RES_CTLR
2564/**
2565 * mem_cgroup_get_shmem_target - find a page or entry assigned to the shmem file
2566 * @inode: the inode to be searched
2567 * @pgoff: the offset to be searched
2568 * @pagep: the pointer for the found page to be stored
2569 * @ent: the pointer for the found swap entry to be stored
2570 *
2571 * If a page is found, refcount of it is incremented. Callers should handle
2572 * these refcount.
2573 */
2574void mem_cgroup_get_shmem_target(struct inode *inode, pgoff_t pgoff,
2575 struct page **pagep, swp_entry_t *ent)
2576{
2577 swp_entry_t entry = { .val = 0 }, *ptr;
2578 struct page *page = NULL;
2579 struct shmem_inode_info *info = SHMEM_I(inode);
2580
2581 if ((pgoff << PAGE_CACHE_SHIFT) >= i_size_read(inode))
2582 goto out;
2583
2584 spin_lock(&info->lock);
2585 ptr = shmem_swp_entry(info, pgoff, NULL);
2586#ifdef CONFIG_SWAP
2587 if (ptr && ptr->val) {
2588 entry.val = ptr->val;
2589 page = find_get_page(&swapper_space, entry.val);
2590 } else
2591#endif
2592 page = find_get_page(inode->i_mapping, pgoff);
2593 if (ptr)
2594 shmem_swp_unmap(ptr);
2595 spin_unlock(&info->lock);
2596out:
2597 *pagep = page;
2598 *ent = entry;
2599}
2600#endif
2601
2573#else /* !CONFIG_SHMEM */ 2602#else /* !CONFIG_SHMEM */
2574 2603
2575/* 2604/*
@@ -2609,9 +2638,34 @@ int shmem_lock(struct file *file, int lock, struct user_struct *user)
2609 return 0; 2638 return 0;
2610} 2639}
2611 2640
2641#ifdef CONFIG_CGROUP_MEM_RES_CTLR
2642/**
2643 * mem_cgroup_get_shmem_target - find a page or entry assigned to the shmem file
2644 * @inode: the inode to be searched
2645 * @pgoff: the offset to be searched
2646 * @pagep: the pointer for the found page to be stored
2647 * @ent: the pointer for the found swap entry to be stored
2648 *
2649 * If a page is found, refcount of it is incremented. Callers should handle
2650 * these refcount.
2651 */
2652void mem_cgroup_get_shmem_target(struct inode *inode, pgoff_t pgoff,
2653 struct page **pagep, swp_entry_t *ent)
2654{
2655 struct page *page = NULL;
2656
2657 if ((pgoff << PAGE_CACHE_SHIFT) >= i_size_read(inode))
2658 goto out;
2659 page = find_get_page(inode->i_mapping, pgoff);
2660out:
2661 *pagep = page;
2662 *ent = (swp_entry_t){ .val = 0 };
2663}
2664#endif
2665
2612#define shmem_vm_ops generic_file_vm_ops 2666#define shmem_vm_ops generic_file_vm_ops
2613#define shmem_file_operations ramfs_file_operations 2667#define shmem_file_operations ramfs_file_operations
2614#define shmem_get_inode(sb, mode, dev, flags) ramfs_get_inode(sb, mode, dev) 2668#define shmem_get_inode(sb, dir, mode, dev, flags) ramfs_get_inode(sb, dir, mode, dev)
2615#define shmem_acct_size(flags, size) 0 2669#define shmem_acct_size(flags, size) 0
2616#define shmem_unacct_size(flags, size) do {} while (0) 2670#define shmem_unacct_size(flags, size) do {} while (0)
2617#define SHMEM_MAX_BYTES MAX_LFS_FILESIZE 2671#define SHMEM_MAX_BYTES MAX_LFS_FILESIZE
@@ -2655,7 +2709,7 @@ struct file *shmem_file_setup(const char *name, loff_t size, unsigned long flags
2655 path.mnt = mntget(shm_mnt); 2709 path.mnt = mntget(shm_mnt);
2656 2710
2657 error = -ENOSPC; 2711 error = -ENOSPC;
2658 inode = shmem_get_inode(root->d_sb, S_IFREG | S_IRWXUGO, 0, flags); 2712 inode = shmem_get_inode(root->d_sb, NULL, S_IFREG | S_IRWXUGO, 0, flags);
2659 if (!inode) 2713 if (!inode)
2660 goto put_dentry; 2714 goto put_dentry;
2661 2715