@@ -137,6 +137,7 @@ static void v9fs_vfs_readahead(struct readahead_control *ractl)
137137static int v9fs_release_page (struct page * page , gfp_t gfp )
138138{
139139 struct folio * folio = page_folio (page );
140+ struct inode * inode = folio_inode (folio );
140141
141142 if (folio_test_private (folio ))
142143 return 0 ;
@@ -147,6 +148,7 @@ static int v9fs_release_page(struct page *page, gfp_t gfp)
147148 folio_wait_fscache (folio );
148149 }
149150#endif
151+ fscache_note_page_release (v9fs_inode_cookie (V9FS_I (inode )));
150152 return 1 ;
151153}
152154
@@ -165,10 +167,25 @@ static void v9fs_invalidate_page(struct page *page, unsigned int offset,
165167 folio_wait_fscache (folio );
166168}
167169
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+
168184static int v9fs_vfs_write_folio_locked (struct folio * folio )
169185{
170186 struct inode * inode = folio_inode (folio );
171187 struct v9fs_inode * v9inode = V9FS_I (inode );
188+ struct fscache_cookie * cookie = v9fs_inode_cookie (v9inode );
172189 loff_t start = folio_pos (folio );
173190 loff_t i_size = i_size_read (inode );
174191 struct iov_iter from ;
@@ -185,10 +202,21 @@ static int v9fs_vfs_write_folio_locked(struct folio *folio)
185202 /* We should have writeback_fid always set */
186203 BUG_ON (!v9inode -> writeback_fid );
187204
205+ folio_wait_fscache (folio );
188206 folio_start_writeback (folio );
189207
190208 p9_client_write (v9inode -> writeback_fid , start , & from , & err );
191209
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+
192220 folio_end_writeback (folio );
193221 return err ;
194222}
@@ -307,6 +335,7 @@ static int v9fs_write_end(struct file *filp, struct address_space *mapping,
307335 loff_t last_pos = pos + copied ;
308336 struct folio * folio = page_folio (subpage );
309337 struct inode * inode = mapping -> host ;
338+ struct v9fs_inode * v9inode = V9FS_I (inode );
310339
311340 p9_debug (P9_DEBUG_VFS , "filp %p, mapping %p\n" , filp , mapping );
312341
@@ -326,6 +355,7 @@ static int v9fs_write_end(struct file *filp, struct address_space *mapping,
326355 if (last_pos > inode -> i_size ) {
327356 inode_add_bytes (inode , last_pos - inode -> i_size );
328357 i_size_write (inode , last_pos );
358+ fscache_update_cookie (v9fs_inode_cookie (v9inode ), NULL , & last_pos );
329359 }
330360 folio_mark_dirty (folio );
331361out :
@@ -335,11 +365,25 @@ static int v9fs_write_end(struct file *filp, struct address_space *mapping,
335365 return copied ;
336366}
337367
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
338382
339383const struct address_space_operations v9fs_addr_operations = {
340384 .readpage = v9fs_vfs_readpage ,
341385 .readahead = v9fs_vfs_readahead ,
342- .set_page_dirty = __set_page_dirty_nobuffers ,
386+ .set_page_dirty = v9fs_set_page_dirty ,
343387 .writepage = v9fs_vfs_writepage ,
344388 .write_begin = v9fs_write_begin ,
345389 .write_end = v9fs_write_end ,
0 commit comments