@@ -55,22 +55,28 @@ static vm_fault_t secretmem_fault(struct vm_fault *vmf)
55
55
gfp_t gfp = vmf -> gfp_mask ;
56
56
unsigned long addr ;
57
57
struct page * page ;
58
+ vm_fault_t ret ;
58
59
int err ;
59
60
60
61
if (((loff_t )vmf -> pgoff << PAGE_SHIFT ) >= i_size_read (inode ))
61
62
return vmf_error (- EINVAL );
62
63
64
+ filemap_invalidate_lock_shared (mapping );
65
+
63
66
retry :
64
67
page = find_lock_page (mapping , offset );
65
68
if (!page ) {
66
69
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
+ }
69
74
70
75
err = set_direct_map_invalid_noflush (page );
71
76
if (err ) {
72
77
put_page (page );
73
- return vmf_error (err );
78
+ ret = vmf_error (err );
79
+ goto out ;
74
80
}
75
81
76
82
__SetPageUptodate (page );
@@ -86,15 +92,20 @@ static vm_fault_t secretmem_fault(struct vm_fault *vmf)
86
92
if (err == - EEXIST )
87
93
goto retry ;
88
94
89
- return vmf_error (err );
95
+ ret = vmf_error (err );
96
+ goto out ;
90
97
}
91
98
92
99
addr = (unsigned long )page_address (page );
93
100
flush_tlb_kernel_range (addr , addr + PAGE_SIZE );
94
101
}
95
102
96
103
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 ;
98
109
}
99
110
100
111
static const struct vm_operations_struct secretmem_vm_ops = {
@@ -162,12 +173,20 @@ static int secretmem_setattr(struct user_namespace *mnt_userns,
162
173
struct dentry * dentry , struct iattr * iattr )
163
174
{
164
175
struct inode * inode = d_inode (dentry );
176
+ struct address_space * mapping = inode -> i_mapping ;
165
177
unsigned int ia_valid = iattr -> ia_valid ;
178
+ int ret ;
179
+
180
+ filemap_invalidate_lock (mapping );
166
181
167
182
if ((ia_valid & ATTR_SIZE ) && inode -> i_size )
168
- return - EINVAL ;
183
+ ret = - EINVAL ;
184
+ else
185
+ ret = simple_setattr (mnt_userns , dentry , iattr );
169
186
170
- return simple_setattr (mnt_userns , dentry , iattr );
187
+ filemap_invalidate_unlock (mapping );
188
+
189
+ return ret ;
171
190
}
172
191
173
192
static const struct inode_operations secretmem_iops = {
0 commit comments