aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--fs/f2fs/file.c9
-rw-r--r--fs/f2fs/node.c20
-rw-r--r--include/trace/events/f2fs.h176
3 files changed, 203 insertions, 2 deletions
diff --git a/fs/f2fs/file.c b/fs/f2fs/file.c
index 0b0ba26ba76e..71efa373cc45 100644
--- a/fs/f2fs/file.c
+++ b/fs/f2fs/file.c
@@ -193,6 +193,9 @@ static int truncate_data_blocks_range(struct dnode_of_data *dn, int count)
193 sync_inode_page(dn); 193 sync_inode_page(dn);
194 } 194 }
195 dn->ofs_in_node = ofs; 195 dn->ofs_in_node = ofs;
196
197 trace_f2fs_truncate_data_blocks_range(dn->inode, dn->nid,
198 dn->ofs_in_node, nr_free);
196 return nr_free; 199 return nr_free;
197} 200}
198 201
@@ -229,6 +232,8 @@ static int truncate_blocks(struct inode *inode, u64 from)
229 int count = 0, ilock = -1; 232 int count = 0, ilock = -1;
230 int err; 233 int err;
231 234
235 trace_f2fs_truncate_blocks_enter(inode, from);
236
232 free_from = (pgoff_t) 237 free_from = (pgoff_t)
233 ((from + blocksize - 1) >> (sbi->log_blocksize)); 238 ((from + blocksize - 1) >> (sbi->log_blocksize));
234 239
@@ -239,6 +244,7 @@ static int truncate_blocks(struct inode *inode, u64 from)
239 if (err == -ENOENT) 244 if (err == -ENOENT)
240 goto free_next; 245 goto free_next;
241 mutex_unlock_op(sbi, ilock); 246 mutex_unlock_op(sbi, ilock);
247 trace_f2fs_truncate_blocks_exit(inode, err);
242 return err; 248 return err;
243 } 249 }
244 250
@@ -263,6 +269,7 @@ free_next:
263 /* lastly zero out the first data page */ 269 /* lastly zero out the first data page */
264 truncate_partial_data_page(inode, from); 270 truncate_partial_data_page(inode, from);
265 271
272 trace_f2fs_truncate_blocks_exit(inode, err);
266 return err; 273 return err;
267} 274}
268 275
@@ -272,6 +279,8 @@ void f2fs_truncate(struct inode *inode)
272 S_ISLNK(inode->i_mode))) 279 S_ISLNK(inode->i_mode)))
273 return; 280 return;
274 281
282 trace_f2fs_truncate(inode);
283
275 if (!truncate_blocks(inode, i_size_read(inode))) { 284 if (!truncate_blocks(inode, i_size_read(inode))) {
276 inode->i_mtime = inode->i_ctime = CURRENT_TIME; 285 inode->i_mtime = inode->i_ctime = CURRENT_TIME;
277 mark_inode_dirty(inode); 286 mark_inode_dirty(inode);
diff --git a/fs/f2fs/node.c b/fs/f2fs/node.c
index 5a7edf90ca45..5a825502b0b0 100644
--- a/fs/f2fs/node.c
+++ b/fs/f2fs/node.c
@@ -19,6 +19,7 @@
19#include "f2fs.h" 19#include "f2fs.h"
20#include "node.h" 20#include "node.h"
21#include "segment.h" 21#include "segment.h"
22#include <trace/events/f2fs.h>
22 23
23static struct kmem_cache *nat_entry_slab; 24static struct kmem_cache *nat_entry_slab;
24static struct kmem_cache *free_nid_slab; 25static struct kmem_cache *free_nid_slab;
@@ -508,6 +509,7 @@ invalidate:
508 509
509 f2fs_put_page(dn->node_page, 1); 510 f2fs_put_page(dn->node_page, 1);
510 dn->node_page = NULL; 511 dn->node_page = NULL;
512 trace_f2fs_truncate_node(dn->inode, dn->nid, ni.blk_addr);
511} 513}
512 514
513static int truncate_dnode(struct dnode_of_data *dn) 515static int truncate_dnode(struct dnode_of_data *dn)
@@ -548,9 +550,13 @@ static int truncate_nodes(struct dnode_of_data *dn, unsigned int nofs,
548 if (dn->nid == 0) 550 if (dn->nid == 0)
549 return NIDS_PER_BLOCK + 1; 551 return NIDS_PER_BLOCK + 1;
550 552
553 trace_f2fs_truncate_nodes_enter(dn->inode, dn->nid, dn->data_blkaddr);
554
551 page = get_node_page(sbi, dn->nid); 555 page = get_node_page(sbi, dn->nid);
552 if (IS_ERR(page)) 556 if (IS_ERR(page)) {
557 trace_f2fs_truncate_nodes_exit(dn->inode, PTR_ERR(page));
553 return PTR_ERR(page); 558 return PTR_ERR(page);
559 }
554 560
555 rn = (struct f2fs_node *)page_address(page); 561 rn = (struct f2fs_node *)page_address(page);
556 if (depth < 3) { 562 if (depth < 3) {
@@ -592,10 +598,12 @@ static int truncate_nodes(struct dnode_of_data *dn, unsigned int nofs,
592 } else { 598 } else {
593 f2fs_put_page(page, 1); 599 f2fs_put_page(page, 1);
594 } 600 }
601 trace_f2fs_truncate_nodes_exit(dn->inode, freed);
595 return freed; 602 return freed;
596 603
597out_err: 604out_err:
598 f2fs_put_page(page, 1); 605 f2fs_put_page(page, 1);
606 trace_f2fs_truncate_nodes_exit(dn->inode, ret);
599 return ret; 607 return ret;
600} 608}
601 609
@@ -650,6 +658,9 @@ static int truncate_partial_nodes(struct dnode_of_data *dn,
650fail: 658fail:
651 for (i = depth - 3; i >= 0; i--) 659 for (i = depth - 3; i >= 0; i--)
652 f2fs_put_page(pages[i], 1); 660 f2fs_put_page(pages[i], 1);
661
662 trace_f2fs_truncate_partial_nodes(dn->inode, nid, depth, err);
663
653 return err; 664 return err;
654} 665}
655 666
@@ -666,11 +677,15 @@ int truncate_inode_blocks(struct inode *inode, pgoff_t from)
666 struct dnode_of_data dn; 677 struct dnode_of_data dn;
667 struct page *page; 678 struct page *page;
668 679
680 trace_f2fs_truncate_inode_blocks_enter(inode, from);
681
669 level = get_node_path(from, offset, noffset); 682 level = get_node_path(from, offset, noffset);
670 683
671 page = get_node_page(sbi, inode->i_ino); 684 page = get_node_page(sbi, inode->i_ino);
672 if (IS_ERR(page)) 685 if (IS_ERR(page)) {
686 trace_f2fs_truncate_inode_blocks_exit(inode, PTR_ERR(page));
673 return PTR_ERR(page); 687 return PTR_ERR(page);
688 }
674 689
675 set_new_dnode(&dn, inode, page, NULL, 0); 690 set_new_dnode(&dn, inode, page, NULL, 0);
676 unlock_page(page); 691 unlock_page(page);
@@ -740,6 +755,7 @@ skip_partial:
740 } 755 }
741fail: 756fail:
742 f2fs_put_page(page, 0); 757 f2fs_put_page(page, 0);
758 trace_f2fs_truncate_inode_blocks_exit(inode, err);
743 return err > 0 ? 0 : err; 759 return err > 0 ? 0 : err;
744} 760}
745 761
diff --git a/include/trace/events/f2fs.h b/include/trace/events/f2fs.h
index 03bb0dbf468d..4bbd19f79d27 100644
--- a/include/trace/events/f2fs.h
+++ b/include/trace/events/f2fs.h
@@ -189,6 +189,182 @@ DEFINE_EVENT(f2fs__inode_exit, f2fs_unlink_exit,
189 189
190 TP_ARGS(inode, ret) 190 TP_ARGS(inode, ret)
191); 191);
192
193DEFINE_EVENT(f2fs__inode, f2fs_truncate,
194
195 TP_PROTO(struct inode *inode),
196
197 TP_ARGS(inode)
198);
199
200TRACE_EVENT(f2fs_truncate_data_blocks_range,
201
202 TP_PROTO(struct inode *inode, nid_t nid, unsigned int ofs, int free),
203
204 TP_ARGS(inode, nid, ofs, free),
205
206 TP_STRUCT__entry(
207 __field(dev_t, dev)
208 __field(ino_t, ino)
209 __field(nid_t, nid)
210 __field(unsigned int, ofs)
211 __field(int, free)
212 ),
213
214 TP_fast_assign(
215 __entry->dev = inode->i_sb->s_dev;
216 __entry->ino = inode->i_ino;
217 __entry->nid = nid;
218 __entry->ofs = ofs;
219 __entry->free = free;
220 ),
221
222 TP_printk("dev = (%d,%d), ino = %lu, nid = %u, offset = %u, freed = %d",
223 show_dev_ino(__entry),
224 (unsigned int)__entry->nid,
225 __entry->ofs,
226 __entry->free)
227);
228
229DECLARE_EVENT_CLASS(f2fs__truncate_op,
230
231 TP_PROTO(struct inode *inode, u64 from),
232
233 TP_ARGS(inode, from),
234
235 TP_STRUCT__entry(
236 __field(dev_t, dev)
237 __field(ino_t, ino)
238 __field(loff_t, size)
239 __field(blkcnt_t, blocks)
240 __field(u64, from)
241 ),
242
243 TP_fast_assign(
244 __entry->dev = inode->i_sb->s_dev;
245 __entry->ino = inode->i_ino;
246 __entry->size = inode->i_size;
247 __entry->blocks = inode->i_blocks;
248 __entry->from = from;
249 ),
250
251 TP_printk("dev = (%d,%d), ino = %lu, i_size = %lld, i_blocks = %llu, "
252 "start file offset = %llu",
253 show_dev_ino(__entry),
254 __entry->size,
255 (unsigned long long)__entry->blocks,
256 (unsigned long long)__entry->from)
257);
258
259DEFINE_EVENT(f2fs__truncate_op, f2fs_truncate_blocks_enter,
260
261 TP_PROTO(struct inode *inode, u64 from),
262
263 TP_ARGS(inode, from)
264);
265
266DEFINE_EVENT(f2fs__inode_exit, f2fs_truncate_blocks_exit,
267
268 TP_PROTO(struct inode *inode, int ret),
269
270 TP_ARGS(inode, ret)
271);
272
273DEFINE_EVENT(f2fs__truncate_op, f2fs_truncate_inode_blocks_enter,
274
275 TP_PROTO(struct inode *inode, u64 from),
276
277 TP_ARGS(inode, from)
278);
279
280DEFINE_EVENT(f2fs__inode_exit, f2fs_truncate_inode_blocks_exit,
281
282 TP_PROTO(struct inode *inode, int ret),
283
284 TP_ARGS(inode, ret)
285);
286
287DECLARE_EVENT_CLASS(f2fs__truncate_node,
288
289 TP_PROTO(struct inode *inode, nid_t nid, block_t blk_addr),
290
291 TP_ARGS(inode, nid, blk_addr),
292
293 TP_STRUCT__entry(
294 __field(dev_t, dev)
295 __field(ino_t, ino)
296 __field(nid_t, nid)
297 __field(block_t, blk_addr)
298 ),
299
300 TP_fast_assign(
301 __entry->dev = inode->i_sb->s_dev;
302 __entry->ino = inode->i_ino;
303 __entry->nid = nid;
304 __entry->blk_addr = blk_addr;
305 ),
306
307 TP_printk("dev = (%d,%d), ino = %lu, nid = %u, block_address = 0x%llx",
308 show_dev_ino(__entry),
309 (unsigned int)__entry->nid,
310 (unsigned long long)__entry->blk_addr)
311);
312
313DEFINE_EVENT(f2fs__truncate_node, f2fs_truncate_nodes_enter,
314
315 TP_PROTO(struct inode *inode, nid_t nid, block_t blk_addr),
316
317 TP_ARGS(inode, nid, blk_addr)
318);
319
320DEFINE_EVENT(f2fs__inode_exit, f2fs_truncate_nodes_exit,
321
322 TP_PROTO(struct inode *inode, int ret),
323
324 TP_ARGS(inode, ret)
325);
326
327DEFINE_EVENT(f2fs__truncate_node, f2fs_truncate_node,
328
329 TP_PROTO(struct inode *inode, nid_t nid, block_t blk_addr),
330
331 TP_ARGS(inode, nid, blk_addr)
332);
333
334TRACE_EVENT(f2fs_truncate_partial_nodes,
335
336 TP_PROTO(struct inode *inode, nid_t nid[], int depth, int err),
337
338 TP_ARGS(inode, nid, depth, err),
339
340 TP_STRUCT__entry(
341 __field(dev_t, dev)
342 __field(ino_t, ino)
343 __field(nid_t, nid[3])
344 __field(int, depth)
345 __field(int, err)
346 ),
347
348 TP_fast_assign(
349 __entry->dev = inode->i_sb->s_dev;
350 __entry->ino = inode->i_ino;
351 __entry->nid[0] = nid[0];
352 __entry->nid[1] = nid[1];
353 __entry->nid[2] = nid[2];
354 __entry->depth = depth;
355 __entry->err = err;
356 ),
357
358 TP_printk("dev = (%d,%d), ino = %lu, "
359 "nid[0] = %u, nid[1] = %u, nid[2] = %u, depth = %d, err = %d",
360 show_dev_ino(__entry),
361 (unsigned int)__entry->nid[0],
362 (unsigned int)__entry->nid[1],
363 (unsigned int)__entry->nid[2],
364 __entry->depth,
365 __entry->err)
366);
367
192#endif /* _TRACE_F2FS_H */ 368#endif /* _TRACE_F2FS_H */
193 369
194 /* This part must be outside protection */ 370 /* This part must be outside protection */