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