diff options
-rw-r--r-- | fs/f2fs/file.c | 9 | ||||
-rw-r--r-- | fs/f2fs/node.c | 20 | ||||
-rw-r--r-- | include/trace/events/f2fs.h | 176 |
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 | ||
23 | static struct kmem_cache *nat_entry_slab; | 24 | static struct kmem_cache *nat_entry_slab; |
24 | static struct kmem_cache *free_nid_slab; | 25 | static 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 | ||
513 | static int truncate_dnode(struct dnode_of_data *dn) | 515 | static 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 | ||
597 | out_err: | 604 | out_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, | |||
650 | fail: | 658 | fail: |
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 | } |
741 | fail: | 756 | fail: |
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 | |||
193 | DEFINE_EVENT(f2fs__inode, f2fs_truncate, | ||
194 | |||
195 | TP_PROTO(struct inode *inode), | ||
196 | |||
197 | TP_ARGS(inode) | ||
198 | ); | ||
199 | |||
200 | TRACE_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 | |||
229 | DECLARE_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 | |||
259 | DEFINE_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 | |||
266 | DEFINE_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 | |||
273 | DEFINE_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 | |||
280 | DEFINE_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 | |||
287 | DECLARE_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 | |||
313 | DEFINE_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 | |||
320 | DEFINE_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 | |||
327 | DEFINE_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 | |||
334 | TRACE_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 */ |