aboutsummaryrefslogtreecommitdiffstats
path: root/fs/nilfs2
diff options
context:
space:
mode:
authorRyusuke Konishi <konishi.ryusuke@lab.ntt.co.jp>2010-09-05 03:17:35 -0400
committerRyusuke Konishi <konishi.ryusuke@lab.ntt.co.jp>2010-10-22 20:24:38 -0400
commit090fd5b10165033d7c30afde0a7e59141d820602 (patch)
treecbb3ec5b29719457cd45f72624d03d7e31af4a4c /fs/nilfs2
parentc6e071884aca360a14c21757d760e76ec34b4894 (diff)
nilfs2: get rid of back pointer to writable sb instance
Nilfs object holds a back pointer to a writable super block instance in nilfs->ns_writer, and this became eliminable since sb is now made per device and all inodes have a valid pointer to it. This deletes the ns_writer pointer and a reader/writer semaphore protecting it. Signed-off-by: Ryusuke Konishi <konishi.ryusuke@lab.ntt.co.jp>
Diffstat (limited to 'fs/nilfs2')
-rw-r--r--fs/nilfs2/mdt.c33
-rw-r--r--fs/nilfs2/recovery.c4
-rw-r--r--fs/nilfs2/segment.c4
-rw-r--r--fs/nilfs2/the_nilfs.c1
-rw-r--r--fs/nilfs2/the_nilfs.h21
5 files changed, 2 insertions, 61 deletions
diff --git a/fs/nilfs2/mdt.c b/fs/nilfs2/mdt.c
index 32695f3c4b9a..0a2ccfc0d6f9 100644
--- a/fs/nilfs2/mdt.c
+++ b/fs/nilfs2/mdt.c
@@ -78,25 +78,11 @@ static int nilfs_mdt_create_block(struct inode *inode, unsigned long block,
78 struct buffer_head *, 78 struct buffer_head *,
79 void *)) 79 void *))
80{ 80{
81 struct the_nilfs *nilfs = NILFS_I_NILFS(inode);
82 struct super_block *sb = inode->i_sb; 81 struct super_block *sb = inode->i_sb;
83 struct nilfs_transaction_info ti; 82 struct nilfs_transaction_info ti;
84 struct buffer_head *bh; 83 struct buffer_head *bh;
85 int err; 84 int err;
86 85
87 if (!sb) {
88 /*
89 * Make sure this function is not called from any
90 * read-only context.
91 */
92 if (!nilfs->ns_writer) {
93 WARN_ON(1);
94 err = -EROFS;
95 goto out;
96 }
97 sb = nilfs->ns_writer->s_super;
98 }
99
100 nilfs_transaction_begin(sb, &ti, 0); 86 nilfs_transaction_begin(sb, &ti, 0);
101 87
102 err = -ENOMEM; 88 err = -ENOMEM;
@@ -112,7 +98,7 @@ static int nilfs_mdt_create_block(struct inode *inode, unsigned long block,
112 if (buffer_uptodate(bh)) 98 if (buffer_uptodate(bh))
113 goto failed_bh; 99 goto failed_bh;
114 100
115 bh->b_bdev = nilfs->ns_bdev; 101 bh->b_bdev = sb->s_bdev;
116 err = nilfs_mdt_insert_new_block(inode, block, bh, init_block); 102 err = nilfs_mdt_insert_new_block(inode, block, bh, init_block);
117 if (likely(!err)) { 103 if (likely(!err)) {
118 get_bh(bh); 104 get_bh(bh);
@@ -129,7 +115,7 @@ static int nilfs_mdt_create_block(struct inode *inode, unsigned long block,
129 err = nilfs_transaction_commit(sb); 115 err = nilfs_transaction_commit(sb);
130 else 116 else
131 nilfs_transaction_abort(sb); 117 nilfs_transaction_abort(sb);
132 out: 118
133 return err; 119 return err;
134} 120}
135 121
@@ -398,8 +384,6 @@ nilfs_mdt_write_page(struct page *page, struct writeback_control *wbc)
398{ 384{
399 struct inode *inode; 385 struct inode *inode;
400 struct super_block *sb; 386 struct super_block *sb;
401 struct the_nilfs *nilfs;
402 struct nilfs_sb_info *writer = NULL;
403 int err = 0; 387 int err = 0;
404 388
405 redirty_page_for_writepage(wbc, page); 389 redirty_page_for_writepage(wbc, page);
@@ -410,25 +394,12 @@ nilfs_mdt_write_page(struct page *page, struct writeback_control *wbc)
410 return 0; 394 return 0;
411 395
412 sb = inode->i_sb; 396 sb = inode->i_sb;
413 nilfs = NILFS_SB(sb)->s_nilfs;
414
415 if (!sb) {
416 down_read(&nilfs->ns_writer_sem);
417 writer = nilfs->ns_writer;
418 if (!writer) {
419 up_read(&nilfs->ns_writer_sem);
420 return -EROFS;
421 }
422 sb = writer->s_super;
423 }
424 397
425 if (wbc->sync_mode == WB_SYNC_ALL) 398 if (wbc->sync_mode == WB_SYNC_ALL)
426 err = nilfs_construct_segment(sb); 399 err = nilfs_construct_segment(sb);
427 else if (wbc->for_reclaim) 400 else if (wbc->for_reclaim)
428 nilfs_flush_segment(sb, inode->i_ino); 401 nilfs_flush_segment(sb, inode->i_ino);
429 402
430 if (writer)
431 up_read(&nilfs->ns_writer_sem);
432 return err; 403 return err;
433} 404}
434 405
diff --git a/fs/nilfs2/recovery.c b/fs/nilfs2/recovery.c
index dcb5a9812c6c..5d2711c28da7 100644
--- a/fs/nilfs2/recovery.c
+++ b/fs/nilfs2/recovery.c
@@ -440,7 +440,6 @@ static int nilfs_prepare_segment_for_recovery(struct the_nilfs *nilfs,
440 segnum[2] = ri->ri_segnum; 440 segnum[2] = ri->ri_segnum;
441 segnum[3] = ri->ri_nextnum; 441 segnum[3] = ri->ri_nextnum;
442 442
443 nilfs_attach_writer(nilfs, sbi);
444 /* 443 /*
445 * Releasing the next segment of the latest super root. 444 * Releasing the next segment of the latest super root.
446 * The next segment is invalidated by this recovery. 445 * The next segment is invalidated by this recovery.
@@ -480,7 +479,6 @@ static int nilfs_prepare_segment_for_recovery(struct the_nilfs *nilfs,
480 479
481 failed: 480 failed:
482 /* No need to recover sufile because it will be destroyed on error */ 481 /* No need to recover sufile because it will be destroyed on error */
483 nilfs_detach_writer(nilfs, sbi);
484 return err; 482 return err;
485} 483}
486 484
@@ -599,7 +597,6 @@ static int nilfs_do_roll_forward(struct the_nilfs *nilfs,
599 }; 597 };
600 int state = RF_INIT_ST; 598 int state = RF_INIT_ST;
601 599
602 nilfs_attach_writer(nilfs, sbi);
603 pseg_start = ri->ri_lsegs_start; 600 pseg_start = ri->ri_lsegs_start;
604 seg_seq = ri->ri_lsegs_start_seq; 601 seg_seq = ri->ri_lsegs_start_seq;
605 segnum = nilfs_get_segnum_of_block(nilfs, pseg_start); 602 segnum = nilfs_get_segnum_of_block(nilfs, pseg_start);
@@ -690,7 +687,6 @@ static int nilfs_do_roll_forward(struct the_nilfs *nilfs,
690 out: 687 out:
691 brelse(bh_sum); 688 brelse(bh_sum);
692 dispose_recovery_list(&dsync_blocks); 689 dispose_recovery_list(&dsync_blocks);
693 nilfs_detach_writer(nilfs, sbi);
694 return err; 690 return err;
695 691
696 confused: 692 confused:
diff --git a/fs/nilfs2/segment.c b/fs/nilfs2/segment.c
index b0c5e08d06c8..56350bf1f79f 100644
--- a/fs/nilfs2/segment.c
+++ b/fs/nilfs2/segment.c
@@ -2799,7 +2799,6 @@ static void nilfs_segctor_destroy(struct nilfs_sc_info *sci)
2799int nilfs_attach_segment_constructor(struct nilfs_sb_info *sbi, 2799int nilfs_attach_segment_constructor(struct nilfs_sb_info *sbi,
2800 struct nilfs_root *root) 2800 struct nilfs_root *root)
2801{ 2801{
2802 struct the_nilfs *nilfs = sbi->s_nilfs;
2803 int err; 2802 int err;
2804 2803
2805 if (NILFS_SC(sbi)) { 2804 if (NILFS_SC(sbi)) {
@@ -2815,10 +2814,8 @@ int nilfs_attach_segment_constructor(struct nilfs_sb_info *sbi,
2815 if (!sbi->s_sc_info) 2814 if (!sbi->s_sc_info)
2816 return -ENOMEM; 2815 return -ENOMEM;
2817 2816
2818 nilfs_attach_writer(nilfs, sbi);
2819 err = nilfs_segctor_start_thread(NILFS_SC(sbi)); 2817 err = nilfs_segctor_start_thread(NILFS_SC(sbi));
2820 if (err) { 2818 if (err) {
2821 nilfs_detach_writer(nilfs, sbi);
2822 kfree(sbi->s_sc_info); 2819 kfree(sbi->s_sc_info);
2823 sbi->s_sc_info = NULL; 2820 sbi->s_sc_info = NULL;
2824 } 2821 }
@@ -2855,5 +2852,4 @@ void nilfs_detach_segment_constructor(struct nilfs_sb_info *sbi)
2855 up_write(&nilfs->ns_segctor_sem); 2852 up_write(&nilfs->ns_segctor_sem);
2856 2853
2857 nilfs_dispose_list(sbi, &garbage_list, 1); 2854 nilfs_dispose_list(sbi, &garbage_list, 1);
2858 nilfs_detach_writer(nilfs, sbi);
2859} 2855}
diff --git a/fs/nilfs2/the_nilfs.c b/fs/nilfs2/the_nilfs.c
index 4cc705a1d135..a94aa57c4bd9 100644
--- a/fs/nilfs2/the_nilfs.c
+++ b/fs/nilfs2/the_nilfs.c
@@ -75,7 +75,6 @@ struct the_nilfs *alloc_nilfs(struct block_device *bdev)
75 nilfs->ns_bdev = bdev; 75 nilfs->ns_bdev = bdev;
76 atomic_set(&nilfs->ns_ndirtyblks, 0); 76 atomic_set(&nilfs->ns_ndirtyblks, 0);
77 init_rwsem(&nilfs->ns_sem); 77 init_rwsem(&nilfs->ns_sem);
78 init_rwsem(&nilfs->ns_writer_sem);
79 INIT_LIST_HEAD(&nilfs->ns_gc_inodes); 78 INIT_LIST_HEAD(&nilfs->ns_gc_inodes);
80 spin_lock_init(&nilfs->ns_last_segment_lock); 79 spin_lock_init(&nilfs->ns_last_segment_lock);
81 nilfs->ns_cptree = RB_ROOT; 80 nilfs->ns_cptree = RB_ROOT;
diff --git a/fs/nilfs2/the_nilfs.h b/fs/nilfs2/the_nilfs.h
index cae56f338b64..bbbc1c748aac 100644
--- a/fs/nilfs2/the_nilfs.h
+++ b/fs/nilfs2/the_nilfs.h
@@ -48,9 +48,7 @@ enum {
48 * @ns_flags: flags 48 * @ns_flags: flags
49 * @ns_bdev: block device 49 * @ns_bdev: block device
50 * @ns_bdi: backing dev info 50 * @ns_bdi: backing dev info
51 * @ns_writer: back pointer to writable nilfs_sb_info
52 * @ns_sem: semaphore for shared states 51 * @ns_sem: semaphore for shared states
53 * @ns_writer_sem: semaphore protecting ns_writer attach/detach
54 * @ns_sbh: buffer heads of on-disk super blocks 52 * @ns_sbh: buffer heads of on-disk super blocks
55 * @ns_sbp: pointers to super block data 53 * @ns_sbp: pointers to super block data
56 * @ns_sbwtime: previous write time of super block 54 * @ns_sbwtime: previous write time of super block
@@ -93,9 +91,7 @@ struct the_nilfs {
93 91
94 struct block_device *ns_bdev; 92 struct block_device *ns_bdev;
95 struct backing_dev_info *ns_bdi; 93 struct backing_dev_info *ns_bdi;
96 struct nilfs_sb_info *ns_writer;
97 struct rw_semaphore ns_sem; 94 struct rw_semaphore ns_sem;
98 struct rw_semaphore ns_writer_sem;
99 95
100 /* 96 /*
101 * used for 97 * used for
@@ -252,23 +248,6 @@ static inline void nilfs_get_root(struct nilfs_root *root)
252 atomic_inc(&root->count); 248 atomic_inc(&root->count);
253} 249}
254 250
255static inline void
256nilfs_attach_writer(struct the_nilfs *nilfs, struct nilfs_sb_info *sbi)
257{
258 down_write(&nilfs->ns_writer_sem);
259 nilfs->ns_writer = sbi;
260 up_write(&nilfs->ns_writer_sem);
261}
262
263static inline void
264nilfs_detach_writer(struct the_nilfs *nilfs, struct nilfs_sb_info *sbi)
265{
266 down_write(&nilfs->ns_writer_sem);
267 if (sbi == nilfs->ns_writer)
268 nilfs->ns_writer = NULL;
269 up_write(&nilfs->ns_writer_sem);
270}
271
272static inline int nilfs_valid_fs(struct the_nilfs *nilfs) 251static inline int nilfs_valid_fs(struct the_nilfs *nilfs)
273{ 252{
274 unsigned valid_fs; 253 unsigned valid_fs;