@@ -137,6 +137,7 @@ static void v9fs_vfs_readahead(struct readahead_control *ractl)
137
137
static int v9fs_release_page (struct page * page , gfp_t gfp )
138
138
{
139
139
struct folio * folio = page_folio (page );
140
+ struct inode * inode = folio_inode (folio );
140
141
141
142
if (folio_test_private (folio ))
142
143
return 0 ;
@@ -147,6 +148,7 @@ static int v9fs_release_page(struct page *page, gfp_t gfp)
147
148
folio_wait_fscache (folio );
148
149
}
149
150
#endif
151
+ fscache_note_page_release (v9fs_inode_cookie (V9FS_I (inode )));
150
152
return 1 ;
151
153
}
152
154
@@ -165,10 +167,25 @@ static void v9fs_invalidate_page(struct page *page, unsigned int offset,
165
167
folio_wait_fscache (folio );
166
168
}
167
169
170
+ static void v9fs_write_to_cache_done (void * priv , ssize_t transferred_or_error ,
171
+ bool was_async )
172
+ {
173
+ struct v9fs_inode * v9inode = priv ;
174
+ __le32 version ;
175
+
176
+ if (IS_ERR_VALUE (transferred_or_error ) &&
177
+ transferred_or_error != - ENOBUFS ) {
178
+ version = cpu_to_le32 (v9inode -> qid .version );
179
+ fscache_invalidate (v9fs_inode_cookie (v9inode ), & version ,
180
+ i_size_read (& v9inode -> vfs_inode ), 0 );
181
+ }
182
+ }
183
+
168
184
static int v9fs_vfs_write_folio_locked (struct folio * folio )
169
185
{
170
186
struct inode * inode = folio_inode (folio );
171
187
struct v9fs_inode * v9inode = V9FS_I (inode );
188
+ struct fscache_cookie * cookie = v9fs_inode_cookie (v9inode );
172
189
loff_t start = folio_pos (folio );
173
190
loff_t i_size = i_size_read (inode );
174
191
struct iov_iter from ;
@@ -185,10 +202,21 @@ static int v9fs_vfs_write_folio_locked(struct folio *folio)
185
202
/* We should have writeback_fid always set */
186
203
BUG_ON (!v9inode -> writeback_fid );
187
204
205
+ folio_wait_fscache (folio );
188
206
folio_start_writeback (folio );
189
207
190
208
p9_client_write (v9inode -> writeback_fid , start , & from , & err );
191
209
210
+ if (err == 0 &&
211
+ fscache_cookie_enabled (cookie ) &&
212
+ test_bit (FSCACHE_COOKIE_IS_CACHING , & cookie -> flags )) {
213
+ folio_start_fscache (folio );
214
+ fscache_write_to_cache (v9fs_inode_cookie (v9inode ),
215
+ folio_mapping (folio ), start , len , i_size ,
216
+ v9fs_write_to_cache_done , v9inode ,
217
+ true);
218
+ }
219
+
192
220
folio_end_writeback (folio );
193
221
return err ;
194
222
}
@@ -307,6 +335,7 @@ static int v9fs_write_end(struct file *filp, struct address_space *mapping,
307
335
loff_t last_pos = pos + copied ;
308
336
struct folio * folio = page_folio (subpage );
309
337
struct inode * inode = mapping -> host ;
338
+ struct v9fs_inode * v9inode = V9FS_I (inode );
310
339
311
340
p9_debug (P9_DEBUG_VFS , "filp %p, mapping %p\n" , filp , mapping );
312
341
@@ -326,6 +355,7 @@ static int v9fs_write_end(struct file *filp, struct address_space *mapping,
326
355
if (last_pos > inode -> i_size ) {
327
356
inode_add_bytes (inode , last_pos - inode -> i_size );
328
357
i_size_write (inode , last_pos );
358
+ fscache_update_cookie (v9fs_inode_cookie (v9inode ), NULL , & last_pos );
329
359
}
330
360
folio_mark_dirty (folio );
331
361
out :
@@ -335,11 +365,25 @@ static int v9fs_write_end(struct file *filp, struct address_space *mapping,
335
365
return copied ;
336
366
}
337
367
368
+ #ifdef CONFIG_9P_FSCACHE
369
+ /*
370
+ * Mark a page as having been made dirty and thus needing writeback. We also
371
+ * need to pin the cache object to write back to.
372
+ */
373
+ static int v9fs_set_page_dirty (struct page * page )
374
+ {
375
+ struct v9fs_inode * v9inode = V9FS_I (page -> mapping -> host );
376
+
377
+ return fscache_set_page_dirty (page , v9fs_inode_cookie (v9inode ));
378
+ }
379
+ #else
380
+ #define v9fs_set_page_dirty __set_page_dirty_nobuffers
381
+ #endif
338
382
339
383
const struct address_space_operations v9fs_addr_operations = {
340
384
.readpage = v9fs_vfs_readpage ,
341
385
.readahead = v9fs_vfs_readahead ,
342
- .set_page_dirty = __set_page_dirty_nobuffers ,
386
+ .set_page_dirty = v9fs_set_page_dirty ,
343
387
.writepage = v9fs_vfs_writepage ,
344
388
.write_begin = v9fs_write_begin ,
345
389
.write_end = v9fs_write_end ,
0 commit comments