diff options
Diffstat (limited to 'fs/fs-writeback.c')
| -rw-r--r-- | fs/fs-writeback.c | 47 |
1 files changed, 40 insertions, 7 deletions
diff --git a/fs/fs-writeback.c b/fs/fs-writeback.c index f027382b54be..3d06ccc953aa 100644 --- a/fs/fs-writeback.c +++ b/fs/fs-writeback.c | |||
| @@ -1081,30 +1081,42 @@ static void wait_sb_inodes(struct super_block *sb) | |||
| 1081 | } | 1081 | } |
| 1082 | 1082 | ||
| 1083 | /** | 1083 | /** |
| 1084 | * writeback_inodes_sb - writeback dirty inodes from given super_block | 1084 | * writeback_inodes_sb_nr - writeback dirty inodes from given super_block |
| 1085 | * @sb: the superblock | 1085 | * @sb: the superblock |
| 1086 | * @nr: the number of pages to write | ||
| 1086 | * | 1087 | * |
| 1087 | * Start writeback on some inodes on this super_block. No guarantees are made | 1088 | * Start writeback on some inodes on this super_block. No guarantees are made |
| 1088 | * on how many (if any) will be written, and this function does not wait | 1089 | * on how many (if any) will be written, and this function does not wait |
| 1089 | * for IO completion of submitted IO. The number of pages submitted is | 1090 | * for IO completion of submitted IO. |
| 1090 | * returned. | ||
| 1091 | */ | 1091 | */ |
| 1092 | void writeback_inodes_sb(struct super_block *sb) | 1092 | void writeback_inodes_sb_nr(struct super_block *sb, unsigned long nr) |
| 1093 | { | 1093 | { |
| 1094 | DECLARE_COMPLETION_ONSTACK(done); | 1094 | DECLARE_COMPLETION_ONSTACK(done); |
| 1095 | struct wb_writeback_work work = { | 1095 | struct wb_writeback_work work = { |
| 1096 | .sb = sb, | 1096 | .sb = sb, |
| 1097 | .sync_mode = WB_SYNC_NONE, | 1097 | .sync_mode = WB_SYNC_NONE, |
| 1098 | .done = &done, | 1098 | .done = &done, |
| 1099 | .nr_pages = nr, | ||
| 1099 | }; | 1100 | }; |
| 1100 | 1101 | ||
| 1101 | WARN_ON(!rwsem_is_locked(&sb->s_umount)); | 1102 | WARN_ON(!rwsem_is_locked(&sb->s_umount)); |
| 1102 | |||
| 1103 | work.nr_pages = get_nr_dirty_pages(); | ||
| 1104 | |||
| 1105 | bdi_queue_work(sb->s_bdi, &work); | 1103 | bdi_queue_work(sb->s_bdi, &work); |
| 1106 | wait_for_completion(&done); | 1104 | wait_for_completion(&done); |
| 1107 | } | 1105 | } |
| 1106 | EXPORT_SYMBOL(writeback_inodes_sb_nr); | ||
| 1107 | |||
| 1108 | /** | ||
| 1109 | * writeback_inodes_sb - writeback dirty inodes from given super_block | ||
| 1110 | * @sb: the superblock | ||
| 1111 | * | ||
| 1112 | * Start writeback on some inodes on this super_block. No guarantees are made | ||
| 1113 | * on how many (if any) will be written, and this function does not wait | ||
| 1114 | * for IO completion of submitted IO. | ||
| 1115 | */ | ||
| 1116 | void writeback_inodes_sb(struct super_block *sb) | ||
| 1117 | { | ||
| 1118 | return writeback_inodes_sb_nr(sb, get_nr_dirty_pages()); | ||
| 1119 | } | ||
| 1108 | EXPORT_SYMBOL(writeback_inodes_sb); | 1120 | EXPORT_SYMBOL(writeback_inodes_sb); |
| 1109 | 1121 | ||
| 1110 | /** | 1122 | /** |
| @@ -1127,6 +1139,27 @@ int writeback_inodes_sb_if_idle(struct super_block *sb) | |||
| 1127 | EXPORT_SYMBOL(writeback_inodes_sb_if_idle); | 1139 | EXPORT_SYMBOL(writeback_inodes_sb_if_idle); |
| 1128 | 1140 | ||
| 1129 | /** | 1141 | /** |
| 1142 | * writeback_inodes_sb_if_idle - start writeback if none underway | ||
| 1143 | * @sb: the superblock | ||
| 1144 | * @nr: the number of pages to write | ||
| 1145 | * | ||
| 1146 | * Invoke writeback_inodes_sb if no writeback is currently underway. | ||
| 1147 | * Returns 1 if writeback was started, 0 if not. | ||
| 1148 | */ | ||
| 1149 | int writeback_inodes_sb_nr_if_idle(struct super_block *sb, | ||
| 1150 | unsigned long nr) | ||
| 1151 | { | ||
| 1152 | if (!writeback_in_progress(sb->s_bdi)) { | ||
| 1153 | down_read(&sb->s_umount); | ||
| 1154 | writeback_inodes_sb_nr(sb, nr); | ||
| 1155 | up_read(&sb->s_umount); | ||
| 1156 | return 1; | ||
| 1157 | } else | ||
| 1158 | return 0; | ||
| 1159 | } | ||
| 1160 | EXPORT_SYMBOL(writeback_inodes_sb_nr_if_idle); | ||
| 1161 | |||
| 1162 | /** | ||
| 1130 | * sync_inodes_sb - sync sb inode pages | 1163 | * sync_inodes_sb - sync sb inode pages |
| 1131 | * @sb: the superblock | 1164 | * @sb: the superblock |
| 1132 | * | 1165 | * |
