shmem.c (66ee4b8887ec5ce04bae3e840d206db7b7ad34d1) | shmem.c (77142517990fd3d982678c2945ea2c4188ec5f9a) |
---|---|
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. --- 135 unchanged lines hidden (view full) --- 144} 145 146static inline void shmem_unacct_size(unsigned long flags, loff_t size) 147{ 148 if (!(flags & VM_NORESERVE)) 149 vm_unacct_memory(VM_ACCT(size)); 150} 151 | 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. --- 135 unchanged lines hidden (view full) --- 144} 145 146static inline void shmem_unacct_size(unsigned long flags, loff_t size) 147{ 148 if (!(flags & VM_NORESERVE)) 149 vm_unacct_memory(VM_ACCT(size)); 150} 151 |
152static inline int shmem_reacct_size(unsigned long flags, 153 loff_t oldsize, loff_t newsize) 154{ 155 if (!(flags & VM_NORESERVE)) { 156 if (VM_ACCT(newsize) > VM_ACCT(oldsize)) 157 return security_vm_enough_memory_mm(current->mm, 158 VM_ACCT(newsize) - VM_ACCT(oldsize)); 159 else if (VM_ACCT(newsize) < VM_ACCT(oldsize)) 160 vm_unacct_memory(VM_ACCT(oldsize) - VM_ACCT(newsize)); 161 } 162 return 0; 163} 164 |
|
152/* 153 * ... whereas tmpfs objects are accounted incrementally as 154 * pages are allocated, in order to allow huge sparse files. 155 * shmem_getpage reports shmem_acct_block failure as -ENOSPC not -ENOMEM, 156 * so that a failure on a sparse tmpfs mapping will give SIGBUS not OOM. 157 */ 158static inline int shmem_acct_block(unsigned long flags) 159{ --- 384 unchanged lines hidden (view full) --- 544 if (error) 545 return error; 546 547 if (S_ISREG(inode->i_mode) && (attr->ia_valid & ATTR_SIZE)) { 548 loff_t oldsize = inode->i_size; 549 loff_t newsize = attr->ia_size; 550 551 if (newsize != oldsize) { | 165/* 166 * ... whereas tmpfs objects are accounted incrementally as 167 * pages are allocated, in order to allow huge sparse files. 168 * shmem_getpage reports shmem_acct_block failure as -ENOSPC not -ENOMEM, 169 * so that a failure on a sparse tmpfs mapping will give SIGBUS not OOM. 170 */ 171static inline int shmem_acct_block(unsigned long flags) 172{ --- 384 unchanged lines hidden (view full) --- 557 if (error) 558 return error; 559 560 if (S_ISREG(inode->i_mode) && (attr->ia_valid & ATTR_SIZE)) { 561 loff_t oldsize = inode->i_size; 562 loff_t newsize = attr->ia_size; 563 564 if (newsize != oldsize) { |
565 error = shmem_reacct_size(SHMEM_I(inode)->flags, 566 oldsize, newsize); 567 if (error) 568 return error; |
|
552 i_size_write(inode, newsize); 553 inode->i_ctime = inode->i_mtime = CURRENT_TIME; 554 } 555 if (newsize < oldsize) { 556 loff_t holebegin = round_up(newsize, PAGE_SIZE); 557 unmap_mapping_range(inode->i_mapping, holebegin, 0, 1); 558 shmem_truncate_range(inode, newsize, (loff_t)-1); 559 /* unmap again to remove racily COWed private pages */ --- 2493 unchanged lines hidden --- | 569 i_size_write(inode, newsize); 570 inode->i_ctime = inode->i_mtime = CURRENT_TIME; 571 } 572 if (newsize < oldsize) { 573 loff_t holebegin = round_up(newsize, PAGE_SIZE); 574 unmap_mapping_range(inode->i_mapping, holebegin, 0, 1); 575 shmem_truncate_range(inode, newsize, (loff_t)-1); 576 /* unmap again to remove racily COWed private pages */ --- 2493 unchanged lines hidden --- |