diff options
Diffstat (limited to 'fs/nilfs2')
-rw-r--r-- | fs/nilfs2/bmap.c | 47 | ||||
-rw-r--r-- | fs/nilfs2/btnode.c | 8 | ||||
-rw-r--r-- | fs/nilfs2/btnode.h | 1 | ||||
-rw-r--r-- | fs/nilfs2/dir.c | 3 | ||||
-rw-r--r-- | fs/nilfs2/file.c | 1 | ||||
-rw-r--r-- | fs/nilfs2/ifile.c | 11 | ||||
-rw-r--r-- | fs/nilfs2/inode.c | 180 | ||||
-rw-r--r-- | fs/nilfs2/ioctl.c | 12 | ||||
-rw-r--r-- | fs/nilfs2/mdt.c | 36 | ||||
-rw-r--r-- | fs/nilfs2/namei.c | 9 | ||||
-rw-r--r-- | fs/nilfs2/nilfs.h | 13 | ||||
-rw-r--r-- | fs/nilfs2/page.c | 97 | ||||
-rw-r--r-- | fs/nilfs2/page.h | 4 | ||||
-rw-r--r-- | fs/nilfs2/recovery.c | 2 | ||||
-rw-r--r-- | fs/nilfs2/sb.h | 8 | ||||
-rw-r--r-- | fs/nilfs2/segment.c | 46 | ||||
-rw-r--r-- | fs/nilfs2/super.c | 43 | ||||
-rw-r--r-- | fs/nilfs2/the_nilfs.c | 6 | ||||
-rw-r--r-- | fs/nilfs2/the_nilfs.h | 3 |
19 files changed, 347 insertions, 183 deletions
diff --git a/fs/nilfs2/bmap.c b/fs/nilfs2/bmap.c index 8b782b062baa..3ee67c67cc52 100644 --- a/fs/nilfs2/bmap.c +++ b/fs/nilfs2/bmap.c | |||
@@ -35,7 +35,20 @@ | |||
35 | 35 | ||
36 | struct inode *nilfs_bmap_get_dat(const struct nilfs_bmap *bmap) | 36 | struct inode *nilfs_bmap_get_dat(const struct nilfs_bmap *bmap) |
37 | { | 37 | { |
38 | return nilfs_dat_inode(NILFS_I_NILFS(bmap->b_inode)); | 38 | return NILFS_I_NILFS(bmap->b_inode)->ns_dat; |
39 | } | ||
40 | |||
41 | static int nilfs_bmap_convert_error(struct nilfs_bmap *bmap, | ||
42 | const char *fname, int err) | ||
43 | { | ||
44 | struct inode *inode = bmap->b_inode; | ||
45 | |||
46 | if (err == -EINVAL) { | ||
47 | nilfs_error(inode->i_sb, fname, | ||
48 | "broken bmap (inode number=%lu)\n", inode->i_ino); | ||
49 | err = -EIO; | ||
50 | } | ||
51 | return err; | ||
39 | } | 52 | } |
40 | 53 | ||
41 | /** | 54 | /** |
@@ -66,8 +79,10 @@ int nilfs_bmap_lookup_at_level(struct nilfs_bmap *bmap, __u64 key, int level, | |||
66 | 79 | ||
67 | down_read(&bmap->b_sem); | 80 | down_read(&bmap->b_sem); |
68 | ret = bmap->b_ops->bop_lookup(bmap, key, level, ptrp); | 81 | ret = bmap->b_ops->bop_lookup(bmap, key, level, ptrp); |
69 | if (ret < 0) | 82 | if (ret < 0) { |
83 | ret = nilfs_bmap_convert_error(bmap, __func__, ret); | ||
70 | goto out; | 84 | goto out; |
85 | } | ||
71 | if (NILFS_BMAP_USE_VBN(bmap)) { | 86 | if (NILFS_BMAP_USE_VBN(bmap)) { |
72 | ret = nilfs_dat_translate(nilfs_bmap_get_dat(bmap), *ptrp, | 87 | ret = nilfs_dat_translate(nilfs_bmap_get_dat(bmap), *ptrp, |
73 | &blocknr); | 88 | &blocknr); |
@@ -88,7 +103,8 @@ int nilfs_bmap_lookup_contig(struct nilfs_bmap *bmap, __u64 key, __u64 *ptrp, | |||
88 | down_read(&bmap->b_sem); | 103 | down_read(&bmap->b_sem); |
89 | ret = bmap->b_ops->bop_lookup_contig(bmap, key, ptrp, maxblocks); | 104 | ret = bmap->b_ops->bop_lookup_contig(bmap, key, ptrp, maxblocks); |
90 | up_read(&bmap->b_sem); | 105 | up_read(&bmap->b_sem); |
91 | return ret; | 106 | |
107 | return nilfs_bmap_convert_error(bmap, __func__, ret); | ||
92 | } | 108 | } |
93 | 109 | ||
94 | static int nilfs_bmap_do_insert(struct nilfs_bmap *bmap, __u64 key, __u64 ptr) | 110 | static int nilfs_bmap_do_insert(struct nilfs_bmap *bmap, __u64 key, __u64 ptr) |
@@ -144,7 +160,8 @@ int nilfs_bmap_insert(struct nilfs_bmap *bmap, | |||
144 | down_write(&bmap->b_sem); | 160 | down_write(&bmap->b_sem); |
145 | ret = nilfs_bmap_do_insert(bmap, key, rec); | 161 | ret = nilfs_bmap_do_insert(bmap, key, rec); |
146 | up_write(&bmap->b_sem); | 162 | up_write(&bmap->b_sem); |
147 | return ret; | 163 | |
164 | return nilfs_bmap_convert_error(bmap, __func__, ret); | ||
148 | } | 165 | } |
149 | 166 | ||
150 | static int nilfs_bmap_do_delete(struct nilfs_bmap *bmap, __u64 key) | 167 | static int nilfs_bmap_do_delete(struct nilfs_bmap *bmap, __u64 key) |
@@ -180,9 +197,12 @@ int nilfs_bmap_last_key(struct nilfs_bmap *bmap, unsigned long *key) | |||
180 | 197 | ||
181 | down_read(&bmap->b_sem); | 198 | down_read(&bmap->b_sem); |
182 | ret = bmap->b_ops->bop_last_key(bmap, &lastkey); | 199 | ret = bmap->b_ops->bop_last_key(bmap, &lastkey); |
183 | if (!ret) | ||
184 | *key = lastkey; | ||
185 | up_read(&bmap->b_sem); | 200 | up_read(&bmap->b_sem); |
201 | |||
202 | if (ret < 0) | ||
203 | ret = nilfs_bmap_convert_error(bmap, __func__, ret); | ||
204 | else | ||
205 | *key = lastkey; | ||
186 | return ret; | 206 | return ret; |
187 | } | 207 | } |
188 | 208 | ||
@@ -210,7 +230,8 @@ int nilfs_bmap_delete(struct nilfs_bmap *bmap, unsigned long key) | |||
210 | down_write(&bmap->b_sem); | 230 | down_write(&bmap->b_sem); |
211 | ret = nilfs_bmap_do_delete(bmap, key); | 231 | ret = nilfs_bmap_do_delete(bmap, key); |
212 | up_write(&bmap->b_sem); | 232 | up_write(&bmap->b_sem); |
213 | return ret; | 233 | |
234 | return nilfs_bmap_convert_error(bmap, __func__, ret); | ||
214 | } | 235 | } |
215 | 236 | ||
216 | static int nilfs_bmap_do_truncate(struct nilfs_bmap *bmap, unsigned long key) | 237 | static int nilfs_bmap_do_truncate(struct nilfs_bmap *bmap, unsigned long key) |
@@ -261,7 +282,8 @@ int nilfs_bmap_truncate(struct nilfs_bmap *bmap, unsigned long key) | |||
261 | down_write(&bmap->b_sem); | 282 | down_write(&bmap->b_sem); |
262 | ret = nilfs_bmap_do_truncate(bmap, key); | 283 | ret = nilfs_bmap_do_truncate(bmap, key); |
263 | up_write(&bmap->b_sem); | 284 | up_write(&bmap->b_sem); |
264 | return ret; | 285 | |
286 | return nilfs_bmap_convert_error(bmap, __func__, ret); | ||
265 | } | 287 | } |
266 | 288 | ||
267 | /** | 289 | /** |
@@ -300,7 +322,8 @@ int nilfs_bmap_propagate(struct nilfs_bmap *bmap, struct buffer_head *bh) | |||
300 | down_write(&bmap->b_sem); | 322 | down_write(&bmap->b_sem); |
301 | ret = bmap->b_ops->bop_propagate(bmap, bh); | 323 | ret = bmap->b_ops->bop_propagate(bmap, bh); |
302 | up_write(&bmap->b_sem); | 324 | up_write(&bmap->b_sem); |
303 | return ret; | 325 | |
326 | return nilfs_bmap_convert_error(bmap, __func__, ret); | ||
304 | } | 327 | } |
305 | 328 | ||
306 | /** | 329 | /** |
@@ -344,7 +367,8 @@ int nilfs_bmap_assign(struct nilfs_bmap *bmap, | |||
344 | down_write(&bmap->b_sem); | 367 | down_write(&bmap->b_sem); |
345 | ret = bmap->b_ops->bop_assign(bmap, bh, blocknr, binfo); | 368 | ret = bmap->b_ops->bop_assign(bmap, bh, blocknr, binfo); |
346 | up_write(&bmap->b_sem); | 369 | up_write(&bmap->b_sem); |
347 | return ret; | 370 | |
371 | return nilfs_bmap_convert_error(bmap, __func__, ret); | ||
348 | } | 372 | } |
349 | 373 | ||
350 | /** | 374 | /** |
@@ -373,7 +397,8 @@ int nilfs_bmap_mark(struct nilfs_bmap *bmap, __u64 key, int level) | |||
373 | down_write(&bmap->b_sem); | 397 | down_write(&bmap->b_sem); |
374 | ret = bmap->b_ops->bop_mark(bmap, key, level); | 398 | ret = bmap->b_ops->bop_mark(bmap, key, level); |
375 | up_write(&bmap->b_sem); | 399 | up_write(&bmap->b_sem); |
376 | return ret; | 400 | |
401 | return nilfs_bmap_convert_error(bmap, __func__, ret); | ||
377 | } | 402 | } |
378 | 403 | ||
379 | /** | 404 | /** |
diff --git a/fs/nilfs2/btnode.c b/fs/nilfs2/btnode.c index 5115814cb745..85f7baa15f5d 100644 --- a/fs/nilfs2/btnode.c +++ b/fs/nilfs2/btnode.c | |||
@@ -35,11 +35,6 @@ | |||
35 | #include "btnode.h" | 35 | #include "btnode.h" |
36 | 36 | ||
37 | 37 | ||
38 | void nilfs_btnode_cache_init_once(struct address_space *btnc) | ||
39 | { | ||
40 | nilfs_mapping_init_once(btnc); | ||
41 | } | ||
42 | |||
43 | static const struct address_space_operations def_btnode_aops = { | 38 | static const struct address_space_operations def_btnode_aops = { |
44 | .sync_page = block_sync_page, | 39 | .sync_page = block_sync_page, |
45 | }; | 40 | }; |
@@ -104,8 +99,7 @@ int nilfs_btnode_submit_block(struct address_space *btnc, __u64 blocknr, | |||
104 | if (pblocknr == 0) { | 99 | if (pblocknr == 0) { |
105 | pblocknr = blocknr; | 100 | pblocknr = blocknr; |
106 | if (inode->i_ino != NILFS_DAT_INO) { | 101 | if (inode->i_ino != NILFS_DAT_INO) { |
107 | struct inode *dat = | 102 | struct inode *dat = NILFS_I_NILFS(inode)->ns_dat; |
108 | nilfs_dat_inode(NILFS_I_NILFS(inode)); | ||
109 | 103 | ||
110 | /* blocknr is a virtual block number */ | 104 | /* blocknr is a virtual block number */ |
111 | err = nilfs_dat_translate(dat, blocknr, &pblocknr); | 105 | err = nilfs_dat_translate(dat, blocknr, &pblocknr); |
diff --git a/fs/nilfs2/btnode.h b/fs/nilfs2/btnode.h index 79037494f1e0..1b8ebd888c28 100644 --- a/fs/nilfs2/btnode.h +++ b/fs/nilfs2/btnode.h | |||
@@ -37,7 +37,6 @@ struct nilfs_btnode_chkey_ctxt { | |||
37 | struct buffer_head *newbh; | 37 | struct buffer_head *newbh; |
38 | }; | 38 | }; |
39 | 39 | ||
40 | void nilfs_btnode_cache_init_once(struct address_space *); | ||
41 | void nilfs_btnode_cache_init(struct address_space *, struct backing_dev_info *); | 40 | void nilfs_btnode_cache_init(struct address_space *, struct backing_dev_info *); |
42 | void nilfs_btnode_cache_clear(struct address_space *); | 41 | void nilfs_btnode_cache_clear(struct address_space *); |
43 | struct buffer_head *nilfs_btnode_create_block(struct address_space *btnc, | 42 | struct buffer_head *nilfs_btnode_create_block(struct address_space *btnc, |
diff --git a/fs/nilfs2/dir.c b/fs/nilfs2/dir.c index cb003c8ee1f6..9d45773b79e6 100644 --- a/fs/nilfs2/dir.c +++ b/fs/nilfs2/dir.c | |||
@@ -91,7 +91,6 @@ static void nilfs_commit_chunk(struct page *page, | |||
91 | unsigned from, unsigned to) | 91 | unsigned from, unsigned to) |
92 | { | 92 | { |
93 | struct inode *dir = mapping->host; | 93 | struct inode *dir = mapping->host; |
94 | struct nilfs_sb_info *sbi = NILFS_SB(dir->i_sb); | ||
95 | loff_t pos = page_offset(page) + from; | 94 | loff_t pos = page_offset(page) + from; |
96 | unsigned len = to - from; | 95 | unsigned len = to - from; |
97 | unsigned nr_dirty, copied; | 96 | unsigned nr_dirty, copied; |
@@ -103,7 +102,7 @@ static void nilfs_commit_chunk(struct page *page, | |||
103 | i_size_write(dir, pos + copied); | 102 | i_size_write(dir, pos + copied); |
104 | if (IS_DIRSYNC(dir)) | 103 | if (IS_DIRSYNC(dir)) |
105 | nilfs_set_transaction_flag(NILFS_TI_SYNC); | 104 | nilfs_set_transaction_flag(NILFS_TI_SYNC); |
106 | err = nilfs_set_file_dirty(sbi, dir, nr_dirty); | 105 | err = nilfs_set_file_dirty(dir, nr_dirty); |
107 | WARN_ON(err); /* do not happen */ | 106 | WARN_ON(err); /* do not happen */ |
108 | unlock_page(page); | 107 | unlock_page(page); |
109 | } | 108 | } |
diff --git a/fs/nilfs2/file.c b/fs/nilfs2/file.c index c9a30d7ff6fc..2f560c9fb808 100644 --- a/fs/nilfs2/file.c +++ b/fs/nilfs2/file.c | |||
@@ -155,6 +155,7 @@ const struct inode_operations nilfs_file_inode_operations = { | |||
155 | .truncate = nilfs_truncate, | 155 | .truncate = nilfs_truncate, |
156 | .setattr = nilfs_setattr, | 156 | .setattr = nilfs_setattr, |
157 | .permission = nilfs_permission, | 157 | .permission = nilfs_permission, |
158 | .fiemap = nilfs_fiemap, | ||
158 | }; | 159 | }; |
159 | 160 | ||
160 | /* end of file */ | 161 | /* end of file */ |
diff --git a/fs/nilfs2/ifile.c b/fs/nilfs2/ifile.c index 9f8a2da67f90..bfc73d3a30ed 100644 --- a/fs/nilfs2/ifile.c +++ b/fs/nilfs2/ifile.c | |||
@@ -149,14 +149,9 @@ int nilfs_ifile_get_inode_block(struct inode *ifile, ino_t ino, | |||
149 | } | 149 | } |
150 | 150 | ||
151 | err = nilfs_palloc_get_entry_block(ifile, ino, 0, out_bh); | 151 | err = nilfs_palloc_get_entry_block(ifile, ino, 0, out_bh); |
152 | if (unlikely(err)) { | 152 | if (unlikely(err)) |
153 | if (err == -EINVAL) | 153 | nilfs_warning(sb, __func__, "unable to read inode: %lu", |
154 | nilfs_error(sb, __func__, "ifile is broken"); | 154 | (unsigned long) ino); |
155 | else | ||
156 | nilfs_warning(sb, __func__, | ||
157 | "unable to read inode: %lu", | ||
158 | (unsigned long) ino); | ||
159 | } | ||
160 | return err; | 155 | return err; |
161 | } | 156 | } |
162 | 157 | ||
diff --git a/fs/nilfs2/inode.c b/fs/nilfs2/inode.c index 77b48c8fab17..2fd440d8d6b8 100644 --- a/fs/nilfs2/inode.c +++ b/fs/nilfs2/inode.c | |||
@@ -58,7 +58,7 @@ int nilfs_get_block(struct inode *inode, sector_t blkoff, | |||
58 | struct nilfs_inode_info *ii = NILFS_I(inode); | 58 | struct nilfs_inode_info *ii = NILFS_I(inode); |
59 | __u64 blknum = 0; | 59 | __u64 blknum = 0; |
60 | int err = 0, ret; | 60 | int err = 0, ret; |
61 | struct inode *dat = nilfs_dat_inode(NILFS_I_NILFS(inode)); | 61 | struct inode *dat = NILFS_I_NILFS(inode)->ns_dat; |
62 | unsigned maxblocks = bh_result->b_size >> inode->i_blkbits; | 62 | unsigned maxblocks = bh_result->b_size >> inode->i_blkbits; |
63 | 63 | ||
64 | down_read(&NILFS_MDT(dat)->mi_sem); | 64 | down_read(&NILFS_MDT(dat)->mi_sem); |
@@ -96,11 +96,6 @@ int nilfs_get_block(struct inode *inode, sector_t blkoff, | |||
96 | inode->i_ino, | 96 | inode->i_ino, |
97 | (unsigned long long)blkoff); | 97 | (unsigned long long)blkoff); |
98 | err = 0; | 98 | err = 0; |
99 | } else if (err == -EINVAL) { | ||
100 | nilfs_error(inode->i_sb, __func__, | ||
101 | "broken bmap (inode=%lu)\n", | ||
102 | inode->i_ino); | ||
103 | err = -EIO; | ||
104 | } | 99 | } |
105 | nilfs_transaction_abort(inode->i_sb); | 100 | nilfs_transaction_abort(inode->i_sb); |
106 | goto out; | 101 | goto out; |
@@ -109,6 +104,7 @@ int nilfs_get_block(struct inode *inode, sector_t blkoff, | |||
109 | nilfs_transaction_commit(inode->i_sb); /* never fails */ | 104 | nilfs_transaction_commit(inode->i_sb); /* never fails */ |
110 | /* Error handling should be detailed */ | 105 | /* Error handling should be detailed */ |
111 | set_buffer_new(bh_result); | 106 | set_buffer_new(bh_result); |
107 | set_buffer_delay(bh_result); | ||
112 | map_bh(bh_result, inode->i_sb, 0); /* dbn must be changed | 108 | map_bh(bh_result, inode->i_sb, 0); /* dbn must be changed |
113 | to proper value */ | 109 | to proper value */ |
114 | } else if (ret == -ENOENT) { | 110 | } else if (ret == -ENOENT) { |
@@ -185,10 +181,9 @@ static int nilfs_set_page_dirty(struct page *page) | |||
185 | 181 | ||
186 | if (ret) { | 182 | if (ret) { |
187 | struct inode *inode = page->mapping->host; | 183 | struct inode *inode = page->mapping->host; |
188 | struct nilfs_sb_info *sbi = NILFS_SB(inode->i_sb); | ||
189 | unsigned nr_dirty = 1 << (PAGE_SHIFT - inode->i_blkbits); | 184 | unsigned nr_dirty = 1 << (PAGE_SHIFT - inode->i_blkbits); |
190 | 185 | ||
191 | nilfs_set_file_dirty(sbi, inode, nr_dirty); | 186 | nilfs_set_file_dirty(inode, nr_dirty); |
192 | } | 187 | } |
193 | return ret; | 188 | return ret; |
194 | } | 189 | } |
@@ -229,7 +224,7 @@ static int nilfs_write_end(struct file *file, struct address_space *mapping, | |||
229 | start + copied); | 224 | start + copied); |
230 | copied = generic_write_end(file, mapping, pos, len, copied, page, | 225 | copied = generic_write_end(file, mapping, pos, len, copied, page, |
231 | fsdata); | 226 | fsdata); |
232 | nilfs_set_file_dirty(NILFS_SB(inode->i_sb), inode, nr_dirty); | 227 | nilfs_set_file_dirty(inode, nr_dirty); |
233 | err = nilfs_transaction_commit(inode->i_sb); | 228 | err = nilfs_transaction_commit(inode->i_sb); |
234 | return err ? : copied; | 229 | return err ? : copied; |
235 | } | 230 | } |
@@ -425,13 +420,12 @@ static int __nilfs_read_inode(struct super_block *sb, | |||
425 | struct nilfs_root *root, unsigned long ino, | 420 | struct nilfs_root *root, unsigned long ino, |
426 | struct inode *inode) | 421 | struct inode *inode) |
427 | { | 422 | { |
428 | struct nilfs_sb_info *sbi = NILFS_SB(sb); | 423 | struct the_nilfs *nilfs = NILFS_SB(sb)->s_nilfs; |
429 | struct inode *dat = nilfs_dat_inode(sbi->s_nilfs); | ||
430 | struct buffer_head *bh; | 424 | struct buffer_head *bh; |
431 | struct nilfs_inode *raw_inode; | 425 | struct nilfs_inode *raw_inode; |
432 | int err; | 426 | int err; |
433 | 427 | ||
434 | down_read(&NILFS_MDT(dat)->mi_sem); /* XXX */ | 428 | down_read(&NILFS_MDT(nilfs->ns_dat)->mi_sem); |
435 | err = nilfs_ifile_get_inode_block(root->ifile, ino, &bh); | 429 | err = nilfs_ifile_get_inode_block(root->ifile, ino, &bh); |
436 | if (unlikely(err)) | 430 | if (unlikely(err)) |
437 | goto bad_inode; | 431 | goto bad_inode; |
@@ -461,7 +455,7 @@ static int __nilfs_read_inode(struct super_block *sb, | |||
461 | } | 455 | } |
462 | nilfs_ifile_unmap_inode(root->ifile, ino, bh); | 456 | nilfs_ifile_unmap_inode(root->ifile, ino, bh); |
463 | brelse(bh); | 457 | brelse(bh); |
464 | up_read(&NILFS_MDT(dat)->mi_sem); /* XXX */ | 458 | up_read(&NILFS_MDT(nilfs->ns_dat)->mi_sem); |
465 | nilfs_set_inode_flags(inode); | 459 | nilfs_set_inode_flags(inode); |
466 | return 0; | 460 | return 0; |
467 | 461 | ||
@@ -470,7 +464,7 @@ static int __nilfs_read_inode(struct super_block *sb, | |||
470 | brelse(bh); | 464 | brelse(bh); |
471 | 465 | ||
472 | bad_inode: | 466 | bad_inode: |
473 | up_read(&NILFS_MDT(dat)->mi_sem); /* XXX */ | 467 | up_read(&NILFS_MDT(nilfs->ns_dat)->mi_sem); |
474 | return err; | 468 | return err; |
475 | } | 469 | } |
476 | 470 | ||
@@ -629,7 +623,7 @@ static void nilfs_truncate_bmap(struct nilfs_inode_info *ii, | |||
629 | 623 | ||
630 | if (!test_bit(NILFS_I_BMAP, &ii->i_state)) | 624 | if (!test_bit(NILFS_I_BMAP, &ii->i_state)) |
631 | return; | 625 | return; |
632 | repeat: | 626 | repeat: |
633 | ret = nilfs_bmap_last_key(ii->i_bmap, &b); | 627 | ret = nilfs_bmap_last_key(ii->i_bmap, &b); |
634 | if (ret == -ENOENT) | 628 | if (ret == -ENOENT) |
635 | return; | 629 | return; |
@@ -646,14 +640,10 @@ static void nilfs_truncate_bmap(struct nilfs_inode_info *ii, | |||
646 | nilfs_bmap_truncate(ii->i_bmap, b) == 0)) | 640 | nilfs_bmap_truncate(ii->i_bmap, b) == 0)) |
647 | goto repeat; | 641 | goto repeat; |
648 | 642 | ||
649 | failed: | 643 | failed: |
650 | if (ret == -EINVAL) | 644 | nilfs_warning(ii->vfs_inode.i_sb, __func__, |
651 | nilfs_error(ii->vfs_inode.i_sb, __func__, | 645 | "failed to truncate bmap (ino=%lu, err=%d)", |
652 | "bmap is broken (ino=%lu)", ii->vfs_inode.i_ino); | 646 | ii->vfs_inode.i_ino, ret); |
653 | else | ||
654 | nilfs_warning(ii->vfs_inode.i_sb, __func__, | ||
655 | "failed to truncate bmap (ino=%lu, err=%d)", | ||
656 | ii->vfs_inode.i_ino, ret); | ||
657 | } | 647 | } |
658 | 648 | ||
659 | void nilfs_truncate(struct inode *inode) | 649 | void nilfs_truncate(struct inode *inode) |
@@ -682,7 +672,7 @@ void nilfs_truncate(struct inode *inode) | |||
682 | nilfs_set_transaction_flag(NILFS_TI_SYNC); | 672 | nilfs_set_transaction_flag(NILFS_TI_SYNC); |
683 | 673 | ||
684 | nilfs_mark_inode_dirty(inode); | 674 | nilfs_mark_inode_dirty(inode); |
685 | nilfs_set_file_dirty(NILFS_SB(sb), inode, 0); | 675 | nilfs_set_file_dirty(inode, 0); |
686 | nilfs_transaction_commit(sb); | 676 | nilfs_transaction_commit(sb); |
687 | /* May construct a logical segment and may fail in sync mode. | 677 | /* May construct a logical segment and may fail in sync mode. |
688 | But truncate has no return value. */ | 678 | But truncate has no return value. */ |
@@ -800,9 +790,9 @@ int nilfs_permission(struct inode *inode, int mask, unsigned int flags) | |||
800 | return generic_permission(inode, mask, flags, NULL); | 790 | return generic_permission(inode, mask, flags, NULL); |
801 | } | 791 | } |
802 | 792 | ||
803 | int nilfs_load_inode_block(struct nilfs_sb_info *sbi, struct inode *inode, | 793 | int nilfs_load_inode_block(struct inode *inode, struct buffer_head **pbh) |
804 | struct buffer_head **pbh) | ||
805 | { | 794 | { |
795 | struct nilfs_sb_info *sbi = NILFS_SB(inode->i_sb); | ||
806 | struct nilfs_inode_info *ii = NILFS_I(inode); | 796 | struct nilfs_inode_info *ii = NILFS_I(inode); |
807 | int err; | 797 | int err; |
808 | 798 | ||
@@ -843,9 +833,9 @@ int nilfs_inode_dirty(struct inode *inode) | |||
843 | return ret; | 833 | return ret; |
844 | } | 834 | } |
845 | 835 | ||
846 | int nilfs_set_file_dirty(struct nilfs_sb_info *sbi, struct inode *inode, | 836 | int nilfs_set_file_dirty(struct inode *inode, unsigned nr_dirty) |
847 | unsigned nr_dirty) | ||
848 | { | 837 | { |
838 | struct nilfs_sb_info *sbi = NILFS_SB(inode->i_sb); | ||
849 | struct nilfs_inode_info *ii = NILFS_I(inode); | 839 | struct nilfs_inode_info *ii = NILFS_I(inode); |
850 | 840 | ||
851 | atomic_add(nr_dirty, &sbi->s_nilfs->ns_ndirtyblks); | 841 | atomic_add(nr_dirty, &sbi->s_nilfs->ns_ndirtyblks); |
@@ -878,11 +868,10 @@ int nilfs_set_file_dirty(struct nilfs_sb_info *sbi, struct inode *inode, | |||
878 | 868 | ||
879 | int nilfs_mark_inode_dirty(struct inode *inode) | 869 | int nilfs_mark_inode_dirty(struct inode *inode) |
880 | { | 870 | { |
881 | struct nilfs_sb_info *sbi = NILFS_SB(inode->i_sb); | ||
882 | struct buffer_head *ibh; | 871 | struct buffer_head *ibh; |
883 | int err; | 872 | int err; |
884 | 873 | ||
885 | err = nilfs_load_inode_block(sbi, inode, &ibh); | 874 | err = nilfs_load_inode_block(inode, &ibh); |
886 | if (unlikely(err)) { | 875 | if (unlikely(err)) { |
887 | nilfs_warning(inode->i_sb, __func__, | 876 | nilfs_warning(inode->i_sb, __func__, |
888 | "failed to reget inode block.\n"); | 877 | "failed to reget inode block.\n"); |
@@ -924,3 +913,134 @@ void nilfs_dirty_inode(struct inode *inode) | |||
924 | nilfs_mark_inode_dirty(inode); | 913 | nilfs_mark_inode_dirty(inode); |
925 | nilfs_transaction_commit(inode->i_sb); /* never fails */ | 914 | nilfs_transaction_commit(inode->i_sb); /* never fails */ |
926 | } | 915 | } |
916 | |||
917 | int nilfs_fiemap(struct inode *inode, struct fiemap_extent_info *fieinfo, | ||
918 | __u64 start, __u64 len) | ||
919 | { | ||
920 | struct the_nilfs *nilfs = NILFS_I_NILFS(inode); | ||
921 | __u64 logical = 0, phys = 0, size = 0; | ||
922 | __u32 flags = 0; | ||
923 | loff_t isize; | ||
924 | sector_t blkoff, end_blkoff; | ||
925 | sector_t delalloc_blkoff; | ||
926 | unsigned long delalloc_blklen; | ||
927 | unsigned int blkbits = inode->i_blkbits; | ||
928 | int ret, n; | ||
929 | |||
930 | ret = fiemap_check_flags(fieinfo, FIEMAP_FLAG_SYNC); | ||
931 | if (ret) | ||
932 | return ret; | ||
933 | |||
934 | mutex_lock(&inode->i_mutex); | ||
935 | |||
936 | isize = i_size_read(inode); | ||
937 | |||
938 | blkoff = start >> blkbits; | ||
939 | end_blkoff = (start + len - 1) >> blkbits; | ||
940 | |||
941 | delalloc_blklen = nilfs_find_uncommitted_extent(inode, blkoff, | ||
942 | &delalloc_blkoff); | ||
943 | |||
944 | do { | ||
945 | __u64 blkphy; | ||
946 | unsigned int maxblocks; | ||
947 | |||
948 | if (delalloc_blklen && blkoff == delalloc_blkoff) { | ||
949 | if (size) { | ||
950 | /* End of the current extent */ | ||
951 | ret = fiemap_fill_next_extent( | ||
952 | fieinfo, logical, phys, size, flags); | ||
953 | if (ret) | ||
954 | break; | ||
955 | } | ||
956 | if (blkoff > end_blkoff) | ||
957 | break; | ||
958 | |||
959 | flags = FIEMAP_EXTENT_MERGED | FIEMAP_EXTENT_DELALLOC; | ||
960 | logical = blkoff << blkbits; | ||
961 | phys = 0; | ||
962 | size = delalloc_blklen << blkbits; | ||
963 | |||
964 | blkoff = delalloc_blkoff + delalloc_blklen; | ||
965 | delalloc_blklen = nilfs_find_uncommitted_extent( | ||
966 | inode, blkoff, &delalloc_blkoff); | ||
967 | continue; | ||
968 | } | ||
969 | |||
970 | /* | ||
971 | * Limit the number of blocks that we look up so as | ||
972 | * not to get into the next delayed allocation extent. | ||
973 | */ | ||
974 | maxblocks = INT_MAX; | ||
975 | if (delalloc_blklen) | ||
976 | maxblocks = min_t(sector_t, delalloc_blkoff - blkoff, | ||
977 | maxblocks); | ||
978 | blkphy = 0; | ||
979 | |||
980 | down_read(&NILFS_MDT(nilfs->ns_dat)->mi_sem); | ||
981 | n = nilfs_bmap_lookup_contig( | ||
982 | NILFS_I(inode)->i_bmap, blkoff, &blkphy, maxblocks); | ||
983 | up_read(&NILFS_MDT(nilfs->ns_dat)->mi_sem); | ||
984 | |||
985 | if (n < 0) { | ||
986 | int past_eof; | ||
987 | |||
988 | if (unlikely(n != -ENOENT)) | ||
989 | break; /* error */ | ||
990 | |||
991 | /* HOLE */ | ||
992 | blkoff++; | ||
993 | past_eof = ((blkoff << blkbits) >= isize); | ||
994 | |||
995 | if (size) { | ||
996 | /* End of the current extent */ | ||
997 | |||
998 | if (past_eof) | ||
999 | flags |= FIEMAP_EXTENT_LAST; | ||
1000 | |||
1001 | ret = fiemap_fill_next_extent( | ||
1002 | fieinfo, logical, phys, size, flags); | ||
1003 | if (ret) | ||
1004 | break; | ||
1005 | size = 0; | ||
1006 | } | ||
1007 | if (blkoff > end_blkoff || past_eof) | ||
1008 | break; | ||
1009 | } else { | ||
1010 | if (size) { | ||
1011 | if (phys && blkphy << blkbits == phys + size) { | ||
1012 | /* The current extent goes on */ | ||
1013 | size += n << blkbits; | ||
1014 | } else { | ||
1015 | /* Terminate the current extent */ | ||
1016 | ret = fiemap_fill_next_extent( | ||
1017 | fieinfo, logical, phys, size, | ||
1018 | flags); | ||
1019 | if (ret || blkoff > end_blkoff) | ||
1020 | break; | ||
1021 | |||
1022 | /* Start another extent */ | ||
1023 | flags = FIEMAP_EXTENT_MERGED; | ||
1024 | logical = blkoff << blkbits; | ||
1025 | phys = blkphy << blkbits; | ||
1026 | size = n << blkbits; | ||
1027 | } | ||
1028 | } else { | ||
1029 | /* Start a new extent */ | ||
1030 | flags = FIEMAP_EXTENT_MERGED; | ||
1031 | logical = blkoff << blkbits; | ||
1032 | phys = blkphy << blkbits; | ||
1033 | size = n << blkbits; | ||
1034 | } | ||
1035 | blkoff += n; | ||
1036 | } | ||
1037 | cond_resched(); | ||
1038 | } while (true); | ||
1039 | |||
1040 | /* If ret is 1 then we just hit the end of the extent array */ | ||
1041 | if (ret == 1) | ||
1042 | ret = 0; | ||
1043 | |||
1044 | mutex_unlock(&inode->i_mutex); | ||
1045 | return ret; | ||
1046 | } | ||
diff --git a/fs/nilfs2/ioctl.c b/fs/nilfs2/ioctl.c index b185e937a335..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 | ||
@@ -421,7 +420,7 @@ static int nilfs_ioctl_free_vblocknrs(struct the_nilfs *nilfs, | |||
421 | size_t nmembs = argv->v_nmembs; | 420 | size_t nmembs = argv->v_nmembs; |
422 | int ret; | 421 | int ret; |
423 | 422 | ||
424 | ret = nilfs_dat_freev(nilfs_dat_inode(nilfs), buf, nmembs); | 423 | ret = nilfs_dat_freev(nilfs->ns_dat, buf, nmembs); |
425 | 424 | ||
426 | return (ret < 0) ? ret : nmembs; | 425 | return (ret < 0) ? ret : nmembs; |
427 | } | 426 | } |
@@ -430,8 +429,7 @@ static int nilfs_ioctl_mark_blocks_dirty(struct the_nilfs *nilfs, | |||
430 | struct nilfs_argv *argv, void *buf) | 429 | struct nilfs_argv *argv, void *buf) |
431 | { | 430 | { |
432 | size_t nmembs = argv->v_nmembs; | 431 | size_t nmembs = argv->v_nmembs; |
433 | struct inode *dat = nilfs_dat_inode(nilfs); | 432 | struct nilfs_bmap *bmap = NILFS_I(nilfs->ns_dat)->i_bmap; |
434 | struct nilfs_bmap *bmap = NILFS_I(dat)->i_bmap; | ||
435 | struct nilfs_bdesc *bdescs = buf; | 433 | struct nilfs_bdesc *bdescs = buf; |
436 | int ret, i; | 434 | int ret, i; |
437 | 435 | ||
@@ -450,7 +448,7 @@ static int nilfs_ioctl_mark_blocks_dirty(struct the_nilfs *nilfs, | |||
450 | /* skip dead block */ | 448 | /* skip dead block */ |
451 | continue; | 449 | continue; |
452 | if (bdescs[i].bd_level == 0) { | 450 | if (bdescs[i].bd_level == 0) { |
453 | ret = nilfs_mdt_mark_block_dirty(dat, | 451 | ret = nilfs_mdt_mark_block_dirty(nilfs->ns_dat, |
454 | bdescs[i].bd_offset); | 452 | bdescs[i].bd_offset); |
455 | if (ret < 0) { | 453 | if (ret < 0) { |
456 | WARN_ON(ret == -ENOENT); | 454 | WARN_ON(ret == -ENOENT); |
diff --git a/fs/nilfs2/mdt.c b/fs/nilfs2/mdt.c index 39a5b84e2c9f..a0babd2bff6a 100644 --- a/fs/nilfs2/mdt.c +++ b/fs/nilfs2/mdt.c | |||
@@ -237,8 +237,6 @@ static int nilfs_mdt_read_block(struct inode *inode, unsigned long block, | |||
237 | * | 237 | * |
238 | * %-ENOENT - the specified block does not exist (hole block) | 238 | * %-ENOENT - the specified block does not exist (hole block) |
239 | * | 239 | * |
240 | * %-EINVAL - bmap is broken. (the caller should call nilfs_error()) | ||
241 | * | ||
242 | * %-EROFS - Read only filesystem (for create mode) | 240 | * %-EROFS - Read only filesystem (for create mode) |
243 | */ | 241 | */ |
244 | int nilfs_mdt_get_block(struct inode *inode, unsigned long blkoff, int create, | 242 | int nilfs_mdt_get_block(struct inode *inode, unsigned long blkoff, int create, |
@@ -273,8 +271,6 @@ int nilfs_mdt_get_block(struct inode *inode, unsigned long blkoff, int create, | |||
273 | * %-ENOMEM - Insufficient memory available. | 271 | * %-ENOMEM - Insufficient memory available. |
274 | * | 272 | * |
275 | * %-EIO - I/O error | 273 | * %-EIO - I/O error |
276 | * | ||
277 | * %-EINVAL - bmap is broken. (the caller should call nilfs_error()) | ||
278 | */ | 274 | */ |
279 | int nilfs_mdt_delete_block(struct inode *inode, unsigned long block) | 275 | int nilfs_mdt_delete_block(struct inode *inode, unsigned long block) |
280 | { | 276 | { |
@@ -350,8 +346,6 @@ int nilfs_mdt_forget_block(struct inode *inode, unsigned long block) | |||
350 | * %-EIO - I/O error | 346 | * %-EIO - I/O error |
351 | * | 347 | * |
352 | * %-ENOENT - the specified block does not exist (hole block) | 348 | * %-ENOENT - the specified block does not exist (hole block) |
353 | * | ||
354 | * %-EINVAL - bmap is broken. (the caller should call nilfs_error()) | ||
355 | */ | 349 | */ |
356 | int nilfs_mdt_mark_block_dirty(struct inode *inode, unsigned long block) | 350 | int nilfs_mdt_mark_block_dirty(struct inode *inode, unsigned long block) |
357 | { | 351 | { |
@@ -460,9 +454,9 @@ int nilfs_mdt_setup_shadow_map(struct inode *inode, | |||
460 | struct backing_dev_info *bdi = inode->i_sb->s_bdi; | 454 | struct backing_dev_info *bdi = inode->i_sb->s_bdi; |
461 | 455 | ||
462 | INIT_LIST_HEAD(&shadow->frozen_buffers); | 456 | INIT_LIST_HEAD(&shadow->frozen_buffers); |
463 | nilfs_mapping_init_once(&shadow->frozen_data); | 457 | address_space_init_once(&shadow->frozen_data); |
464 | nilfs_mapping_init(&shadow->frozen_data, bdi, &shadow_map_aops); | 458 | nilfs_mapping_init(&shadow->frozen_data, bdi, &shadow_map_aops); |
465 | nilfs_mapping_init_once(&shadow->frozen_btnodes); | 459 | address_space_init_once(&shadow->frozen_btnodes); |
466 | nilfs_mapping_init(&shadow->frozen_btnodes, bdi, &shadow_map_aops); | 460 | nilfs_mapping_init(&shadow->frozen_btnodes, bdi, &shadow_map_aops); |
467 | mi->mi_shadow = shadow; | 461 | mi->mi_shadow = shadow; |
468 | return 0; | 462 | return 0; |
@@ -499,31 +493,29 @@ int nilfs_mdt_freeze_buffer(struct inode *inode, struct buffer_head *bh) | |||
499 | struct buffer_head *bh_frozen; | 493 | struct buffer_head *bh_frozen; |
500 | struct page *page; | 494 | struct page *page; |
501 | int blkbits = inode->i_blkbits; | 495 | int blkbits = inode->i_blkbits; |
502 | int ret = -ENOMEM; | ||
503 | 496 | ||
504 | page = grab_cache_page(&shadow->frozen_data, bh->b_page->index); | 497 | page = grab_cache_page(&shadow->frozen_data, bh->b_page->index); |
505 | if (!page) | 498 | if (!page) |
506 | return ret; | 499 | return -ENOMEM; |
507 | 500 | ||
508 | if (!page_has_buffers(page)) | 501 | if (!page_has_buffers(page)) |
509 | create_empty_buffers(page, 1 << blkbits, 0); | 502 | create_empty_buffers(page, 1 << blkbits, 0); |
510 | 503 | ||
511 | bh_frozen = nilfs_page_get_nth_block(page, bh_offset(bh) >> blkbits); | 504 | bh_frozen = nilfs_page_get_nth_block(page, bh_offset(bh) >> blkbits); |
512 | if (bh_frozen) { | 505 | |
513 | if (!buffer_uptodate(bh_frozen)) | 506 | if (!buffer_uptodate(bh_frozen)) |
514 | nilfs_copy_buffer(bh_frozen, bh); | 507 | nilfs_copy_buffer(bh_frozen, bh); |
515 | if (list_empty(&bh_frozen->b_assoc_buffers)) { | 508 | if (list_empty(&bh_frozen->b_assoc_buffers)) { |
516 | list_add_tail(&bh_frozen->b_assoc_buffers, | 509 | list_add_tail(&bh_frozen->b_assoc_buffers, |
517 | &shadow->frozen_buffers); | 510 | &shadow->frozen_buffers); |
518 | set_buffer_nilfs_redirected(bh); | 511 | set_buffer_nilfs_redirected(bh); |
519 | } else { | 512 | } else { |
520 | brelse(bh_frozen); /* already frozen */ | 513 | brelse(bh_frozen); /* already frozen */ |
521 | } | ||
522 | ret = 0; | ||
523 | } | 514 | } |
515 | |||
524 | unlock_page(page); | 516 | unlock_page(page); |
525 | page_cache_release(page); | 517 | page_cache_release(page); |
526 | return ret; | 518 | return 0; |
527 | } | 519 | } |
528 | 520 | ||
529 | struct buffer_head * | 521 | struct buffer_head * |
diff --git a/fs/nilfs2/namei.c b/fs/nilfs2/namei.c index 6e9557ecf161..161791d26458 100644 --- a/fs/nilfs2/namei.c +++ b/fs/nilfs2/namei.c | |||
@@ -397,7 +397,6 @@ static int nilfs_rename(struct inode *old_dir, struct dentry *old_dentry, | |||
397 | new_de = nilfs_find_entry(new_dir, &new_dentry->d_name, &new_page); | 397 | new_de = nilfs_find_entry(new_dir, &new_dentry->d_name, &new_page); |
398 | if (!new_de) | 398 | if (!new_de) |
399 | goto out_dir; | 399 | goto out_dir; |
400 | inc_nlink(old_inode); | ||
401 | nilfs_set_link(new_dir, new_de, new_page, old_inode); | 400 | nilfs_set_link(new_dir, new_de, new_page, old_inode); |
402 | nilfs_mark_inode_dirty(new_dir); | 401 | nilfs_mark_inode_dirty(new_dir); |
403 | new_inode->i_ctime = CURRENT_TIME; | 402 | new_inode->i_ctime = CURRENT_TIME; |
@@ -411,13 +410,9 @@ static int nilfs_rename(struct inode *old_dir, struct dentry *old_dentry, | |||
411 | if (new_dir->i_nlink >= NILFS_LINK_MAX) | 410 | if (new_dir->i_nlink >= NILFS_LINK_MAX) |
412 | goto out_dir; | 411 | goto out_dir; |
413 | } | 412 | } |
414 | inc_nlink(old_inode); | ||
415 | err = nilfs_add_link(new_dentry, old_inode); | 413 | err = nilfs_add_link(new_dentry, old_inode); |
416 | if (err) { | 414 | if (err) |
417 | drop_nlink(old_inode); | ||
418 | nilfs_mark_inode_dirty(old_inode); | ||
419 | goto out_dir; | 415 | goto out_dir; |
420 | } | ||
421 | if (dir_de) { | 416 | if (dir_de) { |
422 | inc_nlink(new_dir); | 417 | inc_nlink(new_dir); |
423 | nilfs_mark_inode_dirty(new_dir); | 418 | nilfs_mark_inode_dirty(new_dir); |
@@ -431,7 +426,6 @@ static int nilfs_rename(struct inode *old_dir, struct dentry *old_dentry, | |||
431 | old_inode->i_ctime = CURRENT_TIME; | 426 | old_inode->i_ctime = CURRENT_TIME; |
432 | 427 | ||
433 | nilfs_delete_entry(old_de, old_page); | 428 | nilfs_delete_entry(old_de, old_page); |
434 | drop_nlink(old_inode); | ||
435 | 429 | ||
436 | if (dir_de) { | 430 | if (dir_de) { |
437 | nilfs_set_link(old_inode, dir_de, dir_page, new_dir); | 431 | nilfs_set_link(old_inode, dir_de, dir_page, new_dir); |
@@ -577,6 +571,7 @@ const struct inode_operations nilfs_dir_inode_operations = { | |||
577 | .rename = nilfs_rename, | 571 | .rename = nilfs_rename, |
578 | .setattr = nilfs_setattr, | 572 | .setattr = nilfs_setattr, |
579 | .permission = nilfs_permission, | 573 | .permission = nilfs_permission, |
574 | .fiemap = nilfs_fiemap, | ||
580 | }; | 575 | }; |
581 | 576 | ||
582 | const struct inode_operations nilfs_special_inode_operations = { | 577 | const struct inode_operations nilfs_special_inode_operations = { |
diff --git a/fs/nilfs2/nilfs.h b/fs/nilfs2/nilfs.h index 0ca98823db59..777e8fd04304 100644 --- a/fs/nilfs2/nilfs.h +++ b/fs/nilfs2/nilfs.h | |||
@@ -190,11 +190,6 @@ static inline int nilfs_doing_construction(void) | |||
190 | return nilfs_test_transaction_flag(NILFS_TI_WRITER); | 190 | return nilfs_test_transaction_flag(NILFS_TI_WRITER); |
191 | } | 191 | } |
192 | 192 | ||
193 | static inline struct inode *nilfs_dat_inode(const struct the_nilfs *nilfs) | ||
194 | { | ||
195 | return nilfs->ns_dat; | ||
196 | } | ||
197 | |||
198 | /* | 193 | /* |
199 | * function prototype | 194 | * function prototype |
200 | */ | 195 | */ |
@@ -257,13 +252,13 @@ extern void nilfs_truncate(struct inode *); | |||
257 | extern void nilfs_evict_inode(struct inode *); | 252 | extern void nilfs_evict_inode(struct inode *); |
258 | extern int nilfs_setattr(struct dentry *, struct iattr *); | 253 | extern int nilfs_setattr(struct dentry *, struct iattr *); |
259 | int nilfs_permission(struct inode *inode, int mask, unsigned int flags); | 254 | int nilfs_permission(struct inode *inode, int mask, unsigned int flags); |
260 | extern int nilfs_load_inode_block(struct nilfs_sb_info *, struct inode *, | 255 | int nilfs_load_inode_block(struct inode *inode, struct buffer_head **pbh); |
261 | struct buffer_head **); | ||
262 | extern int nilfs_inode_dirty(struct inode *); | 256 | extern int nilfs_inode_dirty(struct inode *); |
263 | extern int nilfs_set_file_dirty(struct nilfs_sb_info *, struct inode *, | 257 | int nilfs_set_file_dirty(struct inode *inode, unsigned nr_dirty); |
264 | unsigned); | ||
265 | extern int nilfs_mark_inode_dirty(struct inode *); | 258 | extern int nilfs_mark_inode_dirty(struct inode *); |
266 | extern void nilfs_dirty_inode(struct inode *); | 259 | extern void nilfs_dirty_inode(struct inode *); |
260 | int nilfs_fiemap(struct inode *inode, struct fiemap_extent_info *fieinfo, | ||
261 | __u64 start, __u64 len); | ||
267 | 262 | ||
268 | /* super.c */ | 263 | /* super.c */ |
269 | extern struct inode *nilfs_alloc_inode(struct super_block *); | 264 | extern struct inode *nilfs_alloc_inode(struct super_block *); |
diff --git a/fs/nilfs2/page.c b/fs/nilfs2/page.c index a6c3c2e817f8..a585b35fd6bc 100644 --- a/fs/nilfs2/page.c +++ b/fs/nilfs2/page.c | |||
@@ -491,19 +491,6 @@ unsigned nilfs_page_count_clean_buffers(struct page *page, | |||
491 | } | 491 | } |
492 | return nc; | 492 | return nc; |
493 | } | 493 | } |
494 | |||
495 | void nilfs_mapping_init_once(struct address_space *mapping) | ||
496 | { | ||
497 | memset(mapping, 0, sizeof(*mapping)); | ||
498 | INIT_RADIX_TREE(&mapping->page_tree, GFP_ATOMIC); | ||
499 | spin_lock_init(&mapping->tree_lock); | ||
500 | INIT_LIST_HEAD(&mapping->private_list); | ||
501 | spin_lock_init(&mapping->private_lock); | ||
502 | |||
503 | spin_lock_init(&mapping->i_mmap_lock); | ||
504 | INIT_RAW_PRIO_TREE_ROOT(&mapping->i_mmap); | ||
505 | INIT_LIST_HEAD(&mapping->i_mmap_nonlinear); | ||
506 | } | ||
507 | 494 | ||
508 | void nilfs_mapping_init(struct address_space *mapping, | 495 | void nilfs_mapping_init(struct address_space *mapping, |
509 | struct backing_dev_info *bdi, | 496 | struct backing_dev_info *bdi, |
@@ -546,3 +533,87 @@ int __nilfs_clear_page_dirty(struct page *page) | |||
546 | } | 533 | } |
547 | return TestClearPageDirty(page); | 534 | return TestClearPageDirty(page); |
548 | } | 535 | } |
536 | |||
537 | /** | ||
538 | * nilfs_find_uncommitted_extent - find extent of uncommitted data | ||
539 | * @inode: inode | ||
540 | * @start_blk: start block offset (in) | ||
541 | * @blkoff: start offset of the found extent (out) | ||
542 | * | ||
543 | * This function searches an extent of buffers marked "delayed" which | ||
544 | * starts from a block offset equal to or larger than @start_blk. If | ||
545 | * such an extent was found, this will store the start offset in | ||
546 | * @blkoff and return its length in blocks. Otherwise, zero is | ||
547 | * returned. | ||
548 | */ | ||
549 | unsigned long nilfs_find_uncommitted_extent(struct inode *inode, | ||
550 | sector_t start_blk, | ||
551 | sector_t *blkoff) | ||
552 | { | ||
553 | unsigned int i; | ||
554 | pgoff_t index; | ||
555 | unsigned int nblocks_in_page; | ||
556 | unsigned long length = 0; | ||
557 | sector_t b; | ||
558 | struct pagevec pvec; | ||
559 | struct page *page; | ||
560 | |||
561 | if (inode->i_mapping->nrpages == 0) | ||
562 | return 0; | ||
563 | |||
564 | index = start_blk >> (PAGE_CACHE_SHIFT - inode->i_blkbits); | ||
565 | nblocks_in_page = 1U << (PAGE_CACHE_SHIFT - inode->i_blkbits); | ||
566 | |||
567 | pagevec_init(&pvec, 0); | ||
568 | |||
569 | repeat: | ||
570 | pvec.nr = find_get_pages_contig(inode->i_mapping, index, PAGEVEC_SIZE, | ||
571 | pvec.pages); | ||
572 | if (pvec.nr == 0) | ||
573 | return length; | ||
574 | |||
575 | if (length > 0 && pvec.pages[0]->index > index) | ||
576 | goto out; | ||
577 | |||
578 | b = pvec.pages[0]->index << (PAGE_CACHE_SHIFT - inode->i_blkbits); | ||
579 | i = 0; | ||
580 | do { | ||
581 | page = pvec.pages[i]; | ||
582 | |||
583 | lock_page(page); | ||
584 | if (page_has_buffers(page)) { | ||
585 | struct buffer_head *bh, *head; | ||
586 | |||
587 | bh = head = page_buffers(page); | ||
588 | do { | ||
589 | if (b < start_blk) | ||
590 | continue; | ||
591 | if (buffer_delay(bh)) { | ||
592 | if (length == 0) | ||
593 | *blkoff = b; | ||
594 | length++; | ||
595 | } else if (length > 0) { | ||
596 | goto out_locked; | ||
597 | } | ||
598 | } while (++b, bh = bh->b_this_page, bh != head); | ||
599 | } else { | ||
600 | if (length > 0) | ||
601 | goto out_locked; | ||
602 | |||
603 | b += nblocks_in_page; | ||
604 | } | ||
605 | unlock_page(page); | ||
606 | |||
607 | } while (++i < pagevec_count(&pvec)); | ||
608 | |||
609 | index = page->index + 1; | ||
610 | pagevec_release(&pvec); | ||
611 | cond_resched(); | ||
612 | goto repeat; | ||
613 | |||
614 | out_locked: | ||
615 | unlock_page(page); | ||
616 | out: | ||
617 | pagevec_release(&pvec); | ||
618 | return length; | ||
619 | } | ||
diff --git a/fs/nilfs2/page.h b/fs/nilfs2/page.h index fb9e8a8a2038..2a00953ebd5f 100644 --- a/fs/nilfs2/page.h +++ b/fs/nilfs2/page.h | |||
@@ -61,11 +61,13 @@ void nilfs_free_private_page(struct page *); | |||
61 | int nilfs_copy_dirty_pages(struct address_space *, struct address_space *); | 61 | int nilfs_copy_dirty_pages(struct address_space *, struct address_space *); |
62 | void nilfs_copy_back_pages(struct address_space *, struct address_space *); | 62 | void nilfs_copy_back_pages(struct address_space *, struct address_space *); |
63 | void nilfs_clear_dirty_pages(struct address_space *); | 63 | void nilfs_clear_dirty_pages(struct address_space *); |
64 | void nilfs_mapping_init_once(struct address_space *mapping); | ||
65 | void nilfs_mapping_init(struct address_space *mapping, | 64 | void nilfs_mapping_init(struct address_space *mapping, |
66 | struct backing_dev_info *bdi, | 65 | struct backing_dev_info *bdi, |
67 | const struct address_space_operations *aops); | 66 | const struct address_space_operations *aops); |
68 | unsigned nilfs_page_count_clean_buffers(struct page *, unsigned, unsigned); | 67 | unsigned nilfs_page_count_clean_buffers(struct page *, unsigned, unsigned); |
68 | unsigned long nilfs_find_uncommitted_extent(struct inode *inode, | ||
69 | sector_t start_blk, | ||
70 | sector_t *blkoff); | ||
69 | 71 | ||
70 | #define NILFS_PAGE_BUG(page, m, a...) \ | 72 | #define NILFS_PAGE_BUG(page, m, a...) \ |
71 | do { nilfs_page_bug(page); BUG(); } while (0) | 73 | do { nilfs_page_bug(page); BUG(); } while (0) |
diff --git a/fs/nilfs2/recovery.c b/fs/nilfs2/recovery.c index 5d2711c28da7..3dfcd3b7d389 100644 --- a/fs/nilfs2/recovery.c +++ b/fs/nilfs2/recovery.c | |||
@@ -535,7 +535,7 @@ static int nilfs_recover_dsync_blocks(struct the_nilfs *nilfs, | |||
535 | if (unlikely(err)) | 535 | if (unlikely(err)) |
536 | goto failed_page; | 536 | goto failed_page; |
537 | 537 | ||
538 | err = nilfs_set_file_dirty(sbi, inode, 1); | 538 | err = nilfs_set_file_dirty(inode, 1); |
539 | if (unlikely(err)) | 539 | if (unlikely(err)) |
540 | goto failed_page; | 540 | goto failed_page; |
541 | 541 | ||
diff --git a/fs/nilfs2/sb.h b/fs/nilfs2/sb.h index 35a07157b980..7a17715f215f 100644 --- a/fs/nilfs2/sb.h +++ b/fs/nilfs2/sb.h | |||
@@ -27,14 +27,6 @@ | |||
27 | #include <linux/types.h> | 27 | #include <linux/types.h> |
28 | #include <linux/fs.h> | 28 | #include <linux/fs.h> |
29 | 29 | ||
30 | /* | ||
31 | * Mount options | ||
32 | */ | ||
33 | struct nilfs_mount_options { | ||
34 | unsigned long mount_opt; | ||
35 | __u64 snapshot_cno; | ||
36 | }; | ||
37 | |||
38 | struct the_nilfs; | 30 | struct the_nilfs; |
39 | struct nilfs_sc_info; | 31 | struct nilfs_sc_info; |
40 | 32 | ||
diff --git a/fs/nilfs2/segment.c b/fs/nilfs2/segment.c index 687d090cea34..2de9f636792a 100644 --- a/fs/nilfs2/segment.c +++ b/fs/nilfs2/segment.c | |||
@@ -430,7 +430,8 @@ static void nilfs_segctor_begin_finfo(struct nilfs_sc_info *sci, | |||
430 | nilfs_segctor_map_segsum_entry( | 430 | nilfs_segctor_map_segsum_entry( |
431 | sci, &sci->sc_binfo_ptr, sizeof(struct nilfs_finfo)); | 431 | sci, &sci->sc_binfo_ptr, sizeof(struct nilfs_finfo)); |
432 | 432 | ||
433 | if (inode->i_sb && !test_bit(NILFS_SC_HAVE_DELTA, &sci->sc_flags)) | 433 | if (NILFS_I(inode)->i_root && |
434 | !test_bit(NILFS_SC_HAVE_DELTA, &sci->sc_flags)) | ||
434 | set_bit(NILFS_SC_HAVE_DELTA, &sci->sc_flags); | 435 | set_bit(NILFS_SC_HAVE_DELTA, &sci->sc_flags); |
435 | /* skip finfo */ | 436 | /* skip finfo */ |
436 | } | 437 | } |
@@ -504,17 +505,6 @@ static int nilfs_segctor_add_file_block(struct nilfs_sc_info *sci, | |||
504 | return err; | 505 | return err; |
505 | } | 506 | } |
506 | 507 | ||
507 | static int nilfs_handle_bmap_error(int err, const char *fname, | ||
508 | struct inode *inode, struct super_block *sb) | ||
509 | { | ||
510 | if (err == -EINVAL) { | ||
511 | nilfs_error(sb, fname, "broken bmap (inode=%lu)\n", | ||
512 | inode->i_ino); | ||
513 | err = -EIO; | ||
514 | } | ||
515 | return err; | ||
516 | } | ||
517 | |||
518 | /* | 508 | /* |
519 | * Callback functions that enumerate, mark, and collect dirty blocks | 509 | * Callback functions that enumerate, mark, and collect dirty blocks |
520 | */ | 510 | */ |
@@ -524,9 +514,8 @@ static int nilfs_collect_file_data(struct nilfs_sc_info *sci, | |||
524 | int err; | 514 | int err; |
525 | 515 | ||
526 | err = nilfs_bmap_propagate(NILFS_I(inode)->i_bmap, bh); | 516 | err = nilfs_bmap_propagate(NILFS_I(inode)->i_bmap, bh); |
527 | if (unlikely(err < 0)) | 517 | if (err < 0) |
528 | return nilfs_handle_bmap_error(err, __func__, inode, | 518 | return err; |
529 | sci->sc_super); | ||
530 | 519 | ||
531 | err = nilfs_segctor_add_file_block(sci, bh, inode, | 520 | err = nilfs_segctor_add_file_block(sci, bh, inode, |
532 | sizeof(struct nilfs_binfo_v)); | 521 | sizeof(struct nilfs_binfo_v)); |
@@ -539,13 +528,7 @@ static int nilfs_collect_file_node(struct nilfs_sc_info *sci, | |||
539 | struct buffer_head *bh, | 528 | struct buffer_head *bh, |
540 | struct inode *inode) | 529 | struct inode *inode) |
541 | { | 530 | { |
542 | int err; | 531 | return nilfs_bmap_propagate(NILFS_I(inode)->i_bmap, bh); |
543 | |||
544 | err = nilfs_bmap_propagate(NILFS_I(inode)->i_bmap, bh); | ||
545 | if (unlikely(err < 0)) | ||
546 | return nilfs_handle_bmap_error(err, __func__, inode, | ||
547 | sci->sc_super); | ||
548 | return 0; | ||
549 | } | 532 | } |
550 | 533 | ||
551 | static int nilfs_collect_file_bmap(struct nilfs_sc_info *sci, | 534 | static int nilfs_collect_file_bmap(struct nilfs_sc_info *sci, |
@@ -588,9 +571,8 @@ static int nilfs_collect_dat_data(struct nilfs_sc_info *sci, | |||
588 | int err; | 571 | int err; |
589 | 572 | ||
590 | err = nilfs_bmap_propagate(NILFS_I(inode)->i_bmap, bh); | 573 | err = nilfs_bmap_propagate(NILFS_I(inode)->i_bmap, bh); |
591 | if (unlikely(err < 0)) | 574 | if (err < 0) |
592 | return nilfs_handle_bmap_error(err, __func__, inode, | 575 | return err; |
593 | sci->sc_super); | ||
594 | 576 | ||
595 | err = nilfs_segctor_add_file_block(sci, bh, inode, sizeof(__le64)); | 577 | err = nilfs_segctor_add_file_block(sci, bh, inode, sizeof(__le64)); |
596 | if (!err) | 578 | if (!err) |
@@ -776,9 +758,8 @@ static int nilfs_test_metadata_dirty(struct the_nilfs *nilfs, | |||
776 | ret++; | 758 | ret++; |
777 | if (nilfs_mdt_fetch_dirty(nilfs->ns_sufile)) | 759 | if (nilfs_mdt_fetch_dirty(nilfs->ns_sufile)) |
778 | ret++; | 760 | ret++; |
779 | if (ret || nilfs_doing_gc()) | 761 | if ((ret || nilfs_doing_gc()) && nilfs_mdt_fetch_dirty(nilfs->ns_dat)) |
780 | if (nilfs_mdt_fetch_dirty(nilfs_dat_inode(nilfs))) | 762 | ret++; |
781 | ret++; | ||
782 | return ret; | 763 | return ret; |
783 | } | 764 | } |
784 | 765 | ||
@@ -814,7 +795,7 @@ static void nilfs_segctor_clear_metadata_dirty(struct nilfs_sc_info *sci) | |||
814 | nilfs_mdt_clear_dirty(sci->sc_root->ifile); | 795 | nilfs_mdt_clear_dirty(sci->sc_root->ifile); |
815 | nilfs_mdt_clear_dirty(nilfs->ns_cpfile); | 796 | nilfs_mdt_clear_dirty(nilfs->ns_cpfile); |
816 | nilfs_mdt_clear_dirty(nilfs->ns_sufile); | 797 | nilfs_mdt_clear_dirty(nilfs->ns_sufile); |
817 | nilfs_mdt_clear_dirty(nilfs_dat_inode(nilfs)); | 798 | nilfs_mdt_clear_dirty(nilfs->ns_dat); |
818 | } | 799 | } |
819 | 800 | ||
820 | static int nilfs_segctor_create_checkpoint(struct nilfs_sc_info *sci) | 801 | static int nilfs_segctor_create_checkpoint(struct nilfs_sc_info *sci) |
@@ -923,7 +904,7 @@ static void nilfs_segctor_fill_in_super_root(struct nilfs_sc_info *sci, | |||
923 | nilfs->ns_nongc_ctime : sci->sc_seg_ctime); | 904 | nilfs->ns_nongc_ctime : sci->sc_seg_ctime); |
924 | raw_sr->sr_flags = 0; | 905 | raw_sr->sr_flags = 0; |
925 | 906 | ||
926 | nilfs_write_inode_common(nilfs_dat_inode(nilfs), (void *)raw_sr + | 907 | nilfs_write_inode_common(nilfs->ns_dat, (void *)raw_sr + |
927 | NILFS_SR_DAT_OFFSET(isz), 1); | 908 | NILFS_SR_DAT_OFFSET(isz), 1); |
928 | nilfs_write_inode_common(nilfs->ns_cpfile, (void *)raw_sr + | 909 | nilfs_write_inode_common(nilfs->ns_cpfile, (void *)raw_sr + |
929 | NILFS_SR_CPFILE_OFFSET(isz), 1); | 910 | NILFS_SR_CPFILE_OFFSET(isz), 1); |
@@ -1179,7 +1160,7 @@ static int nilfs_segctor_collect_blocks(struct nilfs_sc_info *sci, int mode) | |||
1179 | sci->sc_stage.scnt++; /* Fall through */ | 1160 | sci->sc_stage.scnt++; /* Fall through */ |
1180 | case NILFS_ST_DAT: | 1161 | case NILFS_ST_DAT: |
1181 | dat_stage: | 1162 | dat_stage: |
1182 | err = nilfs_segctor_scan_file(sci, nilfs_dat_inode(nilfs), | 1163 | err = nilfs_segctor_scan_file(sci, nilfs->ns_dat, |
1183 | &nilfs_sc_dat_ops); | 1164 | &nilfs_sc_dat_ops); |
1184 | if (unlikely(err)) | 1165 | if (unlikely(err)) |
1185 | break; | 1166 | break; |
@@ -1563,7 +1544,6 @@ nilfs_segctor_update_payload_blocknr(struct nilfs_sc_info *sci, | |||
1563 | return 0; | 1544 | return 0; |
1564 | 1545 | ||
1565 | failed_bmap: | 1546 | failed_bmap: |
1566 | err = nilfs_handle_bmap_error(err, __func__, inode, sci->sc_super); | ||
1567 | return err; | 1547 | return err; |
1568 | } | 1548 | } |
1569 | 1549 | ||
@@ -1783,6 +1763,7 @@ static void nilfs_clear_copied_buffers(struct list_head *list, int err) | |||
1783 | if (!err) { | 1763 | if (!err) { |
1784 | set_buffer_uptodate(bh); | 1764 | set_buffer_uptodate(bh); |
1785 | clear_buffer_dirty(bh); | 1765 | clear_buffer_dirty(bh); |
1766 | clear_buffer_delay(bh); | ||
1786 | clear_buffer_nilfs_volatile(bh); | 1767 | clear_buffer_nilfs_volatile(bh); |
1787 | } | 1768 | } |
1788 | brelse(bh); /* for b_assoc_buffers */ | 1769 | brelse(bh); /* for b_assoc_buffers */ |
@@ -1909,6 +1890,7 @@ static void nilfs_segctor_complete_write(struct nilfs_sc_info *sci) | |||
1909 | b_assoc_buffers) { | 1890 | b_assoc_buffers) { |
1910 | set_buffer_uptodate(bh); | 1891 | set_buffer_uptodate(bh); |
1911 | clear_buffer_dirty(bh); | 1892 | clear_buffer_dirty(bh); |
1893 | clear_buffer_delay(bh); | ||
1912 | clear_buffer_nilfs_volatile(bh); | 1894 | clear_buffer_nilfs_volatile(bh); |
1913 | clear_buffer_nilfs_redirected(bh); | 1895 | clear_buffer_nilfs_redirected(bh); |
1914 | if (bh == segbuf->sb_super_root) { | 1896 | if (bh == segbuf->sb_super_root) { |
diff --git a/fs/nilfs2/super.c b/fs/nilfs2/super.c index e2dcc9c733f7..1673b3d99842 100644 --- a/fs/nilfs2/super.c +++ b/fs/nilfs2/super.c | |||
@@ -47,7 +47,6 @@ | |||
47 | #include <linux/crc32.h> | 47 | #include <linux/crc32.h> |
48 | #include <linux/vfs.h> | 48 | #include <linux/vfs.h> |
49 | #include <linux/writeback.h> | 49 | #include <linux/writeback.h> |
50 | #include <linux/kobject.h> | ||
51 | #include <linux/seq_file.h> | 50 | #include <linux/seq_file.h> |
52 | #include <linux/mount.h> | 51 | #include <linux/mount.h> |
53 | #include "nilfs.h" | 52 | #include "nilfs.h" |
@@ -111,12 +110,17 @@ void nilfs_error(struct super_block *sb, const char *function, | |||
111 | const char *fmt, ...) | 110 | const char *fmt, ...) |
112 | { | 111 | { |
113 | struct nilfs_sb_info *sbi = NILFS_SB(sb); | 112 | struct nilfs_sb_info *sbi = NILFS_SB(sb); |
113 | struct va_format vaf; | ||
114 | va_list args; | 114 | va_list args; |
115 | 115 | ||
116 | va_start(args, fmt); | 116 | va_start(args, fmt); |
117 | printk(KERN_CRIT "NILFS error (device %s): %s: ", sb->s_id, function); | 117 | |
118 | vprintk(fmt, args); | 118 | vaf.fmt = fmt; |
119 | printk("\n"); | 119 | vaf.va = &args; |
120 | |||
121 | printk(KERN_CRIT "NILFS error (device %s): %s: %pV\n", | ||
122 | sb->s_id, function, &vaf); | ||
123 | |||
120 | va_end(args); | 124 | va_end(args); |
121 | 125 | ||
122 | if (!(sb->s_flags & MS_RDONLY)) { | 126 | if (!(sb->s_flags & MS_RDONLY)) { |
@@ -136,13 +140,17 @@ void nilfs_error(struct super_block *sb, const char *function, | |||
136 | void nilfs_warning(struct super_block *sb, const char *function, | 140 | void nilfs_warning(struct super_block *sb, const char *function, |
137 | const char *fmt, ...) | 141 | const char *fmt, ...) |
138 | { | 142 | { |
143 | struct va_format vaf; | ||
139 | va_list args; | 144 | va_list args; |
140 | 145 | ||
141 | va_start(args, fmt); | 146 | va_start(args, fmt); |
142 | printk(KERN_WARNING "NILFS warning (device %s): %s: ", | 147 | |
143 | sb->s_id, function); | 148 | vaf.fmt = fmt; |
144 | vprintk(fmt, args); | 149 | vaf.va = &args; |
145 | printk("\n"); | 150 | |
151 | printk(KERN_WARNING "NILFS warning (device %s): %s: %pV\n", | ||
152 | sb->s_id, function, &vaf); | ||
153 | |||
146 | va_end(args); | 154 | va_end(args); |
147 | } | 155 | } |
148 | 156 | ||
@@ -696,7 +704,8 @@ skip_mount_setup: | |||
696 | sbp[0]->s_state = | 704 | sbp[0]->s_state = |
697 | cpu_to_le16(le16_to_cpu(sbp[0]->s_state) & ~NILFS_VALID_FS); | 705 | cpu_to_le16(le16_to_cpu(sbp[0]->s_state) & ~NILFS_VALID_FS); |
698 | /* synchronize sbp[1] with sbp[0] */ | 706 | /* synchronize sbp[1] with sbp[0] */ |
699 | memcpy(sbp[1], sbp[0], nilfs->ns_sbsize); | 707 | if (sbp[1]) |
708 | memcpy(sbp[1], sbp[0], nilfs->ns_sbsize); | ||
700 | return nilfs_commit_super(sbi, NILFS_SB_COMMIT_ALL); | 709 | return nilfs_commit_super(sbi, NILFS_SB_COMMIT_ALL); |
701 | } | 710 | } |
702 | 711 | ||
@@ -1010,11 +1019,11 @@ static int nilfs_remount(struct super_block *sb, int *flags, char *data) | |||
1010 | struct nilfs_sb_info *sbi = NILFS_SB(sb); | 1019 | struct nilfs_sb_info *sbi = NILFS_SB(sb); |
1011 | struct the_nilfs *nilfs = sbi->s_nilfs; | 1020 | struct the_nilfs *nilfs = sbi->s_nilfs; |
1012 | unsigned long old_sb_flags; | 1021 | unsigned long old_sb_flags; |
1013 | struct nilfs_mount_options old_opts; | 1022 | unsigned long old_mount_opt; |
1014 | int err; | 1023 | int err; |
1015 | 1024 | ||
1016 | old_sb_flags = sb->s_flags; | 1025 | old_sb_flags = sb->s_flags; |
1017 | old_opts.mount_opt = sbi->s_mount_opt; | 1026 | old_mount_opt = sbi->s_mount_opt; |
1018 | 1027 | ||
1019 | if (!parse_options(data, sb, 1)) { | 1028 | if (!parse_options(data, sb, 1)) { |
1020 | err = -EINVAL; | 1029 | err = -EINVAL; |
@@ -1083,7 +1092,7 @@ static int nilfs_remount(struct super_block *sb, int *flags, char *data) | |||
1083 | 1092 | ||
1084 | restore_opts: | 1093 | restore_opts: |
1085 | sb->s_flags = old_sb_flags; | 1094 | sb->s_flags = old_sb_flags; |
1086 | sbi->s_mount_opt = old_opts.mount_opt; | 1095 | sbi->s_mount_opt = old_mount_opt; |
1087 | return err; | 1096 | return err; |
1088 | } | 1097 | } |
1089 | 1098 | ||
@@ -1155,14 +1164,14 @@ nilfs_mount(struct file_system_type *fs_type, int flags, | |||
1155 | { | 1164 | { |
1156 | struct nilfs_super_data sd; | 1165 | struct nilfs_super_data sd; |
1157 | struct super_block *s; | 1166 | struct super_block *s; |
1158 | fmode_t mode = FMODE_READ; | 1167 | fmode_t mode = FMODE_READ | FMODE_EXCL; |
1159 | struct dentry *root_dentry; | 1168 | struct dentry *root_dentry; |
1160 | int err, s_new = false; | 1169 | int err, s_new = false; |
1161 | 1170 | ||
1162 | if (!(flags & MS_RDONLY)) | 1171 | if (!(flags & MS_RDONLY)) |
1163 | mode |= FMODE_WRITE; | 1172 | mode |= FMODE_WRITE; |
1164 | 1173 | ||
1165 | sd.bdev = open_bdev_exclusive(dev_name, mode, fs_type); | 1174 | sd.bdev = blkdev_get_by_path(dev_name, mode, fs_type); |
1166 | if (IS_ERR(sd.bdev)) | 1175 | if (IS_ERR(sd.bdev)) |
1167 | return ERR_CAST(sd.bdev); | 1176 | return ERR_CAST(sd.bdev); |
1168 | 1177 | ||
@@ -1241,7 +1250,7 @@ nilfs_mount(struct file_system_type *fs_type, int flags, | |||
1241 | } | 1250 | } |
1242 | 1251 | ||
1243 | if (!s_new) | 1252 | if (!s_new) |
1244 | close_bdev_exclusive(sd.bdev, mode); | 1253 | blkdev_put(sd.bdev, mode); |
1245 | 1254 | ||
1246 | return root_dentry; | 1255 | return root_dentry; |
1247 | 1256 | ||
@@ -1250,7 +1259,7 @@ nilfs_mount(struct file_system_type *fs_type, int flags, | |||
1250 | 1259 | ||
1251 | failed: | 1260 | failed: |
1252 | if (!s_new) | 1261 | if (!s_new) |
1253 | close_bdev_exclusive(sd.bdev, mode); | 1262 | blkdev_put(sd.bdev, mode); |
1254 | return ERR_PTR(err); | 1263 | return ERR_PTR(err); |
1255 | } | 1264 | } |
1256 | 1265 | ||
@@ -1270,7 +1279,7 @@ static void nilfs_inode_init_once(void *obj) | |||
1270 | #ifdef CONFIG_NILFS_XATTR | 1279 | #ifdef CONFIG_NILFS_XATTR |
1271 | init_rwsem(&ii->xattr_sem); | 1280 | init_rwsem(&ii->xattr_sem); |
1272 | #endif | 1281 | #endif |
1273 | nilfs_btnode_cache_init_once(&ii->i_btnode_cache); | 1282 | address_space_init_once(&ii->i_btnode_cache); |
1274 | ii->i_bmap = &ii->i_bmap_data; | 1283 | ii->i_bmap = &ii->i_bmap_data; |
1275 | inode_init_once(&ii->vfs_inode); | 1284 | inode_init_once(&ii->vfs_inode); |
1276 | } | 1285 | } |
diff --git a/fs/nilfs2/the_nilfs.c b/fs/nilfs2/the_nilfs.c index 0254be2d73c6..ad4ac607cf57 100644 --- a/fs/nilfs2/the_nilfs.c +++ b/fs/nilfs2/the_nilfs.c | |||
@@ -329,7 +329,6 @@ int load_nilfs(struct the_nilfs *nilfs, struct nilfs_sb_info *sbi) | |||
329 | printk(KERN_INFO "NILFS: recovery complete.\n"); | 329 | printk(KERN_INFO "NILFS: recovery complete.\n"); |
330 | 330 | ||
331 | skip_recovery: | 331 | skip_recovery: |
332 | set_nilfs_loaded(nilfs); | ||
333 | nilfs_clear_recovery_info(&ri); | 332 | nilfs_clear_recovery_info(&ri); |
334 | sbi->s_super->s_flags = s_flags; | 333 | sbi->s_super->s_flags = s_flags; |
335 | return 0; | 334 | return 0; |
@@ -651,12 +650,11 @@ int nilfs_discard_segments(struct the_nilfs *nilfs, __u64 *segnump, | |||
651 | 650 | ||
652 | int nilfs_count_free_blocks(struct the_nilfs *nilfs, sector_t *nblocks) | 651 | int nilfs_count_free_blocks(struct the_nilfs *nilfs, sector_t *nblocks) |
653 | { | 652 | { |
654 | struct inode *dat = nilfs_dat_inode(nilfs); | ||
655 | unsigned long ncleansegs; | 653 | unsigned long ncleansegs; |
656 | 654 | ||
657 | down_read(&NILFS_MDT(dat)->mi_sem); /* XXX */ | 655 | down_read(&NILFS_MDT(nilfs->ns_dat)->mi_sem); |
658 | ncleansegs = nilfs_sufile_get_ncleansegs(nilfs->ns_sufile); | 656 | ncleansegs = nilfs_sufile_get_ncleansegs(nilfs->ns_sufile); |
659 | up_read(&NILFS_MDT(dat)->mi_sem); /* XXX */ | 657 | up_read(&NILFS_MDT(nilfs->ns_dat)->mi_sem); |
660 | *nblocks = (sector_t)ncleansegs * nilfs->ns_blocks_per_segment; | 658 | *nblocks = (sector_t)ncleansegs * nilfs->ns_blocks_per_segment; |
661 | return 0; | 659 | return 0; |
662 | } | 660 | } |
diff --git a/fs/nilfs2/the_nilfs.h b/fs/nilfs2/the_nilfs.h index 69226e14b745..fd85e4c05c6b 100644 --- a/fs/nilfs2/the_nilfs.h +++ b/fs/nilfs2/the_nilfs.h | |||
@@ -36,8 +36,6 @@ | |||
36 | /* the_nilfs struct */ | 36 | /* the_nilfs struct */ |
37 | enum { | 37 | enum { |
38 | THE_NILFS_INIT = 0, /* Information from super_block is set */ | 38 | THE_NILFS_INIT = 0, /* Information from super_block is set */ |
39 | THE_NILFS_LOADED, /* Roll-back/roll-forward has done and | ||
40 | the latest checkpoint was loaded */ | ||
41 | THE_NILFS_DISCONTINUED, /* 'next' pointer chain has broken */ | 39 | THE_NILFS_DISCONTINUED, /* 'next' pointer chain has broken */ |
42 | THE_NILFS_GC_RUNNING, /* gc process is running */ | 40 | THE_NILFS_GC_RUNNING, /* gc process is running */ |
43 | THE_NILFS_SB_DIRTY, /* super block is dirty */ | 41 | THE_NILFS_SB_DIRTY, /* super block is dirty */ |
@@ -178,7 +176,6 @@ static inline int nilfs_##name(struct the_nilfs *nilfs) \ | |||
178 | } | 176 | } |
179 | 177 | ||
180 | THE_NILFS_FNS(INIT, init) | 178 | THE_NILFS_FNS(INIT, init) |
181 | THE_NILFS_FNS(LOADED, loaded) | ||
182 | THE_NILFS_FNS(DISCONTINUED, discontinued) | 179 | THE_NILFS_FNS(DISCONTINUED, discontinued) |
183 | THE_NILFS_FNS(GC_RUNNING, gc_running) | 180 | THE_NILFS_FNS(GC_RUNNING, gc_running) |
184 | THE_NILFS_FNS(SB_DIRTY, sb_dirty) | 181 | THE_NILFS_FNS(SB_DIRTY, sb_dirty) |