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} |