shmem.c (1ff8392c32a2645d2665ca779ecb91bb29361c13) shmem.c (d00806b183152af6d24f46f0c33f14162ca1262a)
1/*
2 * Resizable virtual memory filesystem for Linux.
3 *
4 * Copyright (C) 2000 Linus Torvalds.
5 * 2000 Transmeta Corp.
6 * 2000-2001 Christoph Rohland
7 * 2000-2001 SAP AG
8 * 2002 Red Hat Inc.

--- 69 unchanged lines hidden (view full) ---

78#define BOGO_DIRENT_SIZE 20
79
80/* Flag allocation requirements to shmem_getpage and shmem_swp_alloc */
81enum sgp_type {
82 SGP_QUICK, /* don't try more than file page cache lookup */
83 SGP_READ, /* don't exceed i_size, don't allocate page */
84 SGP_CACHE, /* don't exceed i_size, may allocate page */
85 SGP_WRITE, /* may exceed i_size, may allocate page */
1/*
2 * Resizable virtual memory filesystem for Linux.
3 *
4 * Copyright (C) 2000 Linus Torvalds.
5 * 2000 Transmeta Corp.
6 * 2000-2001 Christoph Rohland
7 * 2000-2001 SAP AG
8 * 2002 Red Hat Inc.

--- 69 unchanged lines hidden (view full) ---

78#define BOGO_DIRENT_SIZE 20
79
80/* Flag allocation requirements to shmem_getpage and shmem_swp_alloc */
81enum sgp_type {
82 SGP_QUICK, /* don't try more than file page cache lookup */
83 SGP_READ, /* don't exceed i_size, don't allocate page */
84 SGP_CACHE, /* don't exceed i_size, may allocate page */
85 SGP_WRITE, /* may exceed i_size, may allocate page */
86 SGP_NOPAGE, /* same as SGP_CACHE, return with page locked */
86};
87
88static int shmem_getpage(struct inode *inode, unsigned long idx,
89 struct page **pagep, enum sgp_type sgp, int *type);
90
91static inline struct page *shmem_dir_alloc(gfp_t gfp_mask)
92{
93 /*

--- 1190 unchanged lines hidden (view full) ---

1284
1285 info->alloced++;
1286 spin_unlock(&info->lock);
1287 flush_dcache_page(filepage);
1288 SetPageUptodate(filepage);
1289 }
1290done:
1291 if (*pagep != filepage) {
87};
88
89static int shmem_getpage(struct inode *inode, unsigned long idx,
90 struct page **pagep, enum sgp_type sgp, int *type);
91
92static inline struct page *shmem_dir_alloc(gfp_t gfp_mask)
93{
94 /*

--- 1190 unchanged lines hidden (view full) ---

1285
1286 info->alloced++;
1287 spin_unlock(&info->lock);
1288 flush_dcache_page(filepage);
1289 SetPageUptodate(filepage);
1290 }
1291done:
1292 if (*pagep != filepage) {
1292 unlock_page(filepage);
1293 *pagep = filepage;
1293 *pagep = filepage;
1294 if (sgp != SGP_NOPAGE)
1295 unlock_page(filepage);
1296
1294 }
1295 return 0;
1296
1297failed:
1298 if (*pagep != filepage) {
1299 unlock_page(filepage);
1300 page_cache_release(filepage);
1301 }
1302 return error;
1303}
1304
1305static struct page *shmem_nopage(struct vm_area_struct *vma,
1306 unsigned long address, int *type)
1307{
1308 struct inode *inode = vma->vm_file->f_path.dentry->d_inode;
1309 struct page *page = NULL;
1310 unsigned long idx;
1311 int error;
1312
1297 }
1298 return 0;
1299
1300failed:
1301 if (*pagep != filepage) {
1302 unlock_page(filepage);
1303 page_cache_release(filepage);
1304 }
1305 return error;
1306}
1307
1308static struct page *shmem_nopage(struct vm_area_struct *vma,
1309 unsigned long address, int *type)
1310{
1311 struct inode *inode = vma->vm_file->f_path.dentry->d_inode;
1312 struct page *page = NULL;
1313 unsigned long idx;
1314 int error;
1315
1316 BUG_ON(!(vma->vm_flags & VM_CAN_INVALIDATE));
1317
1313 idx = (address - vma->vm_start) >> PAGE_SHIFT;
1314 idx += vma->vm_pgoff;
1315 idx >>= PAGE_CACHE_SHIFT - PAGE_SHIFT;
1316 if (((loff_t) idx << PAGE_CACHE_SHIFT) >= i_size_read(inode))
1317 return NOPAGE_SIGBUS;
1318
1318 idx = (address - vma->vm_start) >> PAGE_SHIFT;
1319 idx += vma->vm_pgoff;
1320 idx >>= PAGE_CACHE_SHIFT - PAGE_SHIFT;
1321 if (((loff_t) idx << PAGE_CACHE_SHIFT) >= i_size_read(inode))
1322 return NOPAGE_SIGBUS;
1323
1319 error = shmem_getpage(inode, idx, &page, SGP_CACHE, type);
1324 error = shmem_getpage(inode, idx, &page, SGP_NOPAGE, type);
1320 if (error)
1321 return (error == -ENOMEM)? NOPAGE_OOM: NOPAGE_SIGBUS;
1322
1323 mark_page_accessed(page);
1324 return page;
1325}
1326
1327static int shmem_populate(struct vm_area_struct *vma,

--- 81 unchanged lines hidden (view full) ---

1409 spin_unlock(&info->lock);
1410 return retval;
1411}
1412
1413static int shmem_mmap(struct file *file, struct vm_area_struct *vma)
1414{
1415 file_accessed(file);
1416 vma->vm_ops = &shmem_vm_ops;
1325 if (error)
1326 return (error == -ENOMEM)? NOPAGE_OOM: NOPAGE_SIGBUS;
1327
1328 mark_page_accessed(page);
1329 return page;
1330}
1331
1332static int shmem_populate(struct vm_area_struct *vma,

--- 81 unchanged lines hidden (view full) ---

1414 spin_unlock(&info->lock);
1415 return retval;
1416}
1417
1418static int shmem_mmap(struct file *file, struct vm_area_struct *vma)
1419{
1420 file_accessed(file);
1421 vma->vm_ops = &shmem_vm_ops;
1422 vma->vm_flags |= VM_CAN_INVALIDATE;
1417 return 0;
1418}
1419
1420static struct inode *
1421shmem_get_inode(struct super_block *sb, int mode, dev_t dev)
1422{
1423 struct inode *inode;
1424 struct shmem_inode_info *info;

--- 1166 unchanged lines hidden (view full) ---

2591 file = shmem_file_setup("dev/zero", size, vma->vm_flags);
2592 if (IS_ERR(file))
2593 return PTR_ERR(file);
2594
2595 if (vma->vm_file)
2596 fput(vma->vm_file);
2597 vma->vm_file = file;
2598 vma->vm_ops = &shmem_vm_ops;
1423 return 0;
1424}
1425
1426static struct inode *
1427shmem_get_inode(struct super_block *sb, int mode, dev_t dev)
1428{
1429 struct inode *inode;
1430 struct shmem_inode_info *info;

--- 1166 unchanged lines hidden (view full) ---

2597 file = shmem_file_setup("dev/zero", size, vma->vm_flags);
2598 if (IS_ERR(file))
2599 return PTR_ERR(file);
2600
2601 if (vma->vm_file)
2602 fput(vma->vm_file);
2603 vma->vm_file = file;
2604 vma->vm_ops = &shmem_vm_ops;
2605 vma->vm_flags |= VM_CAN_INVALIDATE;
2599 return 0;
2600}
2606 return 0;
2607}