diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2011-03-19 01:33:38 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2011-03-19 01:33:38 -0400 |
commit | 5bab188a316718a26346cdb25c4cc6b319f8f907 (patch) | |
tree | 0316a8294b9709a55b0c5b2f1c1c0d3793d35c01 | |
parent | a8c91da549f625d0600d5bd7e1831066b55edf0d (diff) | |
parent | 4d3cf1bc557dc8b88e1cabf1980b3baa3380a641 (diff) |
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/ryusuke/nilfs2
* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/ryusuke/nilfs2:
nilfs2: move NILFS_SUPER_MAGIC to linux/magic.h
nilfs2: get rid of nilfs_sb_info structure
nilfs2: use sb instance instead of nilfs_sb_info struct
nilfs2: get rid of sc_sbi back pointer
nilfs2: move log writer onto nilfs object
nilfs2: move next generation counter into nilfs object
nilfs2: move s_inode_lock and s_dirty_files into nilfs object
nilfs2: move parameters on nilfs_sb_info into nilfs object
nilfs2: move mount options to nilfs object
nilfs2: record used amount of each checkpoint in checkpoint list
nilfs2: optimize rec_len functions
nilfs2: append blocksize info to warnings during loading super blocks
nilfs2: add compat ioctl
nilfs2: implement FS_IOC_GETFLAGS/SETFLAGS/GETVERSION
nilfs2: tighten restrictions on inode flags
nilfs2: mark S_NOATIME on inodes only if NOATIME attribute is set
nilfs2: use common file attribute macros
nilfs2: add free entries count only if clear bit operation succeeded
nilfs2: decrement inodes count only if raw inode was successfully deleted
-rw-r--r-- | fs/nilfs2/alloc.c | 12 | ||||
-rw-r--r-- | fs/nilfs2/bmap.c | 12 | ||||
-rw-r--r-- | fs/nilfs2/bmap.h | 3 | ||||
-rw-r--r-- | fs/nilfs2/btree.c | 6 | ||||
-rw-r--r-- | fs/nilfs2/dir.c | 5 | ||||
-rw-r--r-- | fs/nilfs2/direct.c | 4 | ||||
-rw-r--r-- | fs/nilfs2/file.c | 4 | ||||
-rw-r--r-- | fs/nilfs2/inode.c | 83 | ||||
-rw-r--r-- | fs/nilfs2/ioctl.c | 115 | ||||
-rw-r--r-- | fs/nilfs2/mdt.h | 2 | ||||
-rw-r--r-- | fs/nilfs2/namei.c | 2 | ||||
-rw-r--r-- | fs/nilfs2/nilfs.h | 33 | ||||
-rw-r--r-- | fs/nilfs2/recovery.c | 32 | ||||
-rw-r--r-- | fs/nilfs2/sb.h | 85 | ||||
-rw-r--r-- | fs/nilfs2/segment.c | 258 | ||||
-rw-r--r-- | fs/nilfs2/segment.h | 14 | ||||
-rw-r--r-- | fs/nilfs2/super.c | 214 | ||||
-rw-r--r-- | fs/nilfs2/the_nilfs.c | 44 | ||||
-rw-r--r-- | fs/nilfs2/the_nilfs.h | 51 | ||||
-rw-r--r-- | include/linux/magic.h | 1 | ||||
-rw-r--r-- | include/linux/nilfs2_fs.h | 32 |
21 files changed, 513 insertions, 499 deletions
diff --git a/fs/nilfs2/alloc.c b/fs/nilfs2/alloc.c index d7fd696e595c..0a0a66d98cce 100644 --- a/fs/nilfs2/alloc.c +++ b/fs/nilfs2/alloc.c | |||
@@ -521,8 +521,8 @@ void nilfs_palloc_commit_free_entry(struct inode *inode, | |||
521 | group_offset, bitmap)) | 521 | group_offset, bitmap)) |
522 | printk(KERN_WARNING "%s: entry number %llu already freed\n", | 522 | printk(KERN_WARNING "%s: entry number %llu already freed\n", |
523 | __func__, (unsigned long long)req->pr_entry_nr); | 523 | __func__, (unsigned long long)req->pr_entry_nr); |
524 | 524 | else | |
525 | nilfs_palloc_group_desc_add_entries(inode, group, desc, 1); | 525 | nilfs_palloc_group_desc_add_entries(inode, group, desc, 1); |
526 | 526 | ||
527 | kunmap(req->pr_bitmap_bh->b_page); | 527 | kunmap(req->pr_bitmap_bh->b_page); |
528 | kunmap(req->pr_desc_bh->b_page); | 528 | kunmap(req->pr_desc_bh->b_page); |
@@ -558,8 +558,8 @@ void nilfs_palloc_abort_alloc_entry(struct inode *inode, | |||
558 | group_offset, bitmap)) | 558 | group_offset, bitmap)) |
559 | printk(KERN_WARNING "%s: entry number %llu already freed\n", | 559 | printk(KERN_WARNING "%s: entry number %llu already freed\n", |
560 | __func__, (unsigned long long)req->pr_entry_nr); | 560 | __func__, (unsigned long long)req->pr_entry_nr); |
561 | 561 | else | |
562 | nilfs_palloc_group_desc_add_entries(inode, group, desc, 1); | 562 | nilfs_palloc_group_desc_add_entries(inode, group, desc, 1); |
563 | 563 | ||
564 | kunmap(req->pr_bitmap_bh->b_page); | 564 | kunmap(req->pr_bitmap_bh->b_page); |
565 | kunmap(req->pr_desc_bh->b_page); | 565 | kunmap(req->pr_desc_bh->b_page); |
@@ -665,7 +665,7 @@ int nilfs_palloc_freev(struct inode *inode, __u64 *entry_nrs, size_t nitems) | |||
665 | for (j = i, n = 0; | 665 | for (j = i, n = 0; |
666 | (j < nitems) && nilfs_palloc_group_is_in(inode, group, | 666 | (j < nitems) && nilfs_palloc_group_is_in(inode, group, |
667 | entry_nrs[j]); | 667 | entry_nrs[j]); |
668 | j++, n++) { | 668 | j++) { |
669 | nilfs_palloc_group(inode, entry_nrs[j], &group_offset); | 669 | nilfs_palloc_group(inode, entry_nrs[j], &group_offset); |
670 | if (!nilfs_clear_bit_atomic( | 670 | if (!nilfs_clear_bit_atomic( |
671 | nilfs_mdt_bgl_lock(inode, group), | 671 | nilfs_mdt_bgl_lock(inode, group), |
@@ -674,6 +674,8 @@ int nilfs_palloc_freev(struct inode *inode, __u64 *entry_nrs, size_t nitems) | |||
674 | "%s: entry number %llu already freed\n", | 674 | "%s: entry number %llu already freed\n", |
675 | __func__, | 675 | __func__, |
676 | (unsigned long long)entry_nrs[j]); | 676 | (unsigned long long)entry_nrs[j]); |
677 | } else { | ||
678 | n++; | ||
677 | } | 679 | } |
678 | } | 680 | } |
679 | nilfs_palloc_group_desc_add_entries(inode, group, desc, n); | 681 | nilfs_palloc_group_desc_add_entries(inode, group, desc, n); |
diff --git a/fs/nilfs2/bmap.c b/fs/nilfs2/bmap.c index 3ee67c67cc52..4723f04e9b12 100644 --- a/fs/nilfs2/bmap.c +++ b/fs/nilfs2/bmap.c | |||
@@ -25,7 +25,6 @@ | |||
25 | #include <linux/errno.h> | 25 | #include <linux/errno.h> |
26 | #include "nilfs.h" | 26 | #include "nilfs.h" |
27 | #include "bmap.h" | 27 | #include "bmap.h" |
28 | #include "sb.h" | ||
29 | #include "btree.h" | 28 | #include "btree.h" |
30 | #include "direct.h" | 29 | #include "direct.h" |
31 | #include "btnode.h" | 30 | #include "btnode.h" |
@@ -425,17 +424,6 @@ int nilfs_bmap_test_and_clear_dirty(struct nilfs_bmap *bmap) | |||
425 | /* | 424 | /* |
426 | * Internal use only | 425 | * Internal use only |
427 | */ | 426 | */ |
428 | |||
429 | void nilfs_bmap_add_blocks(const struct nilfs_bmap *bmap, int n) | ||
430 | { | ||
431 | inode_add_bytes(bmap->b_inode, (1 << bmap->b_inode->i_blkbits) * n); | ||
432 | } | ||
433 | |||
434 | void nilfs_bmap_sub_blocks(const struct nilfs_bmap *bmap, int n) | ||
435 | { | ||
436 | inode_sub_bytes(bmap->b_inode, (1 << bmap->b_inode->i_blkbits) * n); | ||
437 | } | ||
438 | |||
439 | __u64 nilfs_bmap_data_get_key(const struct nilfs_bmap *bmap, | 427 | __u64 nilfs_bmap_data_get_key(const struct nilfs_bmap *bmap, |
440 | const struct buffer_head *bh) | 428 | const struct buffer_head *bh) |
441 | { | 429 | { |
diff --git a/fs/nilfs2/bmap.h b/fs/nilfs2/bmap.h index bde1c0aa2e15..40d9f453d31c 100644 --- a/fs/nilfs2/bmap.h +++ b/fs/nilfs2/bmap.h | |||
@@ -240,9 +240,6 @@ __u64 nilfs_bmap_data_get_key(const struct nilfs_bmap *, | |||
240 | __u64 nilfs_bmap_find_target_seq(const struct nilfs_bmap *, __u64); | 240 | __u64 nilfs_bmap_find_target_seq(const struct nilfs_bmap *, __u64); |
241 | __u64 nilfs_bmap_find_target_in_group(const struct nilfs_bmap *); | 241 | __u64 nilfs_bmap_find_target_in_group(const struct nilfs_bmap *); |
242 | 242 | ||
243 | void nilfs_bmap_add_blocks(const struct nilfs_bmap *, int); | ||
244 | void nilfs_bmap_sub_blocks(const struct nilfs_bmap *, int); | ||
245 | |||
246 | 243 | ||
247 | /* Assume that bmap semaphore is locked. */ | 244 | /* Assume that bmap semaphore is locked. */ |
248 | static inline int nilfs_bmap_dirty(const struct nilfs_bmap *bmap) | 245 | static inline int nilfs_bmap_dirty(const struct nilfs_bmap *bmap) |
diff --git a/fs/nilfs2/btree.c b/fs/nilfs2/btree.c index 300c2bc00c3f..d451ae0e0bf3 100644 --- a/fs/nilfs2/btree.c +++ b/fs/nilfs2/btree.c | |||
@@ -1174,7 +1174,7 @@ static int nilfs_btree_insert(struct nilfs_bmap *btree, __u64 key, __u64 ptr) | |||
1174 | if (ret < 0) | 1174 | if (ret < 0) |
1175 | goto out; | 1175 | goto out; |
1176 | nilfs_btree_commit_insert(btree, path, level, key, ptr); | 1176 | nilfs_btree_commit_insert(btree, path, level, key, ptr); |
1177 | nilfs_bmap_add_blocks(btree, stats.bs_nblocks); | 1177 | nilfs_inode_add_blocks(btree->b_inode, stats.bs_nblocks); |
1178 | 1178 | ||
1179 | out: | 1179 | out: |
1180 | nilfs_btree_free_path(path); | 1180 | nilfs_btree_free_path(path); |
@@ -1511,7 +1511,7 @@ static int nilfs_btree_delete(struct nilfs_bmap *btree, __u64 key) | |||
1511 | if (ret < 0) | 1511 | if (ret < 0) |
1512 | goto out; | 1512 | goto out; |
1513 | nilfs_btree_commit_delete(btree, path, level, dat); | 1513 | nilfs_btree_commit_delete(btree, path, level, dat); |
1514 | nilfs_bmap_sub_blocks(btree, stats.bs_nblocks); | 1514 | nilfs_inode_sub_blocks(btree->b_inode, stats.bs_nblocks); |
1515 | 1515 | ||
1516 | out: | 1516 | out: |
1517 | nilfs_btree_free_path(path); | 1517 | nilfs_btree_free_path(path); |
@@ -1776,7 +1776,7 @@ int nilfs_btree_convert_and_insert(struct nilfs_bmap *btree, | |||
1776 | return ret; | 1776 | return ret; |
1777 | nilfs_btree_commit_convert_and_insert(btree, key, ptr, keys, ptrs, n, | 1777 | nilfs_btree_commit_convert_and_insert(btree, key, ptr, keys, ptrs, n, |
1778 | di, ni, bh); | 1778 | di, ni, bh); |
1779 | nilfs_bmap_add_blocks(btree, stats.bs_nblocks); | 1779 | nilfs_inode_add_blocks(btree->b_inode, stats.bs_nblocks); |
1780 | return 0; | 1780 | return 0; |
1781 | } | 1781 | } |
1782 | 1782 | ||
diff --git a/fs/nilfs2/dir.c b/fs/nilfs2/dir.c index 9d45773b79e6..3a1923943b14 100644 --- a/fs/nilfs2/dir.c +++ b/fs/nilfs2/dir.c | |||
@@ -440,7 +440,6 @@ void nilfs_set_link(struct inode *dir, struct nilfs_dir_entry *de, | |||
440 | nilfs_commit_chunk(page, mapping, from, to); | 440 | nilfs_commit_chunk(page, mapping, from, to); |
441 | nilfs_put_page(page); | 441 | nilfs_put_page(page); |
442 | dir->i_mtime = dir->i_ctime = CURRENT_TIME; | 442 | dir->i_mtime = dir->i_ctime = CURRENT_TIME; |
443 | /* NILFS_I(dir)->i_flags &= ~NILFS_BTREE_FL; */ | ||
444 | } | 443 | } |
445 | 444 | ||
446 | /* | 445 | /* |
@@ -531,7 +530,6 @@ got_it: | |||
531 | nilfs_set_de_type(de, inode); | 530 | nilfs_set_de_type(de, inode); |
532 | nilfs_commit_chunk(page, page->mapping, from, to); | 531 | nilfs_commit_chunk(page, page->mapping, from, to); |
533 | dir->i_mtime = dir->i_ctime = CURRENT_TIME; | 532 | dir->i_mtime = dir->i_ctime = CURRENT_TIME; |
534 | /* NILFS_I(dir)->i_flags &= ~NILFS_BTREE_FL; */ | ||
535 | nilfs_mark_inode_dirty(dir); | 533 | nilfs_mark_inode_dirty(dir); |
536 | /* OFFSET_CACHE */ | 534 | /* OFFSET_CACHE */ |
537 | out_put: | 535 | out_put: |
@@ -579,7 +577,6 @@ int nilfs_delete_entry(struct nilfs_dir_entry *dir, struct page *page) | |||
579 | dir->inode = 0; | 577 | dir->inode = 0; |
580 | nilfs_commit_chunk(page, mapping, from, to); | 578 | nilfs_commit_chunk(page, mapping, from, to); |
581 | inode->i_ctime = inode->i_mtime = CURRENT_TIME; | 579 | inode->i_ctime = inode->i_mtime = CURRENT_TIME; |
582 | /* NILFS_I(inode)->i_flags &= ~NILFS_BTREE_FL; */ | ||
583 | out: | 580 | out: |
584 | nilfs_put_page(page); | 581 | nilfs_put_page(page); |
585 | return err; | 582 | return err; |
@@ -684,7 +681,7 @@ const struct file_operations nilfs_dir_operations = { | |||
684 | .readdir = nilfs_readdir, | 681 | .readdir = nilfs_readdir, |
685 | .unlocked_ioctl = nilfs_ioctl, | 682 | .unlocked_ioctl = nilfs_ioctl, |
686 | #ifdef CONFIG_COMPAT | 683 | #ifdef CONFIG_COMPAT |
687 | .compat_ioctl = nilfs_ioctl, | 684 | .compat_ioctl = nilfs_compat_ioctl, |
688 | #endif /* CONFIG_COMPAT */ | 685 | #endif /* CONFIG_COMPAT */ |
689 | .fsync = nilfs_sync_file, | 686 | .fsync = nilfs_sync_file, |
690 | 687 | ||
diff --git a/fs/nilfs2/direct.c b/fs/nilfs2/direct.c index 324d80c57518..82f4865e86dd 100644 --- a/fs/nilfs2/direct.c +++ b/fs/nilfs2/direct.c | |||
@@ -146,7 +146,7 @@ static int nilfs_direct_insert(struct nilfs_bmap *bmap, __u64 key, __u64 ptr) | |||
146 | if (NILFS_BMAP_USE_VBN(bmap)) | 146 | if (NILFS_BMAP_USE_VBN(bmap)) |
147 | nilfs_bmap_set_target_v(bmap, key, req.bpr_ptr); | 147 | nilfs_bmap_set_target_v(bmap, key, req.bpr_ptr); |
148 | 148 | ||
149 | nilfs_bmap_add_blocks(bmap, 1); | 149 | nilfs_inode_add_blocks(bmap->b_inode, 1); |
150 | } | 150 | } |
151 | return ret; | 151 | return ret; |
152 | } | 152 | } |
@@ -168,7 +168,7 @@ static int nilfs_direct_delete(struct nilfs_bmap *bmap, __u64 key) | |||
168 | if (!ret) { | 168 | if (!ret) { |
169 | nilfs_bmap_commit_end_ptr(bmap, &req, dat); | 169 | nilfs_bmap_commit_end_ptr(bmap, &req, dat); |
170 | nilfs_direct_set_ptr(bmap, key, NILFS_BMAP_INVALID_PTR); | 170 | nilfs_direct_set_ptr(bmap, key, NILFS_BMAP_INVALID_PTR); |
171 | nilfs_bmap_sub_blocks(bmap, 1); | 171 | nilfs_inode_sub_blocks(bmap->b_inode, 1); |
172 | } | 172 | } |
173 | return ret; | 173 | return ret; |
174 | } | 174 | } |
diff --git a/fs/nilfs2/file.c b/fs/nilfs2/file.c index 2f560c9fb808..93589fccdd97 100644 --- a/fs/nilfs2/file.c +++ b/fs/nilfs2/file.c | |||
@@ -59,7 +59,7 @@ static int nilfs_page_mkwrite(struct vm_area_struct *vma, struct vm_fault *vmf) | |||
59 | struct nilfs_transaction_info ti; | 59 | struct nilfs_transaction_info ti; |
60 | int ret; | 60 | int ret; |
61 | 61 | ||
62 | if (unlikely(nilfs_near_disk_full(NILFS_SB(inode->i_sb)->s_nilfs))) | 62 | if (unlikely(nilfs_near_disk_full(inode->i_sb->s_fs_info))) |
63 | return VM_FAULT_SIGBUS; /* -ENOSPC */ | 63 | return VM_FAULT_SIGBUS; /* -ENOSPC */ |
64 | 64 | ||
65 | lock_page(page); | 65 | lock_page(page); |
@@ -142,7 +142,7 @@ const struct file_operations nilfs_file_operations = { | |||
142 | .aio_write = generic_file_aio_write, | 142 | .aio_write = generic_file_aio_write, |
143 | .unlocked_ioctl = nilfs_ioctl, | 143 | .unlocked_ioctl = nilfs_ioctl, |
144 | #ifdef CONFIG_COMPAT | 144 | #ifdef CONFIG_COMPAT |
145 | .compat_ioctl = nilfs_ioctl, | 145 | .compat_ioctl = nilfs_compat_ioctl, |
146 | #endif /* CONFIG_COMPAT */ | 146 | #endif /* CONFIG_COMPAT */ |
147 | .mmap = nilfs_file_mmap, | 147 | .mmap = nilfs_file_mmap, |
148 | .open = generic_file_open, | 148 | .open = generic_file_open, |
diff --git a/fs/nilfs2/inode.c b/fs/nilfs2/inode.c index 2fd440d8d6b8..d5625be236a8 100644 --- a/fs/nilfs2/inode.c +++ b/fs/nilfs2/inode.c | |||
@@ -41,6 +41,24 @@ struct nilfs_iget_args { | |||
41 | int for_gc; | 41 | int for_gc; |
42 | }; | 42 | }; |
43 | 43 | ||
44 | void nilfs_inode_add_blocks(struct inode *inode, int n) | ||
45 | { | ||
46 | struct nilfs_root *root = NILFS_I(inode)->i_root; | ||
47 | |||
48 | inode_add_bytes(inode, (1 << inode->i_blkbits) * n); | ||
49 | if (root) | ||
50 | atomic_add(n, &root->blocks_count); | ||
51 | } | ||
52 | |||
53 | void nilfs_inode_sub_blocks(struct inode *inode, int n) | ||
54 | { | ||
55 | struct nilfs_root *root = NILFS_I(inode)->i_root; | ||
56 | |||
57 | inode_sub_bytes(inode, (1 << inode->i_blkbits) * n); | ||
58 | if (root) | ||
59 | atomic_sub(n, &root->blocks_count); | ||
60 | } | ||
61 | |||
44 | /** | 62 | /** |
45 | * nilfs_get_block() - get a file block on the filesystem (callback function) | 63 | * nilfs_get_block() - get a file block on the filesystem (callback function) |
46 | * @inode - inode struct of the target file | 64 | * @inode - inode struct of the target file |
@@ -277,7 +295,7 @@ const struct address_space_operations nilfs_aops = { | |||
277 | struct inode *nilfs_new_inode(struct inode *dir, int mode) | 295 | struct inode *nilfs_new_inode(struct inode *dir, int mode) |
278 | { | 296 | { |
279 | struct super_block *sb = dir->i_sb; | 297 | struct super_block *sb = dir->i_sb; |
280 | struct nilfs_sb_info *sbi = NILFS_SB(sb); | 298 | struct the_nilfs *nilfs = sb->s_fs_info; |
281 | struct inode *inode; | 299 | struct inode *inode; |
282 | struct nilfs_inode_info *ii; | 300 | struct nilfs_inode_info *ii; |
283 | struct nilfs_root *root; | 301 | struct nilfs_root *root; |
@@ -315,19 +333,16 @@ struct inode *nilfs_new_inode(struct inode *dir, int mode) | |||
315 | /* No lock is needed; iget() ensures it. */ | 333 | /* No lock is needed; iget() ensures it. */ |
316 | } | 334 | } |
317 | 335 | ||
318 | ii->i_flags = NILFS_I(dir)->i_flags; | 336 | ii->i_flags = nilfs_mask_flags( |
319 | if (S_ISLNK(mode)) | 337 | mode, NILFS_I(dir)->i_flags & NILFS_FL_INHERITED); |
320 | ii->i_flags &= ~(NILFS_IMMUTABLE_FL | NILFS_APPEND_FL); | ||
321 | if (!S_ISDIR(mode)) | ||
322 | ii->i_flags &= ~NILFS_DIRSYNC_FL; | ||
323 | 338 | ||
324 | /* ii->i_file_acl = 0; */ | 339 | /* ii->i_file_acl = 0; */ |
325 | /* ii->i_dir_acl = 0; */ | 340 | /* ii->i_dir_acl = 0; */ |
326 | ii->i_dir_start_lookup = 0; | 341 | ii->i_dir_start_lookup = 0; |
327 | nilfs_set_inode_flags(inode); | 342 | nilfs_set_inode_flags(inode); |
328 | spin_lock(&sbi->s_next_gen_lock); | 343 | spin_lock(&nilfs->ns_next_gen_lock); |
329 | inode->i_generation = sbi->s_next_generation++; | 344 | inode->i_generation = nilfs->ns_next_generation++; |
330 | spin_unlock(&sbi->s_next_gen_lock); | 345 | spin_unlock(&nilfs->ns_next_gen_lock); |
331 | insert_inode_hash(inode); | 346 | insert_inode_hash(inode); |
332 | 347 | ||
333 | err = nilfs_init_acl(inode, dir); | 348 | err = nilfs_init_acl(inode, dir); |
@@ -359,17 +374,15 @@ void nilfs_set_inode_flags(struct inode *inode) | |||
359 | 374 | ||
360 | inode->i_flags &= ~(S_SYNC | S_APPEND | S_IMMUTABLE | S_NOATIME | | 375 | inode->i_flags &= ~(S_SYNC | S_APPEND | S_IMMUTABLE | S_NOATIME | |
361 | S_DIRSYNC); | 376 | S_DIRSYNC); |
362 | if (flags & NILFS_SYNC_FL) | 377 | if (flags & FS_SYNC_FL) |
363 | inode->i_flags |= S_SYNC; | 378 | inode->i_flags |= S_SYNC; |
364 | if (flags & NILFS_APPEND_FL) | 379 | if (flags & FS_APPEND_FL) |
365 | inode->i_flags |= S_APPEND; | 380 | inode->i_flags |= S_APPEND; |
366 | if (flags & NILFS_IMMUTABLE_FL) | 381 | if (flags & FS_IMMUTABLE_FL) |
367 | inode->i_flags |= S_IMMUTABLE; | 382 | inode->i_flags |= S_IMMUTABLE; |
368 | #ifndef NILFS_ATIME_DISABLE | 383 | if (flags & FS_NOATIME_FL) |
369 | if (flags & NILFS_NOATIME_FL) | ||
370 | #endif | ||
371 | inode->i_flags |= S_NOATIME; | 384 | inode->i_flags |= S_NOATIME; |
372 | if (flags & NILFS_DIRSYNC_FL) | 385 | if (flags & FS_DIRSYNC_FL) |
373 | inode->i_flags |= S_DIRSYNC; | 386 | inode->i_flags |= S_DIRSYNC; |
374 | mapping_set_gfp_mask(inode->i_mapping, | 387 | mapping_set_gfp_mask(inode->i_mapping, |
375 | mapping_gfp_mask(inode->i_mapping) & ~__GFP_FS); | 388 | mapping_gfp_mask(inode->i_mapping) & ~__GFP_FS); |
@@ -420,7 +433,7 @@ static int __nilfs_read_inode(struct super_block *sb, | |||
420 | struct nilfs_root *root, unsigned long ino, | 433 | struct nilfs_root *root, unsigned long ino, |
421 | struct inode *inode) | 434 | struct inode *inode) |
422 | { | 435 | { |
423 | struct the_nilfs *nilfs = NILFS_SB(sb)->s_nilfs; | 436 | struct the_nilfs *nilfs = sb->s_fs_info; |
424 | struct buffer_head *bh; | 437 | struct buffer_head *bh; |
425 | struct nilfs_inode *raw_inode; | 438 | struct nilfs_inode *raw_inode; |
426 | int err; | 439 | int err; |
@@ -707,6 +720,7 @@ void nilfs_evict_inode(struct inode *inode) | |||
707 | struct nilfs_transaction_info ti; | 720 | struct nilfs_transaction_info ti; |
708 | struct super_block *sb = inode->i_sb; | 721 | struct super_block *sb = inode->i_sb; |
709 | struct nilfs_inode_info *ii = NILFS_I(inode); | 722 | struct nilfs_inode_info *ii = NILFS_I(inode); |
723 | int ret; | ||
710 | 724 | ||
711 | if (inode->i_nlink || !ii->i_root || unlikely(is_bad_inode(inode))) { | 725 | if (inode->i_nlink || !ii->i_root || unlikely(is_bad_inode(inode))) { |
712 | if (inode->i_data.nrpages) | 726 | if (inode->i_data.nrpages) |
@@ -725,8 +739,9 @@ void nilfs_evict_inode(struct inode *inode) | |||
725 | nilfs_mark_inode_dirty(inode); | 739 | nilfs_mark_inode_dirty(inode); |
726 | end_writeback(inode); | 740 | end_writeback(inode); |
727 | 741 | ||
728 | nilfs_ifile_delete_inode(ii->i_root->ifile, inode->i_ino); | 742 | ret = nilfs_ifile_delete_inode(ii->i_root->ifile, inode->i_ino); |
729 | atomic_dec(&ii->i_root->inodes_count); | 743 | if (!ret) |
744 | atomic_dec(&ii->i_root->inodes_count); | ||
730 | 745 | ||
731 | nilfs_clear_inode(inode); | 746 | nilfs_clear_inode(inode); |
732 | 747 | ||
@@ -792,18 +807,18 @@ int nilfs_permission(struct inode *inode, int mask, unsigned int flags) | |||
792 | 807 | ||
793 | int nilfs_load_inode_block(struct inode *inode, struct buffer_head **pbh) | 808 | int nilfs_load_inode_block(struct inode *inode, struct buffer_head **pbh) |
794 | { | 809 | { |
795 | struct nilfs_sb_info *sbi = NILFS_SB(inode->i_sb); | 810 | struct the_nilfs *nilfs = inode->i_sb->s_fs_info; |
796 | struct nilfs_inode_info *ii = NILFS_I(inode); | 811 | struct nilfs_inode_info *ii = NILFS_I(inode); |
797 | int err; | 812 | int err; |
798 | 813 | ||
799 | spin_lock(&sbi->s_inode_lock); | 814 | spin_lock(&nilfs->ns_inode_lock); |
800 | if (ii->i_bh == NULL) { | 815 | if (ii->i_bh == NULL) { |
801 | spin_unlock(&sbi->s_inode_lock); | 816 | spin_unlock(&nilfs->ns_inode_lock); |
802 | err = nilfs_ifile_get_inode_block(ii->i_root->ifile, | 817 | err = nilfs_ifile_get_inode_block(ii->i_root->ifile, |
803 | inode->i_ino, pbh); | 818 | inode->i_ino, pbh); |
804 | if (unlikely(err)) | 819 | if (unlikely(err)) |
805 | return err; | 820 | return err; |
806 | spin_lock(&sbi->s_inode_lock); | 821 | spin_lock(&nilfs->ns_inode_lock); |
807 | if (ii->i_bh == NULL) | 822 | if (ii->i_bh == NULL) |
808 | ii->i_bh = *pbh; | 823 | ii->i_bh = *pbh; |
809 | else { | 824 | else { |
@@ -814,36 +829,36 @@ int nilfs_load_inode_block(struct inode *inode, struct buffer_head **pbh) | |||
814 | *pbh = ii->i_bh; | 829 | *pbh = ii->i_bh; |
815 | 830 | ||
816 | get_bh(*pbh); | 831 | get_bh(*pbh); |
817 | spin_unlock(&sbi->s_inode_lock); | 832 | spin_unlock(&nilfs->ns_inode_lock); |
818 | return 0; | 833 | return 0; |
819 | } | 834 | } |
820 | 835 | ||
821 | int nilfs_inode_dirty(struct inode *inode) | 836 | int nilfs_inode_dirty(struct inode *inode) |
822 | { | 837 | { |
823 | struct nilfs_inode_info *ii = NILFS_I(inode); | 838 | struct nilfs_inode_info *ii = NILFS_I(inode); |
824 | struct nilfs_sb_info *sbi = NILFS_SB(inode->i_sb); | 839 | struct the_nilfs *nilfs = inode->i_sb->s_fs_info; |
825 | int ret = 0; | 840 | int ret = 0; |
826 | 841 | ||
827 | if (!list_empty(&ii->i_dirty)) { | 842 | if (!list_empty(&ii->i_dirty)) { |
828 | spin_lock(&sbi->s_inode_lock); | 843 | spin_lock(&nilfs->ns_inode_lock); |
829 | ret = test_bit(NILFS_I_DIRTY, &ii->i_state) || | 844 | ret = test_bit(NILFS_I_DIRTY, &ii->i_state) || |
830 | test_bit(NILFS_I_BUSY, &ii->i_state); | 845 | test_bit(NILFS_I_BUSY, &ii->i_state); |
831 | spin_unlock(&sbi->s_inode_lock); | 846 | spin_unlock(&nilfs->ns_inode_lock); |
832 | } | 847 | } |
833 | return ret; | 848 | return ret; |
834 | } | 849 | } |
835 | 850 | ||
836 | int nilfs_set_file_dirty(struct inode *inode, unsigned nr_dirty) | 851 | int nilfs_set_file_dirty(struct inode *inode, unsigned nr_dirty) |
837 | { | 852 | { |
838 | struct nilfs_sb_info *sbi = NILFS_SB(inode->i_sb); | ||
839 | struct nilfs_inode_info *ii = NILFS_I(inode); | 853 | struct nilfs_inode_info *ii = NILFS_I(inode); |
854 | struct the_nilfs *nilfs = inode->i_sb->s_fs_info; | ||
840 | 855 | ||
841 | atomic_add(nr_dirty, &sbi->s_nilfs->ns_ndirtyblks); | 856 | atomic_add(nr_dirty, &nilfs->ns_ndirtyblks); |
842 | 857 | ||
843 | if (test_and_set_bit(NILFS_I_DIRTY, &ii->i_state)) | 858 | if (test_and_set_bit(NILFS_I_DIRTY, &ii->i_state)) |
844 | return 0; | 859 | return 0; |
845 | 860 | ||
846 | spin_lock(&sbi->s_inode_lock); | 861 | spin_lock(&nilfs->ns_inode_lock); |
847 | if (!test_bit(NILFS_I_QUEUED, &ii->i_state) && | 862 | if (!test_bit(NILFS_I_QUEUED, &ii->i_state) && |
848 | !test_bit(NILFS_I_BUSY, &ii->i_state)) { | 863 | !test_bit(NILFS_I_BUSY, &ii->i_state)) { |
849 | /* Because this routine may race with nilfs_dispose_list(), | 864 | /* Because this routine may race with nilfs_dispose_list(), |
@@ -851,18 +866,18 @@ int nilfs_set_file_dirty(struct inode *inode, unsigned nr_dirty) | |||
851 | if (list_empty(&ii->i_dirty) && igrab(inode) == NULL) { | 866 | if (list_empty(&ii->i_dirty) && igrab(inode) == NULL) { |
852 | /* This will happen when somebody is freeing | 867 | /* This will happen when somebody is freeing |
853 | this inode. */ | 868 | this inode. */ |
854 | nilfs_warning(sbi->s_super, __func__, | 869 | nilfs_warning(inode->i_sb, __func__, |
855 | "cannot get inode (ino=%lu)\n", | 870 | "cannot get inode (ino=%lu)\n", |
856 | inode->i_ino); | 871 | inode->i_ino); |
857 | spin_unlock(&sbi->s_inode_lock); | 872 | spin_unlock(&nilfs->ns_inode_lock); |
858 | return -EINVAL; /* NILFS_I_DIRTY may remain for | 873 | return -EINVAL; /* NILFS_I_DIRTY may remain for |
859 | freeing inode */ | 874 | freeing inode */ |
860 | } | 875 | } |
861 | list_del(&ii->i_dirty); | 876 | list_del(&ii->i_dirty); |
862 | list_add_tail(&ii->i_dirty, &sbi->s_dirty_files); | 877 | list_add_tail(&ii->i_dirty, &nilfs->ns_dirty_files); |
863 | set_bit(NILFS_I_QUEUED, &ii->i_state); | 878 | set_bit(NILFS_I_QUEUED, &ii->i_state); |
864 | } | 879 | } |
865 | spin_unlock(&sbi->s_inode_lock); | 880 | spin_unlock(&nilfs->ns_inode_lock); |
866 | return 0; | 881 | return 0; |
867 | } | 882 | } |
868 | 883 | ||
diff --git a/fs/nilfs2/ioctl.c b/fs/nilfs2/ioctl.c index 496738963fdb..95c04c2f2b3e 100644 --- a/fs/nilfs2/ioctl.c +++ b/fs/nilfs2/ioctl.c | |||
@@ -26,7 +26,9 @@ | |||
26 | #include <linux/capability.h> /* capable() */ | 26 | #include <linux/capability.h> /* capable() */ |
27 | #include <linux/uaccess.h> /* copy_from_user(), copy_to_user() */ | 27 | #include <linux/uaccess.h> /* copy_from_user(), copy_to_user() */ |
28 | #include <linux/vmalloc.h> | 28 | #include <linux/vmalloc.h> |
29 | #include <linux/compat.h> /* compat_ptr() */ | ||
29 | #include <linux/mount.h> /* mnt_want_write(), mnt_drop_write() */ | 30 | #include <linux/mount.h> /* mnt_want_write(), mnt_drop_write() */ |
31 | #include <linux/buffer_head.h> | ||
30 | #include <linux/nilfs2_fs.h> | 32 | #include <linux/nilfs2_fs.h> |
31 | #include "nilfs.h" | 33 | #include "nilfs.h" |
32 | #include "segment.h" | 34 | #include "segment.h" |
@@ -97,11 +99,74 @@ static int nilfs_ioctl_wrap_copy(struct the_nilfs *nilfs, | |||
97 | return ret; | 99 | return ret; |
98 | } | 100 | } |
99 | 101 | ||
102 | static int nilfs_ioctl_getflags(struct inode *inode, void __user *argp) | ||
103 | { | ||
104 | unsigned int flags = NILFS_I(inode)->i_flags & FS_FL_USER_VISIBLE; | ||
105 | |||
106 | return put_user(flags, (int __user *)argp); | ||
107 | } | ||
108 | |||
109 | static int nilfs_ioctl_setflags(struct inode *inode, struct file *filp, | ||
110 | void __user *argp) | ||
111 | { | ||
112 | struct nilfs_transaction_info ti; | ||
113 | unsigned int flags, oldflags; | ||
114 | int ret; | ||
115 | |||
116 | if (!is_owner_or_cap(inode)) | ||
117 | return -EACCES; | ||
118 | |||
119 | if (get_user(flags, (int __user *)argp)) | ||
120 | return -EFAULT; | ||
121 | |||
122 | ret = mnt_want_write(filp->f_path.mnt); | ||
123 | if (ret) | ||
124 | return ret; | ||
125 | |||
126 | flags = nilfs_mask_flags(inode->i_mode, flags); | ||
127 | |||
128 | mutex_lock(&inode->i_mutex); | ||
129 | |||
130 | oldflags = NILFS_I(inode)->i_flags; | ||
131 | |||
132 | /* | ||
133 | * The IMMUTABLE and APPEND_ONLY flags can only be changed by the | ||
134 | * relevant capability. | ||
135 | */ | ||
136 | ret = -EPERM; | ||
137 | if (((flags ^ oldflags) & (FS_APPEND_FL | FS_IMMUTABLE_FL)) && | ||
138 | !capable(CAP_LINUX_IMMUTABLE)) | ||
139 | goto out; | ||
140 | |||
141 | ret = nilfs_transaction_begin(inode->i_sb, &ti, 0); | ||
142 | if (ret) | ||
143 | goto out; | ||
144 | |||
145 | NILFS_I(inode)->i_flags = (oldflags & ~FS_FL_USER_MODIFIABLE) | | ||
146 | (flags & FS_FL_USER_MODIFIABLE); | ||
147 | |||
148 | nilfs_set_inode_flags(inode); | ||
149 | inode->i_ctime = CURRENT_TIME; | ||
150 | if (IS_SYNC(inode)) | ||
151 | nilfs_set_transaction_flag(NILFS_TI_SYNC); | ||
152 | |||
153 | nilfs_mark_inode_dirty(inode); | ||
154 | ret = nilfs_transaction_commit(inode->i_sb); | ||
155 | out: | ||
156 | mutex_unlock(&inode->i_mutex); | ||
157 | mnt_drop_write(filp->f_path.mnt); | ||
158 | return ret; | ||
159 | } | ||
160 | |||
161 | static int nilfs_ioctl_getversion(struct inode *inode, void __user *argp) | ||
162 | { | ||
163 | return put_user(inode->i_generation, (int __user *)argp); | ||
164 | } | ||
165 | |||
100 | static int nilfs_ioctl_change_cpmode(struct inode *inode, struct file *filp, | 166 | static int nilfs_ioctl_change_cpmode(struct inode *inode, struct file *filp, |
101 | unsigned int cmd, void __user *argp) | 167 | unsigned int cmd, void __user *argp) |
102 | { | 168 | { |
103 | struct the_nilfs *nilfs = NILFS_SB(inode->i_sb)->s_nilfs; | 169 | struct the_nilfs *nilfs = inode->i_sb->s_fs_info; |
104 | struct inode *cpfile = nilfs->ns_cpfile; | ||
105 | struct nilfs_transaction_info ti; | 170 | struct nilfs_transaction_info ti; |
106 | struct nilfs_cpmode cpmode; | 171 | struct nilfs_cpmode cpmode; |
107 | int ret; | 172 | int ret; |
@@ -121,7 +186,7 @@ static int nilfs_ioctl_change_cpmode(struct inode *inode, struct file *filp, | |||
121 | 186 | ||
122 | nilfs_transaction_begin(inode->i_sb, &ti, 0); | 187 | nilfs_transaction_begin(inode->i_sb, &ti, 0); |
123 | ret = nilfs_cpfile_change_cpmode( | 188 | ret = nilfs_cpfile_change_cpmode( |
124 | cpfile, cpmode.cm_cno, cpmode.cm_mode); | 189 | nilfs->ns_cpfile, cpmode.cm_cno, cpmode.cm_mode); |
125 | if (unlikely(ret < 0)) | 190 | if (unlikely(ret < 0)) |
126 | nilfs_transaction_abort(inode->i_sb); | 191 | nilfs_transaction_abort(inode->i_sb); |
127 | else | 192 | else |
@@ -137,7 +202,7 @@ static int | |||
137 | nilfs_ioctl_delete_checkpoint(struct inode *inode, struct file *filp, | 202 | nilfs_ioctl_delete_checkpoint(struct inode *inode, struct file *filp, |
138 | unsigned int cmd, void __user *argp) | 203 | unsigned int cmd, void __user *argp) |
139 | { | 204 | { |
140 | struct inode *cpfile = NILFS_SB(inode->i_sb)->s_nilfs->ns_cpfile; | 205 | struct the_nilfs *nilfs = inode->i_sb->s_fs_info; |
141 | struct nilfs_transaction_info ti; | 206 | struct nilfs_transaction_info ti; |
142 | __u64 cno; | 207 | __u64 cno; |
143 | int ret; | 208 | int ret; |
@@ -154,7 +219,7 @@ nilfs_ioctl_delete_checkpoint(struct inode *inode, struct file *filp, | |||
154 | goto out; | 219 | goto out; |
155 | 220 | ||
156 | nilfs_transaction_begin(inode->i_sb, &ti, 0); | 221 | nilfs_transaction_begin(inode->i_sb, &ti, 0); |
157 | ret = nilfs_cpfile_delete_checkpoint(cpfile, cno); | 222 | ret = nilfs_cpfile_delete_checkpoint(nilfs->ns_cpfile, cno); |
158 | if (unlikely(ret < 0)) | 223 | if (unlikely(ret < 0)) |
159 | nilfs_transaction_abort(inode->i_sb); | 224 | nilfs_transaction_abort(inode->i_sb); |
160 | else | 225 | else |
@@ -180,7 +245,7 @@ nilfs_ioctl_do_get_cpinfo(struct the_nilfs *nilfs, __u64 *posp, int flags, | |||
180 | static int nilfs_ioctl_get_cpstat(struct inode *inode, struct file *filp, | 245 | static int nilfs_ioctl_get_cpstat(struct inode *inode, struct file *filp, |
181 | unsigned int cmd, void __user *argp) | 246 | unsigned int cmd, void __user *argp) |
182 | { | 247 | { |
183 | struct the_nilfs *nilfs = NILFS_SB(inode->i_sb)->s_nilfs; | 248 | struct the_nilfs *nilfs = inode->i_sb->s_fs_info; |
184 | struct nilfs_cpstat cpstat; | 249 | struct nilfs_cpstat cpstat; |
185 | int ret; | 250 | int ret; |
186 | 251 | ||
@@ -211,7 +276,7 @@ nilfs_ioctl_do_get_suinfo(struct the_nilfs *nilfs, __u64 *posp, int flags, | |||
211 | static int nilfs_ioctl_get_sustat(struct inode *inode, struct file *filp, | 276 | static int nilfs_ioctl_get_sustat(struct inode *inode, struct file *filp, |
212 | unsigned int cmd, void __user *argp) | 277 | unsigned int cmd, void __user *argp) |
213 | { | 278 | { |
214 | struct the_nilfs *nilfs = NILFS_SB(inode->i_sb)->s_nilfs; | 279 | struct the_nilfs *nilfs = inode->i_sb->s_fs_info; |
215 | struct nilfs_sustat sustat; | 280 | struct nilfs_sustat sustat; |
216 | int ret; | 281 | int ret; |
217 | 282 | ||
@@ -267,7 +332,7 @@ nilfs_ioctl_do_get_bdescs(struct the_nilfs *nilfs, __u64 *posp, int flags, | |||
267 | static int nilfs_ioctl_get_bdescs(struct inode *inode, struct file *filp, | 332 | static int nilfs_ioctl_get_bdescs(struct inode *inode, struct file *filp, |
268 | unsigned int cmd, void __user *argp) | 333 | unsigned int cmd, void __user *argp) |
269 | { | 334 | { |
270 | struct the_nilfs *nilfs = NILFS_SB(inode->i_sb)->s_nilfs; | 335 | struct the_nilfs *nilfs = inode->i_sb->s_fs_info; |
271 | struct nilfs_argv argv; | 336 | struct nilfs_argv argv; |
272 | int ret; | 337 | int ret; |
273 | 338 | ||
@@ -336,7 +401,7 @@ static int nilfs_ioctl_move_blocks(struct super_block *sb, | |||
336 | struct nilfs_argv *argv, void *buf) | 401 | struct nilfs_argv *argv, void *buf) |
337 | { | 402 | { |
338 | size_t nmembs = argv->v_nmembs; | 403 | size_t nmembs = argv->v_nmembs; |
339 | struct the_nilfs *nilfs = NILFS_SB(sb)->s_nilfs; | 404 | struct the_nilfs *nilfs = sb->s_fs_info; |
340 | struct inode *inode; | 405 | struct inode *inode; |
341 | struct nilfs_vdesc *vdesc; | 406 | struct nilfs_vdesc *vdesc; |
342 | struct buffer_head *bh, *n; | 407 | struct buffer_head *bh, *n; |
@@ -550,7 +615,7 @@ static int nilfs_ioctl_clean_segments(struct inode *inode, struct file *filp, | |||
550 | ret = PTR_ERR(kbufs[4]); | 615 | ret = PTR_ERR(kbufs[4]); |
551 | goto out; | 616 | goto out; |
552 | } | 617 | } |
553 | nilfs = NILFS_SB(inode->i_sb)->s_nilfs; | 618 | nilfs = inode->i_sb->s_fs_info; |
554 | 619 | ||
555 | for (n = 0; n < 4; n++) { | 620 | for (n = 0; n < 4; n++) { |
556 | ret = -EINVAL; | 621 | ret = -EINVAL; |
@@ -623,7 +688,7 @@ static int nilfs_ioctl_sync(struct inode *inode, struct file *filp, | |||
623 | return ret; | 688 | return ret; |
624 | 689 | ||
625 | if (argp != NULL) { | 690 | if (argp != NULL) { |
626 | nilfs = NILFS_SB(inode->i_sb)->s_nilfs; | 691 | nilfs = inode->i_sb->s_fs_info; |
627 | down_read(&nilfs->ns_segctor_sem); | 692 | down_read(&nilfs->ns_segctor_sem); |
628 | cno = nilfs->ns_cno - 1; | 693 | cno = nilfs->ns_cno - 1; |
629 | up_read(&nilfs->ns_segctor_sem); | 694 | up_read(&nilfs->ns_segctor_sem); |
@@ -641,7 +706,7 @@ static int nilfs_ioctl_get_info(struct inode *inode, struct file *filp, | |||
641 | void *, size_t, size_t)) | 706 | void *, size_t, size_t)) |
642 | 707 | ||
643 | { | 708 | { |
644 | struct the_nilfs *nilfs = NILFS_SB(inode->i_sb)->s_nilfs; | 709 | struct the_nilfs *nilfs = inode->i_sb->s_fs_info; |
645 | struct nilfs_argv argv; | 710 | struct nilfs_argv argv; |
646 | int ret; | 711 | int ret; |
647 | 712 | ||
@@ -666,6 +731,12 @@ long nilfs_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) | |||
666 | void __user *argp = (void __user *)arg; | 731 | void __user *argp = (void __user *)arg; |
667 | 732 | ||
668 | switch (cmd) { | 733 | switch (cmd) { |
734 | case FS_IOC_GETFLAGS: | ||
735 | return nilfs_ioctl_getflags(inode, argp); | ||
736 | case FS_IOC_SETFLAGS: | ||
737 | return nilfs_ioctl_setflags(inode, filp, argp); | ||
738 | case FS_IOC_GETVERSION: | ||
739 | return nilfs_ioctl_getversion(inode, argp); | ||
669 | case NILFS_IOCTL_CHANGE_CPMODE: | 740 | case NILFS_IOCTL_CHANGE_CPMODE: |
670 | return nilfs_ioctl_change_cpmode(inode, filp, cmd, argp); | 741 | return nilfs_ioctl_change_cpmode(inode, filp, cmd, argp); |
671 | case NILFS_IOCTL_DELETE_CHECKPOINT: | 742 | case NILFS_IOCTL_DELETE_CHECKPOINT: |
@@ -696,3 +767,23 @@ long nilfs_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) | |||
696 | return -ENOTTY; | 767 | return -ENOTTY; |
697 | } | 768 | } |
698 | } | 769 | } |
770 | |||
771 | #ifdef CONFIG_COMPAT | ||
772 | long nilfs_compat_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) | ||
773 | { | ||
774 | switch (cmd) { | ||
775 | case FS_IOC32_GETFLAGS: | ||
776 | cmd = FS_IOC_GETFLAGS; | ||
777 | break; | ||
778 | case FS_IOC32_SETFLAGS: | ||
779 | cmd = FS_IOC_SETFLAGS; | ||
780 | break; | ||
781 | case FS_IOC32_GETVERSION: | ||
782 | cmd = FS_IOC_GETVERSION; | ||
783 | break; | ||
784 | default: | ||
785 | return -ENOIOCTLCMD; | ||
786 | } | ||
787 | return nilfs_ioctl(filp, cmd, (unsigned long)compat_ptr(arg)); | ||
788 | } | ||
789 | #endif | ||
diff --git a/fs/nilfs2/mdt.h b/fs/nilfs2/mdt.h index b13734bf3521..ed68563ec708 100644 --- a/fs/nilfs2/mdt.h +++ b/fs/nilfs2/mdt.h | |||
@@ -66,7 +66,7 @@ static inline struct nilfs_mdt_info *NILFS_MDT(const struct inode *inode) | |||
66 | 66 | ||
67 | static inline struct the_nilfs *NILFS_I_NILFS(struct inode *inode) | 67 | static inline struct the_nilfs *NILFS_I_NILFS(struct inode *inode) |
68 | { | 68 | { |
69 | return NILFS_SB(inode->i_sb)->s_nilfs; | 69 | return inode->i_sb->s_fs_info; |
70 | } | 70 | } |
71 | 71 | ||
72 | /* Default GFP flags using highmem */ | 72 | /* Default GFP flags using highmem */ |
diff --git a/fs/nilfs2/namei.c b/fs/nilfs2/namei.c index 161791d26458..546849b3e88f 100644 --- a/fs/nilfs2/namei.c +++ b/fs/nilfs2/namei.c | |||
@@ -482,7 +482,7 @@ static struct dentry *nilfs_get_dentry(struct super_block *sb, u64 cno, | |||
482 | if (ino < NILFS_FIRST_INO(sb) && ino != NILFS_ROOT_INO) | 482 | if (ino < NILFS_FIRST_INO(sb) && ino != NILFS_ROOT_INO) |
483 | return ERR_PTR(-ESTALE); | 483 | return ERR_PTR(-ESTALE); |
484 | 484 | ||
485 | root = nilfs_lookup_root(NILFS_SB(sb)->s_nilfs, cno); | 485 | root = nilfs_lookup_root(sb->s_fs_info, cno); |
486 | if (!root) | 486 | if (!root) |
487 | return ERR_PTR(-ESTALE); | 487 | return ERR_PTR(-ESTALE); |
488 | 488 | ||
diff --git a/fs/nilfs2/nilfs.h b/fs/nilfs2/nilfs.h index 777e8fd04304..856e8e4e0b74 100644 --- a/fs/nilfs2/nilfs.h +++ b/fs/nilfs2/nilfs.h | |||
@@ -30,7 +30,6 @@ | |||
30 | #include <linux/blkdev.h> | 30 | #include <linux/blkdev.h> |
31 | #include <linux/nilfs2_fs.h> | 31 | #include <linux/nilfs2_fs.h> |
32 | #include "the_nilfs.h" | 32 | #include "the_nilfs.h" |
33 | #include "sb.h" | ||
34 | #include "bmap.h" | 33 | #include "bmap.h" |
35 | 34 | ||
36 | /* | 35 | /* |
@@ -122,7 +121,7 @@ enum { | |||
122 | #define NILFS_SYS_INO_BITS \ | 121 | #define NILFS_SYS_INO_BITS \ |
123 | ((unsigned int)(1 << NILFS_ROOT_INO) | NILFS_MDT_INO_BITS) | 122 | ((unsigned int)(1 << NILFS_ROOT_INO) | NILFS_MDT_INO_BITS) |
124 | 123 | ||
125 | #define NILFS_FIRST_INO(sb) (NILFS_SB(sb)->s_nilfs->ns_first_ino) | 124 | #define NILFS_FIRST_INO(sb) (((struct the_nilfs *)sb->s_fs_info)->ns_first_ino) |
126 | 125 | ||
127 | #define NILFS_MDT_INODE(sb, ino) \ | 126 | #define NILFS_MDT_INODE(sb, ino) \ |
128 | ((ino) < NILFS_FIRST_INO(sb) && (NILFS_MDT_INO_BITS & (1 << (ino)))) | 127 | ((ino) < NILFS_FIRST_INO(sb) && (NILFS_MDT_INO_BITS & (1 << (ino)))) |
@@ -212,6 +211,23 @@ static inline int nilfs_init_acl(struct inode *inode, struct inode *dir) | |||
212 | 211 | ||
213 | #define NILFS_ATIME_DISABLE | 212 | #define NILFS_ATIME_DISABLE |
214 | 213 | ||
214 | /* Flags that should be inherited by new inodes from their parent. */ | ||
215 | #define NILFS_FL_INHERITED \ | ||
216 | (FS_SECRM_FL | FS_UNRM_FL | FS_COMPR_FL | FS_SYNC_FL | \ | ||
217 | FS_IMMUTABLE_FL | FS_APPEND_FL | FS_NODUMP_FL | FS_NOATIME_FL |\ | ||
218 | FS_COMPRBLK_FL | FS_NOCOMP_FL | FS_NOTAIL_FL | FS_DIRSYNC_FL) | ||
219 | |||
220 | /* Mask out flags that are inappropriate for the given type of inode. */ | ||
221 | static inline __u32 nilfs_mask_flags(umode_t mode, __u32 flags) | ||
222 | { | ||
223 | if (S_ISDIR(mode)) | ||
224 | return flags; | ||
225 | else if (S_ISREG(mode)) | ||
226 | return flags & ~(FS_DIRSYNC_FL | FS_TOPDIR_FL); | ||
227 | else | ||
228 | return flags & (FS_NODUMP_FL | FS_NOATIME_FL); | ||
229 | } | ||
230 | |||
215 | /* dir.c */ | 231 | /* dir.c */ |
216 | extern int nilfs_add_link(struct dentry *, struct inode *); | 232 | extern int nilfs_add_link(struct dentry *, struct inode *); |
217 | extern ino_t nilfs_inode_by_name(struct inode *, const struct qstr *); | 233 | extern ino_t nilfs_inode_by_name(struct inode *, const struct qstr *); |
@@ -229,10 +245,13 @@ extern int nilfs_sync_file(struct file *, int); | |||
229 | 245 | ||
230 | /* ioctl.c */ | 246 | /* ioctl.c */ |
231 | long nilfs_ioctl(struct file *, unsigned int, unsigned long); | 247 | long nilfs_ioctl(struct file *, unsigned int, unsigned long); |
248 | long nilfs_compat_ioctl(struct file *file, unsigned int cmd, unsigned long arg); | ||
232 | int nilfs_ioctl_prepare_clean_segments(struct the_nilfs *, struct nilfs_argv *, | 249 | int nilfs_ioctl_prepare_clean_segments(struct the_nilfs *, struct nilfs_argv *, |
233 | void **); | 250 | void **); |
234 | 251 | ||
235 | /* inode.c */ | 252 | /* inode.c */ |
253 | void nilfs_inode_add_blocks(struct inode *inode, int n); | ||
254 | void nilfs_inode_sub_blocks(struct inode *inode, int n); | ||
236 | extern struct inode *nilfs_new_inode(struct inode *, int); | 255 | extern struct inode *nilfs_new_inode(struct inode *, int); |
237 | extern void nilfs_free_inode(struct inode *); | 256 | extern void nilfs_free_inode(struct inode *); |
238 | extern int nilfs_get_block(struct inode *, sector_t, struct buffer_head *, int); | 257 | extern int nilfs_get_block(struct inode *, sector_t, struct buffer_head *, int); |
@@ -275,11 +294,11 @@ extern int nilfs_check_feature_compatibility(struct super_block *, | |||
275 | struct nilfs_super_block *); | 294 | struct nilfs_super_block *); |
276 | extern void nilfs_set_log_cursor(struct nilfs_super_block *, | 295 | extern void nilfs_set_log_cursor(struct nilfs_super_block *, |
277 | struct the_nilfs *); | 296 | struct the_nilfs *); |
278 | extern struct nilfs_super_block **nilfs_prepare_super(struct nilfs_sb_info *, | 297 | struct nilfs_super_block **nilfs_prepare_super(struct super_block *sb, |
279 | int flip); | 298 | int flip); |
280 | extern int nilfs_commit_super(struct nilfs_sb_info *, int); | 299 | int nilfs_commit_super(struct super_block *sb, int flag); |
281 | extern int nilfs_cleanup_super(struct nilfs_sb_info *); | 300 | int nilfs_cleanup_super(struct super_block *sb); |
282 | int nilfs_attach_checkpoint(struct nilfs_sb_info *sbi, __u64 cno, int curr_mnt, | 301 | int nilfs_attach_checkpoint(struct super_block *sb, __u64 cno, int curr_mnt, |
283 | struct nilfs_root **root); | 302 | struct nilfs_root **root); |
284 | int nilfs_checkpoint_is_mounted(struct super_block *sb, __u64 cno); | 303 | int nilfs_checkpoint_is_mounted(struct super_block *sb, __u64 cno); |
285 | 304 | ||
diff --git a/fs/nilfs2/recovery.c b/fs/nilfs2/recovery.c index 3dfcd3b7d389..ba4a64518f38 100644 --- a/fs/nilfs2/recovery.c +++ b/fs/nilfs2/recovery.c | |||
@@ -425,7 +425,7 @@ void nilfs_dispose_segment_list(struct list_head *head) | |||
425 | } | 425 | } |
426 | 426 | ||
427 | static int nilfs_prepare_segment_for_recovery(struct the_nilfs *nilfs, | 427 | static int nilfs_prepare_segment_for_recovery(struct the_nilfs *nilfs, |
428 | struct nilfs_sb_info *sbi, | 428 | struct super_block *sb, |
429 | struct nilfs_recovery_info *ri) | 429 | struct nilfs_recovery_info *ri) |
430 | { | 430 | { |
431 | struct list_head *head = &ri->ri_used_segments; | 431 | struct list_head *head = &ri->ri_used_segments; |
@@ -501,7 +501,7 @@ static int nilfs_recovery_copy_block(struct the_nilfs *nilfs, | |||
501 | } | 501 | } |
502 | 502 | ||
503 | static int nilfs_recover_dsync_blocks(struct the_nilfs *nilfs, | 503 | static int nilfs_recover_dsync_blocks(struct the_nilfs *nilfs, |
504 | struct nilfs_sb_info *sbi, | 504 | struct super_block *sb, |
505 | struct nilfs_root *root, | 505 | struct nilfs_root *root, |
506 | struct list_head *head, | 506 | struct list_head *head, |
507 | unsigned long *nr_salvaged_blocks) | 507 | unsigned long *nr_salvaged_blocks) |
@@ -514,7 +514,7 @@ static int nilfs_recover_dsync_blocks(struct the_nilfs *nilfs, | |||
514 | int err = 0, err2 = 0; | 514 | int err = 0, err2 = 0; |
515 | 515 | ||
516 | list_for_each_entry_safe(rb, n, head, list) { | 516 | list_for_each_entry_safe(rb, n, head, list) { |
517 | inode = nilfs_iget(sbi->s_super, root, rb->ino); | 517 | inode = nilfs_iget(sb, root, rb->ino); |
518 | if (IS_ERR(inode)) { | 518 | if (IS_ERR(inode)) { |
519 | err = PTR_ERR(inode); | 519 | err = PTR_ERR(inode); |
520 | inode = NULL; | 520 | inode = NULL; |
@@ -572,11 +572,11 @@ static int nilfs_recover_dsync_blocks(struct the_nilfs *nilfs, | |||
572 | * nilfs_do_roll_forward - salvage logical segments newer than the latest | 572 | * nilfs_do_roll_forward - salvage logical segments newer than the latest |
573 | * checkpoint | 573 | * checkpoint |
574 | * @nilfs: nilfs object | 574 | * @nilfs: nilfs object |
575 | * @sbi: nilfs_sb_info | 575 | * @sb: super block instance |
576 | * @ri: pointer to a nilfs_recovery_info | 576 | * @ri: pointer to a nilfs_recovery_info |
577 | */ | 577 | */ |
578 | static int nilfs_do_roll_forward(struct the_nilfs *nilfs, | 578 | static int nilfs_do_roll_forward(struct the_nilfs *nilfs, |
579 | struct nilfs_sb_info *sbi, | 579 | struct super_block *sb, |
580 | struct nilfs_root *root, | 580 | struct nilfs_root *root, |
581 | struct nilfs_recovery_info *ri) | 581 | struct nilfs_recovery_info *ri) |
582 | { | 582 | { |
@@ -648,7 +648,7 @@ static int nilfs_do_roll_forward(struct the_nilfs *nilfs, | |||
648 | goto failed; | 648 | goto failed; |
649 | if (flags & NILFS_SS_LOGEND) { | 649 | if (flags & NILFS_SS_LOGEND) { |
650 | err = nilfs_recover_dsync_blocks( | 650 | err = nilfs_recover_dsync_blocks( |
651 | nilfs, sbi, root, &dsync_blocks, | 651 | nilfs, sb, root, &dsync_blocks, |
652 | &nsalvaged_blocks); | 652 | &nsalvaged_blocks); |
653 | if (unlikely(err)) | 653 | if (unlikely(err)) |
654 | goto failed; | 654 | goto failed; |
@@ -681,7 +681,7 @@ static int nilfs_do_roll_forward(struct the_nilfs *nilfs, | |||
681 | 681 | ||
682 | if (nsalvaged_blocks) { | 682 | if (nsalvaged_blocks) { |
683 | printk(KERN_INFO "NILFS (device %s): salvaged %lu blocks\n", | 683 | printk(KERN_INFO "NILFS (device %s): salvaged %lu blocks\n", |
684 | sbi->s_super->s_id, nsalvaged_blocks); | 684 | sb->s_id, nsalvaged_blocks); |
685 | ri->ri_need_recovery = NILFS_RECOVERY_ROLLFORWARD_DONE; | 685 | ri->ri_need_recovery = NILFS_RECOVERY_ROLLFORWARD_DONE; |
686 | } | 686 | } |
687 | out: | 687 | out: |
@@ -695,7 +695,7 @@ static int nilfs_do_roll_forward(struct the_nilfs *nilfs, | |||
695 | printk(KERN_ERR | 695 | printk(KERN_ERR |
696 | "NILFS (device %s): Error roll-forwarding " | 696 | "NILFS (device %s): Error roll-forwarding " |
697 | "(err=%d, pseg block=%llu). ", | 697 | "(err=%d, pseg block=%llu). ", |
698 | sbi->s_super->s_id, err, (unsigned long long)pseg_start); | 698 | sb->s_id, err, (unsigned long long)pseg_start); |
699 | goto out; | 699 | goto out; |
700 | } | 700 | } |
701 | 701 | ||
@@ -724,7 +724,7 @@ static void nilfs_finish_roll_forward(struct the_nilfs *nilfs, | |||
724 | /** | 724 | /** |
725 | * nilfs_salvage_orphan_logs - salvage logs written after the latest checkpoint | 725 | * nilfs_salvage_orphan_logs - salvage logs written after the latest checkpoint |
726 | * @nilfs: nilfs object | 726 | * @nilfs: nilfs object |
727 | * @sbi: nilfs_sb_info | 727 | * @sb: super block instance |
728 | * @ri: pointer to a nilfs_recovery_info struct to store search results. | 728 | * @ri: pointer to a nilfs_recovery_info struct to store search results. |
729 | * | 729 | * |
730 | * Return Value: On success, 0 is returned. On error, one of the following | 730 | * Return Value: On success, 0 is returned. On error, one of the following |
@@ -741,7 +741,7 @@ static void nilfs_finish_roll_forward(struct the_nilfs *nilfs, | |||
741 | * %-ENOMEM - Insufficient memory available. | 741 | * %-ENOMEM - Insufficient memory available. |
742 | */ | 742 | */ |
743 | int nilfs_salvage_orphan_logs(struct the_nilfs *nilfs, | 743 | int nilfs_salvage_orphan_logs(struct the_nilfs *nilfs, |
744 | struct nilfs_sb_info *sbi, | 744 | struct super_block *sb, |
745 | struct nilfs_recovery_info *ri) | 745 | struct nilfs_recovery_info *ri) |
746 | { | 746 | { |
747 | struct nilfs_root *root; | 747 | struct nilfs_root *root; |
@@ -750,32 +750,32 @@ int nilfs_salvage_orphan_logs(struct the_nilfs *nilfs, | |||
750 | if (ri->ri_lsegs_start == 0 || ri->ri_lsegs_end == 0) | 750 | if (ri->ri_lsegs_start == 0 || ri->ri_lsegs_end == 0) |
751 | return 0; | 751 | return 0; |
752 | 752 | ||
753 | err = nilfs_attach_checkpoint(sbi, ri->ri_cno, true, &root); | 753 | err = nilfs_attach_checkpoint(sb, ri->ri_cno, true, &root); |
754 | if (unlikely(err)) { | 754 | if (unlikely(err)) { |
755 | printk(KERN_ERR | 755 | printk(KERN_ERR |
756 | "NILFS: error loading the latest checkpoint.\n"); | 756 | "NILFS: error loading the latest checkpoint.\n"); |
757 | return err; | 757 | return err; |
758 | } | 758 | } |
759 | 759 | ||
760 | err = nilfs_do_roll_forward(nilfs, sbi, root, ri); | 760 | err = nilfs_do_roll_forward(nilfs, sb, root, ri); |
761 | if (unlikely(err)) | 761 | if (unlikely(err)) |
762 | goto failed; | 762 | goto failed; |
763 | 763 | ||
764 | if (ri->ri_need_recovery == NILFS_RECOVERY_ROLLFORWARD_DONE) { | 764 | if (ri->ri_need_recovery == NILFS_RECOVERY_ROLLFORWARD_DONE) { |
765 | err = nilfs_prepare_segment_for_recovery(nilfs, sbi, ri); | 765 | err = nilfs_prepare_segment_for_recovery(nilfs, sb, ri); |
766 | if (unlikely(err)) { | 766 | if (unlikely(err)) { |
767 | printk(KERN_ERR "NILFS: Error preparing segments for " | 767 | printk(KERN_ERR "NILFS: Error preparing segments for " |
768 | "recovery.\n"); | 768 | "recovery.\n"); |
769 | goto failed; | 769 | goto failed; |
770 | } | 770 | } |
771 | 771 | ||
772 | err = nilfs_attach_segment_constructor(sbi, root); | 772 | err = nilfs_attach_log_writer(sb, root); |
773 | if (unlikely(err)) | 773 | if (unlikely(err)) |
774 | goto failed; | 774 | goto failed; |
775 | 775 | ||
776 | set_nilfs_discontinued(nilfs); | 776 | set_nilfs_discontinued(nilfs); |
777 | err = nilfs_construct_segment(sbi->s_super); | 777 | err = nilfs_construct_segment(sb); |
778 | nilfs_detach_segment_constructor(sbi); | 778 | nilfs_detach_log_writer(sb); |
779 | 779 | ||
780 | if (unlikely(err)) { | 780 | if (unlikely(err)) { |
781 | printk(KERN_ERR "NILFS: Oops! recovery failed. " | 781 | printk(KERN_ERR "NILFS: Oops! recovery failed. " |
diff --git a/fs/nilfs2/sb.h b/fs/nilfs2/sb.h deleted file mode 100644 index 7a17715f215f..000000000000 --- a/fs/nilfs2/sb.h +++ /dev/null | |||
@@ -1,85 +0,0 @@ | |||
1 | /* | ||
2 | * sb.h - NILFS on-memory super block structure. | ||
3 | * | ||
4 | * Copyright (C) 2005-2008 Nippon Telegraph and Telephone Corporation. | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or modify | ||
7 | * it under the terms of the GNU General Public License as published by | ||
8 | * the Free Software Foundation; either version 2 of the License, or | ||
9 | * (at your option) any later version. | ||
10 | * | ||
11 | * This program is distributed in the hope that it will be useful, | ||
12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
14 | * GNU General Public License for more details. | ||
15 | * | ||
16 | * You should have received a copy of the GNU General Public License | ||
17 | * along with this program; if not, write to the Free Software | ||
18 | * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | ||
19 | * | ||
20 | * Written by Ryusuke Konishi <ryusuke@osrg.net> | ||
21 | * | ||
22 | */ | ||
23 | |||
24 | #ifndef _NILFS_SB | ||
25 | #define _NILFS_SB | ||
26 | |||
27 | #include <linux/types.h> | ||
28 | #include <linux/fs.h> | ||
29 | |||
30 | struct the_nilfs; | ||
31 | struct nilfs_sc_info; | ||
32 | |||
33 | /* | ||
34 | * NILFS super-block data in memory | ||
35 | */ | ||
36 | struct nilfs_sb_info { | ||
37 | /* Mount options */ | ||
38 | unsigned long s_mount_opt; | ||
39 | uid_t s_resuid; | ||
40 | gid_t s_resgid; | ||
41 | |||
42 | unsigned long s_interval; /* construction interval */ | ||
43 | unsigned long s_watermark; /* threshold of data amount | ||
44 | for the segment construction */ | ||
45 | |||
46 | /* Fundamental members */ | ||
47 | struct super_block *s_super; /* reverse pointer to super_block */ | ||
48 | struct the_nilfs *s_nilfs; | ||
49 | |||
50 | /* Segment constructor */ | ||
51 | struct list_head s_dirty_files; /* dirty files list */ | ||
52 | struct nilfs_sc_info *s_sc_info; /* segment constructor info */ | ||
53 | spinlock_t s_inode_lock; /* Lock for the nilfs inode. | ||
54 | It covers s_dirty_files list */ | ||
55 | |||
56 | /* Inode allocator */ | ||
57 | spinlock_t s_next_gen_lock; | ||
58 | u32 s_next_generation; | ||
59 | }; | ||
60 | |||
61 | static inline struct nilfs_sb_info *NILFS_SB(struct super_block *sb) | ||
62 | { | ||
63 | return sb->s_fs_info; | ||
64 | } | ||
65 | |||
66 | static inline struct nilfs_sc_info *NILFS_SC(struct nilfs_sb_info *sbi) | ||
67 | { | ||
68 | return sbi->s_sc_info; | ||
69 | } | ||
70 | |||
71 | /* | ||
72 | * Bit operations for the mount option | ||
73 | */ | ||
74 | #define nilfs_clear_opt(sbi, opt) \ | ||
75 | do { (sbi)->s_mount_opt &= ~NILFS_MOUNT_##opt; } while (0) | ||
76 | #define nilfs_set_opt(sbi, opt) \ | ||
77 | do { (sbi)->s_mount_opt |= NILFS_MOUNT_##opt; } while (0) | ||
78 | #define nilfs_test_opt(sbi, opt) ((sbi)->s_mount_opt & NILFS_MOUNT_##opt) | ||
79 | #define nilfs_write_opt(sbi, mask, opt) \ | ||
80 | do { (sbi)->s_mount_opt = \ | ||
81 | (((sbi)->s_mount_opt & ~NILFS_MOUNT_##mask) | \ | ||
82 | NILFS_MOUNT_##opt); \ | ||
83 | } while (0) | ||
84 | |||
85 | #endif /* _NILFS_SB */ | ||
diff --git a/fs/nilfs2/segment.c b/fs/nilfs2/segment.c index 2de9f636792a..afe4f2183454 100644 --- a/fs/nilfs2/segment.c +++ b/fs/nilfs2/segment.c | |||
@@ -104,8 +104,7 @@ struct nilfs_sc_operations { | |||
104 | static void nilfs_segctor_start_timer(struct nilfs_sc_info *); | 104 | static void nilfs_segctor_start_timer(struct nilfs_sc_info *); |
105 | static void nilfs_segctor_do_flush(struct nilfs_sc_info *, int); | 105 | static void nilfs_segctor_do_flush(struct nilfs_sc_info *, int); |
106 | static void nilfs_segctor_do_immediate_flush(struct nilfs_sc_info *); | 106 | static void nilfs_segctor_do_immediate_flush(struct nilfs_sc_info *); |
107 | static void nilfs_dispose_list(struct nilfs_sb_info *, struct list_head *, | 107 | static void nilfs_dispose_list(struct the_nilfs *, struct list_head *, int); |
108 | int); | ||
109 | 108 | ||
110 | #define nilfs_cnt32_gt(a, b) \ | 109 | #define nilfs_cnt32_gt(a, b) \ |
111 | (typecheck(__u32, a) && typecheck(__u32, b) && \ | 110 | (typecheck(__u32, a) && typecheck(__u32, b) && \ |
@@ -182,7 +181,6 @@ int nilfs_transaction_begin(struct super_block *sb, | |||
182 | struct nilfs_transaction_info *ti, | 181 | struct nilfs_transaction_info *ti, |
183 | int vacancy_check) | 182 | int vacancy_check) |
184 | { | 183 | { |
185 | struct nilfs_sb_info *sbi; | ||
186 | struct the_nilfs *nilfs; | 184 | struct the_nilfs *nilfs; |
187 | int ret = nilfs_prepare_segment_lock(ti); | 185 | int ret = nilfs_prepare_segment_lock(ti); |
188 | 186 | ||
@@ -193,8 +191,7 @@ int nilfs_transaction_begin(struct super_block *sb, | |||
193 | 191 | ||
194 | vfs_check_frozen(sb, SB_FREEZE_WRITE); | 192 | vfs_check_frozen(sb, SB_FREEZE_WRITE); |
195 | 193 | ||
196 | sbi = NILFS_SB(sb); | 194 | nilfs = sb->s_fs_info; |
197 | nilfs = sbi->s_nilfs; | ||
198 | down_read(&nilfs->ns_segctor_sem); | 195 | down_read(&nilfs->ns_segctor_sem); |
199 | if (vacancy_check && nilfs_near_disk_full(nilfs)) { | 196 | if (vacancy_check && nilfs_near_disk_full(nilfs)) { |
200 | up_read(&nilfs->ns_segctor_sem); | 197 | up_read(&nilfs->ns_segctor_sem); |
@@ -225,8 +222,7 @@ int nilfs_transaction_begin(struct super_block *sb, | |||
225 | int nilfs_transaction_commit(struct super_block *sb) | 222 | int nilfs_transaction_commit(struct super_block *sb) |
226 | { | 223 | { |
227 | struct nilfs_transaction_info *ti = current->journal_info; | 224 | struct nilfs_transaction_info *ti = current->journal_info; |
228 | struct nilfs_sb_info *sbi; | 225 | struct the_nilfs *nilfs = sb->s_fs_info; |
229 | struct nilfs_sc_info *sci; | ||
230 | int err = 0; | 226 | int err = 0; |
231 | 227 | ||
232 | BUG_ON(ti == NULL || ti->ti_magic != NILFS_TI_MAGIC); | 228 | BUG_ON(ti == NULL || ti->ti_magic != NILFS_TI_MAGIC); |
@@ -235,16 +231,15 @@ int nilfs_transaction_commit(struct super_block *sb) | |||
235 | ti->ti_count--; | 231 | ti->ti_count--; |
236 | return 0; | 232 | return 0; |
237 | } | 233 | } |
238 | sbi = NILFS_SB(sb); | 234 | if (nilfs->ns_writer) { |
239 | sci = NILFS_SC(sbi); | 235 | struct nilfs_sc_info *sci = nilfs->ns_writer; |
240 | if (sci != NULL) { | 236 | |
241 | if (ti->ti_flags & NILFS_TI_COMMIT) | 237 | if (ti->ti_flags & NILFS_TI_COMMIT) |
242 | nilfs_segctor_start_timer(sci); | 238 | nilfs_segctor_start_timer(sci); |
243 | if (atomic_read(&sbi->s_nilfs->ns_ndirtyblks) > | 239 | if (atomic_read(&nilfs->ns_ndirtyblks) > sci->sc_watermark) |
244 | sci->sc_watermark) | ||
245 | nilfs_segctor_do_flush(sci, 0); | 240 | nilfs_segctor_do_flush(sci, 0); |
246 | } | 241 | } |
247 | up_read(&sbi->s_nilfs->ns_segctor_sem); | 242 | up_read(&nilfs->ns_segctor_sem); |
248 | current->journal_info = ti->ti_save; | 243 | current->journal_info = ti->ti_save; |
249 | 244 | ||
250 | if (ti->ti_flags & NILFS_TI_SYNC) | 245 | if (ti->ti_flags & NILFS_TI_SYNC) |
@@ -257,13 +252,14 @@ int nilfs_transaction_commit(struct super_block *sb) | |||
257 | void nilfs_transaction_abort(struct super_block *sb) | 252 | void nilfs_transaction_abort(struct super_block *sb) |
258 | { | 253 | { |
259 | struct nilfs_transaction_info *ti = current->journal_info; | 254 | struct nilfs_transaction_info *ti = current->journal_info; |
255 | struct the_nilfs *nilfs = sb->s_fs_info; | ||
260 | 256 | ||
261 | BUG_ON(ti == NULL || ti->ti_magic != NILFS_TI_MAGIC); | 257 | BUG_ON(ti == NULL || ti->ti_magic != NILFS_TI_MAGIC); |
262 | if (ti->ti_count > 0) { | 258 | if (ti->ti_count > 0) { |
263 | ti->ti_count--; | 259 | ti->ti_count--; |
264 | return; | 260 | return; |
265 | } | 261 | } |
266 | up_read(&NILFS_SB(sb)->s_nilfs->ns_segctor_sem); | 262 | up_read(&nilfs->ns_segctor_sem); |
267 | 263 | ||
268 | current->journal_info = ti->ti_save; | 264 | current->journal_info = ti->ti_save; |
269 | if (ti->ti_flags & NILFS_TI_DYNAMIC_ALLOC) | 265 | if (ti->ti_flags & NILFS_TI_DYNAMIC_ALLOC) |
@@ -272,9 +268,8 @@ void nilfs_transaction_abort(struct super_block *sb) | |||
272 | 268 | ||
273 | void nilfs_relax_pressure_in_lock(struct super_block *sb) | 269 | void nilfs_relax_pressure_in_lock(struct super_block *sb) |
274 | { | 270 | { |
275 | struct nilfs_sb_info *sbi = NILFS_SB(sb); | 271 | struct the_nilfs *nilfs = sb->s_fs_info; |
276 | struct nilfs_sc_info *sci = NILFS_SC(sbi); | 272 | struct nilfs_sc_info *sci = nilfs->ns_writer; |
277 | struct the_nilfs *nilfs = sbi->s_nilfs; | ||
278 | 273 | ||
279 | if (!sci || !sci->sc_flush_request) | 274 | if (!sci || !sci->sc_flush_request) |
280 | return; | 275 | return; |
@@ -294,11 +289,13 @@ void nilfs_relax_pressure_in_lock(struct super_block *sb) | |||
294 | downgrade_write(&nilfs->ns_segctor_sem); | 289 | downgrade_write(&nilfs->ns_segctor_sem); |
295 | } | 290 | } |
296 | 291 | ||
297 | static void nilfs_transaction_lock(struct nilfs_sb_info *sbi, | 292 | static void nilfs_transaction_lock(struct super_block *sb, |
298 | struct nilfs_transaction_info *ti, | 293 | struct nilfs_transaction_info *ti, |
299 | int gcflag) | 294 | int gcflag) |
300 | { | 295 | { |
301 | struct nilfs_transaction_info *cur_ti = current->journal_info; | 296 | struct nilfs_transaction_info *cur_ti = current->journal_info; |
297 | struct the_nilfs *nilfs = sb->s_fs_info; | ||
298 | struct nilfs_sc_info *sci = nilfs->ns_writer; | ||
302 | 299 | ||
303 | WARN_ON(cur_ti); | 300 | WARN_ON(cur_ti); |
304 | ti->ti_flags = NILFS_TI_WRITER; | 301 | ti->ti_flags = NILFS_TI_WRITER; |
@@ -309,30 +306,31 @@ static void nilfs_transaction_lock(struct nilfs_sb_info *sbi, | |||
309 | current->journal_info = ti; | 306 | current->journal_info = ti; |
310 | 307 | ||
311 | for (;;) { | 308 | for (;;) { |
312 | down_write(&sbi->s_nilfs->ns_segctor_sem); | 309 | down_write(&nilfs->ns_segctor_sem); |
313 | if (!test_bit(NILFS_SC_PRIOR_FLUSH, &NILFS_SC(sbi)->sc_flags)) | 310 | if (!test_bit(NILFS_SC_PRIOR_FLUSH, &sci->sc_flags)) |
314 | break; | 311 | break; |
315 | 312 | ||
316 | nilfs_segctor_do_immediate_flush(NILFS_SC(sbi)); | 313 | nilfs_segctor_do_immediate_flush(sci); |
317 | 314 | ||
318 | up_write(&sbi->s_nilfs->ns_segctor_sem); | 315 | up_write(&nilfs->ns_segctor_sem); |
319 | yield(); | 316 | yield(); |
320 | } | 317 | } |
321 | if (gcflag) | 318 | if (gcflag) |
322 | ti->ti_flags |= NILFS_TI_GC; | 319 | ti->ti_flags |= NILFS_TI_GC; |
323 | } | 320 | } |
324 | 321 | ||
325 | static void nilfs_transaction_unlock(struct nilfs_sb_info *sbi) | 322 | static void nilfs_transaction_unlock(struct super_block *sb) |
326 | { | 323 | { |
327 | struct nilfs_transaction_info *ti = current->journal_info; | 324 | struct nilfs_transaction_info *ti = current->journal_info; |
325 | struct the_nilfs *nilfs = sb->s_fs_info; | ||
328 | 326 | ||
329 | BUG_ON(ti == NULL || ti->ti_magic != NILFS_TI_MAGIC); | 327 | BUG_ON(ti == NULL || ti->ti_magic != NILFS_TI_MAGIC); |
330 | BUG_ON(ti->ti_count > 0); | 328 | BUG_ON(ti->ti_count > 0); |
331 | 329 | ||
332 | up_write(&sbi->s_nilfs->ns_segctor_sem); | 330 | up_write(&nilfs->ns_segctor_sem); |
333 | current->journal_info = ti->ti_save; | 331 | current->journal_info = ti->ti_save; |
334 | if (!list_empty(&ti->ti_garbage)) | 332 | if (!list_empty(&ti->ti_garbage)) |
335 | nilfs_dispose_list(sbi, &ti->ti_garbage, 0); | 333 | nilfs_dispose_list(nilfs, &ti->ti_garbage, 0); |
336 | } | 334 | } |
337 | 335 | ||
338 | static void *nilfs_segctor_map_segsum_entry(struct nilfs_sc_info *sci, | 336 | static void *nilfs_segctor_map_segsum_entry(struct nilfs_sc_info *sci, |
@@ -714,7 +712,7 @@ static void nilfs_lookup_dirty_node_buffers(struct inode *inode, | |||
714 | } | 712 | } |
715 | } | 713 | } |
716 | 714 | ||
717 | static void nilfs_dispose_list(struct nilfs_sb_info *sbi, | 715 | static void nilfs_dispose_list(struct the_nilfs *nilfs, |
718 | struct list_head *head, int force) | 716 | struct list_head *head, int force) |
719 | { | 717 | { |
720 | struct nilfs_inode_info *ii, *n; | 718 | struct nilfs_inode_info *ii, *n; |
@@ -722,7 +720,7 @@ static void nilfs_dispose_list(struct nilfs_sb_info *sbi, | |||
722 | unsigned nv = 0; | 720 | unsigned nv = 0; |
723 | 721 | ||
724 | while (!list_empty(head)) { | 722 | while (!list_empty(head)) { |
725 | spin_lock(&sbi->s_inode_lock); | 723 | spin_lock(&nilfs->ns_inode_lock); |
726 | list_for_each_entry_safe(ii, n, head, i_dirty) { | 724 | list_for_each_entry_safe(ii, n, head, i_dirty) { |
727 | list_del_init(&ii->i_dirty); | 725 | list_del_init(&ii->i_dirty); |
728 | if (force) { | 726 | if (force) { |
@@ -733,14 +731,14 @@ static void nilfs_dispose_list(struct nilfs_sb_info *sbi, | |||
733 | } else if (test_bit(NILFS_I_DIRTY, &ii->i_state)) { | 731 | } else if (test_bit(NILFS_I_DIRTY, &ii->i_state)) { |
734 | set_bit(NILFS_I_QUEUED, &ii->i_state); | 732 | set_bit(NILFS_I_QUEUED, &ii->i_state); |
735 | list_add_tail(&ii->i_dirty, | 733 | list_add_tail(&ii->i_dirty, |
736 | &sbi->s_dirty_files); | 734 | &nilfs->ns_dirty_files); |
737 | continue; | 735 | continue; |
738 | } | 736 | } |
739 | ivec[nv++] = ii; | 737 | ivec[nv++] = ii; |
740 | if (nv == SC_N_INODEVEC) | 738 | if (nv == SC_N_INODEVEC) |
741 | break; | 739 | break; |
742 | } | 740 | } |
743 | spin_unlock(&sbi->s_inode_lock); | 741 | spin_unlock(&nilfs->ns_inode_lock); |
744 | 742 | ||
745 | for (pii = ivec; nv > 0; pii++, nv--) | 743 | for (pii = ivec; nv > 0; pii++, nv--) |
746 | iput(&(*pii)->vfs_inode); | 744 | iput(&(*pii)->vfs_inode); |
@@ -773,24 +771,23 @@ static int nilfs_segctor_clean(struct nilfs_sc_info *sci) | |||
773 | 771 | ||
774 | static int nilfs_segctor_confirm(struct nilfs_sc_info *sci) | 772 | static int nilfs_segctor_confirm(struct nilfs_sc_info *sci) |
775 | { | 773 | { |
776 | struct nilfs_sb_info *sbi = sci->sc_sbi; | 774 | struct the_nilfs *nilfs = sci->sc_super->s_fs_info; |
777 | int ret = 0; | 775 | int ret = 0; |
778 | 776 | ||
779 | if (nilfs_test_metadata_dirty(sbi->s_nilfs, sci->sc_root)) | 777 | if (nilfs_test_metadata_dirty(nilfs, sci->sc_root)) |
780 | set_bit(NILFS_SC_DIRTY, &sci->sc_flags); | 778 | set_bit(NILFS_SC_DIRTY, &sci->sc_flags); |
781 | 779 | ||
782 | spin_lock(&sbi->s_inode_lock); | 780 | spin_lock(&nilfs->ns_inode_lock); |
783 | if (list_empty(&sbi->s_dirty_files) && nilfs_segctor_clean(sci)) | 781 | if (list_empty(&nilfs->ns_dirty_files) && nilfs_segctor_clean(sci)) |
784 | ret++; | 782 | ret++; |
785 | 783 | ||
786 | spin_unlock(&sbi->s_inode_lock); | 784 | spin_unlock(&nilfs->ns_inode_lock); |
787 | return ret; | 785 | return ret; |
788 | } | 786 | } |
789 | 787 | ||
790 | static void nilfs_segctor_clear_metadata_dirty(struct nilfs_sc_info *sci) | 788 | static void nilfs_segctor_clear_metadata_dirty(struct nilfs_sc_info *sci) |
791 | { | 789 | { |
792 | struct nilfs_sb_info *sbi = sci->sc_sbi; | 790 | struct the_nilfs *nilfs = sci->sc_super->s_fs_info; |
793 | struct the_nilfs *nilfs = sbi->s_nilfs; | ||
794 | 791 | ||
795 | nilfs_mdt_clear_dirty(sci->sc_root->ifile); | 792 | nilfs_mdt_clear_dirty(sci->sc_root->ifile); |
796 | nilfs_mdt_clear_dirty(nilfs->ns_cpfile); | 793 | nilfs_mdt_clear_dirty(nilfs->ns_cpfile); |
@@ -800,7 +797,7 @@ static void nilfs_segctor_clear_metadata_dirty(struct nilfs_sc_info *sci) | |||
800 | 797 | ||
801 | static int nilfs_segctor_create_checkpoint(struct nilfs_sc_info *sci) | 798 | static int nilfs_segctor_create_checkpoint(struct nilfs_sc_info *sci) |
802 | { | 799 | { |
803 | struct the_nilfs *nilfs = sci->sc_sbi->s_nilfs; | 800 | struct the_nilfs *nilfs = sci->sc_super->s_fs_info; |
804 | struct buffer_head *bh_cp; | 801 | struct buffer_head *bh_cp; |
805 | struct nilfs_checkpoint *raw_cp; | 802 | struct nilfs_checkpoint *raw_cp; |
806 | int err; | 803 | int err; |
@@ -824,8 +821,7 @@ static int nilfs_segctor_create_checkpoint(struct nilfs_sc_info *sci) | |||
824 | 821 | ||
825 | static int nilfs_segctor_fill_in_checkpoint(struct nilfs_sc_info *sci) | 822 | static int nilfs_segctor_fill_in_checkpoint(struct nilfs_sc_info *sci) |
826 | { | 823 | { |
827 | struct nilfs_sb_info *sbi = sci->sc_sbi; | 824 | struct the_nilfs *nilfs = sci->sc_super->s_fs_info; |
828 | struct the_nilfs *nilfs = sbi->s_nilfs; | ||
829 | struct buffer_head *bh_cp; | 825 | struct buffer_head *bh_cp; |
830 | struct nilfs_checkpoint *raw_cp; | 826 | struct nilfs_checkpoint *raw_cp; |
831 | int err; | 827 | int err; |
@@ -1049,8 +1045,7 @@ static int nilfs_segctor_scan_file_dsync(struct nilfs_sc_info *sci, | |||
1049 | 1045 | ||
1050 | static int nilfs_segctor_collect_blocks(struct nilfs_sc_info *sci, int mode) | 1046 | static int nilfs_segctor_collect_blocks(struct nilfs_sc_info *sci, int mode) |
1051 | { | 1047 | { |
1052 | struct nilfs_sb_info *sbi = sci->sc_sbi; | 1048 | struct the_nilfs *nilfs = sci->sc_super->s_fs_info; |
1053 | struct the_nilfs *nilfs = sbi->s_nilfs; | ||
1054 | struct list_head *head; | 1049 | struct list_head *head; |
1055 | struct nilfs_inode_info *ii; | 1050 | struct nilfs_inode_info *ii; |
1056 | size_t ndone; | 1051 | size_t ndone; |
@@ -1859,7 +1854,7 @@ static void nilfs_segctor_complete_write(struct nilfs_sc_info *sci) | |||
1859 | { | 1854 | { |
1860 | struct nilfs_segment_buffer *segbuf; | 1855 | struct nilfs_segment_buffer *segbuf; |
1861 | struct page *bd_page = NULL, *fs_page = NULL; | 1856 | struct page *bd_page = NULL, *fs_page = NULL; |
1862 | struct the_nilfs *nilfs = sci->sc_sbi->s_nilfs; | 1857 | struct the_nilfs *nilfs = sci->sc_super->s_fs_info; |
1863 | int update_sr = false; | 1858 | int update_sr = false; |
1864 | 1859 | ||
1865 | list_for_each_entry(segbuf, &sci->sc_write_logs, sb_list) { | 1860 | list_for_each_entry(segbuf, &sci->sc_write_logs, sb_list) { |
@@ -1963,30 +1958,30 @@ static int nilfs_segctor_wait(struct nilfs_sc_info *sci) | |||
1963 | return ret; | 1958 | return ret; |
1964 | } | 1959 | } |
1965 | 1960 | ||
1966 | static int nilfs_segctor_check_in_files(struct nilfs_sc_info *sci, | 1961 | static int nilfs_segctor_collect_dirty_files(struct nilfs_sc_info *sci, |
1967 | struct nilfs_sb_info *sbi) | 1962 | struct the_nilfs *nilfs) |
1968 | { | 1963 | { |
1969 | struct nilfs_inode_info *ii, *n; | 1964 | struct nilfs_inode_info *ii, *n; |
1970 | struct inode *ifile = sci->sc_root->ifile; | 1965 | struct inode *ifile = sci->sc_root->ifile; |
1971 | 1966 | ||
1972 | spin_lock(&sbi->s_inode_lock); | 1967 | spin_lock(&nilfs->ns_inode_lock); |
1973 | retry: | 1968 | retry: |
1974 | list_for_each_entry_safe(ii, n, &sbi->s_dirty_files, i_dirty) { | 1969 | list_for_each_entry_safe(ii, n, &nilfs->ns_dirty_files, i_dirty) { |
1975 | if (!ii->i_bh) { | 1970 | if (!ii->i_bh) { |
1976 | struct buffer_head *ibh; | 1971 | struct buffer_head *ibh; |
1977 | int err; | 1972 | int err; |
1978 | 1973 | ||
1979 | spin_unlock(&sbi->s_inode_lock); | 1974 | spin_unlock(&nilfs->ns_inode_lock); |
1980 | err = nilfs_ifile_get_inode_block( | 1975 | err = nilfs_ifile_get_inode_block( |
1981 | ifile, ii->vfs_inode.i_ino, &ibh); | 1976 | ifile, ii->vfs_inode.i_ino, &ibh); |
1982 | if (unlikely(err)) { | 1977 | if (unlikely(err)) { |
1983 | nilfs_warning(sbi->s_super, __func__, | 1978 | nilfs_warning(sci->sc_super, __func__, |
1984 | "failed to get inode block.\n"); | 1979 | "failed to get inode block.\n"); |
1985 | return err; | 1980 | return err; |
1986 | } | 1981 | } |
1987 | nilfs_mdt_mark_buffer_dirty(ibh); | 1982 | nilfs_mdt_mark_buffer_dirty(ibh); |
1988 | nilfs_mdt_mark_dirty(ifile); | 1983 | nilfs_mdt_mark_dirty(ifile); |
1989 | spin_lock(&sbi->s_inode_lock); | 1984 | spin_lock(&nilfs->ns_inode_lock); |
1990 | if (likely(!ii->i_bh)) | 1985 | if (likely(!ii->i_bh)) |
1991 | ii->i_bh = ibh; | 1986 | ii->i_bh = ibh; |
1992 | else | 1987 | else |
@@ -1999,18 +1994,18 @@ static int nilfs_segctor_check_in_files(struct nilfs_sc_info *sci, | |||
1999 | list_del(&ii->i_dirty); | 1994 | list_del(&ii->i_dirty); |
2000 | list_add_tail(&ii->i_dirty, &sci->sc_dirty_files); | 1995 | list_add_tail(&ii->i_dirty, &sci->sc_dirty_files); |
2001 | } | 1996 | } |
2002 | spin_unlock(&sbi->s_inode_lock); | 1997 | spin_unlock(&nilfs->ns_inode_lock); |
2003 | 1998 | ||
2004 | return 0; | 1999 | return 0; |
2005 | } | 2000 | } |
2006 | 2001 | ||
2007 | static void nilfs_segctor_check_out_files(struct nilfs_sc_info *sci, | 2002 | static void nilfs_segctor_drop_written_files(struct nilfs_sc_info *sci, |
2008 | struct nilfs_sb_info *sbi) | 2003 | struct the_nilfs *nilfs) |
2009 | { | 2004 | { |
2010 | struct nilfs_transaction_info *ti = current->journal_info; | 2005 | struct nilfs_transaction_info *ti = current->journal_info; |
2011 | struct nilfs_inode_info *ii, *n; | 2006 | struct nilfs_inode_info *ii, *n; |
2012 | 2007 | ||
2013 | spin_lock(&sbi->s_inode_lock); | 2008 | spin_lock(&nilfs->ns_inode_lock); |
2014 | list_for_each_entry_safe(ii, n, &sci->sc_dirty_files, i_dirty) { | 2009 | list_for_each_entry_safe(ii, n, &sci->sc_dirty_files, i_dirty) { |
2015 | if (!test_and_clear_bit(NILFS_I_UPDATED, &ii->i_state) || | 2010 | if (!test_and_clear_bit(NILFS_I_UPDATED, &ii->i_state) || |
2016 | test_bit(NILFS_I_DIRTY, &ii->i_state)) | 2011 | test_bit(NILFS_I_DIRTY, &ii->i_state)) |
@@ -2022,7 +2017,7 @@ static void nilfs_segctor_check_out_files(struct nilfs_sc_info *sci, | |||
2022 | list_del(&ii->i_dirty); | 2017 | list_del(&ii->i_dirty); |
2023 | list_add_tail(&ii->i_dirty, &ti->ti_garbage); | 2018 | list_add_tail(&ii->i_dirty, &ti->ti_garbage); |
2024 | } | 2019 | } |
2025 | spin_unlock(&sbi->s_inode_lock); | 2020 | spin_unlock(&nilfs->ns_inode_lock); |
2026 | } | 2021 | } |
2027 | 2022 | ||
2028 | /* | 2023 | /* |
@@ -2030,15 +2025,14 @@ static void nilfs_segctor_check_out_files(struct nilfs_sc_info *sci, | |||
2030 | */ | 2025 | */ |
2031 | static int nilfs_segctor_do_construct(struct nilfs_sc_info *sci, int mode) | 2026 | static int nilfs_segctor_do_construct(struct nilfs_sc_info *sci, int mode) |
2032 | { | 2027 | { |
2033 | struct nilfs_sb_info *sbi = sci->sc_sbi; | 2028 | struct the_nilfs *nilfs = sci->sc_super->s_fs_info; |
2034 | struct the_nilfs *nilfs = sbi->s_nilfs; | ||
2035 | struct page *failed_page; | 2029 | struct page *failed_page; |
2036 | int err; | 2030 | int err; |
2037 | 2031 | ||
2038 | sci->sc_stage.scnt = NILFS_ST_INIT; | 2032 | sci->sc_stage.scnt = NILFS_ST_INIT; |
2039 | sci->sc_cno = nilfs->ns_cno; | 2033 | sci->sc_cno = nilfs->ns_cno; |
2040 | 2034 | ||
2041 | err = nilfs_segctor_check_in_files(sci, sbi); | 2035 | err = nilfs_segctor_collect_dirty_files(sci, nilfs); |
2042 | if (unlikely(err)) | 2036 | if (unlikely(err)) |
2043 | goto out; | 2037 | goto out; |
2044 | 2038 | ||
@@ -2116,7 +2110,7 @@ static int nilfs_segctor_do_construct(struct nilfs_sc_info *sci, int mode) | |||
2116 | } while (sci->sc_stage.scnt != NILFS_ST_DONE); | 2110 | } while (sci->sc_stage.scnt != NILFS_ST_DONE); |
2117 | 2111 | ||
2118 | out: | 2112 | out: |
2119 | nilfs_segctor_check_out_files(sci, sbi); | 2113 | nilfs_segctor_drop_written_files(sci, nilfs); |
2120 | return err; | 2114 | return err; |
2121 | 2115 | ||
2122 | failed_to_write: | 2116 | failed_to_write: |
@@ -2169,8 +2163,8 @@ static void nilfs_segctor_do_flush(struct nilfs_sc_info *sci, int bn) | |||
2169 | */ | 2163 | */ |
2170 | void nilfs_flush_segment(struct super_block *sb, ino_t ino) | 2164 | void nilfs_flush_segment(struct super_block *sb, ino_t ino) |
2171 | { | 2165 | { |
2172 | struct nilfs_sb_info *sbi = NILFS_SB(sb); | 2166 | struct the_nilfs *nilfs = sb->s_fs_info; |
2173 | struct nilfs_sc_info *sci = NILFS_SC(sbi); | 2167 | struct nilfs_sc_info *sci = nilfs->ns_writer; |
2174 | 2168 | ||
2175 | if (!sci || nilfs_doing_construction()) | 2169 | if (!sci || nilfs_doing_construction()) |
2176 | return; | 2170 | return; |
@@ -2259,8 +2253,8 @@ static void nilfs_segctor_wakeup(struct nilfs_sc_info *sci, int err) | |||
2259 | */ | 2253 | */ |
2260 | int nilfs_construct_segment(struct super_block *sb) | 2254 | int nilfs_construct_segment(struct super_block *sb) |
2261 | { | 2255 | { |
2262 | struct nilfs_sb_info *sbi = NILFS_SB(sb); | 2256 | struct the_nilfs *nilfs = sb->s_fs_info; |
2263 | struct nilfs_sc_info *sci = NILFS_SC(sbi); | 2257 | struct nilfs_sc_info *sci = nilfs->ns_writer; |
2264 | struct nilfs_transaction_info *ti; | 2258 | struct nilfs_transaction_info *ti; |
2265 | int err; | 2259 | int err; |
2266 | 2260 | ||
@@ -2297,8 +2291,8 @@ int nilfs_construct_segment(struct super_block *sb) | |||
2297 | int nilfs_construct_dsync_segment(struct super_block *sb, struct inode *inode, | 2291 | int nilfs_construct_dsync_segment(struct super_block *sb, struct inode *inode, |
2298 | loff_t start, loff_t end) | 2292 | loff_t start, loff_t end) |
2299 | { | 2293 | { |
2300 | struct nilfs_sb_info *sbi = NILFS_SB(sb); | 2294 | struct the_nilfs *nilfs = sb->s_fs_info; |
2301 | struct nilfs_sc_info *sci = NILFS_SC(sbi); | 2295 | struct nilfs_sc_info *sci = nilfs->ns_writer; |
2302 | struct nilfs_inode_info *ii; | 2296 | struct nilfs_inode_info *ii; |
2303 | struct nilfs_transaction_info ti; | 2297 | struct nilfs_transaction_info ti; |
2304 | int err = 0; | 2298 | int err = 0; |
@@ -2306,33 +2300,33 @@ int nilfs_construct_dsync_segment(struct super_block *sb, struct inode *inode, | |||
2306 | if (!sci) | 2300 | if (!sci) |
2307 | return -EROFS; | 2301 | return -EROFS; |
2308 | 2302 | ||
2309 | nilfs_transaction_lock(sbi, &ti, 0); | 2303 | nilfs_transaction_lock(sb, &ti, 0); |
2310 | 2304 | ||
2311 | ii = NILFS_I(inode); | 2305 | ii = NILFS_I(inode); |
2312 | if (test_bit(NILFS_I_INODE_DIRTY, &ii->i_state) || | 2306 | if (test_bit(NILFS_I_INODE_DIRTY, &ii->i_state) || |
2313 | nilfs_test_opt(sbi, STRICT_ORDER) || | 2307 | nilfs_test_opt(nilfs, STRICT_ORDER) || |
2314 | test_bit(NILFS_SC_UNCLOSED, &sci->sc_flags) || | 2308 | test_bit(NILFS_SC_UNCLOSED, &sci->sc_flags) || |
2315 | nilfs_discontinued(sbi->s_nilfs)) { | 2309 | nilfs_discontinued(nilfs)) { |
2316 | nilfs_transaction_unlock(sbi); | 2310 | nilfs_transaction_unlock(sb); |
2317 | err = nilfs_segctor_sync(sci); | 2311 | err = nilfs_segctor_sync(sci); |
2318 | return err; | 2312 | return err; |
2319 | } | 2313 | } |
2320 | 2314 | ||
2321 | spin_lock(&sbi->s_inode_lock); | 2315 | spin_lock(&nilfs->ns_inode_lock); |
2322 | if (!test_bit(NILFS_I_QUEUED, &ii->i_state) && | 2316 | if (!test_bit(NILFS_I_QUEUED, &ii->i_state) && |
2323 | !test_bit(NILFS_I_BUSY, &ii->i_state)) { | 2317 | !test_bit(NILFS_I_BUSY, &ii->i_state)) { |
2324 | spin_unlock(&sbi->s_inode_lock); | 2318 | spin_unlock(&nilfs->ns_inode_lock); |
2325 | nilfs_transaction_unlock(sbi); | 2319 | nilfs_transaction_unlock(sb); |
2326 | return 0; | 2320 | return 0; |
2327 | } | 2321 | } |
2328 | spin_unlock(&sbi->s_inode_lock); | 2322 | spin_unlock(&nilfs->ns_inode_lock); |
2329 | sci->sc_dsync_inode = ii; | 2323 | sci->sc_dsync_inode = ii; |
2330 | sci->sc_dsync_start = start; | 2324 | sci->sc_dsync_start = start; |
2331 | sci->sc_dsync_end = end; | 2325 | sci->sc_dsync_end = end; |
2332 | 2326 | ||
2333 | err = nilfs_segctor_do_construct(sci, SC_LSEG_DSYNC); | 2327 | err = nilfs_segctor_do_construct(sci, SC_LSEG_DSYNC); |
2334 | 2328 | ||
2335 | nilfs_transaction_unlock(sbi); | 2329 | nilfs_transaction_unlock(sb); |
2336 | return err; | 2330 | return err; |
2337 | } | 2331 | } |
2338 | 2332 | ||
@@ -2388,8 +2382,7 @@ static void nilfs_segctor_notify(struct nilfs_sc_info *sci, int mode, int err) | |||
2388 | */ | 2382 | */ |
2389 | static int nilfs_segctor_construct(struct nilfs_sc_info *sci, int mode) | 2383 | static int nilfs_segctor_construct(struct nilfs_sc_info *sci, int mode) |
2390 | { | 2384 | { |
2391 | struct nilfs_sb_info *sbi = sci->sc_sbi; | 2385 | struct the_nilfs *nilfs = sci->sc_super->s_fs_info; |
2392 | struct the_nilfs *nilfs = sbi->s_nilfs; | ||
2393 | struct nilfs_super_block **sbp; | 2386 | struct nilfs_super_block **sbp; |
2394 | int err = 0; | 2387 | int err = 0; |
2395 | 2388 | ||
@@ -2407,11 +2400,12 @@ static int nilfs_segctor_construct(struct nilfs_sc_info *sci, int mode) | |||
2407 | nilfs_discontinued(nilfs)) { | 2400 | nilfs_discontinued(nilfs)) { |
2408 | down_write(&nilfs->ns_sem); | 2401 | down_write(&nilfs->ns_sem); |
2409 | err = -EIO; | 2402 | err = -EIO; |
2410 | sbp = nilfs_prepare_super(sbi, | 2403 | sbp = nilfs_prepare_super(sci->sc_super, |
2411 | nilfs_sb_will_flip(nilfs)); | 2404 | nilfs_sb_will_flip(nilfs)); |
2412 | if (likely(sbp)) { | 2405 | if (likely(sbp)) { |
2413 | nilfs_set_log_cursor(sbp[0], nilfs); | 2406 | nilfs_set_log_cursor(sbp[0], nilfs); |
2414 | err = nilfs_commit_super(sbi, NILFS_SB_COMMIT); | 2407 | err = nilfs_commit_super(sci->sc_super, |
2408 | NILFS_SB_COMMIT); | ||
2415 | } | 2409 | } |
2416 | up_write(&nilfs->ns_sem); | 2410 | up_write(&nilfs->ns_sem); |
2417 | } | 2411 | } |
@@ -2443,16 +2437,15 @@ nilfs_remove_written_gcinodes(struct the_nilfs *nilfs, struct list_head *head) | |||
2443 | int nilfs_clean_segments(struct super_block *sb, struct nilfs_argv *argv, | 2437 | int nilfs_clean_segments(struct super_block *sb, struct nilfs_argv *argv, |
2444 | void **kbufs) | 2438 | void **kbufs) |
2445 | { | 2439 | { |
2446 | struct nilfs_sb_info *sbi = NILFS_SB(sb); | 2440 | struct the_nilfs *nilfs = sb->s_fs_info; |
2447 | struct nilfs_sc_info *sci = NILFS_SC(sbi); | 2441 | struct nilfs_sc_info *sci = nilfs->ns_writer; |
2448 | struct the_nilfs *nilfs = sbi->s_nilfs; | ||
2449 | struct nilfs_transaction_info ti; | 2442 | struct nilfs_transaction_info ti; |
2450 | int err; | 2443 | int err; |
2451 | 2444 | ||
2452 | if (unlikely(!sci)) | 2445 | if (unlikely(!sci)) |
2453 | return -EROFS; | 2446 | return -EROFS; |
2454 | 2447 | ||
2455 | nilfs_transaction_lock(sbi, &ti, 1); | 2448 | nilfs_transaction_lock(sb, &ti, 1); |
2456 | 2449 | ||
2457 | err = nilfs_mdt_save_to_shadow_map(nilfs->ns_dat); | 2450 | err = nilfs_mdt_save_to_shadow_map(nilfs->ns_dat); |
2458 | if (unlikely(err)) | 2451 | if (unlikely(err)) |
@@ -2480,14 +2473,14 @@ int nilfs_clean_segments(struct super_block *sb, struct nilfs_argv *argv, | |||
2480 | set_current_state(TASK_INTERRUPTIBLE); | 2473 | set_current_state(TASK_INTERRUPTIBLE); |
2481 | schedule_timeout(sci->sc_interval); | 2474 | schedule_timeout(sci->sc_interval); |
2482 | } | 2475 | } |
2483 | if (nilfs_test_opt(sbi, DISCARD)) { | 2476 | if (nilfs_test_opt(nilfs, DISCARD)) { |
2484 | int ret = nilfs_discard_segments(nilfs, sci->sc_freesegs, | 2477 | int ret = nilfs_discard_segments(nilfs, sci->sc_freesegs, |
2485 | sci->sc_nfreesegs); | 2478 | sci->sc_nfreesegs); |
2486 | if (ret) { | 2479 | if (ret) { |
2487 | printk(KERN_WARNING | 2480 | printk(KERN_WARNING |
2488 | "NILFS warning: error %d on discard request, " | 2481 | "NILFS warning: error %d on discard request, " |
2489 | "turning discards off for the device\n", ret); | 2482 | "turning discards off for the device\n", ret); |
2490 | nilfs_clear_opt(sbi, DISCARD); | 2483 | nilfs_clear_opt(nilfs, DISCARD); |
2491 | } | 2484 | } |
2492 | } | 2485 | } |
2493 | 2486 | ||
@@ -2495,16 +2488,15 @@ int nilfs_clean_segments(struct super_block *sb, struct nilfs_argv *argv, | |||
2495 | sci->sc_freesegs = NULL; | 2488 | sci->sc_freesegs = NULL; |
2496 | sci->sc_nfreesegs = 0; | 2489 | sci->sc_nfreesegs = 0; |
2497 | nilfs_mdt_clear_shadow_map(nilfs->ns_dat); | 2490 | nilfs_mdt_clear_shadow_map(nilfs->ns_dat); |
2498 | nilfs_transaction_unlock(sbi); | 2491 | nilfs_transaction_unlock(sb); |
2499 | return err; | 2492 | return err; |
2500 | } | 2493 | } |
2501 | 2494 | ||
2502 | static void nilfs_segctor_thread_construct(struct nilfs_sc_info *sci, int mode) | 2495 | static void nilfs_segctor_thread_construct(struct nilfs_sc_info *sci, int mode) |
2503 | { | 2496 | { |
2504 | struct nilfs_sb_info *sbi = sci->sc_sbi; | ||
2505 | struct nilfs_transaction_info ti; | 2497 | struct nilfs_transaction_info ti; |
2506 | 2498 | ||
2507 | nilfs_transaction_lock(sbi, &ti, 0); | 2499 | nilfs_transaction_lock(sci->sc_super, &ti, 0); |
2508 | nilfs_segctor_construct(sci, mode); | 2500 | nilfs_segctor_construct(sci, mode); |
2509 | 2501 | ||
2510 | /* | 2502 | /* |
@@ -2515,7 +2507,7 @@ static void nilfs_segctor_thread_construct(struct nilfs_sc_info *sci, int mode) | |||
2515 | if (test_bit(NILFS_SC_UNCLOSED, &sci->sc_flags)) | 2507 | if (test_bit(NILFS_SC_UNCLOSED, &sci->sc_flags)) |
2516 | nilfs_segctor_start_timer(sci); | 2508 | nilfs_segctor_start_timer(sci); |
2517 | 2509 | ||
2518 | nilfs_transaction_unlock(sbi); | 2510 | nilfs_transaction_unlock(sci->sc_super); |
2519 | } | 2511 | } |
2520 | 2512 | ||
2521 | static void nilfs_segctor_do_immediate_flush(struct nilfs_sc_info *sci) | 2513 | static void nilfs_segctor_do_immediate_flush(struct nilfs_sc_info *sci) |
@@ -2561,7 +2553,7 @@ static int nilfs_segctor_flush_mode(struct nilfs_sc_info *sci) | |||
2561 | static int nilfs_segctor_thread(void *arg) | 2553 | static int nilfs_segctor_thread(void *arg) |
2562 | { | 2554 | { |
2563 | struct nilfs_sc_info *sci = (struct nilfs_sc_info *)arg; | 2555 | struct nilfs_sc_info *sci = (struct nilfs_sc_info *)arg; |
2564 | struct the_nilfs *nilfs = sci->sc_sbi->s_nilfs; | 2556 | struct the_nilfs *nilfs = sci->sc_super->s_fs_info; |
2565 | int timeout = 0; | 2557 | int timeout = 0; |
2566 | 2558 | ||
2567 | sci->sc_timer.data = (unsigned long)current; | 2559 | sci->sc_timer.data = (unsigned long)current; |
@@ -2672,17 +2664,17 @@ static void nilfs_segctor_kill_thread(struct nilfs_sc_info *sci) | |||
2672 | /* | 2664 | /* |
2673 | * Setup & clean-up functions | 2665 | * Setup & clean-up functions |
2674 | */ | 2666 | */ |
2675 | static struct nilfs_sc_info *nilfs_segctor_new(struct nilfs_sb_info *sbi, | 2667 | static struct nilfs_sc_info *nilfs_segctor_new(struct super_block *sb, |
2676 | struct nilfs_root *root) | 2668 | struct nilfs_root *root) |
2677 | { | 2669 | { |
2670 | struct the_nilfs *nilfs = sb->s_fs_info; | ||
2678 | struct nilfs_sc_info *sci; | 2671 | struct nilfs_sc_info *sci; |
2679 | 2672 | ||
2680 | sci = kzalloc(sizeof(*sci), GFP_KERNEL); | 2673 | sci = kzalloc(sizeof(*sci), GFP_KERNEL); |
2681 | if (!sci) | 2674 | if (!sci) |
2682 | return NULL; | 2675 | return NULL; |
2683 | 2676 | ||
2684 | sci->sc_sbi = sbi; | 2677 | sci->sc_super = sb; |
2685 | sci->sc_super = sbi->s_super; | ||
2686 | 2678 | ||
2687 | nilfs_get_root(root); | 2679 | nilfs_get_root(root); |
2688 | sci->sc_root = root; | 2680 | sci->sc_root = root; |
@@ -2702,10 +2694,10 @@ static struct nilfs_sc_info *nilfs_segctor_new(struct nilfs_sb_info *sbi, | |||
2702 | sci->sc_mjcp_freq = HZ * NILFS_SC_DEFAULT_SR_FREQ; | 2694 | sci->sc_mjcp_freq = HZ * NILFS_SC_DEFAULT_SR_FREQ; |
2703 | sci->sc_watermark = NILFS_SC_DEFAULT_WATERMARK; | 2695 | sci->sc_watermark = NILFS_SC_DEFAULT_WATERMARK; |
2704 | 2696 | ||
2705 | if (sbi->s_interval) | 2697 | if (nilfs->ns_interval) |
2706 | sci->sc_interval = sbi->s_interval; | 2698 | sci->sc_interval = nilfs->ns_interval; |
2707 | if (sbi->s_watermark) | 2699 | if (nilfs->ns_watermark) |
2708 | sci->sc_watermark = sbi->s_watermark; | 2700 | sci->sc_watermark = nilfs->ns_watermark; |
2709 | return sci; | 2701 | return sci; |
2710 | } | 2702 | } |
2711 | 2703 | ||
@@ -2716,12 +2708,11 @@ static void nilfs_segctor_write_out(struct nilfs_sc_info *sci) | |||
2716 | /* The segctord thread was stopped and its timer was removed. | 2708 | /* The segctord thread was stopped and its timer was removed. |
2717 | But some tasks remain. */ | 2709 | But some tasks remain. */ |
2718 | do { | 2710 | do { |
2719 | struct nilfs_sb_info *sbi = sci->sc_sbi; | ||
2720 | struct nilfs_transaction_info ti; | 2711 | struct nilfs_transaction_info ti; |
2721 | 2712 | ||
2722 | nilfs_transaction_lock(sbi, &ti, 0); | 2713 | nilfs_transaction_lock(sci->sc_super, &ti, 0); |
2723 | ret = nilfs_segctor_construct(sci, SC_LSEG_SR); | 2714 | ret = nilfs_segctor_construct(sci, SC_LSEG_SR); |
2724 | nilfs_transaction_unlock(sbi); | 2715 | nilfs_transaction_unlock(sci->sc_super); |
2725 | 2716 | ||
2726 | } while (ret && retrycount-- > 0); | 2717 | } while (ret && retrycount-- > 0); |
2727 | } | 2718 | } |
@@ -2736,10 +2727,10 @@ static void nilfs_segctor_write_out(struct nilfs_sc_info *sci) | |||
2736 | */ | 2727 | */ |
2737 | static void nilfs_segctor_destroy(struct nilfs_sc_info *sci) | 2728 | static void nilfs_segctor_destroy(struct nilfs_sc_info *sci) |
2738 | { | 2729 | { |
2739 | struct nilfs_sb_info *sbi = sci->sc_sbi; | 2730 | struct the_nilfs *nilfs = sci->sc_super->s_fs_info; |
2740 | int flag; | 2731 | int flag; |
2741 | 2732 | ||
2742 | up_write(&sbi->s_nilfs->ns_segctor_sem); | 2733 | up_write(&nilfs->ns_segctor_sem); |
2743 | 2734 | ||
2744 | spin_lock(&sci->sc_state_lock); | 2735 | spin_lock(&sci->sc_state_lock); |
2745 | nilfs_segctor_kill_thread(sci); | 2736 | nilfs_segctor_kill_thread(sci); |
@@ -2753,9 +2744,9 @@ static void nilfs_segctor_destroy(struct nilfs_sc_info *sci) | |||
2753 | WARN_ON(!list_empty(&sci->sc_copied_buffers)); | 2744 | WARN_ON(!list_empty(&sci->sc_copied_buffers)); |
2754 | 2745 | ||
2755 | if (!list_empty(&sci->sc_dirty_files)) { | 2746 | if (!list_empty(&sci->sc_dirty_files)) { |
2756 | nilfs_warning(sbi->s_super, __func__, | 2747 | nilfs_warning(sci->sc_super, __func__, |
2757 | "dirty file(s) after the final construction\n"); | 2748 | "dirty file(s) after the final construction\n"); |
2758 | nilfs_dispose_list(sbi, &sci->sc_dirty_files, 1); | 2749 | nilfs_dispose_list(nilfs, &sci->sc_dirty_files, 1); |
2759 | } | 2750 | } |
2760 | 2751 | ||
2761 | WARN_ON(!list_empty(&sci->sc_segbufs)); | 2752 | WARN_ON(!list_empty(&sci->sc_segbufs)); |
@@ -2763,79 +2754,78 @@ static void nilfs_segctor_destroy(struct nilfs_sc_info *sci) | |||
2763 | 2754 | ||
2764 | nilfs_put_root(sci->sc_root); | 2755 | nilfs_put_root(sci->sc_root); |
2765 | 2756 | ||
2766 | down_write(&sbi->s_nilfs->ns_segctor_sem); | 2757 | down_write(&nilfs->ns_segctor_sem); |
2767 | 2758 | ||
2768 | del_timer_sync(&sci->sc_timer); | 2759 | del_timer_sync(&sci->sc_timer); |
2769 | kfree(sci); | 2760 | kfree(sci); |
2770 | } | 2761 | } |
2771 | 2762 | ||
2772 | /** | 2763 | /** |
2773 | * nilfs_attach_segment_constructor - attach a segment constructor | 2764 | * nilfs_attach_log_writer - attach log writer |
2774 | * @sbi: nilfs_sb_info | 2765 | * @sb: super block instance |
2775 | * @root: root object of the current filesystem tree | 2766 | * @root: root object of the current filesystem tree |
2776 | * | 2767 | * |
2777 | * nilfs_attach_segment_constructor() allocates a struct nilfs_sc_info, | 2768 | * This allocates a log writer object, initializes it, and starts the |
2778 | * initializes it, and starts the segment constructor. | 2769 | * log writer. |
2779 | * | 2770 | * |
2780 | * Return Value: On success, 0 is returned. On error, one of the following | 2771 | * Return Value: On success, 0 is returned. On error, one of the following |
2781 | * negative error code is returned. | 2772 | * negative error code is returned. |
2782 | * | 2773 | * |
2783 | * %-ENOMEM - Insufficient memory available. | 2774 | * %-ENOMEM - Insufficient memory available. |
2784 | */ | 2775 | */ |
2785 | int nilfs_attach_segment_constructor(struct nilfs_sb_info *sbi, | 2776 | int nilfs_attach_log_writer(struct super_block *sb, struct nilfs_root *root) |
2786 | struct nilfs_root *root) | ||
2787 | { | 2777 | { |
2778 | struct the_nilfs *nilfs = sb->s_fs_info; | ||
2788 | int err; | 2779 | int err; |
2789 | 2780 | ||
2790 | if (NILFS_SC(sbi)) { | 2781 | if (nilfs->ns_writer) { |
2791 | /* | 2782 | /* |
2792 | * This happens if the filesystem was remounted | 2783 | * This happens if the filesystem was remounted |
2793 | * read/write after nilfs_error degenerated it into a | 2784 | * read/write after nilfs_error degenerated it into a |
2794 | * read-only mount. | 2785 | * read-only mount. |
2795 | */ | 2786 | */ |
2796 | nilfs_detach_segment_constructor(sbi); | 2787 | nilfs_detach_log_writer(sb); |
2797 | } | 2788 | } |
2798 | 2789 | ||
2799 | sbi->s_sc_info = nilfs_segctor_new(sbi, root); | 2790 | nilfs->ns_writer = nilfs_segctor_new(sb, root); |
2800 | if (!sbi->s_sc_info) | 2791 | if (!nilfs->ns_writer) |
2801 | return -ENOMEM; | 2792 | return -ENOMEM; |
2802 | 2793 | ||
2803 | err = nilfs_segctor_start_thread(NILFS_SC(sbi)); | 2794 | err = nilfs_segctor_start_thread(nilfs->ns_writer); |
2804 | if (err) { | 2795 | if (err) { |
2805 | kfree(sbi->s_sc_info); | 2796 | kfree(nilfs->ns_writer); |
2806 | sbi->s_sc_info = NULL; | 2797 | nilfs->ns_writer = NULL; |
2807 | } | 2798 | } |
2808 | return err; | 2799 | return err; |
2809 | } | 2800 | } |
2810 | 2801 | ||
2811 | /** | 2802 | /** |
2812 | * nilfs_detach_segment_constructor - destroy the segment constructor | 2803 | * nilfs_detach_log_writer - destroy log writer |
2813 | * @sbi: nilfs_sb_info | 2804 | * @sb: super block instance |
2814 | * | 2805 | * |
2815 | * nilfs_detach_segment_constructor() kills the segment constructor daemon, | 2806 | * This kills log writer daemon, frees the log writer object, and |
2816 | * frees the struct nilfs_sc_info, and destroy the dirty file list. | 2807 | * destroys list of dirty files. |
2817 | */ | 2808 | */ |
2818 | void nilfs_detach_segment_constructor(struct nilfs_sb_info *sbi) | 2809 | void nilfs_detach_log_writer(struct super_block *sb) |
2819 | { | 2810 | { |
2820 | struct the_nilfs *nilfs = sbi->s_nilfs; | 2811 | struct the_nilfs *nilfs = sb->s_fs_info; |
2821 | LIST_HEAD(garbage_list); | 2812 | LIST_HEAD(garbage_list); |
2822 | 2813 | ||
2823 | down_write(&nilfs->ns_segctor_sem); | 2814 | down_write(&nilfs->ns_segctor_sem); |
2824 | if (NILFS_SC(sbi)) { | 2815 | if (nilfs->ns_writer) { |
2825 | nilfs_segctor_destroy(NILFS_SC(sbi)); | 2816 | nilfs_segctor_destroy(nilfs->ns_writer); |
2826 | sbi->s_sc_info = NULL; | 2817 | nilfs->ns_writer = NULL; |
2827 | } | 2818 | } |
2828 | 2819 | ||
2829 | /* Force to free the list of dirty files */ | 2820 | /* Force to free the list of dirty files */ |
2830 | spin_lock(&sbi->s_inode_lock); | 2821 | spin_lock(&nilfs->ns_inode_lock); |
2831 | if (!list_empty(&sbi->s_dirty_files)) { | 2822 | if (!list_empty(&nilfs->ns_dirty_files)) { |
2832 | list_splice_init(&sbi->s_dirty_files, &garbage_list); | 2823 | list_splice_init(&nilfs->ns_dirty_files, &garbage_list); |
2833 | nilfs_warning(sbi->s_super, __func__, | 2824 | nilfs_warning(sb, __func__, |
2834 | "Non empty dirty list after the last " | 2825 | "Hit dirty file after stopped log writer\n"); |
2835 | "segment construction\n"); | 2826 | } |
2836 | } | 2827 | spin_unlock(&nilfs->ns_inode_lock); |
2837 | spin_unlock(&sbi->s_inode_lock); | ||
2838 | up_write(&nilfs->ns_segctor_sem); | 2828 | up_write(&nilfs->ns_segctor_sem); |
2839 | 2829 | ||
2840 | nilfs_dispose_list(sbi, &garbage_list, 1); | 2830 | nilfs_dispose_list(nilfs, &garbage_list, 1); |
2841 | } | 2831 | } |
diff --git a/fs/nilfs2/segment.h b/fs/nilfs2/segment.h index cd8056e7cbed..6c02a86745fb 100644 --- a/fs/nilfs2/segment.h +++ b/fs/nilfs2/segment.h | |||
@@ -27,7 +27,7 @@ | |||
27 | #include <linux/fs.h> | 27 | #include <linux/fs.h> |
28 | #include <linux/buffer_head.h> | 28 | #include <linux/buffer_head.h> |
29 | #include <linux/nilfs2_fs.h> | 29 | #include <linux/nilfs2_fs.h> |
30 | #include "sb.h" | 30 | #include "nilfs.h" |
31 | 31 | ||
32 | struct nilfs_root; | 32 | struct nilfs_root; |
33 | 33 | ||
@@ -88,7 +88,6 @@ struct nilfs_segsum_pointer { | |||
88 | /** | 88 | /** |
89 | * struct nilfs_sc_info - Segment constructor information | 89 | * struct nilfs_sc_info - Segment constructor information |
90 | * @sc_super: Back pointer to super_block struct | 90 | * @sc_super: Back pointer to super_block struct |
91 | * @sc_sbi: Back pointer to nilfs_sb_info struct | ||
92 | * @sc_root: root object of the current filesystem tree | 91 | * @sc_root: root object of the current filesystem tree |
93 | * @sc_nblk_inc: Block count of current generation | 92 | * @sc_nblk_inc: Block count of current generation |
94 | * @sc_dirty_files: List of files to be written | 93 | * @sc_dirty_files: List of files to be written |
@@ -131,7 +130,6 @@ struct nilfs_segsum_pointer { | |||
131 | */ | 130 | */ |
132 | struct nilfs_sc_info { | 131 | struct nilfs_sc_info { |
133 | struct super_block *sc_super; | 132 | struct super_block *sc_super; |
134 | struct nilfs_sb_info *sc_sbi; | ||
135 | struct nilfs_root *sc_root; | 133 | struct nilfs_root *sc_root; |
136 | 134 | ||
137 | unsigned long sc_nblk_inc; | 135 | unsigned long sc_nblk_inc; |
@@ -235,18 +233,16 @@ extern void nilfs_flush_segment(struct super_block *, ino_t); | |||
235 | extern int nilfs_clean_segments(struct super_block *, struct nilfs_argv *, | 233 | extern int nilfs_clean_segments(struct super_block *, struct nilfs_argv *, |
236 | void **); | 234 | void **); |
237 | 235 | ||
238 | int nilfs_attach_segment_constructor(struct nilfs_sb_info *sbi, | 236 | int nilfs_attach_log_writer(struct super_block *sb, struct nilfs_root *root); |
239 | struct nilfs_root *root); | 237 | void nilfs_detach_log_writer(struct super_block *sb); |
240 | extern void nilfs_detach_segment_constructor(struct nilfs_sb_info *); | ||
241 | 238 | ||
242 | /* recovery.c */ | 239 | /* recovery.c */ |
243 | extern int nilfs_read_super_root_block(struct the_nilfs *, sector_t, | 240 | extern int nilfs_read_super_root_block(struct the_nilfs *, sector_t, |
244 | struct buffer_head **, int); | 241 | struct buffer_head **, int); |
245 | extern int nilfs_search_super_root(struct the_nilfs *, | 242 | extern int nilfs_search_super_root(struct the_nilfs *, |
246 | struct nilfs_recovery_info *); | 243 | struct nilfs_recovery_info *); |
247 | extern int nilfs_salvage_orphan_logs(struct the_nilfs *, | 244 | int nilfs_salvage_orphan_logs(struct the_nilfs *nilfs, struct super_block *sb, |
248 | struct nilfs_sb_info *, | 245 | struct nilfs_recovery_info *ri); |
249 | struct nilfs_recovery_info *); | ||
250 | extern void nilfs_dispose_segment_list(struct list_head *); | 246 | extern void nilfs_dispose_segment_list(struct list_head *); |
251 | 247 | ||
252 | #endif /* _NILFS_SEGMENT_H */ | 248 | #endif /* _NILFS_SEGMENT_H */ |
diff --git a/fs/nilfs2/super.c b/fs/nilfs2/super.c index 1673b3d99842..062cca065195 100644 --- a/fs/nilfs2/super.c +++ b/fs/nilfs2/super.c | |||
@@ -43,7 +43,6 @@ | |||
43 | #include <linux/init.h> | 43 | #include <linux/init.h> |
44 | #include <linux/blkdev.h> | 44 | #include <linux/blkdev.h> |
45 | #include <linux/parser.h> | 45 | #include <linux/parser.h> |
46 | #include <linux/random.h> | ||
47 | #include <linux/crc32.h> | 46 | #include <linux/crc32.h> |
48 | #include <linux/vfs.h> | 47 | #include <linux/vfs.h> |
49 | #include <linux/writeback.h> | 48 | #include <linux/writeback.h> |
@@ -72,23 +71,23 @@ struct kmem_cache *nilfs_transaction_cachep; | |||
72 | struct kmem_cache *nilfs_segbuf_cachep; | 71 | struct kmem_cache *nilfs_segbuf_cachep; |
73 | struct kmem_cache *nilfs_btree_path_cache; | 72 | struct kmem_cache *nilfs_btree_path_cache; |
74 | 73 | ||
75 | static int nilfs_setup_super(struct nilfs_sb_info *sbi, int is_mount); | 74 | static int nilfs_setup_super(struct super_block *sb, int is_mount); |
76 | static int nilfs_remount(struct super_block *sb, int *flags, char *data); | 75 | static int nilfs_remount(struct super_block *sb, int *flags, char *data); |
77 | 76 | ||
78 | static void nilfs_set_error(struct nilfs_sb_info *sbi) | 77 | static void nilfs_set_error(struct super_block *sb) |
79 | { | 78 | { |
80 | struct the_nilfs *nilfs = sbi->s_nilfs; | 79 | struct the_nilfs *nilfs = sb->s_fs_info; |
81 | struct nilfs_super_block **sbp; | 80 | struct nilfs_super_block **sbp; |
82 | 81 | ||
83 | down_write(&nilfs->ns_sem); | 82 | down_write(&nilfs->ns_sem); |
84 | if (!(nilfs->ns_mount_state & NILFS_ERROR_FS)) { | 83 | if (!(nilfs->ns_mount_state & NILFS_ERROR_FS)) { |
85 | nilfs->ns_mount_state |= NILFS_ERROR_FS; | 84 | nilfs->ns_mount_state |= NILFS_ERROR_FS; |
86 | sbp = nilfs_prepare_super(sbi, 0); | 85 | sbp = nilfs_prepare_super(sb, 0); |
87 | if (likely(sbp)) { | 86 | if (likely(sbp)) { |
88 | sbp[0]->s_state |= cpu_to_le16(NILFS_ERROR_FS); | 87 | sbp[0]->s_state |= cpu_to_le16(NILFS_ERROR_FS); |
89 | if (sbp[1]) | 88 | if (sbp[1]) |
90 | sbp[1]->s_state |= cpu_to_le16(NILFS_ERROR_FS); | 89 | sbp[1]->s_state |= cpu_to_le16(NILFS_ERROR_FS); |
91 | nilfs_commit_super(sbi, NILFS_SB_COMMIT_ALL); | 90 | nilfs_commit_super(sb, NILFS_SB_COMMIT_ALL); |
92 | } | 91 | } |
93 | } | 92 | } |
94 | up_write(&nilfs->ns_sem); | 93 | up_write(&nilfs->ns_sem); |
@@ -109,7 +108,7 @@ static void nilfs_set_error(struct nilfs_sb_info *sbi) | |||
109 | void nilfs_error(struct super_block *sb, const char *function, | 108 | void nilfs_error(struct super_block *sb, const char *function, |
110 | const char *fmt, ...) | 109 | const char *fmt, ...) |
111 | { | 110 | { |
112 | struct nilfs_sb_info *sbi = NILFS_SB(sb); | 111 | struct the_nilfs *nilfs = sb->s_fs_info; |
113 | struct va_format vaf; | 112 | struct va_format vaf; |
114 | va_list args; | 113 | va_list args; |
115 | 114 | ||
@@ -124,15 +123,15 @@ void nilfs_error(struct super_block *sb, const char *function, | |||
124 | va_end(args); | 123 | va_end(args); |
125 | 124 | ||
126 | if (!(sb->s_flags & MS_RDONLY)) { | 125 | if (!(sb->s_flags & MS_RDONLY)) { |
127 | nilfs_set_error(sbi); | 126 | nilfs_set_error(sb); |
128 | 127 | ||
129 | if (nilfs_test_opt(sbi, ERRORS_RO)) { | 128 | if (nilfs_test_opt(nilfs, ERRORS_RO)) { |
130 | printk(KERN_CRIT "Remounting filesystem read-only\n"); | 129 | printk(KERN_CRIT "Remounting filesystem read-only\n"); |
131 | sb->s_flags |= MS_RDONLY; | 130 | sb->s_flags |= MS_RDONLY; |
132 | } | 131 | } |
133 | } | 132 | } |
134 | 133 | ||
135 | if (nilfs_test_opt(sbi, ERRORS_PANIC)) | 134 | if (nilfs_test_opt(nilfs, ERRORS_PANIC)) |
136 | panic("NILFS (device %s): panic forced after error\n", | 135 | panic("NILFS (device %s): panic forced after error\n", |
137 | sb->s_id); | 136 | sb->s_id); |
138 | } | 137 | } |
@@ -189,14 +188,14 @@ void nilfs_destroy_inode(struct inode *inode) | |||
189 | call_rcu(&inode->i_rcu, nilfs_i_callback); | 188 | call_rcu(&inode->i_rcu, nilfs_i_callback); |
190 | } | 189 | } |
191 | 190 | ||
192 | static int nilfs_sync_super(struct nilfs_sb_info *sbi, int flag) | 191 | static int nilfs_sync_super(struct super_block *sb, int flag) |
193 | { | 192 | { |
194 | struct the_nilfs *nilfs = sbi->s_nilfs; | 193 | struct the_nilfs *nilfs = sb->s_fs_info; |
195 | int err; | 194 | int err; |
196 | 195 | ||
197 | retry: | 196 | retry: |
198 | set_buffer_dirty(nilfs->ns_sbh[0]); | 197 | set_buffer_dirty(nilfs->ns_sbh[0]); |
199 | if (nilfs_test_opt(sbi, BARRIER)) { | 198 | if (nilfs_test_opt(nilfs, BARRIER)) { |
200 | err = __sync_dirty_buffer(nilfs->ns_sbh[0], | 199 | err = __sync_dirty_buffer(nilfs->ns_sbh[0], |
201 | WRITE_SYNC | WRITE_FLUSH_FUA); | 200 | WRITE_SYNC | WRITE_FLUSH_FUA); |
202 | } else { | 201 | } else { |
@@ -263,10 +262,10 @@ void nilfs_set_log_cursor(struct nilfs_super_block *sbp, | |||
263 | spin_unlock(&nilfs->ns_last_segment_lock); | 262 | spin_unlock(&nilfs->ns_last_segment_lock); |
264 | } | 263 | } |
265 | 264 | ||
266 | struct nilfs_super_block **nilfs_prepare_super(struct nilfs_sb_info *sbi, | 265 | struct nilfs_super_block **nilfs_prepare_super(struct super_block *sb, |
267 | int flip) | 266 | int flip) |
268 | { | 267 | { |
269 | struct the_nilfs *nilfs = sbi->s_nilfs; | 268 | struct the_nilfs *nilfs = sb->s_fs_info; |
270 | struct nilfs_super_block **sbp = nilfs->ns_sbp; | 269 | struct nilfs_super_block **sbp = nilfs->ns_sbp; |
271 | 270 | ||
272 | /* nilfs->ns_sem must be locked by the caller. */ | 271 | /* nilfs->ns_sem must be locked by the caller. */ |
@@ -276,7 +275,7 @@ struct nilfs_super_block **nilfs_prepare_super(struct nilfs_sb_info *sbi, | |||
276 | memcpy(sbp[0], sbp[1], nilfs->ns_sbsize); | 275 | memcpy(sbp[0], sbp[1], nilfs->ns_sbsize); |
277 | } else { | 276 | } else { |
278 | printk(KERN_CRIT "NILFS: superblock broke on dev %s\n", | 277 | printk(KERN_CRIT "NILFS: superblock broke on dev %s\n", |
279 | sbi->s_super->s_id); | 278 | sb->s_id); |
280 | return NULL; | 279 | return NULL; |
281 | } | 280 | } |
282 | } else if (sbp[1] && | 281 | } else if (sbp[1] && |
@@ -290,9 +289,9 @@ struct nilfs_super_block **nilfs_prepare_super(struct nilfs_sb_info *sbi, | |||
290 | return sbp; | 289 | return sbp; |
291 | } | 290 | } |
292 | 291 | ||
293 | int nilfs_commit_super(struct nilfs_sb_info *sbi, int flag) | 292 | int nilfs_commit_super(struct super_block *sb, int flag) |
294 | { | 293 | { |
295 | struct the_nilfs *nilfs = sbi->s_nilfs; | 294 | struct the_nilfs *nilfs = sb->s_fs_info; |
296 | struct nilfs_super_block **sbp = nilfs->ns_sbp; | 295 | struct nilfs_super_block **sbp = nilfs->ns_sbp; |
297 | time_t t; | 296 | time_t t; |
298 | 297 | ||
@@ -312,27 +311,28 @@ int nilfs_commit_super(struct nilfs_sb_info *sbi, int flag) | |||
312 | nilfs->ns_sbsize)); | 311 | nilfs->ns_sbsize)); |
313 | } | 312 | } |
314 | clear_nilfs_sb_dirty(nilfs); | 313 | clear_nilfs_sb_dirty(nilfs); |
315 | return nilfs_sync_super(sbi, flag); | 314 | return nilfs_sync_super(sb, flag); |
316 | } | 315 | } |
317 | 316 | ||
318 | /** | 317 | /** |
319 | * nilfs_cleanup_super() - write filesystem state for cleanup | 318 | * nilfs_cleanup_super() - write filesystem state for cleanup |
320 | * @sbi: nilfs_sb_info to be unmounted or degraded to read-only | 319 | * @sb: super block instance to be unmounted or degraded to read-only |
321 | * | 320 | * |
322 | * This function restores state flags in the on-disk super block. | 321 | * This function restores state flags in the on-disk super block. |
323 | * This will set "clean" flag (i.e. NILFS_VALID_FS) unless the | 322 | * This will set "clean" flag (i.e. NILFS_VALID_FS) unless the |
324 | * filesystem was not clean previously. | 323 | * filesystem was not clean previously. |
325 | */ | 324 | */ |
326 | int nilfs_cleanup_super(struct nilfs_sb_info *sbi) | 325 | int nilfs_cleanup_super(struct super_block *sb) |
327 | { | 326 | { |
327 | struct the_nilfs *nilfs = sb->s_fs_info; | ||
328 | struct nilfs_super_block **sbp; | 328 | struct nilfs_super_block **sbp; |
329 | int flag = NILFS_SB_COMMIT; | 329 | int flag = NILFS_SB_COMMIT; |
330 | int ret = -EIO; | 330 | int ret = -EIO; |
331 | 331 | ||
332 | sbp = nilfs_prepare_super(sbi, 0); | 332 | sbp = nilfs_prepare_super(sb, 0); |
333 | if (sbp) { | 333 | if (sbp) { |
334 | sbp[0]->s_state = cpu_to_le16(sbi->s_nilfs->ns_mount_state); | 334 | sbp[0]->s_state = cpu_to_le16(nilfs->ns_mount_state); |
335 | nilfs_set_log_cursor(sbp[0], sbi->s_nilfs); | 335 | nilfs_set_log_cursor(sbp[0], nilfs); |
336 | if (sbp[1] && sbp[0]->s_last_cno == sbp[1]->s_last_cno) { | 336 | if (sbp[1] && sbp[0]->s_last_cno == sbp[1]->s_last_cno) { |
337 | /* | 337 | /* |
338 | * make the "clean" flag also to the opposite | 338 | * make the "clean" flag also to the opposite |
@@ -342,21 +342,20 @@ int nilfs_cleanup_super(struct nilfs_sb_info *sbi) | |||
342 | sbp[1]->s_state = sbp[0]->s_state; | 342 | sbp[1]->s_state = sbp[0]->s_state; |
343 | flag = NILFS_SB_COMMIT_ALL; | 343 | flag = NILFS_SB_COMMIT_ALL; |
344 | } | 344 | } |
345 | ret = nilfs_commit_super(sbi, flag); | 345 | ret = nilfs_commit_super(sb, flag); |
346 | } | 346 | } |
347 | return ret; | 347 | return ret; |
348 | } | 348 | } |
349 | 349 | ||
350 | static void nilfs_put_super(struct super_block *sb) | 350 | static void nilfs_put_super(struct super_block *sb) |
351 | { | 351 | { |
352 | struct nilfs_sb_info *sbi = NILFS_SB(sb); | 352 | struct the_nilfs *nilfs = sb->s_fs_info; |
353 | struct the_nilfs *nilfs = sbi->s_nilfs; | ||
354 | 353 | ||
355 | nilfs_detach_segment_constructor(sbi); | 354 | nilfs_detach_log_writer(sb); |
356 | 355 | ||
357 | if (!(sb->s_flags & MS_RDONLY)) { | 356 | if (!(sb->s_flags & MS_RDONLY)) { |
358 | down_write(&nilfs->ns_sem); | 357 | down_write(&nilfs->ns_sem); |
359 | nilfs_cleanup_super(sbi); | 358 | nilfs_cleanup_super(sb); |
360 | up_write(&nilfs->ns_sem); | 359 | up_write(&nilfs->ns_sem); |
361 | } | 360 | } |
362 | 361 | ||
@@ -365,15 +364,12 @@ static void nilfs_put_super(struct super_block *sb) | |||
365 | iput(nilfs->ns_dat); | 364 | iput(nilfs->ns_dat); |
366 | 365 | ||
367 | destroy_nilfs(nilfs); | 366 | destroy_nilfs(nilfs); |
368 | sbi->s_super = NULL; | ||
369 | sb->s_fs_info = NULL; | 367 | sb->s_fs_info = NULL; |
370 | kfree(sbi); | ||
371 | } | 368 | } |
372 | 369 | ||
373 | static int nilfs_sync_fs(struct super_block *sb, int wait) | 370 | static int nilfs_sync_fs(struct super_block *sb, int wait) |
374 | { | 371 | { |
375 | struct nilfs_sb_info *sbi = NILFS_SB(sb); | 372 | struct the_nilfs *nilfs = sb->s_fs_info; |
376 | struct the_nilfs *nilfs = sbi->s_nilfs; | ||
377 | struct nilfs_super_block **sbp; | 373 | struct nilfs_super_block **sbp; |
378 | int err = 0; | 374 | int err = 0; |
379 | 375 | ||
@@ -383,10 +379,10 @@ static int nilfs_sync_fs(struct super_block *sb, int wait) | |||
383 | 379 | ||
384 | down_write(&nilfs->ns_sem); | 380 | down_write(&nilfs->ns_sem); |
385 | if (nilfs_sb_dirty(nilfs)) { | 381 | if (nilfs_sb_dirty(nilfs)) { |
386 | sbp = nilfs_prepare_super(sbi, nilfs_sb_will_flip(nilfs)); | 382 | sbp = nilfs_prepare_super(sb, nilfs_sb_will_flip(nilfs)); |
387 | if (likely(sbp)) { | 383 | if (likely(sbp)) { |
388 | nilfs_set_log_cursor(sbp[0], nilfs); | 384 | nilfs_set_log_cursor(sbp[0], nilfs); |
389 | nilfs_commit_super(sbi, NILFS_SB_COMMIT); | 385 | nilfs_commit_super(sb, NILFS_SB_COMMIT); |
390 | } | 386 | } |
391 | } | 387 | } |
392 | up_write(&nilfs->ns_sem); | 388 | up_write(&nilfs->ns_sem); |
@@ -394,10 +390,10 @@ static int nilfs_sync_fs(struct super_block *sb, int wait) | |||
394 | return err; | 390 | return err; |
395 | } | 391 | } |
396 | 392 | ||
397 | int nilfs_attach_checkpoint(struct nilfs_sb_info *sbi, __u64 cno, int curr_mnt, | 393 | int nilfs_attach_checkpoint(struct super_block *sb, __u64 cno, int curr_mnt, |
398 | struct nilfs_root **rootp) | 394 | struct nilfs_root **rootp) |
399 | { | 395 | { |
400 | struct the_nilfs *nilfs = sbi->s_nilfs; | 396 | struct the_nilfs *nilfs = sb->s_fs_info; |
401 | struct nilfs_root *root; | 397 | struct nilfs_root *root; |
402 | struct nilfs_checkpoint *raw_cp; | 398 | struct nilfs_checkpoint *raw_cp; |
403 | struct buffer_head *bh_cp; | 399 | struct buffer_head *bh_cp; |
@@ -426,7 +422,7 @@ int nilfs_attach_checkpoint(struct nilfs_sb_info *sbi, __u64 cno, int curr_mnt, | |||
426 | goto failed; | 422 | goto failed; |
427 | } | 423 | } |
428 | 424 | ||
429 | err = nilfs_ifile_read(sbi->s_super, root, nilfs->ns_inode_size, | 425 | err = nilfs_ifile_read(sb, root, nilfs->ns_inode_size, |
430 | &raw_cp->cp_ifile_inode, &root->ifile); | 426 | &raw_cp->cp_ifile_inode, &root->ifile); |
431 | if (err) | 427 | if (err) |
432 | goto failed_bh; | 428 | goto failed_bh; |
@@ -450,8 +446,7 @@ int nilfs_attach_checkpoint(struct nilfs_sb_info *sbi, __u64 cno, int curr_mnt, | |||
450 | 446 | ||
451 | static int nilfs_freeze(struct super_block *sb) | 447 | static int nilfs_freeze(struct super_block *sb) |
452 | { | 448 | { |
453 | struct nilfs_sb_info *sbi = NILFS_SB(sb); | 449 | struct the_nilfs *nilfs = sb->s_fs_info; |
454 | struct the_nilfs *nilfs = sbi->s_nilfs; | ||
455 | int err; | 450 | int err; |
456 | 451 | ||
457 | if (sb->s_flags & MS_RDONLY) | 452 | if (sb->s_flags & MS_RDONLY) |
@@ -459,21 +454,20 @@ static int nilfs_freeze(struct super_block *sb) | |||
459 | 454 | ||
460 | /* Mark super block clean */ | 455 | /* Mark super block clean */ |
461 | down_write(&nilfs->ns_sem); | 456 | down_write(&nilfs->ns_sem); |
462 | err = nilfs_cleanup_super(sbi); | 457 | err = nilfs_cleanup_super(sb); |
463 | up_write(&nilfs->ns_sem); | 458 | up_write(&nilfs->ns_sem); |
464 | return err; | 459 | return err; |
465 | } | 460 | } |
466 | 461 | ||
467 | static int nilfs_unfreeze(struct super_block *sb) | 462 | static int nilfs_unfreeze(struct super_block *sb) |
468 | { | 463 | { |
469 | struct nilfs_sb_info *sbi = NILFS_SB(sb); | 464 | struct the_nilfs *nilfs = sb->s_fs_info; |
470 | struct the_nilfs *nilfs = sbi->s_nilfs; | ||
471 | 465 | ||
472 | if (sb->s_flags & MS_RDONLY) | 466 | if (sb->s_flags & MS_RDONLY) |
473 | return 0; | 467 | return 0; |
474 | 468 | ||
475 | down_write(&nilfs->ns_sem); | 469 | down_write(&nilfs->ns_sem); |
476 | nilfs_setup_super(sbi, false); | 470 | nilfs_setup_super(sb, false); |
477 | up_write(&nilfs->ns_sem); | 471 | up_write(&nilfs->ns_sem); |
478 | return 0; | 472 | return 0; |
479 | } | 473 | } |
@@ -530,22 +524,22 @@ static int nilfs_statfs(struct dentry *dentry, struct kstatfs *buf) | |||
530 | static int nilfs_show_options(struct seq_file *seq, struct vfsmount *vfs) | 524 | static int nilfs_show_options(struct seq_file *seq, struct vfsmount *vfs) |
531 | { | 525 | { |
532 | struct super_block *sb = vfs->mnt_sb; | 526 | struct super_block *sb = vfs->mnt_sb; |
533 | struct nilfs_sb_info *sbi = NILFS_SB(sb); | 527 | struct the_nilfs *nilfs = sb->s_fs_info; |
534 | struct nilfs_root *root = NILFS_I(vfs->mnt_root->d_inode)->i_root; | 528 | struct nilfs_root *root = NILFS_I(vfs->mnt_root->d_inode)->i_root; |
535 | 529 | ||
536 | if (!nilfs_test_opt(sbi, BARRIER)) | 530 | if (!nilfs_test_opt(nilfs, BARRIER)) |
537 | seq_puts(seq, ",nobarrier"); | 531 | seq_puts(seq, ",nobarrier"); |
538 | if (root->cno != NILFS_CPTREE_CURRENT_CNO) | 532 | if (root->cno != NILFS_CPTREE_CURRENT_CNO) |
539 | seq_printf(seq, ",cp=%llu", (unsigned long long)root->cno); | 533 | seq_printf(seq, ",cp=%llu", (unsigned long long)root->cno); |
540 | if (nilfs_test_opt(sbi, ERRORS_PANIC)) | 534 | if (nilfs_test_opt(nilfs, ERRORS_PANIC)) |
541 | seq_puts(seq, ",errors=panic"); | 535 | seq_puts(seq, ",errors=panic"); |
542 | if (nilfs_test_opt(sbi, ERRORS_CONT)) | 536 | if (nilfs_test_opt(nilfs, ERRORS_CONT)) |
543 | seq_puts(seq, ",errors=continue"); | 537 | seq_puts(seq, ",errors=continue"); |
544 | if (nilfs_test_opt(sbi, STRICT_ORDER)) | 538 | if (nilfs_test_opt(nilfs, STRICT_ORDER)) |
545 | seq_puts(seq, ",order=strict"); | 539 | seq_puts(seq, ",order=strict"); |
546 | if (nilfs_test_opt(sbi, NORECOVERY)) | 540 | if (nilfs_test_opt(nilfs, NORECOVERY)) |
547 | seq_puts(seq, ",norecovery"); | 541 | seq_puts(seq, ",norecovery"); |
548 | if (nilfs_test_opt(sbi, DISCARD)) | 542 | if (nilfs_test_opt(nilfs, DISCARD)) |
549 | seq_puts(seq, ",discard"); | 543 | seq_puts(seq, ",discard"); |
550 | 544 | ||
551 | return 0; | 545 | return 0; |
@@ -594,7 +588,7 @@ static match_table_t tokens = { | |||
594 | 588 | ||
595 | static int parse_options(char *options, struct super_block *sb, int is_remount) | 589 | static int parse_options(char *options, struct super_block *sb, int is_remount) |
596 | { | 590 | { |
597 | struct nilfs_sb_info *sbi = NILFS_SB(sb); | 591 | struct the_nilfs *nilfs = sb->s_fs_info; |
598 | char *p; | 592 | char *p; |
599 | substring_t args[MAX_OPT_ARGS]; | 593 | substring_t args[MAX_OPT_ARGS]; |
600 | 594 | ||
@@ -609,29 +603,29 @@ static int parse_options(char *options, struct super_block *sb, int is_remount) | |||
609 | token = match_token(p, tokens, args); | 603 | token = match_token(p, tokens, args); |
610 | switch (token) { | 604 | switch (token) { |
611 | case Opt_barrier: | 605 | case Opt_barrier: |
612 | nilfs_set_opt(sbi, BARRIER); | 606 | nilfs_set_opt(nilfs, BARRIER); |
613 | break; | 607 | break; |
614 | case Opt_nobarrier: | 608 | case Opt_nobarrier: |
615 | nilfs_clear_opt(sbi, BARRIER); | 609 | nilfs_clear_opt(nilfs, BARRIER); |
616 | break; | 610 | break; |
617 | case Opt_order: | 611 | case Opt_order: |
618 | if (strcmp(args[0].from, "relaxed") == 0) | 612 | if (strcmp(args[0].from, "relaxed") == 0) |
619 | /* Ordered data semantics */ | 613 | /* Ordered data semantics */ |
620 | nilfs_clear_opt(sbi, STRICT_ORDER); | 614 | nilfs_clear_opt(nilfs, STRICT_ORDER); |
621 | else if (strcmp(args[0].from, "strict") == 0) | 615 | else if (strcmp(args[0].from, "strict") == 0) |
622 | /* Strict in-order semantics */ | 616 | /* Strict in-order semantics */ |
623 | nilfs_set_opt(sbi, STRICT_ORDER); | 617 | nilfs_set_opt(nilfs, STRICT_ORDER); |
624 | else | 618 | else |
625 | return 0; | 619 | return 0; |
626 | break; | 620 | break; |
627 | case Opt_err_panic: | 621 | case Opt_err_panic: |
628 | nilfs_write_opt(sbi, ERROR_MODE, ERRORS_PANIC); | 622 | nilfs_write_opt(nilfs, ERROR_MODE, ERRORS_PANIC); |
629 | break; | 623 | break; |
630 | case Opt_err_ro: | 624 | case Opt_err_ro: |
631 | nilfs_write_opt(sbi, ERROR_MODE, ERRORS_RO); | 625 | nilfs_write_opt(nilfs, ERROR_MODE, ERRORS_RO); |
632 | break; | 626 | break; |
633 | case Opt_err_cont: | 627 | case Opt_err_cont: |
634 | nilfs_write_opt(sbi, ERROR_MODE, ERRORS_CONT); | 628 | nilfs_write_opt(nilfs, ERROR_MODE, ERRORS_CONT); |
635 | break; | 629 | break; |
636 | case Opt_snapshot: | 630 | case Opt_snapshot: |
637 | if (is_remount) { | 631 | if (is_remount) { |
@@ -642,13 +636,13 @@ static int parse_options(char *options, struct super_block *sb, int is_remount) | |||
642 | } | 636 | } |
643 | break; | 637 | break; |
644 | case Opt_norecovery: | 638 | case Opt_norecovery: |
645 | nilfs_set_opt(sbi, NORECOVERY); | 639 | nilfs_set_opt(nilfs, NORECOVERY); |
646 | break; | 640 | break; |
647 | case Opt_discard: | 641 | case Opt_discard: |
648 | nilfs_set_opt(sbi, DISCARD); | 642 | nilfs_set_opt(nilfs, DISCARD); |
649 | break; | 643 | break; |
650 | case Opt_nodiscard: | 644 | case Opt_nodiscard: |
651 | nilfs_clear_opt(sbi, DISCARD); | 645 | nilfs_clear_opt(nilfs, DISCARD); |
652 | break; | 646 | break; |
653 | default: | 647 | default: |
654 | printk(KERN_ERR | 648 | printk(KERN_ERR |
@@ -660,22 +654,24 @@ static int parse_options(char *options, struct super_block *sb, int is_remount) | |||
660 | } | 654 | } |
661 | 655 | ||
662 | static inline void | 656 | static inline void |
663 | nilfs_set_default_options(struct nilfs_sb_info *sbi, | 657 | nilfs_set_default_options(struct super_block *sb, |
664 | struct nilfs_super_block *sbp) | 658 | struct nilfs_super_block *sbp) |
665 | { | 659 | { |
666 | sbi->s_mount_opt = | 660 | struct the_nilfs *nilfs = sb->s_fs_info; |
661 | |||
662 | nilfs->ns_mount_opt = | ||
667 | NILFS_MOUNT_ERRORS_RO | NILFS_MOUNT_BARRIER; | 663 | NILFS_MOUNT_ERRORS_RO | NILFS_MOUNT_BARRIER; |
668 | } | 664 | } |
669 | 665 | ||
670 | static int nilfs_setup_super(struct nilfs_sb_info *sbi, int is_mount) | 666 | static int nilfs_setup_super(struct super_block *sb, int is_mount) |
671 | { | 667 | { |
672 | struct the_nilfs *nilfs = sbi->s_nilfs; | 668 | struct the_nilfs *nilfs = sb->s_fs_info; |
673 | struct nilfs_super_block **sbp; | 669 | struct nilfs_super_block **sbp; |
674 | int max_mnt_count; | 670 | int max_mnt_count; |
675 | int mnt_count; | 671 | int mnt_count; |
676 | 672 | ||
677 | /* nilfs->ns_sem must be locked by the caller. */ | 673 | /* nilfs->ns_sem must be locked by the caller. */ |
678 | sbp = nilfs_prepare_super(sbi, 0); | 674 | sbp = nilfs_prepare_super(sb, 0); |
679 | if (!sbp) | 675 | if (!sbp) |
680 | return -EIO; | 676 | return -EIO; |
681 | 677 | ||
@@ -706,7 +702,7 @@ skip_mount_setup: | |||
706 | /* synchronize sbp[1] with sbp[0] */ | 702 | /* synchronize sbp[1] with sbp[0] */ |
707 | if (sbp[1]) | 703 | if (sbp[1]) |
708 | memcpy(sbp[1], sbp[0], nilfs->ns_sbsize); | 704 | memcpy(sbp[1], sbp[0], nilfs->ns_sbsize); |
709 | return nilfs_commit_super(sbi, NILFS_SB_COMMIT_ALL); | 705 | return nilfs_commit_super(sb, NILFS_SB_COMMIT_ALL); |
710 | } | 706 | } |
711 | 707 | ||
712 | struct nilfs_super_block *nilfs_read_super_block(struct super_block *sb, | 708 | struct nilfs_super_block *nilfs_read_super_block(struct super_block *sb, |
@@ -727,7 +723,7 @@ int nilfs_store_magic_and_option(struct super_block *sb, | |||
727 | struct nilfs_super_block *sbp, | 723 | struct nilfs_super_block *sbp, |
728 | char *data) | 724 | char *data) |
729 | { | 725 | { |
730 | struct nilfs_sb_info *sbi = NILFS_SB(sb); | 726 | struct the_nilfs *nilfs = sb->s_fs_info; |
731 | 727 | ||
732 | sb->s_magic = le16_to_cpu(sbp->s_magic); | 728 | sb->s_magic = le16_to_cpu(sbp->s_magic); |
733 | 729 | ||
@@ -736,12 +732,12 @@ int nilfs_store_magic_and_option(struct super_block *sb, | |||
736 | sb->s_flags |= MS_NOATIME; | 732 | sb->s_flags |= MS_NOATIME; |
737 | #endif | 733 | #endif |
738 | 734 | ||
739 | nilfs_set_default_options(sbi, sbp); | 735 | nilfs_set_default_options(sb, sbp); |
740 | 736 | ||
741 | sbi->s_resuid = le16_to_cpu(sbp->s_def_resuid); | 737 | nilfs->ns_resuid = le16_to_cpu(sbp->s_def_resuid); |
742 | sbi->s_resgid = le16_to_cpu(sbp->s_def_resgid); | 738 | nilfs->ns_resgid = le16_to_cpu(sbp->s_def_resgid); |
743 | sbi->s_interval = le32_to_cpu(sbp->s_c_interval); | 739 | nilfs->ns_interval = le32_to_cpu(sbp->s_c_interval); |
744 | sbi->s_watermark = le32_to_cpu(sbp->s_c_block_max); | 740 | nilfs->ns_watermark = le32_to_cpu(sbp->s_c_block_max); |
745 | 741 | ||
746 | return !parse_options(data, sb, 0) ? -EINVAL : 0 ; | 742 | return !parse_options(data, sb, 0) ? -EINVAL : 0 ; |
747 | } | 743 | } |
@@ -822,7 +818,7 @@ static int nilfs_get_root_dentry(struct super_block *sb, | |||
822 | static int nilfs_attach_snapshot(struct super_block *s, __u64 cno, | 818 | static int nilfs_attach_snapshot(struct super_block *s, __u64 cno, |
823 | struct dentry **root_dentry) | 819 | struct dentry **root_dentry) |
824 | { | 820 | { |
825 | struct the_nilfs *nilfs = NILFS_SB(s)->s_nilfs; | 821 | struct the_nilfs *nilfs = s->s_fs_info; |
826 | struct nilfs_root *root; | 822 | struct nilfs_root *root; |
827 | int ret; | 823 | int ret; |
828 | 824 | ||
@@ -840,7 +836,7 @@ static int nilfs_attach_snapshot(struct super_block *s, __u64 cno, | |||
840 | goto out; | 836 | goto out; |
841 | } | 837 | } |
842 | 838 | ||
843 | ret = nilfs_attach_checkpoint(NILFS_SB(s), cno, false, &root); | 839 | ret = nilfs_attach_checkpoint(s, cno, false, &root); |
844 | if (ret) { | 840 | if (ret) { |
845 | printk(KERN_ERR "NILFS: error loading snapshot " | 841 | printk(KERN_ERR "NILFS: error loading snapshot " |
846 | "(checkpoint number=%llu).\n", | 842 | "(checkpoint number=%llu).\n", |
@@ -874,7 +870,7 @@ static int nilfs_try_to_shrink_tree(struct dentry *root_dentry) | |||
874 | 870 | ||
875 | int nilfs_checkpoint_is_mounted(struct super_block *sb, __u64 cno) | 871 | int nilfs_checkpoint_is_mounted(struct super_block *sb, __u64 cno) |
876 | { | 872 | { |
877 | struct the_nilfs *nilfs = NILFS_SB(sb)->s_nilfs; | 873 | struct the_nilfs *nilfs = sb->s_fs_info; |
878 | struct nilfs_root *root; | 874 | struct nilfs_root *root; |
879 | struct inode *inode; | 875 | struct inode *inode; |
880 | struct dentry *dentry; | 876 | struct dentry *dentry; |
@@ -887,7 +883,7 @@ int nilfs_checkpoint_is_mounted(struct super_block *sb, __u64 cno) | |||
887 | return true; /* protect recent checkpoints */ | 883 | return true; /* protect recent checkpoints */ |
888 | 884 | ||
889 | ret = false; | 885 | ret = false; |
890 | root = nilfs_lookup_root(NILFS_SB(sb)->s_nilfs, cno); | 886 | root = nilfs_lookup_root(nilfs, cno); |
891 | if (root) { | 887 | if (root) { |
892 | inode = nilfs_ilookup(sb, root, NILFS_ROOT_INO); | 888 | inode = nilfs_ilookup(sb, root, NILFS_ROOT_INO); |
893 | if (inode) { | 889 | if (inode) { |
@@ -917,43 +913,21 @@ static int | |||
917 | nilfs_fill_super(struct super_block *sb, void *data, int silent) | 913 | nilfs_fill_super(struct super_block *sb, void *data, int silent) |
918 | { | 914 | { |
919 | struct the_nilfs *nilfs; | 915 | struct the_nilfs *nilfs; |
920 | struct nilfs_sb_info *sbi; | ||
921 | struct nilfs_root *fsroot; | 916 | struct nilfs_root *fsroot; |
922 | struct backing_dev_info *bdi; | 917 | struct backing_dev_info *bdi; |
923 | __u64 cno; | 918 | __u64 cno; |
924 | int err; | 919 | int err; |
925 | 920 | ||
926 | sbi = kzalloc(sizeof(*sbi), GFP_KERNEL); | 921 | nilfs = alloc_nilfs(sb->s_bdev); |
927 | if (!sbi) | 922 | if (!nilfs) |
928 | return -ENOMEM; | 923 | return -ENOMEM; |
929 | 924 | ||
930 | sb->s_fs_info = sbi; | 925 | sb->s_fs_info = nilfs; |
931 | sbi->s_super = sb; | ||
932 | |||
933 | nilfs = alloc_nilfs(sb->s_bdev); | ||
934 | if (!nilfs) { | ||
935 | err = -ENOMEM; | ||
936 | goto failed_sbi; | ||
937 | } | ||
938 | sbi->s_nilfs = nilfs; | ||
939 | 926 | ||
940 | err = init_nilfs(nilfs, sbi, (char *)data); | 927 | err = init_nilfs(nilfs, sb, (char *)data); |
941 | if (err) | 928 | if (err) |
942 | goto failed_nilfs; | 929 | goto failed_nilfs; |
943 | 930 | ||
944 | spin_lock_init(&sbi->s_inode_lock); | ||
945 | INIT_LIST_HEAD(&sbi->s_dirty_files); | ||
946 | |||
947 | /* | ||
948 | * Following initialization is overlapped because | ||
949 | * nilfs_sb_info structure has been cleared at the beginning. | ||
950 | * But we reserve them to keep our interest and make ready | ||
951 | * for the future change. | ||
952 | */ | ||
953 | get_random_bytes(&sbi->s_next_generation, | ||
954 | sizeof(sbi->s_next_generation)); | ||
955 | spin_lock_init(&sbi->s_next_gen_lock); | ||
956 | |||
957 | sb->s_op = &nilfs_sops; | 931 | sb->s_op = &nilfs_sops; |
958 | sb->s_export_op = &nilfs_export_ops; | 932 | sb->s_export_op = &nilfs_export_ops; |
959 | sb->s_root = NULL; | 933 | sb->s_root = NULL; |
@@ -962,12 +936,12 @@ nilfs_fill_super(struct super_block *sb, void *data, int silent) | |||
962 | bdi = sb->s_bdev->bd_inode->i_mapping->backing_dev_info; | 936 | bdi = sb->s_bdev->bd_inode->i_mapping->backing_dev_info; |
963 | sb->s_bdi = bdi ? : &default_backing_dev_info; | 937 | sb->s_bdi = bdi ? : &default_backing_dev_info; |
964 | 938 | ||
965 | err = load_nilfs(nilfs, sbi); | 939 | err = load_nilfs(nilfs, sb); |
966 | if (err) | 940 | if (err) |
967 | goto failed_nilfs; | 941 | goto failed_nilfs; |
968 | 942 | ||
969 | cno = nilfs_last_cno(nilfs); | 943 | cno = nilfs_last_cno(nilfs); |
970 | err = nilfs_attach_checkpoint(sbi, cno, true, &fsroot); | 944 | err = nilfs_attach_checkpoint(sb, cno, true, &fsroot); |
971 | if (err) { | 945 | if (err) { |
972 | printk(KERN_ERR "NILFS: error loading last checkpoint " | 946 | printk(KERN_ERR "NILFS: error loading last checkpoint " |
973 | "(checkpoint number=%llu).\n", (unsigned long long)cno); | 947 | "(checkpoint number=%llu).\n", (unsigned long long)cno); |
@@ -975,7 +949,7 @@ nilfs_fill_super(struct super_block *sb, void *data, int silent) | |||
975 | } | 949 | } |
976 | 950 | ||
977 | if (!(sb->s_flags & MS_RDONLY)) { | 951 | if (!(sb->s_flags & MS_RDONLY)) { |
978 | err = nilfs_attach_segment_constructor(sbi, fsroot); | 952 | err = nilfs_attach_log_writer(sb, fsroot); |
979 | if (err) | 953 | if (err) |
980 | goto failed_checkpoint; | 954 | goto failed_checkpoint; |
981 | } | 955 | } |
@@ -988,14 +962,14 @@ nilfs_fill_super(struct super_block *sb, void *data, int silent) | |||
988 | 962 | ||
989 | if (!(sb->s_flags & MS_RDONLY)) { | 963 | if (!(sb->s_flags & MS_RDONLY)) { |
990 | down_write(&nilfs->ns_sem); | 964 | down_write(&nilfs->ns_sem); |
991 | nilfs_setup_super(sbi, true); | 965 | nilfs_setup_super(sb, true); |
992 | up_write(&nilfs->ns_sem); | 966 | up_write(&nilfs->ns_sem); |
993 | } | 967 | } |
994 | 968 | ||
995 | return 0; | 969 | return 0; |
996 | 970 | ||
997 | failed_segctor: | 971 | failed_segctor: |
998 | nilfs_detach_segment_constructor(sbi); | 972 | nilfs_detach_log_writer(sb); |
999 | 973 | ||
1000 | failed_checkpoint: | 974 | failed_checkpoint: |
1001 | nilfs_put_root(fsroot); | 975 | nilfs_put_root(fsroot); |
@@ -1007,23 +981,18 @@ nilfs_fill_super(struct super_block *sb, void *data, int silent) | |||
1007 | 981 | ||
1008 | failed_nilfs: | 982 | failed_nilfs: |
1009 | destroy_nilfs(nilfs); | 983 | destroy_nilfs(nilfs); |
1010 | |||
1011 | failed_sbi: | ||
1012 | sb->s_fs_info = NULL; | ||
1013 | kfree(sbi); | ||
1014 | return err; | 984 | return err; |
1015 | } | 985 | } |
1016 | 986 | ||
1017 | static int nilfs_remount(struct super_block *sb, int *flags, char *data) | 987 | static int nilfs_remount(struct super_block *sb, int *flags, char *data) |
1018 | { | 988 | { |
1019 | struct nilfs_sb_info *sbi = NILFS_SB(sb); | 989 | struct the_nilfs *nilfs = sb->s_fs_info; |
1020 | struct the_nilfs *nilfs = sbi->s_nilfs; | ||
1021 | unsigned long old_sb_flags; | 990 | unsigned long old_sb_flags; |
1022 | unsigned long old_mount_opt; | 991 | unsigned long old_mount_opt; |
1023 | int err; | 992 | int err; |
1024 | 993 | ||
1025 | old_sb_flags = sb->s_flags; | 994 | old_sb_flags = sb->s_flags; |
1026 | old_mount_opt = sbi->s_mount_opt; | 995 | old_mount_opt = nilfs->ns_mount_opt; |
1027 | 996 | ||
1028 | if (!parse_options(data, sb, 1)) { | 997 | if (!parse_options(data, sb, 1)) { |
1029 | err = -EINVAL; | 998 | err = -EINVAL; |
@@ -1043,8 +1012,8 @@ static int nilfs_remount(struct super_block *sb, int *flags, char *data) | |||
1043 | if ((*flags & MS_RDONLY) == (sb->s_flags & MS_RDONLY)) | 1012 | if ((*flags & MS_RDONLY) == (sb->s_flags & MS_RDONLY)) |
1044 | goto out; | 1013 | goto out; |
1045 | if (*flags & MS_RDONLY) { | 1014 | if (*flags & MS_RDONLY) { |
1046 | /* Shutting down the segment constructor */ | 1015 | /* Shutting down log writer */ |
1047 | nilfs_detach_segment_constructor(sbi); | 1016 | nilfs_detach_log_writer(sb); |
1048 | sb->s_flags |= MS_RDONLY; | 1017 | sb->s_flags |= MS_RDONLY; |
1049 | 1018 | ||
1050 | /* | 1019 | /* |
@@ -1052,7 +1021,7 @@ static int nilfs_remount(struct super_block *sb, int *flags, char *data) | |||
1052 | * the RDONLY flag and then mark the partition as valid again. | 1021 | * the RDONLY flag and then mark the partition as valid again. |
1053 | */ | 1022 | */ |
1054 | down_write(&nilfs->ns_sem); | 1023 | down_write(&nilfs->ns_sem); |
1055 | nilfs_cleanup_super(sbi); | 1024 | nilfs_cleanup_super(sb); |
1056 | up_write(&nilfs->ns_sem); | 1025 | up_write(&nilfs->ns_sem); |
1057 | } else { | 1026 | } else { |
1058 | __u64 features; | 1027 | __u64 features; |
@@ -1079,12 +1048,12 @@ static int nilfs_remount(struct super_block *sb, int *flags, char *data) | |||
1079 | sb->s_flags &= ~MS_RDONLY; | 1048 | sb->s_flags &= ~MS_RDONLY; |
1080 | 1049 | ||
1081 | root = NILFS_I(sb->s_root->d_inode)->i_root; | 1050 | root = NILFS_I(sb->s_root->d_inode)->i_root; |
1082 | err = nilfs_attach_segment_constructor(sbi, root); | 1051 | err = nilfs_attach_log_writer(sb, root); |
1083 | if (err) | 1052 | if (err) |
1084 | goto restore_opts; | 1053 | goto restore_opts; |
1085 | 1054 | ||
1086 | down_write(&nilfs->ns_sem); | 1055 | down_write(&nilfs->ns_sem); |
1087 | nilfs_setup_super(sbi, true); | 1056 | nilfs_setup_super(sb, true); |
1088 | up_write(&nilfs->ns_sem); | 1057 | up_write(&nilfs->ns_sem); |
1089 | } | 1058 | } |
1090 | out: | 1059 | out: |
@@ -1092,13 +1061,12 @@ static int nilfs_remount(struct super_block *sb, int *flags, char *data) | |||
1092 | 1061 | ||
1093 | restore_opts: | 1062 | restore_opts: |
1094 | sb->s_flags = old_sb_flags; | 1063 | sb->s_flags = old_sb_flags; |
1095 | sbi->s_mount_opt = old_mount_opt; | 1064 | nilfs->ns_mount_opt = old_mount_opt; |
1096 | return err; | 1065 | return err; |
1097 | } | 1066 | } |
1098 | 1067 | ||
1099 | struct nilfs_super_data { | 1068 | struct nilfs_super_data { |
1100 | struct block_device *bdev; | 1069 | struct block_device *bdev; |
1101 | struct nilfs_sb_info *sbi; | ||
1102 | __u64 cno; | 1070 | __u64 cno; |
1103 | int flags; | 1071 | int flags; |
1104 | }; | 1072 | }; |
diff --git a/fs/nilfs2/the_nilfs.c b/fs/nilfs2/the_nilfs.c index ad4ac607cf57..d2acd1a651f3 100644 --- a/fs/nilfs2/the_nilfs.c +++ b/fs/nilfs2/the_nilfs.c | |||
@@ -25,6 +25,7 @@ | |||
25 | #include <linux/slab.h> | 25 | #include <linux/slab.h> |
26 | #include <linux/blkdev.h> | 26 | #include <linux/blkdev.h> |
27 | #include <linux/backing-dev.h> | 27 | #include <linux/backing-dev.h> |
28 | #include <linux/random.h> | ||
28 | #include <linux/crc32.h> | 29 | #include <linux/crc32.h> |
29 | #include "nilfs.h" | 30 | #include "nilfs.h" |
30 | #include "segment.h" | 31 | #include "segment.h" |
@@ -75,7 +76,10 @@ struct the_nilfs *alloc_nilfs(struct block_device *bdev) | |||
75 | nilfs->ns_bdev = bdev; | 76 | nilfs->ns_bdev = bdev; |
76 | atomic_set(&nilfs->ns_ndirtyblks, 0); | 77 | atomic_set(&nilfs->ns_ndirtyblks, 0); |
77 | init_rwsem(&nilfs->ns_sem); | 78 | init_rwsem(&nilfs->ns_sem); |
79 | INIT_LIST_HEAD(&nilfs->ns_dirty_files); | ||
78 | INIT_LIST_HEAD(&nilfs->ns_gc_inodes); | 80 | INIT_LIST_HEAD(&nilfs->ns_gc_inodes); |
81 | spin_lock_init(&nilfs->ns_inode_lock); | ||
82 | spin_lock_init(&nilfs->ns_next_gen_lock); | ||
79 | spin_lock_init(&nilfs->ns_last_segment_lock); | 83 | spin_lock_init(&nilfs->ns_last_segment_lock); |
80 | nilfs->ns_cptree = RB_ROOT; | 84 | nilfs->ns_cptree = RB_ROOT; |
81 | spin_lock_init(&nilfs->ns_cptree_lock); | 85 | spin_lock_init(&nilfs->ns_cptree_lock); |
@@ -197,16 +201,16 @@ static int nilfs_store_log_cursor(struct the_nilfs *nilfs, | |||
197 | /** | 201 | /** |
198 | * load_nilfs - load and recover the nilfs | 202 | * load_nilfs - load and recover the nilfs |
199 | * @nilfs: the_nilfs structure to be released | 203 | * @nilfs: the_nilfs structure to be released |
200 | * @sbi: nilfs_sb_info used to recover past segment | 204 | * @sb: super block isntance used to recover past segment |
201 | * | 205 | * |
202 | * load_nilfs() searches and load the latest super root, | 206 | * load_nilfs() searches and load the latest super root, |
203 | * attaches the last segment, and does recovery if needed. | 207 | * attaches the last segment, and does recovery if needed. |
204 | * The caller must call this exclusively for simultaneous mounts. | 208 | * The caller must call this exclusively for simultaneous mounts. |
205 | */ | 209 | */ |
206 | int load_nilfs(struct the_nilfs *nilfs, struct nilfs_sb_info *sbi) | 210 | int load_nilfs(struct the_nilfs *nilfs, struct super_block *sb) |
207 | { | 211 | { |
208 | struct nilfs_recovery_info ri; | 212 | struct nilfs_recovery_info ri; |
209 | unsigned int s_flags = sbi->s_super->s_flags; | 213 | unsigned int s_flags = sb->s_flags; |
210 | int really_read_only = bdev_read_only(nilfs->ns_bdev); | 214 | int really_read_only = bdev_read_only(nilfs->ns_bdev); |
211 | int valid_fs = nilfs_valid_fs(nilfs); | 215 | int valid_fs = nilfs_valid_fs(nilfs); |
212 | int err; | 216 | int err; |
@@ -271,7 +275,7 @@ int load_nilfs(struct the_nilfs *nilfs, struct nilfs_sb_info *sbi) | |||
271 | goto scan_error; | 275 | goto scan_error; |
272 | } | 276 | } |
273 | 277 | ||
274 | err = nilfs_load_super_root(nilfs, sbi->s_super, ri.ri_super_root); | 278 | err = nilfs_load_super_root(nilfs, sb, ri.ri_super_root); |
275 | if (unlikely(err)) { | 279 | if (unlikely(err)) { |
276 | printk(KERN_ERR "NILFS: error loading super root.\n"); | 280 | printk(KERN_ERR "NILFS: error loading super root.\n"); |
277 | goto failed; | 281 | goto failed; |
@@ -283,7 +287,7 @@ int load_nilfs(struct the_nilfs *nilfs, struct nilfs_sb_info *sbi) | |||
283 | if (s_flags & MS_RDONLY) { | 287 | if (s_flags & MS_RDONLY) { |
284 | __u64 features; | 288 | __u64 features; |
285 | 289 | ||
286 | if (nilfs_test_opt(sbi, NORECOVERY)) { | 290 | if (nilfs_test_opt(nilfs, NORECOVERY)) { |
287 | printk(KERN_INFO "NILFS: norecovery option specified. " | 291 | printk(KERN_INFO "NILFS: norecovery option specified. " |
288 | "skipping roll-forward recovery\n"); | 292 | "skipping roll-forward recovery\n"); |
289 | goto skip_recovery; | 293 | goto skip_recovery; |
@@ -304,21 +308,21 @@ int load_nilfs(struct the_nilfs *nilfs, struct nilfs_sb_info *sbi) | |||
304 | err = -EROFS; | 308 | err = -EROFS; |
305 | goto failed_unload; | 309 | goto failed_unload; |
306 | } | 310 | } |
307 | sbi->s_super->s_flags &= ~MS_RDONLY; | 311 | sb->s_flags &= ~MS_RDONLY; |
308 | } else if (nilfs_test_opt(sbi, NORECOVERY)) { | 312 | } else if (nilfs_test_opt(nilfs, NORECOVERY)) { |
309 | printk(KERN_ERR "NILFS: recovery cancelled because norecovery " | 313 | printk(KERN_ERR "NILFS: recovery cancelled because norecovery " |
310 | "option was specified for a read/write mount\n"); | 314 | "option was specified for a read/write mount\n"); |
311 | err = -EINVAL; | 315 | err = -EINVAL; |
312 | goto failed_unload; | 316 | goto failed_unload; |
313 | } | 317 | } |
314 | 318 | ||
315 | err = nilfs_salvage_orphan_logs(nilfs, sbi, &ri); | 319 | err = nilfs_salvage_orphan_logs(nilfs, sb, &ri); |
316 | if (err) | 320 | if (err) |
317 | goto failed_unload; | 321 | goto failed_unload; |
318 | 322 | ||
319 | down_write(&nilfs->ns_sem); | 323 | down_write(&nilfs->ns_sem); |
320 | nilfs->ns_mount_state |= NILFS_VALID_FS; /* set "clean" flag */ | 324 | nilfs->ns_mount_state |= NILFS_VALID_FS; /* set "clean" flag */ |
321 | err = nilfs_cleanup_super(sbi); | 325 | err = nilfs_cleanup_super(sb); |
322 | up_write(&nilfs->ns_sem); | 326 | up_write(&nilfs->ns_sem); |
323 | 327 | ||
324 | if (err) { | 328 | if (err) { |
@@ -330,7 +334,7 @@ int load_nilfs(struct the_nilfs *nilfs, struct nilfs_sb_info *sbi) | |||
330 | 334 | ||
331 | skip_recovery: | 335 | skip_recovery: |
332 | nilfs_clear_recovery_info(&ri); | 336 | nilfs_clear_recovery_info(&ri); |
333 | sbi->s_super->s_flags = s_flags; | 337 | sb->s_flags = s_flags; |
334 | return 0; | 338 | return 0; |
335 | 339 | ||
336 | scan_error: | 340 | scan_error: |
@@ -344,7 +348,7 @@ int load_nilfs(struct the_nilfs *nilfs, struct nilfs_sb_info *sbi) | |||
344 | 348 | ||
345 | failed: | 349 | failed: |
346 | nilfs_clear_recovery_info(&ri); | 350 | nilfs_clear_recovery_info(&ri); |
347 | sbi->s_super->s_flags = s_flags; | 351 | sb->s_flags = s_flags; |
348 | return err; | 352 | return err; |
349 | } | 353 | } |
350 | 354 | ||
@@ -475,10 +479,13 @@ static int nilfs_load_super_block(struct the_nilfs *nilfs, | |||
475 | return -EIO; | 479 | return -EIO; |
476 | } | 480 | } |
477 | printk(KERN_WARNING | 481 | printk(KERN_WARNING |
478 | "NILFS warning: unable to read primary superblock\n"); | 482 | "NILFS warning: unable to read primary superblock " |
479 | } else if (!sbp[1]) | 483 | "(blocksize = %d)\n", blocksize); |
484 | } else if (!sbp[1]) { | ||
480 | printk(KERN_WARNING | 485 | printk(KERN_WARNING |
481 | "NILFS warning: unable to read secondary superblock\n"); | 486 | "NILFS warning: unable to read secondary superblock " |
487 | "(blocksize = %d)\n", blocksize); | ||
488 | } | ||
482 | 489 | ||
483 | /* | 490 | /* |
484 | * Compare two super blocks and set 1 in swp if the secondary | 491 | * Compare two super blocks and set 1 in swp if the secondary |
@@ -505,7 +512,7 @@ static int nilfs_load_super_block(struct the_nilfs *nilfs, | |||
505 | 512 | ||
506 | if (!valid[!swp]) | 513 | if (!valid[!swp]) |
507 | printk(KERN_WARNING "NILFS warning: broken superblock. " | 514 | printk(KERN_WARNING "NILFS warning: broken superblock. " |
508 | "using spare superblock.\n"); | 515 | "using spare superblock (blocksize = %d).\n", blocksize); |
509 | if (swp) | 516 | if (swp) |
510 | nilfs_swap_super_block(nilfs); | 517 | nilfs_swap_super_block(nilfs); |
511 | 518 | ||
@@ -519,7 +526,6 @@ static int nilfs_load_super_block(struct the_nilfs *nilfs, | |||
519 | /** | 526 | /** |
520 | * init_nilfs - initialize a NILFS instance. | 527 | * init_nilfs - initialize a NILFS instance. |
521 | * @nilfs: the_nilfs structure | 528 | * @nilfs: the_nilfs structure |
522 | * @sbi: nilfs_sb_info | ||
523 | * @sb: super block | 529 | * @sb: super block |
524 | * @data: mount options | 530 | * @data: mount options |
525 | * | 531 | * |
@@ -530,9 +536,8 @@ static int nilfs_load_super_block(struct the_nilfs *nilfs, | |||
530 | * Return Value: On success, 0 is returned. On error, a negative error | 536 | * Return Value: On success, 0 is returned. On error, a negative error |
531 | * code is returned. | 537 | * code is returned. |
532 | */ | 538 | */ |
533 | int init_nilfs(struct the_nilfs *nilfs, struct nilfs_sb_info *sbi, char *data) | 539 | int init_nilfs(struct the_nilfs *nilfs, struct super_block *sb, char *data) |
534 | { | 540 | { |
535 | struct super_block *sb = sbi->s_super; | ||
536 | struct nilfs_super_block *sbp; | 541 | struct nilfs_super_block *sbp; |
537 | int blocksize; | 542 | int blocksize; |
538 | int err; | 543 | int err; |
@@ -588,6 +593,9 @@ int init_nilfs(struct the_nilfs *nilfs, struct nilfs_sb_info *sbi, char *data) | |||
588 | nilfs->ns_blocksize_bits = sb->s_blocksize_bits; | 593 | nilfs->ns_blocksize_bits = sb->s_blocksize_bits; |
589 | nilfs->ns_blocksize = blocksize; | 594 | nilfs->ns_blocksize = blocksize; |
590 | 595 | ||
596 | get_random_bytes(&nilfs->ns_next_generation, | ||
597 | sizeof(nilfs->ns_next_generation)); | ||
598 | |||
591 | err = nilfs_store_disk_layout(nilfs, sbp); | 599 | err = nilfs_store_disk_layout(nilfs, sbp); |
592 | if (err) | 600 | if (err) |
593 | goto failed_sbh; | 601 | goto failed_sbh; |
diff --git a/fs/nilfs2/the_nilfs.h b/fs/nilfs2/the_nilfs.h index fd85e4c05c6b..f4968145c2a3 100644 --- a/fs/nilfs2/the_nilfs.h +++ b/fs/nilfs2/the_nilfs.h | |||
@@ -31,7 +31,8 @@ | |||
31 | #include <linux/blkdev.h> | 31 | #include <linux/blkdev.h> |
32 | #include <linux/backing-dev.h> | 32 | #include <linux/backing-dev.h> |
33 | #include <linux/slab.h> | 33 | #include <linux/slab.h> |
34 | #include "sb.h" | 34 | |
35 | struct nilfs_sc_info; | ||
35 | 36 | ||
36 | /* the_nilfs struct */ | 37 | /* the_nilfs struct */ |
37 | enum { | 38 | enum { |
@@ -65,13 +66,23 @@ enum { | |||
65 | * @ns_last_cno: checkpoint number of the latest segment | 66 | * @ns_last_cno: checkpoint number of the latest segment |
66 | * @ns_prot_seq: least sequence number of segments which must not be reclaimed | 67 | * @ns_prot_seq: least sequence number of segments which must not be reclaimed |
67 | * @ns_prev_seq: base sequence number used to decide if advance log cursor | 68 | * @ns_prev_seq: base sequence number used to decide if advance log cursor |
68 | * @ns_segctor_sem: segment constructor semaphore | 69 | * @ns_writer: log writer |
70 | * @ns_segctor_sem: semaphore protecting log write | ||
69 | * @ns_dat: DAT file inode | 71 | * @ns_dat: DAT file inode |
70 | * @ns_cpfile: checkpoint file inode | 72 | * @ns_cpfile: checkpoint file inode |
71 | * @ns_sufile: segusage file inode | 73 | * @ns_sufile: segusage file inode |
72 | * @ns_cptree: rb-tree of all mounted checkpoints (nilfs_root) | 74 | * @ns_cptree: rb-tree of all mounted checkpoints (nilfs_root) |
73 | * @ns_cptree_lock: lock protecting @ns_cptree | 75 | * @ns_cptree_lock: lock protecting @ns_cptree |
76 | * @ns_dirty_files: list of dirty files | ||
77 | * @ns_inode_lock: lock protecting @ns_dirty_files | ||
74 | * @ns_gc_inodes: dummy inodes to keep live blocks | 78 | * @ns_gc_inodes: dummy inodes to keep live blocks |
79 | * @ns_next_generation: next generation number for inodes | ||
80 | * @ns_next_gen_lock: lock protecting @ns_next_generation | ||
81 | * @ns_mount_opt: mount options | ||
82 | * @ns_resuid: uid for reserved blocks | ||
83 | * @ns_resgid: gid for reserved blocks | ||
84 | * @ns_interval: checkpoint creation interval | ||
85 | * @ns_watermark: watermark for the number of dirty buffers | ||
75 | * @ns_blocksize_bits: bit length of block size | 86 | * @ns_blocksize_bits: bit length of block size |
76 | * @ns_blocksize: block size | 87 | * @ns_blocksize: block size |
77 | * @ns_nsegments: number of segments in filesystem | 88 | * @ns_nsegments: number of segments in filesystem |
@@ -131,6 +142,7 @@ struct the_nilfs { | |||
131 | u64 ns_prot_seq; | 142 | u64 ns_prot_seq; |
132 | u64 ns_prev_seq; | 143 | u64 ns_prev_seq; |
133 | 144 | ||
145 | struct nilfs_sc_info *ns_writer; | ||
134 | struct rw_semaphore ns_segctor_sem; | 146 | struct rw_semaphore ns_segctor_sem; |
135 | 147 | ||
136 | /* | 148 | /* |
@@ -145,9 +157,25 @@ struct the_nilfs { | |||
145 | struct rb_root ns_cptree; | 157 | struct rb_root ns_cptree; |
146 | spinlock_t ns_cptree_lock; | 158 | spinlock_t ns_cptree_lock; |
147 | 159 | ||
160 | /* Dirty inode list */ | ||
161 | struct list_head ns_dirty_files; | ||
162 | spinlock_t ns_inode_lock; | ||
163 | |||
148 | /* GC inode list */ | 164 | /* GC inode list */ |
149 | struct list_head ns_gc_inodes; | 165 | struct list_head ns_gc_inodes; |
150 | 166 | ||
167 | /* Inode allocator */ | ||
168 | u32 ns_next_generation; | ||
169 | spinlock_t ns_next_gen_lock; | ||
170 | |||
171 | /* Mount options */ | ||
172 | unsigned long ns_mount_opt; | ||
173 | |||
174 | uid_t ns_resuid; | ||
175 | gid_t ns_resgid; | ||
176 | unsigned long ns_interval; | ||
177 | unsigned long ns_watermark; | ||
178 | |||
151 | /* Disk layout information (static) */ | 179 | /* Disk layout information (static) */ |
152 | unsigned int ns_blocksize_bits; | 180 | unsigned int ns_blocksize_bits; |
153 | unsigned int ns_blocksize; | 181 | unsigned int ns_blocksize; |
@@ -180,6 +208,20 @@ THE_NILFS_FNS(DISCONTINUED, discontinued) | |||
180 | THE_NILFS_FNS(GC_RUNNING, gc_running) | 208 | THE_NILFS_FNS(GC_RUNNING, gc_running) |
181 | THE_NILFS_FNS(SB_DIRTY, sb_dirty) | 209 | THE_NILFS_FNS(SB_DIRTY, sb_dirty) |
182 | 210 | ||
211 | /* | ||
212 | * Mount option operations | ||
213 | */ | ||
214 | #define nilfs_clear_opt(nilfs, opt) \ | ||
215 | do { (nilfs)->ns_mount_opt &= ~NILFS_MOUNT_##opt; } while (0) | ||
216 | #define nilfs_set_opt(nilfs, opt) \ | ||
217 | do { (nilfs)->ns_mount_opt |= NILFS_MOUNT_##opt; } while (0) | ||
218 | #define nilfs_test_opt(nilfs, opt) ((nilfs)->ns_mount_opt & NILFS_MOUNT_##opt) | ||
219 | #define nilfs_write_opt(nilfs, mask, opt) \ | ||
220 | do { (nilfs)->ns_mount_opt = \ | ||
221 | (((nilfs)->ns_mount_opt & ~NILFS_MOUNT_##mask) | \ | ||
222 | NILFS_MOUNT_##opt); \ | ||
223 | } while (0) | ||
224 | |||
183 | /** | 225 | /** |
184 | * struct nilfs_root - nilfs root object | 226 | * struct nilfs_root - nilfs root object |
185 | * @cno: checkpoint number | 227 | * @cno: checkpoint number |
@@ -224,15 +266,14 @@ static inline int nilfs_sb_will_flip(struct the_nilfs *nilfs) | |||
224 | void nilfs_set_last_segment(struct the_nilfs *, sector_t, u64, __u64); | 266 | void nilfs_set_last_segment(struct the_nilfs *, sector_t, u64, __u64); |
225 | struct the_nilfs *alloc_nilfs(struct block_device *bdev); | 267 | struct the_nilfs *alloc_nilfs(struct block_device *bdev); |
226 | void destroy_nilfs(struct the_nilfs *nilfs); | 268 | void destroy_nilfs(struct the_nilfs *nilfs); |
227 | int init_nilfs(struct the_nilfs *, struct nilfs_sb_info *, char *); | 269 | int init_nilfs(struct the_nilfs *nilfs, struct super_block *sb, char *data); |
228 | int load_nilfs(struct the_nilfs *, struct nilfs_sb_info *); | 270 | int load_nilfs(struct the_nilfs *nilfs, struct super_block *sb); |
229 | int nilfs_discard_segments(struct the_nilfs *, __u64 *, size_t); | 271 | int nilfs_discard_segments(struct the_nilfs *, __u64 *, size_t); |
230 | int nilfs_count_free_blocks(struct the_nilfs *, sector_t *); | 272 | int nilfs_count_free_blocks(struct the_nilfs *, sector_t *); |
231 | struct nilfs_root *nilfs_lookup_root(struct the_nilfs *nilfs, __u64 cno); | 273 | struct nilfs_root *nilfs_lookup_root(struct the_nilfs *nilfs, __u64 cno); |
232 | struct nilfs_root *nilfs_find_or_create_root(struct the_nilfs *nilfs, | 274 | struct nilfs_root *nilfs_find_or_create_root(struct the_nilfs *nilfs, |
233 | __u64 cno); | 275 | __u64 cno); |
234 | void nilfs_put_root(struct nilfs_root *root); | 276 | void nilfs_put_root(struct nilfs_root *root); |
235 | struct nilfs_sb_info *nilfs_find_sbinfo(struct the_nilfs *, int, __u64); | ||
236 | int nilfs_near_disk_full(struct the_nilfs *); | 277 | int nilfs_near_disk_full(struct the_nilfs *); |
237 | void nilfs_fall_back_super_block(struct the_nilfs *); | 278 | void nilfs_fall_back_super_block(struct the_nilfs *); |
238 | void nilfs_swap_super_block(struct the_nilfs *); | 279 | void nilfs_swap_super_block(struct the_nilfs *); |
diff --git a/include/linux/magic.h b/include/linux/magic.h index 6cfe344f9559..1e5df2af8d84 100644 --- a/include/linux/magic.h +++ b/include/linux/magic.h | |||
@@ -23,6 +23,7 @@ | |||
23 | #define XENFS_SUPER_MAGIC 0xabba1974 | 23 | #define XENFS_SUPER_MAGIC 0xabba1974 |
24 | #define EXT4_SUPER_MAGIC 0xEF53 | 24 | #define EXT4_SUPER_MAGIC 0xEF53 |
25 | #define BTRFS_SUPER_MAGIC 0x9123683E | 25 | #define BTRFS_SUPER_MAGIC 0x9123683E |
26 | #define NILFS_SUPER_MAGIC 0x3434 | ||
26 | #define HPFS_SUPER_MAGIC 0xf995e849 | 27 | #define HPFS_SUPER_MAGIC 0xf995e849 |
27 | #define ISOFS_SUPER_MAGIC 0x9660 | 28 | #define ISOFS_SUPER_MAGIC 0x9660 |
28 | #define JFFS2_SUPER_MAGIC 0x72b6 | 29 | #define JFFS2_SUPER_MAGIC 0x72b6 |
diff --git a/include/linux/nilfs2_fs.h b/include/linux/nilfs2_fs.h index 227e49dd5720..8768c469e93e 100644 --- a/include/linux/nilfs2_fs.h +++ b/include/linux/nilfs2_fs.h | |||
@@ -40,26 +40,7 @@ | |||
40 | 40 | ||
41 | #include <linux/types.h> | 41 | #include <linux/types.h> |
42 | #include <linux/ioctl.h> | 42 | #include <linux/ioctl.h> |
43 | 43 | #include <linux/magic.h> | |
44 | /* | ||
45 | * Inode flags stored in nilfs_inode and on-memory nilfs inode | ||
46 | * | ||
47 | * We define these flags based on ext2-fs because of the | ||
48 | * compatibility reason; to avoid problems in chattr(1) | ||
49 | */ | ||
50 | #define NILFS_SECRM_FL 0x00000001 /* Secure deletion */ | ||
51 | #define NILFS_UNRM_FL 0x00000002 /* Undelete */ | ||
52 | #define NILFS_SYNC_FL 0x00000008 /* Synchronous updates */ | ||
53 | #define NILFS_IMMUTABLE_FL 0x00000010 /* Immutable file */ | ||
54 | #define NILFS_APPEND_FL 0x00000020 /* writes to file may only append */ | ||
55 | #define NILFS_NODUMP_FL 0x00000040 /* do not dump file */ | ||
56 | #define NILFS_NOATIME_FL 0x00000080 /* do not update atime */ | ||
57 | /* Reserved for compression usage... */ | ||
58 | #define NILFS_NOTAIL_FL 0x00008000 /* file tail should not be merged */ | ||
59 | #define NILFS_DIRSYNC_FL 0x00010000 /* dirsync behaviour */ | ||
60 | |||
61 | #define NILFS_FL_USER_VISIBLE 0x0003DFFF /* User visible flags */ | ||
62 | #define NILFS_FL_USER_MODIFIABLE 0x000380FF /* User modifiable flags */ | ||
63 | 44 | ||
64 | 45 | ||
65 | #define NILFS_INODE_BMAP_SIZE 7 | 46 | #define NILFS_INODE_BMAP_SIZE 7 |
@@ -236,8 +217,10 @@ struct nilfs_super_block { | |||
236 | * If there is a bit set in the incompatible feature set that the kernel | 217 | * If there is a bit set in the incompatible feature set that the kernel |
237 | * doesn't know about, it should refuse to mount the filesystem. | 218 | * doesn't know about, it should refuse to mount the filesystem. |
238 | */ | 219 | */ |
220 | #define NILFS_FEATURE_COMPAT_RO_BLOCK_COUNT 0x00000001ULL | ||
221 | |||
239 | #define NILFS_FEATURE_COMPAT_SUPP 0ULL | 222 | #define NILFS_FEATURE_COMPAT_SUPP 0ULL |
240 | #define NILFS_FEATURE_COMPAT_RO_SUPP 0ULL | 223 | #define NILFS_FEATURE_COMPAT_RO_SUPP NILFS_FEATURE_COMPAT_RO_BLOCK_COUNT |
241 | #define NILFS_FEATURE_INCOMPAT_SUPP 0ULL | 224 | #define NILFS_FEATURE_INCOMPAT_SUPP 0ULL |
242 | 225 | ||
243 | /* | 226 | /* |
@@ -260,7 +243,6 @@ struct nilfs_super_block { | |||
260 | #define NILFS_USER_INO 11 /* Fisrt user's file inode number */ | 243 | #define NILFS_USER_INO 11 /* Fisrt user's file inode number */ |
261 | 244 | ||
262 | #define NILFS_SB_OFFSET_BYTES 1024 /* byte offset of nilfs superblock */ | 245 | #define NILFS_SB_OFFSET_BYTES 1024 /* byte offset of nilfs superblock */ |
263 | #define NILFS_SUPER_MAGIC 0x3434 /* NILFS filesystem magic number */ | ||
264 | 246 | ||
265 | #define NILFS_SEG_MIN_BLOCKS 16 /* Minimum number of blocks in | 247 | #define NILFS_SEG_MIN_BLOCKS 16 /* Minimum number of blocks in |
266 | a full segment */ | 248 | a full segment */ |
@@ -346,17 +328,21 @@ static inline unsigned nilfs_rec_len_from_disk(__le16 dlen) | |||
346 | { | 328 | { |
347 | unsigned len = le16_to_cpu(dlen); | 329 | unsigned len = le16_to_cpu(dlen); |
348 | 330 | ||
331 | #if !defined(__KERNEL__) || (PAGE_CACHE_SIZE >= 65536) | ||
349 | if (len == NILFS_MAX_REC_LEN) | 332 | if (len == NILFS_MAX_REC_LEN) |
350 | return 1 << 16; | 333 | return 1 << 16; |
334 | #endif | ||
351 | return len; | 335 | return len; |
352 | } | 336 | } |
353 | 337 | ||
354 | static inline __le16 nilfs_rec_len_to_disk(unsigned len) | 338 | static inline __le16 nilfs_rec_len_to_disk(unsigned len) |
355 | { | 339 | { |
340 | #if !defined(__KERNEL__) || (PAGE_CACHE_SIZE >= 65536) | ||
356 | if (len == (1 << 16)) | 341 | if (len == (1 << 16)) |
357 | return cpu_to_le16(NILFS_MAX_REC_LEN); | 342 | return cpu_to_le16(NILFS_MAX_REC_LEN); |
358 | else if (len > (1 << 16)) | 343 | else if (len > (1 << 16)) |
359 | BUG(); | 344 | BUG(); |
345 | #endif | ||
360 | return cpu_to_le16(len); | 346 | return cpu_to_le16(len); |
361 | } | 347 | } |
362 | 348 | ||
@@ -525,7 +511,7 @@ struct nilfs_checkpoint { | |||
525 | __le64 cp_create; | 511 | __le64 cp_create; |
526 | __le64 cp_nblk_inc; | 512 | __le64 cp_nblk_inc; |
527 | __le64 cp_inodes_count; | 513 | __le64 cp_inodes_count; |
528 | __le64 cp_blocks_count; /* Reserved (might be deleted) */ | 514 | __le64 cp_blocks_count; |
529 | 515 | ||
530 | /* Do not change the byte offset of ifile inode. | 516 | /* Do not change the byte offset of ifile inode. |
531 | To keep the compatibility of the disk format, | 517 | To keep the compatibility of the disk format, |