diff options
Diffstat (limited to 'fs/nilfs2/ioctl.c')
-rw-r--r-- | fs/nilfs2/ioctl.c | 24 |
1 files changed, 17 insertions, 7 deletions
diff --git a/fs/nilfs2/ioctl.c b/fs/nilfs2/ioctl.c index e00d9457c256..496738963fdb 100644 --- a/fs/nilfs2/ioctl.c +++ b/fs/nilfs2/ioctl.c | |||
@@ -233,7 +233,7 @@ nilfs_ioctl_do_get_vinfo(struct the_nilfs *nilfs, __u64 *posp, int flags, | |||
233 | int ret; | 233 | int ret; |
234 | 234 | ||
235 | down_read(&nilfs->ns_segctor_sem); | 235 | down_read(&nilfs->ns_segctor_sem); |
236 | ret = nilfs_dat_get_vinfo(nilfs_dat_inode(nilfs), buf, size, nmembs); | 236 | ret = nilfs_dat_get_vinfo(nilfs->ns_dat, buf, size, nmembs); |
237 | up_read(&nilfs->ns_segctor_sem); | 237 | up_read(&nilfs->ns_segctor_sem); |
238 | return ret; | 238 | return ret; |
239 | } | 239 | } |
@@ -242,8 +242,7 @@ static ssize_t | |||
242 | nilfs_ioctl_do_get_bdescs(struct the_nilfs *nilfs, __u64 *posp, int flags, | 242 | nilfs_ioctl_do_get_bdescs(struct the_nilfs *nilfs, __u64 *posp, int flags, |
243 | void *buf, size_t size, size_t nmembs) | 243 | void *buf, size_t size, size_t nmembs) |
244 | { | 244 | { |
245 | struct inode *dat = nilfs_dat_inode(nilfs); | 245 | struct nilfs_bmap *bmap = NILFS_I(nilfs->ns_dat)->i_bmap; |
246 | struct nilfs_bmap *bmap = NILFS_I(dat)->i_bmap; | ||
247 | struct nilfs_bdesc *bdescs = buf; | 246 | struct nilfs_bdesc *bdescs = buf; |
248 | int ret, i; | 247 | int ret, i; |
249 | 248 | ||
@@ -337,6 +336,7 @@ static int nilfs_ioctl_move_blocks(struct super_block *sb, | |||
337 | struct nilfs_argv *argv, void *buf) | 336 | struct nilfs_argv *argv, void *buf) |
338 | { | 337 | { |
339 | size_t nmembs = argv->v_nmembs; | 338 | size_t nmembs = argv->v_nmembs; |
339 | struct the_nilfs *nilfs = NILFS_SB(sb)->s_nilfs; | ||
340 | struct inode *inode; | 340 | struct inode *inode; |
341 | struct nilfs_vdesc *vdesc; | 341 | struct nilfs_vdesc *vdesc; |
342 | struct buffer_head *bh, *n; | 342 | struct buffer_head *bh, *n; |
@@ -353,6 +353,17 @@ static int nilfs_ioctl_move_blocks(struct super_block *sb, | |||
353 | ret = PTR_ERR(inode); | 353 | ret = PTR_ERR(inode); |
354 | goto failed; | 354 | goto failed; |
355 | } | 355 | } |
356 | if (list_empty(&NILFS_I(inode)->i_dirty)) { | ||
357 | /* | ||
358 | * Add the inode to GC inode list. Garbage Collection | ||
359 | * is serialized and no two processes manipulate the | ||
360 | * list simultaneously. | ||
361 | */ | ||
362 | igrab(inode); | ||
363 | list_add(&NILFS_I(inode)->i_dirty, | ||
364 | &nilfs->ns_gc_inodes); | ||
365 | } | ||
366 | |||
356 | do { | 367 | do { |
357 | ret = nilfs_ioctl_move_inode_block(inode, vdesc, | 368 | ret = nilfs_ioctl_move_inode_block(inode, vdesc, |
358 | &buffers); | 369 | &buffers); |
@@ -409,7 +420,7 @@ static int nilfs_ioctl_free_vblocknrs(struct the_nilfs *nilfs, | |||
409 | size_t nmembs = argv->v_nmembs; | 420 | size_t nmembs = argv->v_nmembs; |
410 | int ret; | 421 | int ret; |
411 | 422 | ||
412 | ret = nilfs_dat_freev(nilfs_dat_inode(nilfs), buf, nmembs); | 423 | ret = nilfs_dat_freev(nilfs->ns_dat, buf, nmembs); |
413 | 424 | ||
414 | return (ret < 0) ? ret : nmembs; | 425 | return (ret < 0) ? ret : nmembs; |
415 | } | 426 | } |
@@ -418,8 +429,7 @@ static int nilfs_ioctl_mark_blocks_dirty(struct the_nilfs *nilfs, | |||
418 | struct nilfs_argv *argv, void *buf) | 429 | struct nilfs_argv *argv, void *buf) |
419 | { | 430 | { |
420 | size_t nmembs = argv->v_nmembs; | 431 | size_t nmembs = argv->v_nmembs; |
421 | struct inode *dat = nilfs_dat_inode(nilfs); | 432 | struct nilfs_bmap *bmap = NILFS_I(nilfs->ns_dat)->i_bmap; |
422 | struct nilfs_bmap *bmap = NILFS_I(dat)->i_bmap; | ||
423 | struct nilfs_bdesc *bdescs = buf; | 433 | struct nilfs_bdesc *bdescs = buf; |
424 | int ret, i; | 434 | int ret, i; |
425 | 435 | ||
@@ -438,7 +448,7 @@ static int nilfs_ioctl_mark_blocks_dirty(struct the_nilfs *nilfs, | |||
438 | /* skip dead block */ | 448 | /* skip dead block */ |
439 | continue; | 449 | continue; |
440 | if (bdescs[i].bd_level == 0) { | 450 | if (bdescs[i].bd_level == 0) { |
441 | ret = nilfs_mdt_mark_block_dirty(dat, | 451 | ret = nilfs_mdt_mark_block_dirty(nilfs->ns_dat, |
442 | bdescs[i].bd_offset); | 452 | bdescs[i].bd_offset); |
443 | if (ret < 0) { | 453 | if (ret < 0) { |
444 | WARN_ON(ret == -ENOENT); | 454 | WARN_ON(ret == -ENOENT); |