diff options
| author | Dmitry Torokhov <dmitry.torokhov@gmail.com> | 2010-06-22 14:32:04 -0400 |
|---|---|---|
| committer | Dmitry Torokhov <dmitry.torokhov@gmail.com> | 2010-06-22 14:32:04 -0400 |
| commit | 0e789314f8c0b50bd19bf08dc5624b9604d60183 (patch) | |
| tree | 64b6b9655e944284937f5eeff643f0754f35d0af /fs/fs-writeback.c | |
| parent | f5dec51172b81db226a23f309bc737ad021af35b (diff) | |
| parent | 7e27d6e778cd87b6f2415515d7127eba53fe5d02 (diff) | |
Merge commit 'v2.6.35-rc3' into for-linus
Diffstat (limited to 'fs/fs-writeback.c')
| -rw-r--r-- | fs/fs-writeback.c | 64 |
1 files changed, 16 insertions, 48 deletions
diff --git a/fs/fs-writeback.c b/fs/fs-writeback.c index ea8592b90696..1d1088f48bc2 100644 --- a/fs/fs-writeback.c +++ b/fs/fs-writeback.c | |||
| @@ -45,7 +45,6 @@ struct wb_writeback_args { | |||
| 45 | unsigned int for_kupdate:1; | 45 | unsigned int for_kupdate:1; |
| 46 | unsigned int range_cyclic:1; | 46 | unsigned int range_cyclic:1; |
| 47 | unsigned int for_background:1; | 47 | unsigned int for_background:1; |
| 48 | unsigned int sb_pinned:1; | ||
| 49 | }; | 48 | }; |
| 50 | 49 | ||
| 51 | /* | 50 | /* |
| @@ -193,8 +192,7 @@ static void bdi_wait_on_work_clear(struct bdi_work *work) | |||
| 193 | } | 192 | } |
| 194 | 193 | ||
| 195 | static void bdi_alloc_queue_work(struct backing_dev_info *bdi, | 194 | static void bdi_alloc_queue_work(struct backing_dev_info *bdi, |
| 196 | struct wb_writeback_args *args, | 195 | struct wb_writeback_args *args) |
| 197 | int wait) | ||
| 198 | { | 196 | { |
| 199 | struct bdi_work *work; | 197 | struct bdi_work *work; |
| 200 | 198 | ||
| @@ -206,8 +204,6 @@ static void bdi_alloc_queue_work(struct backing_dev_info *bdi, | |||
| 206 | if (work) { | 204 | if (work) { |
| 207 | bdi_work_init(work, args); | 205 | bdi_work_init(work, args); |
| 208 | bdi_queue_work(bdi, work); | 206 | bdi_queue_work(bdi, work); |
| 209 | if (wait) | ||
| 210 | bdi_wait_on_work_clear(work); | ||
| 211 | } else { | 207 | } else { |
| 212 | struct bdi_writeback *wb = &bdi->wb; | 208 | struct bdi_writeback *wb = &bdi->wb; |
| 213 | 209 | ||
| @@ -234,11 +230,6 @@ static void bdi_sync_writeback(struct backing_dev_info *bdi, | |||
| 234 | .sync_mode = WB_SYNC_ALL, | 230 | .sync_mode = WB_SYNC_ALL, |
| 235 | .nr_pages = LONG_MAX, | 231 | .nr_pages = LONG_MAX, |
| 236 | .range_cyclic = 0, | 232 | .range_cyclic = 0, |
| 237 | /* | ||
| 238 | * Setting sb_pinned is not necessary for WB_SYNC_ALL, but | ||
| 239 | * lets make it explicitly clear. | ||
| 240 | */ | ||
| 241 | .sb_pinned = 1, | ||
| 242 | }; | 233 | }; |
| 243 | struct bdi_work work; | 234 | struct bdi_work work; |
| 244 | 235 | ||
| @@ -254,23 +245,21 @@ static void bdi_sync_writeback(struct backing_dev_info *bdi, | |||
| 254 | * @bdi: the backing device to write from | 245 | * @bdi: the backing device to write from |
| 255 | * @sb: write inodes from this super_block | 246 | * @sb: write inodes from this super_block |
| 256 | * @nr_pages: the number of pages to write | 247 | * @nr_pages: the number of pages to write |
| 257 | * @sb_locked: caller already holds sb umount sem. | ||
| 258 | * | 248 | * |
| 259 | * Description: | 249 | * Description: |
| 260 | * This does WB_SYNC_NONE opportunistic writeback. The IO is only | 250 | * This does WB_SYNC_NONE opportunistic writeback. The IO is only |
| 261 | * started when this function returns, we make no guarentees on | 251 | * started when this function returns, we make no guarentees on |
| 262 | * completion. Caller specifies whether sb umount sem is held already or not. | 252 | * completion. Caller need not hold sb s_umount semaphore. |
| 263 | * | 253 | * |
| 264 | */ | 254 | */ |
| 265 | void bdi_start_writeback(struct backing_dev_info *bdi, struct super_block *sb, | 255 | void bdi_start_writeback(struct backing_dev_info *bdi, struct super_block *sb, |
| 266 | long nr_pages, int sb_locked) | 256 | long nr_pages) |
| 267 | { | 257 | { |
| 268 | struct wb_writeback_args args = { | 258 | struct wb_writeback_args args = { |
| 269 | .sb = sb, | 259 | .sb = sb, |
| 270 | .sync_mode = WB_SYNC_NONE, | 260 | .sync_mode = WB_SYNC_NONE, |
| 271 | .nr_pages = nr_pages, | 261 | .nr_pages = nr_pages, |
| 272 | .range_cyclic = 1, | 262 | .range_cyclic = 1, |
| 273 | .sb_pinned = sb_locked, | ||
| 274 | }; | 263 | }; |
| 275 | 264 | ||
| 276 | /* | 265 | /* |
| @@ -282,7 +271,7 @@ void bdi_start_writeback(struct backing_dev_info *bdi, struct super_block *sb, | |||
| 282 | args.for_background = 1; | 271 | args.for_background = 1; |
| 283 | } | 272 | } |
| 284 | 273 | ||
| 285 | bdi_alloc_queue_work(bdi, &args, sb_locked); | 274 | bdi_alloc_queue_work(bdi, &args); |
| 286 | } | 275 | } |
| 287 | 276 | ||
| 288 | /* | 277 | /* |
| @@ -595,7 +584,7 @@ static enum sb_pin_state pin_sb_for_writeback(struct writeback_control *wbc, | |||
| 595 | /* | 584 | /* |
| 596 | * Caller must already hold the ref for this | 585 | * Caller must already hold the ref for this |
| 597 | */ | 586 | */ |
| 598 | if (wbc->sync_mode == WB_SYNC_ALL || wbc->sb_pinned) { | 587 | if (wbc->sync_mode == WB_SYNC_ALL) { |
| 599 | WARN_ON(!rwsem_is_locked(&sb->s_umount)); | 588 | WARN_ON(!rwsem_is_locked(&sb->s_umount)); |
| 600 | return SB_NOT_PINNED; | 589 | return SB_NOT_PINNED; |
| 601 | } | 590 | } |
| @@ -769,7 +758,6 @@ static long wb_writeback(struct bdi_writeback *wb, | |||
| 769 | .for_kupdate = args->for_kupdate, | 758 | .for_kupdate = args->for_kupdate, |
| 770 | .for_background = args->for_background, | 759 | .for_background = args->for_background, |
| 771 | .range_cyclic = args->range_cyclic, | 760 | .range_cyclic = args->range_cyclic, |
| 772 | .sb_pinned = args->sb_pinned, | ||
| 773 | }; | 761 | }; |
| 774 | unsigned long oldest_jif; | 762 | unsigned long oldest_jif; |
| 775 | long wrote = 0; | 763 | long wrote = 0; |
| @@ -912,7 +900,6 @@ long wb_do_writeback(struct bdi_writeback *wb, int force_wait) | |||
| 912 | 900 | ||
| 913 | while ((work = get_next_work_item(bdi, wb)) != NULL) { | 901 | while ((work = get_next_work_item(bdi, wb)) != NULL) { |
| 914 | struct wb_writeback_args args = work->args; | 902 | struct wb_writeback_args args = work->args; |
| 915 | int post_clear; | ||
| 916 | 903 | ||
| 917 | /* | 904 | /* |
| 918 | * Override sync mode, in case we must wait for completion | 905 | * Override sync mode, in case we must wait for completion |
| @@ -920,13 +907,11 @@ long wb_do_writeback(struct bdi_writeback *wb, int force_wait) | |||
| 920 | if (force_wait) | 907 | if (force_wait) |
| 921 | work->args.sync_mode = args.sync_mode = WB_SYNC_ALL; | 908 | work->args.sync_mode = args.sync_mode = WB_SYNC_ALL; |
| 922 | 909 | ||
| 923 | post_clear = WB_SYNC_ALL || args.sb_pinned; | ||
| 924 | |||
| 925 | /* | 910 | /* |
| 926 | * If this isn't a data integrity operation, just notify | 911 | * If this isn't a data integrity operation, just notify |
| 927 | * that we have seen this work and we are now starting it. | 912 | * that we have seen this work and we are now starting it. |
| 928 | */ | 913 | */ |
| 929 | if (!post_clear) | 914 | if (args.sync_mode == WB_SYNC_NONE) |
| 930 | wb_clear_pending(wb, work); | 915 | wb_clear_pending(wb, work); |
| 931 | 916 | ||
| 932 | wrote += wb_writeback(wb, &args); | 917 | wrote += wb_writeback(wb, &args); |
| @@ -935,7 +920,7 @@ long wb_do_writeback(struct bdi_writeback *wb, int force_wait) | |||
| 935 | * This is a data integrity writeback, so only do the | 920 | * This is a data integrity writeback, so only do the |
| 936 | * notification when we have completed the work. | 921 | * notification when we have completed the work. |
| 937 | */ | 922 | */ |
| 938 | if (post_clear) | 923 | if (args.sync_mode == WB_SYNC_ALL) |
| 939 | wb_clear_pending(wb, work); | 924 | wb_clear_pending(wb, work); |
| 940 | } | 925 | } |
| 941 | 926 | ||
| @@ -1011,7 +996,7 @@ static void bdi_writeback_all(struct super_block *sb, long nr_pages) | |||
| 1011 | if (!bdi_has_dirty_io(bdi)) | 996 | if (!bdi_has_dirty_io(bdi)) |
| 1012 | continue; | 997 | continue; |
| 1013 | 998 | ||
| 1014 | bdi_alloc_queue_work(bdi, &args, 0); | 999 | bdi_alloc_queue_work(bdi, &args); |
| 1015 | } | 1000 | } |
| 1016 | 1001 | ||
| 1017 | rcu_read_unlock(); | 1002 | rcu_read_unlock(); |
| @@ -1220,18 +1205,6 @@ static void wait_sb_inodes(struct super_block *sb) | |||
| 1220 | iput(old_inode); | 1205 | iput(old_inode); |
| 1221 | } | 1206 | } |
| 1222 | 1207 | ||
| 1223 | static void __writeback_inodes_sb(struct super_block *sb, int sb_locked) | ||
| 1224 | { | ||
| 1225 | unsigned long nr_dirty = global_page_state(NR_FILE_DIRTY); | ||
| 1226 | unsigned long nr_unstable = global_page_state(NR_UNSTABLE_NFS); | ||
| 1227 | long nr_to_write; | ||
| 1228 | |||
| 1229 | nr_to_write = nr_dirty + nr_unstable + | ||
| 1230 | (inodes_stat.nr_inodes - inodes_stat.nr_unused); | ||
| 1231 | |||
| 1232 | bdi_start_writeback(sb->s_bdi, sb, nr_to_write, sb_locked); | ||
| 1233 | } | ||
| 1234 | |||
| 1235 | /** | 1208 | /** |
| 1236 | * writeback_inodes_sb - writeback dirty inodes from given super_block | 1209 | * writeback_inodes_sb - writeback dirty inodes from given super_block |
| 1237 | * @sb: the superblock | 1210 | * @sb: the superblock |
| @@ -1243,21 +1216,16 @@ static void __writeback_inodes_sb(struct super_block *sb, int sb_locked) | |||
| 1243 | */ | 1216 | */ |
| 1244 | void writeback_inodes_sb(struct super_block *sb) | 1217 | void writeback_inodes_sb(struct super_block *sb) |
| 1245 | { | 1218 | { |
| 1246 | __writeback_inodes_sb(sb, 0); | 1219 | unsigned long nr_dirty = global_page_state(NR_FILE_DIRTY); |
| 1247 | } | 1220 | unsigned long nr_unstable = global_page_state(NR_UNSTABLE_NFS); |
| 1248 | EXPORT_SYMBOL(writeback_inodes_sb); | 1221 | long nr_to_write; |
| 1249 | 1222 | ||
| 1250 | /** | 1223 | nr_to_write = nr_dirty + nr_unstable + |
| 1251 | * writeback_inodes_sb_locked - writeback dirty inodes from given super_block | 1224 | (inodes_stat.nr_inodes - inodes_stat.nr_unused); |
| 1252 | * @sb: the superblock | 1225 | |
| 1253 | * | 1226 | bdi_start_writeback(sb->s_bdi, sb, nr_to_write); |
| 1254 | * Like writeback_inodes_sb(), except the caller already holds the | ||
| 1255 | * sb umount sem. | ||
| 1256 | */ | ||
| 1257 | void writeback_inodes_sb_locked(struct super_block *sb) | ||
| 1258 | { | ||
| 1259 | __writeback_inodes_sb(sb, 1); | ||
| 1260 | } | 1227 | } |
| 1228 | EXPORT_SYMBOL(writeback_inodes_sb); | ||
| 1261 | 1229 | ||
| 1262 | /** | 1230 | /** |
| 1263 | * writeback_inodes_sb_if_idle - start writeback if none underway | 1231 | * writeback_inodes_sb_if_idle - start writeback if none underway |
