@@ -55,22 +55,28 @@ static vm_fault_t secretmem_fault(struct vm_fault *vmf)
5555 gfp_t gfp = vmf -> gfp_mask ;
5656 unsigned long addr ;
5757 struct page * page ;
58+ vm_fault_t ret ;
5859 int err ;
5960
6061 if (((loff_t )vmf -> pgoff << PAGE_SHIFT ) >= i_size_read (inode ))
6162 return vmf_error (- EINVAL );
6263
64+ filemap_invalidate_lock_shared (mapping );
65+
6366retry :
6467 page = find_lock_page (mapping , offset );
6568 if (!page ) {
6669 page = alloc_page (gfp | __GFP_ZERO );
67- if (!page )
68- return VM_FAULT_OOM ;
70+ if (!page ) {
71+ ret = VM_FAULT_OOM ;
72+ goto out ;
73+ }
6974
7075 err = set_direct_map_invalid_noflush (page );
7176 if (err ) {
7277 put_page (page );
73- return vmf_error (err );
78+ ret = vmf_error (err );
79+ goto out ;
7480 }
7581
7682 __SetPageUptodate (page );
@@ -86,15 +92,20 @@ static vm_fault_t secretmem_fault(struct vm_fault *vmf)
8692 if (err == - EEXIST )
8793 goto retry ;
8894
89- return vmf_error (err );
95+ ret = vmf_error (err );
96+ goto out ;
9097 }
9198
9299 addr = (unsigned long )page_address (page );
93100 flush_tlb_kernel_range (addr , addr + PAGE_SIZE );
94101 }
95102
96103 vmf -> page = page ;
97- return VM_FAULT_LOCKED ;
104+ ret = VM_FAULT_LOCKED ;
105+
106+ out :
107+ filemap_invalidate_unlock_shared (mapping );
108+ return ret ;
98109}
99110
100111static const struct vm_operations_struct secretmem_vm_ops = {
@@ -162,12 +173,20 @@ static int secretmem_setattr(struct user_namespace *mnt_userns,
162173 struct dentry * dentry , struct iattr * iattr )
163174{
164175 struct inode * inode = d_inode (dentry );
176+ struct address_space * mapping = inode -> i_mapping ;
165177 unsigned int ia_valid = iattr -> ia_valid ;
178+ int ret ;
179+
180+ filemap_invalidate_lock (mapping );
166181
167182 if ((ia_valid & ATTR_SIZE ) && inode -> i_size )
168- return - EINVAL ;
183+ ret = - EINVAL ;
184+ else
185+ ret = simple_setattr (mnt_userns , dentry , iattr );
169186
170- return simple_setattr (mnt_userns , dentry , iattr );
187+ filemap_invalidate_unlock (mapping );
188+
189+ return ret ;
171190}
172191
173192static const struct inode_operations secretmem_iops = {
0 commit comments