Commit 090fd5b1 authored by Ryusuke Konishi's avatar Ryusuke Konishi

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: default avatarRyusuke Konishi <konishi.ryusuke@lab.ntt.co.jp>
parent c6e07188
...@@ -78,25 +78,11 @@ static int nilfs_mdt_create_block(struct inode *inode, unsigned long block, ...@@ -78,25 +78,11 @@ static int nilfs_mdt_create_block(struct inode *inode, unsigned long block,
struct buffer_head *, struct buffer_head *,
void *)) void *))
{ {
struct the_nilfs *nilfs = NILFS_I_NILFS(inode);
struct super_block *sb = inode->i_sb; struct super_block *sb = inode->i_sb;
struct nilfs_transaction_info ti; struct nilfs_transaction_info ti;
struct buffer_head *bh; struct buffer_head *bh;
int err; int err;
if (!sb) {
/*
* Make sure this function is not called from any
* read-only context.
*/
if (!nilfs->ns_writer) {
WARN_ON(1);
err = -EROFS;
goto out;
}
sb = nilfs->ns_writer->s_super;
}
nilfs_transaction_begin(sb, &ti, 0); nilfs_transaction_begin(sb, &ti, 0);
err = -ENOMEM; err = -ENOMEM;
...@@ -112,7 +98,7 @@ static int nilfs_mdt_create_block(struct inode *inode, unsigned long block, ...@@ -112,7 +98,7 @@ static int nilfs_mdt_create_block(struct inode *inode, unsigned long block,
if (buffer_uptodate(bh)) if (buffer_uptodate(bh))
goto failed_bh; goto failed_bh;
bh->b_bdev = nilfs->ns_bdev; bh->b_bdev = sb->s_bdev;
err = nilfs_mdt_insert_new_block(inode, block, bh, init_block); err = nilfs_mdt_insert_new_block(inode, block, bh, init_block);
if (likely(!err)) { if (likely(!err)) {
get_bh(bh); get_bh(bh);
...@@ -129,7 +115,7 @@ static int nilfs_mdt_create_block(struct inode *inode, unsigned long block, ...@@ -129,7 +115,7 @@ static int nilfs_mdt_create_block(struct inode *inode, unsigned long block,
err = nilfs_transaction_commit(sb); err = nilfs_transaction_commit(sb);
else else
nilfs_transaction_abort(sb); nilfs_transaction_abort(sb);
out:
return err; return err;
} }
...@@ -398,8 +384,6 @@ nilfs_mdt_write_page(struct page *page, struct writeback_control *wbc) ...@@ -398,8 +384,6 @@ nilfs_mdt_write_page(struct page *page, struct writeback_control *wbc)
{ {
struct inode *inode; struct inode *inode;
struct super_block *sb; struct super_block *sb;
struct the_nilfs *nilfs;
struct nilfs_sb_info *writer = NULL;
int err = 0; int err = 0;
redirty_page_for_writepage(wbc, page); redirty_page_for_writepage(wbc, page);
...@@ -410,25 +394,12 @@ nilfs_mdt_write_page(struct page *page, struct writeback_control *wbc) ...@@ -410,25 +394,12 @@ nilfs_mdt_write_page(struct page *page, struct writeback_control *wbc)
return 0; return 0;
sb = inode->i_sb; sb = inode->i_sb;
nilfs = NILFS_SB(sb)->s_nilfs;
if (!sb) {
down_read(&nilfs->ns_writer_sem);
writer = nilfs->ns_writer;
if (!writer) {
up_read(&nilfs->ns_writer_sem);
return -EROFS;
}
sb = writer->s_super;
}
if (wbc->sync_mode == WB_SYNC_ALL) if (wbc->sync_mode == WB_SYNC_ALL)
err = nilfs_construct_segment(sb); err = nilfs_construct_segment(sb);
else if (wbc->for_reclaim) else if (wbc->for_reclaim)
nilfs_flush_segment(sb, inode->i_ino); nilfs_flush_segment(sb, inode->i_ino);
if (writer)
up_read(&nilfs->ns_writer_sem);
return err; return err;
} }
......
...@@ -440,7 +440,6 @@ static int nilfs_prepare_segment_for_recovery(struct the_nilfs *nilfs, ...@@ -440,7 +440,6 @@ static int nilfs_prepare_segment_for_recovery(struct the_nilfs *nilfs,
segnum[2] = ri->ri_segnum; segnum[2] = ri->ri_segnum;
segnum[3] = ri->ri_nextnum; segnum[3] = ri->ri_nextnum;
nilfs_attach_writer(nilfs, sbi);
/* /*
* Releasing the next segment of the latest super root. * Releasing the next segment of the latest super root.
* The next segment is invalidated by this recovery. * The next segment is invalidated by this recovery.
...@@ -480,7 +479,6 @@ static int nilfs_prepare_segment_for_recovery(struct the_nilfs *nilfs, ...@@ -480,7 +479,6 @@ static int nilfs_prepare_segment_for_recovery(struct the_nilfs *nilfs,
failed: failed:
/* No need to recover sufile because it will be destroyed on error */ /* No need to recover sufile because it will be destroyed on error */
nilfs_detach_writer(nilfs, sbi);
return err; return err;
} }
...@@ -599,7 +597,6 @@ static int nilfs_do_roll_forward(struct the_nilfs *nilfs, ...@@ -599,7 +597,6 @@ static int nilfs_do_roll_forward(struct the_nilfs *nilfs,
}; };
int state = RF_INIT_ST; int state = RF_INIT_ST;
nilfs_attach_writer(nilfs, sbi);
pseg_start = ri->ri_lsegs_start; pseg_start = ri->ri_lsegs_start;
seg_seq = ri->ri_lsegs_start_seq; seg_seq = ri->ri_lsegs_start_seq;
segnum = nilfs_get_segnum_of_block(nilfs, pseg_start); segnum = nilfs_get_segnum_of_block(nilfs, pseg_start);
...@@ -690,7 +687,6 @@ static int nilfs_do_roll_forward(struct the_nilfs *nilfs, ...@@ -690,7 +687,6 @@ static int nilfs_do_roll_forward(struct the_nilfs *nilfs,
out: out:
brelse(bh_sum); brelse(bh_sum);
dispose_recovery_list(&dsync_blocks); dispose_recovery_list(&dsync_blocks);
nilfs_detach_writer(nilfs, sbi);
return err; return err;
confused: confused:
......
...@@ -2799,7 +2799,6 @@ static void nilfs_segctor_destroy(struct nilfs_sc_info *sci) ...@@ -2799,7 +2799,6 @@ 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_SC(sbi)) {
...@@ -2815,10 +2814,8 @@ int nilfs_attach_segment_constructor(struct nilfs_sb_info *sbi, ...@@ -2815,10 +2814,8 @@ int nilfs_attach_segment_constructor(struct nilfs_sb_info *sbi,
if (!sbi->s_sc_info) if (!sbi->s_sc_info)
return -ENOMEM; return -ENOMEM;
nilfs_attach_writer(nilfs, sbi);
err = nilfs_segctor_start_thread(NILFS_SC(sbi)); err = nilfs_segctor_start_thread(NILFS_SC(sbi));
if (err) { if (err) {
nilfs_detach_writer(nilfs, sbi);
kfree(sbi->s_sc_info); kfree(sbi->s_sc_info);
sbi->s_sc_info = NULL; sbi->s_sc_info = NULL;
} }
...@@ -2855,5 +2852,4 @@ void nilfs_detach_segment_constructor(struct nilfs_sb_info *sbi) ...@@ -2855,5 +2852,4 @@ void nilfs_detach_segment_constructor(struct nilfs_sb_info *sbi)
up_write(&nilfs->ns_segctor_sem); up_write(&nilfs->ns_segctor_sem);
nilfs_dispose_list(sbi, &garbage_list, 1); nilfs_dispose_list(sbi, &garbage_list, 1);
nilfs_detach_writer(nilfs, sbi);
} }
...@@ -75,7 +75,6 @@ struct the_nilfs *alloc_nilfs(struct block_device *bdev) ...@@ -75,7 +75,6 @@ struct the_nilfs *alloc_nilfs(struct block_device *bdev)
nilfs->ns_bdev = bdev; nilfs->ns_bdev = bdev;
atomic_set(&nilfs->ns_ndirtyblks, 0); atomic_set(&nilfs->ns_ndirtyblks, 0);
init_rwsem(&nilfs->ns_sem); init_rwsem(&nilfs->ns_sem);
init_rwsem(&nilfs->ns_writer_sem);
INIT_LIST_HEAD(&nilfs->ns_gc_inodes); INIT_LIST_HEAD(&nilfs->ns_gc_inodes);
spin_lock_init(&nilfs->ns_last_segment_lock); spin_lock_init(&nilfs->ns_last_segment_lock);
nilfs->ns_cptree = RB_ROOT; nilfs->ns_cptree = RB_ROOT;
......
...@@ -48,9 +48,7 @@ enum { ...@@ -48,9 +48,7 @@ enum {
* @ns_flags: flags * @ns_flags: flags
* @ns_bdev: block device * @ns_bdev: block device
* @ns_bdi: backing dev info * @ns_bdi: backing dev info
* @ns_writer: back pointer to writable nilfs_sb_info
* @ns_sem: semaphore for shared states * @ns_sem: semaphore for shared states
* @ns_writer_sem: semaphore protecting ns_writer attach/detach
* @ns_sbh: buffer heads of on-disk super blocks * @ns_sbh: buffer heads of on-disk super blocks
* @ns_sbp: pointers to super block data * @ns_sbp: pointers to super block data
* @ns_sbwtime: previous write time of super block * @ns_sbwtime: previous write time of super block
...@@ -93,9 +91,7 @@ struct the_nilfs { ...@@ -93,9 +91,7 @@ struct the_nilfs {
struct block_device *ns_bdev; struct block_device *ns_bdev;
struct backing_dev_info *ns_bdi; struct backing_dev_info *ns_bdi;
struct nilfs_sb_info *ns_writer;
struct rw_semaphore ns_sem; struct rw_semaphore ns_sem;
struct rw_semaphore ns_writer_sem;
/* /*
* used for * used for
...@@ -252,23 +248,6 @@ static inline void nilfs_get_root(struct nilfs_root *root) ...@@ -252,23 +248,6 @@ static inline void nilfs_get_root(struct nilfs_root *root)
atomic_inc(&root->count); atomic_inc(&root->count);
} }
static inline void
nilfs_attach_writer(struct the_nilfs *nilfs, struct nilfs_sb_info *sbi)
{
down_write(&nilfs->ns_writer_sem);
nilfs->ns_writer = sbi;
up_write(&nilfs->ns_writer_sem);
}
static inline void
nilfs_detach_writer(struct the_nilfs *nilfs, struct nilfs_sb_info *sbi)
{
down_write(&nilfs->ns_writer_sem);
if (sbi == nilfs->ns_writer)
nilfs->ns_writer = NULL;
up_write(&nilfs->ns_writer_sem);
}
static inline int nilfs_valid_fs(struct the_nilfs *nilfs) static inline int nilfs_valid_fs(struct the_nilfs *nilfs)
{ {
unsigned valid_fs; unsigned valid_fs;
......
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