Commit 3fd3fe5a authored by Ryusuke Konishi's avatar Ryusuke Konishi

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: default avatarRyusuke Konishi <konishi.ryusuke@lab.ntt.co.jp>
parent 9b1fc4e4
...@@ -28,7 +28,6 @@ ...@@ -28,7 +28,6 @@
#include <linux/fs.h> #include <linux/fs.h>
struct the_nilfs; struct the_nilfs;
struct nilfs_sc_info;
/* /*
* NILFS super-block data in memory * NILFS super-block data in memory
...@@ -37,9 +36,6 @@ struct nilfs_sb_info { ...@@ -37,9 +36,6 @@ struct nilfs_sb_info {
/* Fundamental members */ /* Fundamental members */
struct super_block *s_super; /* reverse pointer to super_block */ struct super_block *s_super; /* reverse pointer to super_block */
struct the_nilfs *s_nilfs; struct the_nilfs *s_nilfs;
/* Segment constructor */
struct nilfs_sc_info *s_sc_info; /* segment constructor info */
}; };
static inline struct nilfs_sb_info *NILFS_SB(struct super_block *sb) static 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,9 +43,4 @@ static inline struct nilfs_sb_info *NILFS_SB(struct super_block *sb)
return sb->s_fs_info; return sb->s_fs_info;
} }
static inline struct nilfs_sc_info *NILFS_SC(struct nilfs_sb_info *sbi)
{
return sbi->s_sc_info;
}
#endif /* _NILFS_SB */ #endif /* _NILFS_SB */
...@@ -224,8 +224,7 @@ int nilfs_transaction_begin(struct super_block *sb, ...@@ -224,8 +224,7 @@ int nilfs_transaction_begin(struct super_block *sb,
int nilfs_transaction_commit(struct super_block *sb) int nilfs_transaction_commit(struct super_block *sb)
{ {
struct nilfs_transaction_info *ti = current->journal_info; struct nilfs_transaction_info *ti = current->journal_info;
struct nilfs_sb_info *sbi; struct the_nilfs *nilfs = NILFS_SB(sb)->s_nilfs;
struct nilfs_sc_info *sci;
int err = 0; int err = 0;
BUG_ON(ti == NULL || ti->ti_magic != NILFS_TI_MAGIC); BUG_ON(ti == NULL || ti->ti_magic != NILFS_TI_MAGIC);
...@@ -234,16 +233,15 @@ int nilfs_transaction_commit(struct super_block *sb) ...@@ -234,16 +233,15 @@ int nilfs_transaction_commit(struct super_block *sb)
ti->ti_count--; ti->ti_count--;
return 0; return 0;
} }
sbi = NILFS_SB(sb); if (nilfs->ns_writer) {
sci = NILFS_SC(sbi); struct nilfs_sc_info *sci = nilfs->ns_writer;
if (sci != NULL) {
if (ti->ti_flags & NILFS_TI_COMMIT) if (ti->ti_flags & NILFS_TI_COMMIT)
nilfs_segctor_start_timer(sci); nilfs_segctor_start_timer(sci);
if (atomic_read(&sbi->s_nilfs->ns_ndirtyblks) > if (atomic_read(&nilfs->ns_ndirtyblks) > sci->sc_watermark)
sci->sc_watermark)
nilfs_segctor_do_flush(sci, 0); nilfs_segctor_do_flush(sci, 0);
} }
up_read(&sbi->s_nilfs->ns_segctor_sem); up_read(&nilfs->ns_segctor_sem);
current->journal_info = ti->ti_save; current->journal_info = ti->ti_save;
if (ti->ti_flags & NILFS_TI_SYNC) if (ti->ti_flags & NILFS_TI_SYNC)
...@@ -271,9 +269,8 @@ void nilfs_transaction_abort(struct super_block *sb) ...@@ -271,9 +269,8 @@ void nilfs_transaction_abort(struct super_block *sb)
void nilfs_relax_pressure_in_lock(struct super_block *sb) void nilfs_relax_pressure_in_lock(struct super_block *sb)
{ {
struct nilfs_sb_info *sbi = NILFS_SB(sb); struct the_nilfs *nilfs = NILFS_SB(sb)->s_nilfs;
struct nilfs_sc_info *sci = NILFS_SC(sbi); struct nilfs_sc_info *sci = nilfs->ns_writer;
struct the_nilfs *nilfs = sbi->s_nilfs;
if (!sci || !sci->sc_flush_request) if (!sci || !sci->sc_flush_request)
return; return;
...@@ -298,6 +295,8 @@ static void nilfs_transaction_lock(struct nilfs_sb_info *sbi, ...@@ -298,6 +295,8 @@ static void nilfs_transaction_lock(struct nilfs_sb_info *sbi,
int gcflag) int gcflag)
{ {
struct nilfs_transaction_info *cur_ti = current->journal_info; struct nilfs_transaction_info *cur_ti = current->journal_info;
struct the_nilfs *nilfs = sbi->s_nilfs;
struct nilfs_sc_info *sci = nilfs->ns_writer;
WARN_ON(cur_ti); WARN_ON(cur_ti);
ti->ti_flags = NILFS_TI_WRITER; ti->ti_flags = NILFS_TI_WRITER;
...@@ -308,11 +307,11 @@ static void nilfs_transaction_lock(struct nilfs_sb_info *sbi, ...@@ -308,11 +307,11 @@ static void nilfs_transaction_lock(struct nilfs_sb_info *sbi,
current->journal_info = ti; current->journal_info = ti;
for (;;) { for (;;) {
down_write(&sbi->s_nilfs->ns_segctor_sem); down_write(&nilfs->ns_segctor_sem);
if (!test_bit(NILFS_SC_PRIOR_FLUSH, &NILFS_SC(sbi)->sc_flags)) if (!test_bit(NILFS_SC_PRIOR_FLUSH, &sci->sc_flags))
break; break;
nilfs_segctor_do_immediate_flush(NILFS_SC(sbi)); nilfs_segctor_do_immediate_flush(sci);
up_write(&sbi->s_nilfs->ns_segctor_sem); up_write(&sbi->s_nilfs->ns_segctor_sem);
yield(); yield();
...@@ -2169,8 +2168,8 @@ static void nilfs_segctor_do_flush(struct nilfs_sc_info *sci, int bn) ...@@ -2169,8 +2168,8 @@ static void nilfs_segctor_do_flush(struct nilfs_sc_info *sci, int bn)
*/ */
void nilfs_flush_segment(struct super_block *sb, ino_t ino) void nilfs_flush_segment(struct super_block *sb, ino_t ino)
{ {
struct nilfs_sb_info *sbi = NILFS_SB(sb); struct the_nilfs *nilfs = NILFS_SB(sb)->s_nilfs;
struct nilfs_sc_info *sci = NILFS_SC(sbi); struct nilfs_sc_info *sci = nilfs->ns_writer;
if (!sci || nilfs_doing_construction()) if (!sci || nilfs_doing_construction())
return; return;
...@@ -2259,8 +2258,8 @@ static void nilfs_segctor_wakeup(struct nilfs_sc_info *sci, int err) ...@@ -2259,8 +2258,8 @@ static void nilfs_segctor_wakeup(struct nilfs_sc_info *sci, int err)
*/ */
int nilfs_construct_segment(struct super_block *sb) int nilfs_construct_segment(struct super_block *sb)
{ {
struct nilfs_sb_info *sbi = NILFS_SB(sb); struct the_nilfs *nilfs = NILFS_SB(sb)->s_nilfs;
struct nilfs_sc_info *sci = NILFS_SC(sbi); struct nilfs_sc_info *sci = nilfs->ns_writer;
struct nilfs_transaction_info *ti; struct nilfs_transaction_info *ti;
int err; int err;
...@@ -2299,7 +2298,7 @@ int nilfs_construct_dsync_segment(struct super_block *sb, struct inode *inode, ...@@ -2299,7 +2298,7 @@ int nilfs_construct_dsync_segment(struct super_block *sb, struct inode *inode,
{ {
struct nilfs_sb_info *sbi = NILFS_SB(sb); struct nilfs_sb_info *sbi = NILFS_SB(sb);
struct the_nilfs *nilfs = sbi->s_nilfs; struct the_nilfs *nilfs = sbi->s_nilfs;
struct nilfs_sc_info *sci = NILFS_SC(sbi); struct nilfs_sc_info *sci = nilfs->ns_writer;
struct nilfs_inode_info *ii; struct nilfs_inode_info *ii;
struct nilfs_transaction_info ti; struct nilfs_transaction_info ti;
int err = 0; int err = 0;
...@@ -2445,8 +2444,8 @@ int nilfs_clean_segments(struct super_block *sb, struct nilfs_argv *argv, ...@@ -2445,8 +2444,8 @@ int nilfs_clean_segments(struct super_block *sb, struct nilfs_argv *argv,
void **kbufs) void **kbufs)
{ {
struct nilfs_sb_info *sbi = NILFS_SB(sb); struct nilfs_sb_info *sbi = NILFS_SB(sb);
struct nilfs_sc_info *sci = NILFS_SC(sbi);
struct the_nilfs *nilfs = sbi->s_nilfs; struct the_nilfs *nilfs = sbi->s_nilfs;
struct nilfs_sc_info *sci = nilfs->ns_writer;
struct nilfs_transaction_info ti; struct nilfs_transaction_info ti;
int err; int err;
...@@ -2787,9 +2786,10 @@ static void nilfs_segctor_destroy(struct nilfs_sc_info *sci) ...@@ -2787,9 +2786,10 @@ static void nilfs_segctor_destroy(struct nilfs_sc_info *sci)
int nilfs_attach_segment_constructor(struct nilfs_sb_info *sbi, int nilfs_attach_segment_constructor(struct nilfs_sb_info *sbi,
struct nilfs_root *root) struct nilfs_root *root)
{ {
struct the_nilfs *nilfs = sbi->s_nilfs;
int err; int err;
if (NILFS_SC(sbi)) { if (nilfs->ns_writer) {
/* /*
* This happens if the filesystem was remounted * This happens if the filesystem was remounted
* read/write after nilfs_error degenerated it into a * read/write after nilfs_error degenerated it into a
...@@ -2798,14 +2798,14 @@ int nilfs_attach_segment_constructor(struct nilfs_sb_info *sbi, ...@@ -2798,14 +2798,14 @@ int nilfs_attach_segment_constructor(struct nilfs_sb_info *sbi,
nilfs_detach_segment_constructor(sbi); nilfs_detach_segment_constructor(sbi);
} }
sbi->s_sc_info = nilfs_segctor_new(sbi, root); nilfs->ns_writer = nilfs_segctor_new(sbi, root);
if (!sbi->s_sc_info) if (!nilfs->ns_writer)
return -ENOMEM; return -ENOMEM;
err = nilfs_segctor_start_thread(NILFS_SC(sbi)); err = nilfs_segctor_start_thread(nilfs->ns_writer);
if (err) { if (err) {
kfree(sbi->s_sc_info); kfree(nilfs->ns_writer);
sbi->s_sc_info = NULL; nilfs->ns_writer = NULL;
} }
return err; return err;
} }
...@@ -2823,9 +2823,9 @@ void nilfs_detach_segment_constructor(struct nilfs_sb_info *sbi) ...@@ -2823,9 +2823,9 @@ void nilfs_detach_segment_constructor(struct nilfs_sb_info *sbi)
LIST_HEAD(garbage_list); LIST_HEAD(garbage_list);
down_write(&nilfs->ns_segctor_sem); down_write(&nilfs->ns_segctor_sem);
if (NILFS_SC(sbi)) { if (nilfs->ns_writer) {
nilfs_segctor_destroy(NILFS_SC(sbi)); nilfs_segctor_destroy(nilfs->ns_writer);
sbi->s_sc_info = NULL; nilfs->ns_writer = NULL;
} }
/* Force to free the list of dirty files */ /* Force to free the list of dirty files */
......
...@@ -33,6 +33,8 @@ ...@@ -33,6 +33,8 @@
#include <linux/slab.h> #include <linux/slab.h>
#include "sb.h" #include "sb.h"
struct nilfs_sc_info;
/* the_nilfs struct */ /* the_nilfs struct */
enum { enum {
THE_NILFS_INIT = 0, /* Information from super_block is set */ THE_NILFS_INIT = 0, /* Information from super_block is set */
...@@ -65,7 +67,8 @@ enum { ...@@ -65,7 +67,8 @@ enum {
* @ns_last_cno: checkpoint number of the latest segment * @ns_last_cno: checkpoint number of the latest segment
* @ns_prot_seq: least sequence number of segments which must not be reclaimed * @ns_prot_seq: least sequence number of segments which must not be reclaimed
* @ns_prev_seq: base sequence number used to decide if advance log cursor * @ns_prev_seq: base sequence number used to decide if advance log cursor
* @ns_segctor_sem: segment constructor semaphore * @ns_writer: log writer
* @ns_segctor_sem: semaphore protecting log write
* @ns_dat: DAT file inode * @ns_dat: DAT file inode
* @ns_cpfile: checkpoint file inode * @ns_cpfile: checkpoint file inode
* @ns_sufile: segusage file inode * @ns_sufile: segusage file inode
...@@ -140,6 +143,7 @@ struct the_nilfs { ...@@ -140,6 +143,7 @@ struct the_nilfs {
u64 ns_prot_seq; u64 ns_prot_seq;
u64 ns_prev_seq; u64 ns_prev_seq;
struct nilfs_sc_info *ns_writer;
struct rw_semaphore ns_segctor_sem; struct rw_semaphore ns_segctor_sem;
/* /*
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment