1717#include <linux/pagevec.h>
1818#include "internal.h"
1919
20- /*
21- * We use page->private to hold the amount of the page that we've written to,
22- * splitting the field into two parts. However, we need to represent a range
23- * 0...PAGE_SIZE inclusive, so we can't support 64K pages on a 32-bit system.
24- */
25- #if PAGE_SIZE > 32768
26- #define AFS_PRIV_MAX 0xffffffff
27- #define AFS_PRIV_SHIFT 32
28- #else
29- #define AFS_PRIV_MAX 0xffff
30- #define AFS_PRIV_SHIFT 16
31- #endif
32-
3320/*
3421 * mark a page as having been made dirty and thus needing writeback
3522 */
@@ -145,6 +132,8 @@ int afs_write_begin(struct file *file, struct address_space *mapping,
145132
146133 priv = (unsigned long )t << AFS_PRIV_SHIFT ;
147134 priv |= f ;
135+ trace_afs_page_dirty (vnode , tracepoint_string ("begin" ),
136+ page -> index , priv );
148137 SetPagePrivate (page );
149138 set_page_private (page , priv );
150139 _leave (" = 0" );
@@ -386,6 +375,7 @@ static int afs_write_back_from_locked_page(struct address_space *mapping,
386375 struct page * primary_page ,
387376 pgoff_t final_page )
388377{
378+ struct afs_vnode * vnode = AFS_FS_I (mapping -> host );
389379 struct page * pages [8 ], * page ;
390380 unsigned long count , priv ;
391381 unsigned n , offset , to , f , t ;
@@ -407,8 +397,13 @@ static int afs_write_back_from_locked_page(struct address_space *mapping,
407397 priv = page_private (primary_page );
408398 offset = priv & AFS_PRIV_MAX ;
409399 to = priv >> AFS_PRIV_SHIFT ;
400+ trace_afs_page_dirty (vnode , tracepoint_string ("store" ),
401+ primary_page -> index , priv );
410402
411403 WARN_ON (offset == to );
404+ if (offset == to )
405+ trace_afs_page_dirty (vnode , tracepoint_string ("WARN" ),
406+ primary_page -> index , priv );
412407
413408 if (start >= final_page || to < PAGE_SIZE )
414409 goto no_more ;
@@ -452,6 +447,9 @@ static int afs_write_back_from_locked_page(struct address_space *mapping,
452447 }
453448 to = t ;
454449
450+ trace_afs_page_dirty (vnode , tracepoint_string ("store+" ),
451+ page -> index , priv );
452+
455453 if (!clear_page_dirty_for_io (page ))
456454 BUG ();
457455 if (test_set_page_writeback (page ))
@@ -657,6 +655,7 @@ int afs_writepages(struct address_space *mapping,
657655void afs_pages_written_back (struct afs_vnode * vnode , struct afs_call * call )
658656{
659657 struct pagevec pv ;
658+ unsigned long priv ;
660659 unsigned count , loop ;
661660 pgoff_t first = call -> first , last = call -> last ;
662661
@@ -676,6 +675,9 @@ void afs_pages_written_back(struct afs_vnode *vnode, struct afs_call *call)
676675 ASSERTCMP (pv .nr , = = , count );
677676
678677 for (loop = 0 ; loop < count ; loop ++ ) {
678+ priv = page_private (pv .pages [loop ]);
679+ trace_afs_page_dirty (vnode , tracepoint_string ("clear" ),
680+ pv .pages [loop ]-> index , priv );
679681 set_page_private (pv .pages [loop ], 0 );
680682 end_page_writeback (pv .pages [loop ]);
681683 }
@@ -783,6 +785,8 @@ int afs_page_mkwrite(struct vm_fault *vmf)
783785
784786 priv = (unsigned long )PAGE_SIZE << AFS_PRIV_SHIFT ; /* To */
785787 priv |= 0 ; /* From */
788+ trace_afs_page_dirty (vnode , tracepoint_string ("mkwrite" ),
789+ vmf -> page -> index , priv );
786790 SetPagePrivate (vmf -> page );
787791 set_page_private (vmf -> page , priv );
788792
@@ -840,9 +844,13 @@ int afs_launder_page(struct page *page)
840844 t = priv >> AFS_PRIV_SHIFT ;
841845 }
842846
847+ trace_afs_page_dirty (vnode , tracepoint_string ("launder" ),
848+ page -> index , priv );
843849 ret = afs_store_data (mapping , page -> index , page -> index , t , f );
844850 }
845851
852+ trace_afs_page_dirty (vnode , tracepoint_string ("laundered" ),
853+ page -> index , priv );
846854 set_page_private (page , 0 );
847855 ClearPagePrivate (page );
848856
0 commit comments