aboutsummaryrefslogtreecommitdiffstats
path: root/fs
diff options
context:
space:
mode:
authorRyusuke Konishi <konishi.ryusuke@lab.ntt.co.jp>2011-03-08 21:05:08 -0500
committerRyusuke Konishi <konishi.ryusuke@lab.ntt.co.jp>2011-03-08 21:05:08 -0500
commit3fd3fe5aeaa171a5638d2bb54a1a170eab7b7cdc (patch)
tree3feb95a18e045883b0af27da09be10f5e011776f /fs
parent9b1fc4e4973469dd3fab27ba5d78eca1cd5c13fe (diff)
nilfs2: move log writer onto nilfs object
Log writer is held by the nilfs_sb_info structure. This moves it into nilfs object and replaces all uses of NILFS_SC() accessor. Signed-off-by: Ryusuke Konishi <konishi.ryusuke@lab.ntt.co.jp>
Diffstat (limited to 'fs')
-rw-r--r--fs/nilfs2/sb.h9
-rw-r--r--fs/nilfs2/segment.c58
-rw-r--r--fs/nilfs2/the_nilfs.h6
3 files changed, 34 insertions, 39 deletions
diff --git a/fs/nilfs2/sb.h b/fs/nilfs2/sb.h
index 6f190dfdc649..44553f42ebac 100644
--- a/fs/nilfs2/sb.h
+++ b/fs/nilfs2/sb.h
@@ -28,7 +28,6 @@
28#include <linux/fs.h> 28#include <linux/fs.h>
29 29
30struct the_nilfs; 30struct the_nilfs;
31struct nilfs_sc_info;
32 31
33/* 32/*
34 * NILFS super-block data in memory 33 * NILFS super-block data in memory
@@ -37,9 +36,6 @@ struct nilfs_sb_info {
37 /* Fundamental members */ 36 /* Fundamental members */
38 struct super_block *s_super; /* reverse pointer to super_block */ 37 struct super_block *s_super; /* reverse pointer to super_block */
39 struct the_nilfs *s_nilfs; 38 struct the_nilfs *s_nilfs;
40
41 /* Segment constructor */
42 struct nilfs_sc_info *s_sc_info; /* segment constructor info */
43}; 39};
44 40
45static inline struct nilfs_sb_info *NILFS_SB(struct super_block *sb) 41static inline struct nilfs_sb_info *NILFS_SB(struct super_block *sb)
@@ -47,9 +43,4 @@ static inline struct nilfs_sb_info *NILFS_SB(struct super_block *sb)
47 return sb->s_fs_info; 43 return sb->s_fs_info;
48} 44}
49 45
50static inline struct nilfs_sc_info *NILFS_SC(struct nilfs_sb_info *sbi)
51{
52 return sbi->s_sc_info;
53}
54
55#endif /* _NILFS_SB */ 46#endif /* _NILFS_SB */
diff --git a/fs/nilfs2/segment.c b/fs/nilfs2/segment.c
index 6ac50d811841..e3d1785faf1b 100644
--- a/fs/nilfs2/segment.c
+++ b/fs/nilfs2/segment.c
@@ -224,8 +224,7 @@ int nilfs_transaction_begin(struct super_block *sb,
224int nilfs_transaction_commit(struct super_block *sb) 224int nilfs_transaction_commit(struct super_block *sb)
225{ 225{
226 struct nilfs_transaction_info *ti = current->journal_info; 226 struct nilfs_transaction_info *ti = current->journal_info;
227 struct nilfs_sb_info *sbi; 227 struct the_nilfs *nilfs = NILFS_SB(sb)->s_nilfs;
228 struct nilfs_sc_info *sci;
229 int err = 0; 228 int err = 0;
230 229
231 BUG_ON(ti == NULL || ti->ti_magic != NILFS_TI_MAGIC); 230 BUG_ON(ti == NULL || ti->ti_magic != NILFS_TI_MAGIC);
@@ -234,16 +233,15 @@ int nilfs_transaction_commit(struct super_block *sb)
234 ti->ti_count--; 233 ti->ti_count--;
235 return 0; 234 return 0;
236 } 235 }
237 sbi = NILFS_SB(sb); 236 if (nilfs->ns_writer) {
238 sci = NILFS_SC(sbi); 237 struct nilfs_sc_info *sci = nilfs->ns_writer;
239 if (sci != NULL) { 238
240 if (ti->ti_flags & NILFS_TI_COMMIT) 239 if (ti->ti_flags & NILFS_TI_COMMIT)
241 nilfs_segctor_start_timer(sci); 240 nilfs_segctor_start_timer(sci);
242 if (atomic_read(&sbi->s_nilfs->ns_ndirtyblks) > 241 if (atomic_read(&nilfs->ns_ndirtyblks) > sci->sc_watermark)
243 sci->sc_watermark)
244 nilfs_segctor_do_flush(sci, 0); 242 nilfs_segctor_do_flush(sci, 0);
245 } 243 }
246 up_read(&sbi->s_nilfs->ns_segctor_sem); 244 up_read(&nilfs->ns_segctor_sem);
247 current->journal_info = ti->ti_save; 245 current->journal_info = ti->ti_save;
248 246
249 if (ti->ti_flags & NILFS_TI_SYNC) 247 if (ti->ti_flags & NILFS_TI_SYNC)
@@ -271,9 +269,8 @@ void nilfs_transaction_abort(struct super_block *sb)
271 269
272void nilfs_relax_pressure_in_lock(struct super_block *sb) 270void nilfs_relax_pressure_in_lock(struct super_block *sb)
273{ 271{
274 struct nilfs_sb_info *sbi = NILFS_SB(sb); 272 struct the_nilfs *nilfs = NILFS_SB(sb)->s_nilfs;
275 struct nilfs_sc_info *sci = NILFS_SC(sbi); 273 struct nilfs_sc_info *sci = nilfs->ns_writer;
276 struct the_nilfs *nilfs = sbi->s_nilfs;
277 274
278 if (!sci || !sci->sc_flush_request) 275 if (!sci || !sci->sc_flush_request)
279 return; 276 return;
@@ -298,6 +295,8 @@ static void nilfs_transaction_lock(struct nilfs_sb_info *sbi,
298 int gcflag) 295 int gcflag)
299{ 296{
300 struct nilfs_transaction_info *cur_ti = current->journal_info; 297 struct nilfs_transaction_info *cur_ti = current->journal_info;
298 struct the_nilfs *nilfs = sbi->s_nilfs;
299 struct nilfs_sc_info *sci = nilfs->ns_writer;
301 300
302 WARN_ON(cur_ti); 301 WARN_ON(cur_ti);
303 ti->ti_flags = NILFS_TI_WRITER; 302 ti->ti_flags = NILFS_TI_WRITER;
@@ -308,11 +307,11 @@ static void nilfs_transaction_lock(struct nilfs_sb_info *sbi,
308 current->journal_info = ti; 307 current->journal_info = ti;
309 308
310 for (;;) { 309 for (;;) {
311 down_write(&sbi->s_nilfs->ns_segctor_sem); 310 down_write(&nilfs->ns_segctor_sem);
312 if (!test_bit(NILFS_SC_PRIOR_FLUSH, &NILFS_SC(sbi)->sc_flags)) 311 if (!test_bit(NILFS_SC_PRIOR_FLUSH, &sci->sc_flags))
313 break; 312 break;
314 313
315 nilfs_segctor_do_immediate_flush(NILFS_SC(sbi)); 314 nilfs_segctor_do_immediate_flush(sci);
316 315
317 up_write(&sbi->s_nilfs->ns_segctor_sem); 316 up_write(&sbi->s_nilfs->ns_segctor_sem);
318 yield(); 317 yield();
@@ -2169,8 +2168,8 @@ static void nilfs_segctor_do_flush(struct nilfs_sc_info *sci, int bn)
2169 */ 2168 */
2170void nilfs_flush_segment(struct super_block *sb, ino_t ino) 2169void nilfs_flush_segment(struct super_block *sb, ino_t ino)
2171{ 2170{
2172 struct nilfs_sb_info *sbi = NILFS_SB(sb); 2171 struct the_nilfs *nilfs = NILFS_SB(sb)->s_nilfs;
2173 struct nilfs_sc_info *sci = NILFS_SC(sbi); 2172 struct nilfs_sc_info *sci = nilfs->ns_writer;
2174 2173
2175 if (!sci || nilfs_doing_construction()) 2174 if (!sci || nilfs_doing_construction())
2176 return; 2175 return;
@@ -2259,8 +2258,8 @@ static void nilfs_segctor_wakeup(struct nilfs_sc_info *sci, int err)
2259 */ 2258 */
2260int nilfs_construct_segment(struct super_block *sb) 2259int nilfs_construct_segment(struct super_block *sb)
2261{ 2260{
2262 struct nilfs_sb_info *sbi = NILFS_SB(sb); 2261 struct the_nilfs *nilfs = NILFS_SB(sb)->s_nilfs;
2263 struct nilfs_sc_info *sci = NILFS_SC(sbi); 2262 struct nilfs_sc_info *sci = nilfs->ns_writer;
2264 struct nilfs_transaction_info *ti; 2263 struct nilfs_transaction_info *ti;
2265 int err; 2264 int err;
2266 2265
@@ -2299,7 +2298,7 @@ int nilfs_construct_dsync_segment(struct super_block *sb, struct inode *inode,
2299{ 2298{
2300 struct nilfs_sb_info *sbi = NILFS_SB(sb); 2299 struct nilfs_sb_info *sbi = NILFS_SB(sb);
2301 struct the_nilfs *nilfs = sbi->s_nilfs; 2300 struct the_nilfs *nilfs = sbi->s_nilfs;
2302 struct nilfs_sc_info *sci = NILFS_SC(sbi); 2301 struct nilfs_sc_info *sci = nilfs->ns_writer;
2303 struct nilfs_inode_info *ii; 2302 struct nilfs_inode_info *ii;
2304 struct nilfs_transaction_info ti; 2303 struct nilfs_transaction_info ti;
2305 int err = 0; 2304 int err = 0;
@@ -2445,8 +2444,8 @@ int nilfs_clean_segments(struct super_block *sb, struct nilfs_argv *argv,
2445 void **kbufs) 2444 void **kbufs)
2446{ 2445{
2447 struct nilfs_sb_info *sbi = NILFS_SB(sb); 2446 struct nilfs_sb_info *sbi = NILFS_SB(sb);
2448 struct nilfs_sc_info *sci = NILFS_SC(sbi);
2449 struct the_nilfs *nilfs = sbi->s_nilfs; 2447 struct the_nilfs *nilfs = sbi->s_nilfs;
2448 struct nilfs_sc_info *sci = nilfs->ns_writer;
2450 struct nilfs_transaction_info ti; 2449 struct nilfs_transaction_info ti;
2451 int err; 2450 int err;
2452 2451
@@ -2787,9 +2786,10 @@ static void nilfs_segctor_destroy(struct nilfs_sc_info *sci)
2787int nilfs_attach_segment_constructor(struct nilfs_sb_info *sbi, 2786int nilfs_attach_segment_constructor(struct nilfs_sb_info *sbi,
2788 struct nilfs_root *root) 2787 struct nilfs_root *root)
2789{ 2788{
2789 struct the_nilfs *nilfs = sbi->s_nilfs;
2790 int err; 2790 int err;
2791 2791
2792 if (NILFS_SC(sbi)) { 2792 if (nilfs->ns_writer) {
2793 /* 2793 /*
2794 * This happens if the filesystem was remounted 2794 * This happens if the filesystem was remounted
2795 * read/write after nilfs_error degenerated it into a 2795 * read/write after nilfs_error degenerated it into a
@@ -2798,14 +2798,14 @@ int nilfs_attach_segment_constructor(struct nilfs_sb_info *sbi,
2798 nilfs_detach_segment_constructor(sbi); 2798 nilfs_detach_segment_constructor(sbi);
2799 } 2799 }
2800 2800
2801 sbi->s_sc_info = nilfs_segctor_new(sbi, root); 2801 nilfs->ns_writer = nilfs_segctor_new(sbi, root);
2802 if (!sbi->s_sc_info) 2802 if (!nilfs->ns_writer)
2803 return -ENOMEM; 2803 return -ENOMEM;
2804 2804
2805 err = nilfs_segctor_start_thread(NILFS_SC(sbi)); 2805 err = nilfs_segctor_start_thread(nilfs->ns_writer);
2806 if (err) { 2806 if (err) {
2807 kfree(sbi->s_sc_info); 2807 kfree(nilfs->ns_writer);
2808 sbi->s_sc_info = NULL; 2808 nilfs->ns_writer = NULL;
2809 } 2809 }
2810 return err; 2810 return err;
2811} 2811}
@@ -2823,9 +2823,9 @@ void nilfs_detach_segment_constructor(struct nilfs_sb_info *sbi)
2823 LIST_HEAD(garbage_list); 2823 LIST_HEAD(garbage_list);
2824 2824
2825 down_write(&nilfs->ns_segctor_sem); 2825 down_write(&nilfs->ns_segctor_sem);
2826 if (NILFS_SC(sbi)) { 2826 if (nilfs->ns_writer) {
2827 nilfs_segctor_destroy(NILFS_SC(sbi)); 2827 nilfs_segctor_destroy(nilfs->ns_writer);
2828 sbi->s_sc_info = NULL; 2828 nilfs->ns_writer = NULL;
2829 } 2829 }
2830 2830
2831 /* Force to free the list of dirty files */ 2831 /* Force to free the list of dirty files */
diff --git a/fs/nilfs2/the_nilfs.h b/fs/nilfs2/the_nilfs.h
index 3ecc968f2123..10521b97ded6 100644
--- a/fs/nilfs2/the_nilfs.h
+++ b/fs/nilfs2/the_nilfs.h
@@ -33,6 +33,8 @@
33#include <linux/slab.h> 33#include <linux/slab.h>
34#include "sb.h" 34#include "sb.h"
35 35
36struct nilfs_sc_info;
37
36/* the_nilfs struct */ 38/* the_nilfs struct */
37enum { 39enum {
38 THE_NILFS_INIT = 0, /* Information from super_block is set */ 40 THE_NILFS_INIT = 0, /* Information from super_block is set */
@@ -65,7 +67,8 @@ enum {
65 * @ns_last_cno: checkpoint number of the latest segment 67 * @ns_last_cno: checkpoint number of the latest segment
66 * @ns_prot_seq: least sequence number of segments which must not be reclaimed 68 * @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 69 * @ns_prev_seq: base sequence number used to decide if advance log cursor
68 * @ns_segctor_sem: segment constructor semaphore 70 * @ns_writer: log writer
71 * @ns_segctor_sem: semaphore protecting log write
69 * @ns_dat: DAT file inode 72 * @ns_dat: DAT file inode
70 * @ns_cpfile: checkpoint file inode 73 * @ns_cpfile: checkpoint file inode
71 * @ns_sufile: segusage file inode 74 * @ns_sufile: segusage file inode
@@ -140,6 +143,7 @@ struct the_nilfs {
140 u64 ns_prot_seq; 143 u64 ns_prot_seq;
141 u64 ns_prev_seq; 144 u64 ns_prev_seq;
142 145
146 struct nilfs_sc_info *ns_writer;
143 struct rw_semaphore ns_segctor_sem; 147 struct rw_semaphore ns_segctor_sem;
144 148
145 /* 149 /*