aboutsummaryrefslogtreecommitdiffstats
path: root/fs/nilfs2/ioctl.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/nilfs2/ioctl.c')
-rw-r--r--fs/nilfs2/ioctl.c24
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
242nilfs_ioctl_do_get_bdescs(struct the_nilfs *nilfs, __u64 *posp, int flags, 242nilfs_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);