diff options
Diffstat (limited to 'mm/shmem.c')
-rw-r--r-- | mm/shmem.c | 38 |
1 files changed, 21 insertions, 17 deletions
diff --git a/mm/shmem.c b/mm/shmem.c index 5a0b3d4055f3..356dd99566ec 100644 --- a/mm/shmem.c +++ b/mm/shmem.c | |||
@@ -49,7 +49,6 @@ static struct vfsmount *shm_mnt; | |||
49 | #include <linux/backing-dev.h> | 49 | #include <linux/backing-dev.h> |
50 | #include <linux/shmem_fs.h> | 50 | #include <linux/shmem_fs.h> |
51 | #include <linux/writeback.h> | 51 | #include <linux/writeback.h> |
52 | #include <linux/vfs.h> | ||
53 | #include <linux/blkdev.h> | 52 | #include <linux/blkdev.h> |
54 | #include <linux/security.h> | 53 | #include <linux/security.h> |
55 | #include <linux/swapops.h> | 54 | #include <linux/swapops.h> |
@@ -219,7 +218,7 @@ static const struct file_operations shmem_file_operations; | |||
219 | static const struct inode_operations shmem_inode_operations; | 218 | static const struct inode_operations shmem_inode_operations; |
220 | static const struct inode_operations shmem_dir_inode_operations; | 219 | static const struct inode_operations shmem_dir_inode_operations; |
221 | static const struct inode_operations shmem_special_inode_operations; | 220 | static const struct inode_operations shmem_special_inode_operations; |
222 | static struct vm_operations_struct shmem_vm_ops; | 221 | static const struct vm_operations_struct shmem_vm_ops; |
223 | 222 | ||
224 | static struct backing_dev_info shmem_backing_dev_info __read_mostly = { | 223 | static struct backing_dev_info shmem_backing_dev_info __read_mostly = { |
225 | .ra_pages = 0, /* No readahead */ | 224 | .ra_pages = 0, /* No readahead */ |
@@ -1047,8 +1046,9 @@ static int shmem_writepage(struct page *page, struct writeback_control *wbc) | |||
1047 | * sync from ever calling shmem_writepage; but a stacking filesystem | 1046 | * sync from ever calling shmem_writepage; but a stacking filesystem |
1048 | * may use the ->writepage of its underlying filesystem, in which case | 1047 | * may use the ->writepage of its underlying filesystem, in which case |
1049 | * tmpfs should write out to swap only in response to memory pressure, | 1048 | * tmpfs should write out to swap only in response to memory pressure, |
1050 | * and not for pdflush or sync. However, in those cases, we do still | 1049 | * and not for the writeback threads or sync. However, in those cases, |
1051 | * want to check if there's a redundant swappage to be discarded. | 1050 | * we do still want to check if there's a redundant swappage to be |
1051 | * discarded. | ||
1052 | */ | 1052 | */ |
1053 | if (wbc->for_reclaim) | 1053 | if (wbc->for_reclaim) |
1054 | swap = get_swap_page(); | 1054 | swap = get_swap_page(); |
@@ -1097,6 +1097,10 @@ static int shmem_writepage(struct page *page, struct writeback_control *wbc) | |||
1097 | shmem_swp_unmap(entry); | 1097 | shmem_swp_unmap(entry); |
1098 | unlock: | 1098 | unlock: |
1099 | spin_unlock(&info->lock); | 1099 | spin_unlock(&info->lock); |
1100 | /* | ||
1101 | * add_to_swap_cache() doesn't return -EEXIST, so we can safely | ||
1102 | * clear SWAP_HAS_CACHE flag. | ||
1103 | */ | ||
1100 | swapcache_free(swap, NULL); | 1104 | swapcache_free(swap, NULL); |
1101 | redirty: | 1105 | redirty: |
1102 | set_page_dirty(page); | 1106 | set_page_dirty(page); |
@@ -1630,8 +1634,8 @@ shmem_write_end(struct file *file, struct address_space *mapping, | |||
1630 | if (pos + copied > inode->i_size) | 1634 | if (pos + copied > inode->i_size) |
1631 | i_size_write(inode, pos + copied); | 1635 | i_size_write(inode, pos + copied); |
1632 | 1636 | ||
1633 | unlock_page(page); | ||
1634 | set_page_dirty(page); | 1637 | set_page_dirty(page); |
1638 | unlock_page(page); | ||
1635 | page_cache_release(page); | 1639 | page_cache_release(page); |
1636 | 1640 | ||
1637 | return copied; | 1641 | return copied; |
@@ -1968,13 +1972,13 @@ static int shmem_symlink(struct inode *dir, struct dentry *dentry, const char *s | |||
1968 | iput(inode); | 1972 | iput(inode); |
1969 | return error; | 1973 | return error; |
1970 | } | 1974 | } |
1971 | unlock_page(page); | ||
1972 | inode->i_mapping->a_ops = &shmem_aops; | 1975 | inode->i_mapping->a_ops = &shmem_aops; |
1973 | inode->i_op = &shmem_symlink_inode_operations; | 1976 | inode->i_op = &shmem_symlink_inode_operations; |
1974 | kaddr = kmap_atomic(page, KM_USER0); | 1977 | kaddr = kmap_atomic(page, KM_USER0); |
1975 | memcpy(kaddr, symname, len); | 1978 | memcpy(kaddr, symname, len); |
1976 | kunmap_atomic(kaddr, KM_USER0); | 1979 | kunmap_atomic(kaddr, KM_USER0); |
1977 | set_page_dirty(page); | 1980 | set_page_dirty(page); |
1981 | unlock_page(page); | ||
1978 | page_cache_release(page); | 1982 | page_cache_release(page); |
1979 | } | 1983 | } |
1980 | if (dir->i_mode & S_ISGID) | 1984 | if (dir->i_mode & S_ISGID) |
@@ -2298,8 +2302,7 @@ static void shmem_put_super(struct super_block *sb) | |||
2298 | sb->s_fs_info = NULL; | 2302 | sb->s_fs_info = NULL; |
2299 | } | 2303 | } |
2300 | 2304 | ||
2301 | static int shmem_fill_super(struct super_block *sb, | 2305 | int shmem_fill_super(struct super_block *sb, void *data, int silent) |
2302 | void *data, int silent) | ||
2303 | { | 2306 | { |
2304 | struct inode *inode; | 2307 | struct inode *inode; |
2305 | struct dentry *root; | 2308 | struct dentry *root; |
@@ -2307,17 +2310,14 @@ static int shmem_fill_super(struct super_block *sb, | |||
2307 | int err = -ENOMEM; | 2310 | int err = -ENOMEM; |
2308 | 2311 | ||
2309 | /* Round up to L1_CACHE_BYTES to resist false sharing */ | 2312 | /* Round up to L1_CACHE_BYTES to resist false sharing */ |
2310 | sbinfo = kmalloc(max((int)sizeof(struct shmem_sb_info), | 2313 | sbinfo = kzalloc(max((int)sizeof(struct shmem_sb_info), |
2311 | L1_CACHE_BYTES), GFP_KERNEL); | 2314 | L1_CACHE_BYTES), GFP_KERNEL); |
2312 | if (!sbinfo) | 2315 | if (!sbinfo) |
2313 | return -ENOMEM; | 2316 | return -ENOMEM; |
2314 | 2317 | ||
2315 | sbinfo->max_blocks = 0; | ||
2316 | sbinfo->max_inodes = 0; | ||
2317 | sbinfo->mode = S_IRWXUGO | S_ISVTX; | 2318 | sbinfo->mode = S_IRWXUGO | S_ISVTX; |
2318 | sbinfo->uid = current_fsuid(); | 2319 | sbinfo->uid = current_fsuid(); |
2319 | sbinfo->gid = current_fsgid(); | 2320 | sbinfo->gid = current_fsgid(); |
2320 | sbinfo->mpol = NULL; | ||
2321 | sb->s_fs_info = sbinfo; | 2321 | sb->s_fs_info = sbinfo; |
2322 | 2322 | ||
2323 | #ifdef CONFIG_TMPFS | 2323 | #ifdef CONFIG_TMPFS |
@@ -2421,6 +2421,7 @@ static const struct address_space_operations shmem_aops = { | |||
2421 | .write_end = shmem_write_end, | 2421 | .write_end = shmem_write_end, |
2422 | #endif | 2422 | #endif |
2423 | .migratepage = migrate_page, | 2423 | .migratepage = migrate_page, |
2424 | .error_remove_page = generic_error_remove_page, | ||
2424 | }; | 2425 | }; |
2425 | 2426 | ||
2426 | static const struct file_operations shmem_file_operations = { | 2427 | static const struct file_operations shmem_file_operations = { |
@@ -2497,7 +2498,7 @@ static const struct super_operations shmem_ops = { | |||
2497 | .put_super = shmem_put_super, | 2498 | .put_super = shmem_put_super, |
2498 | }; | 2499 | }; |
2499 | 2500 | ||
2500 | static struct vm_operations_struct shmem_vm_ops = { | 2501 | static const struct vm_operations_struct shmem_vm_ops = { |
2501 | .fault = shmem_fault, | 2502 | .fault = shmem_fault, |
2502 | #ifdef CONFIG_NUMA | 2503 | #ifdef CONFIG_NUMA |
2503 | .set_policy = shmem_set_policy, | 2504 | .set_policy = shmem_set_policy, |
@@ -2519,7 +2520,7 @@ static struct file_system_type tmpfs_fs_type = { | |||
2519 | .kill_sb = kill_litter_super, | 2520 | .kill_sb = kill_litter_super, |
2520 | }; | 2521 | }; |
2521 | 2522 | ||
2522 | static int __init init_tmpfs(void) | 2523 | int __init init_tmpfs(void) |
2523 | { | 2524 | { |
2524 | int error; | 2525 | int error; |
2525 | 2526 | ||
@@ -2576,7 +2577,7 @@ static struct file_system_type tmpfs_fs_type = { | |||
2576 | .kill_sb = kill_litter_super, | 2577 | .kill_sb = kill_litter_super, |
2577 | }; | 2578 | }; |
2578 | 2579 | ||
2579 | static int __init init_tmpfs(void) | 2580 | int __init init_tmpfs(void) |
2580 | { | 2581 | { |
2581 | BUG_ON(register_filesystem(&tmpfs_fs_type) != 0); | 2582 | BUG_ON(register_filesystem(&tmpfs_fs_type) != 0); |
2582 | 2583 | ||
@@ -2591,6 +2592,11 @@ int shmem_unuse(swp_entry_t entry, struct page *page) | |||
2591 | return 0; | 2592 | return 0; |
2592 | } | 2593 | } |
2593 | 2594 | ||
2595 | int shmem_lock(struct file *file, int lock, struct user_struct *user) | ||
2596 | { | ||
2597 | return 0; | ||
2598 | } | ||
2599 | |||
2594 | #define shmem_vm_ops generic_file_vm_ops | 2600 | #define shmem_vm_ops generic_file_vm_ops |
2595 | #define shmem_file_operations ramfs_file_operations | 2601 | #define shmem_file_operations ramfs_file_operations |
2596 | #define shmem_get_inode(sb, mode, dev, flags) ramfs_get_inode(sb, mode, dev) | 2602 | #define shmem_get_inode(sb, mode, dev, flags) ramfs_get_inode(sb, mode, dev) |
@@ -2687,5 +2693,3 @@ int shmem_zero_setup(struct vm_area_struct *vma) | |||
2687 | vma->vm_ops = &shmem_vm_ops; | 2693 | vma->vm_ops = &shmem_vm_ops; |
2688 | return 0; | 2694 | return 0; |
2689 | } | 2695 | } |
2690 | |||
2691 | module_init(init_tmpfs) | ||