diff options
Diffstat (limited to 'fs/ext4/fsync.c')
-rw-r--r-- | fs/ext4/fsync.c | 81 |
1 files changed, 0 insertions, 81 deletions
diff --git a/fs/ext4/fsync.c b/fs/ext4/fsync.c index 323eb15c2d94..460000868b8e 100644 --- a/fs/ext4/fsync.c +++ b/fs/ext4/fsync.c | |||
@@ -34,87 +34,6 @@ | |||
34 | 34 | ||
35 | #include <trace/events/ext4.h> | 35 | #include <trace/events/ext4.h> |
36 | 36 | ||
37 | static void dump_completed_IO(struct inode * inode) | ||
38 | { | ||
39 | #ifdef EXT4FS_DEBUG | ||
40 | struct list_head *cur, *before, *after; | ||
41 | ext4_io_end_t *io, *io0, *io1; | ||
42 | unsigned long flags; | ||
43 | |||
44 | if (list_empty(&EXT4_I(inode)->i_completed_io_list)){ | ||
45 | ext4_debug("inode %lu completed_io list is empty\n", inode->i_ino); | ||
46 | return; | ||
47 | } | ||
48 | |||
49 | ext4_debug("Dump inode %lu completed_io list \n", inode->i_ino); | ||
50 | spin_lock_irqsave(&EXT4_I(inode)->i_completed_io_lock, flags); | ||
51 | list_for_each_entry(io, &EXT4_I(inode)->i_completed_io_list, list){ | ||
52 | cur = &io->list; | ||
53 | before = cur->prev; | ||
54 | io0 = container_of(before, ext4_io_end_t, list); | ||
55 | after = cur->next; | ||
56 | io1 = container_of(after, ext4_io_end_t, list); | ||
57 | |||
58 | ext4_debug("io 0x%p from inode %lu,prev 0x%p,next 0x%p\n", | ||
59 | io, inode->i_ino, io0, io1); | ||
60 | } | ||
61 | spin_unlock_irqrestore(&EXT4_I(inode)->i_completed_io_lock, flags); | ||
62 | #endif | ||
63 | } | ||
64 | |||
65 | /* | ||
66 | * This function is called from ext4_sync_file(). | ||
67 | * | ||
68 | * When IO is completed, the work to convert unwritten extents to | ||
69 | * written is queued on workqueue but may not get immediately | ||
70 | * scheduled. When fsync is called, we need to ensure the | ||
71 | * conversion is complete before fsync returns. | ||
72 | * The inode keeps track of a list of pending/completed IO that | ||
73 | * might needs to do the conversion. This function walks through | ||
74 | * the list and convert the related unwritten extents for completed IO | ||
75 | * to written. | ||
76 | * The function return the number of pending IOs on success. | ||
77 | */ | ||
78 | int ext4_flush_completed_IO(struct inode *inode) | ||
79 | { | ||
80 | ext4_io_end_t *io; | ||
81 | struct ext4_inode_info *ei = EXT4_I(inode); | ||
82 | unsigned long flags; | ||
83 | int ret = 0; | ||
84 | int ret2 = 0; | ||
85 | |||
86 | dump_completed_IO(inode); | ||
87 | spin_lock_irqsave(&ei->i_completed_io_lock, flags); | ||
88 | while (!list_empty(&ei->i_completed_io_list)){ | ||
89 | io = list_entry(ei->i_completed_io_list.next, | ||
90 | ext4_io_end_t, list); | ||
91 | list_del_init(&io->list); | ||
92 | io->flag |= EXT4_IO_END_IN_FSYNC; | ||
93 | /* | ||
94 | * Calling ext4_end_io_nolock() to convert completed | ||
95 | * IO to written. | ||
96 | * | ||
97 | * When ext4_sync_file() is called, run_queue() may already | ||
98 | * about to flush the work corresponding to this io structure. | ||
99 | * It will be upset if it founds the io structure related | ||
100 | * to the work-to-be schedule is freed. | ||
101 | * | ||
102 | * Thus we need to keep the io structure still valid here after | ||
103 | * conversion finished. The io structure has a flag to | ||
104 | * avoid double converting from both fsync and background work | ||
105 | * queue work. | ||
106 | */ | ||
107 | spin_unlock_irqrestore(&ei->i_completed_io_lock, flags); | ||
108 | ret = ext4_end_io_nolock(io); | ||
109 | if (ret < 0) | ||
110 | ret2 = ret; | ||
111 | spin_lock_irqsave(&ei->i_completed_io_lock, flags); | ||
112 | io->flag &= ~EXT4_IO_END_IN_FSYNC; | ||
113 | } | ||
114 | spin_unlock_irqrestore(&ei->i_completed_io_lock, flags); | ||
115 | return (ret2 < 0) ? ret2 : 0; | ||
116 | } | ||
117 | |||
118 | /* | 37 | /* |
119 | * If we're not journaling and this is a just-created file, we have to | 38 | * If we're not journaling and this is a just-created file, we have to |
120 | * sync our parent directory (if it was freshly created) since | 39 | * sync our parent directory (if it was freshly created) since |