提交 b65f0d67 编写于 作者: L Linus Torvalds

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: unfold nilfs_dat_inode function
  nilfs2: do not pass sbi to functions which can get it from inode
  nilfs2: get rid of nilfs_mount_options structure
  nilfs2: simplify nilfs_mdt_freeze_buffer
  nilfs2: get rid of loaded flag from nilfs object
  nilfs2: fix a checkpatch error in page.c
  nilfs2: fiemap support
  nilfs2: mark buffer heads as delayed until the data is written to disk
  nilfs2: call nilfs_error inside bmap routines
  fs/nilfs2/super.c: Use printf extension %pV
  MAINTAINERS: add nilfs2 git tree entry
...@@ -4268,6 +4268,7 @@ NILFS2 FILESYSTEM ...@@ -4268,6 +4268,7 @@ NILFS2 FILESYSTEM
M: KONISHI Ryusuke <konishi.ryusuke@lab.ntt.co.jp> M: KONISHI Ryusuke <konishi.ryusuke@lab.ntt.co.jp>
L: linux-nilfs@vger.kernel.org L: linux-nilfs@vger.kernel.org
W: http://www.nilfs.org/en/ W: http://www.nilfs.org/en/
T: git git://git.kernel.org/pub/scm/linux/kernel/git/ryusuke/nilfs2.git
S: Supported S: Supported
F: Documentation/filesystems/nilfs2.txt F: Documentation/filesystems/nilfs2.txt
F: fs/nilfs2/ F: fs/nilfs2/
......
...@@ -35,7 +35,20 @@ ...@@ -35,7 +35,20 @@
struct inode *nilfs_bmap_get_dat(const struct nilfs_bmap *bmap) struct inode *nilfs_bmap_get_dat(const struct nilfs_bmap *bmap)
{ {
return nilfs_dat_inode(NILFS_I_NILFS(bmap->b_inode)); return NILFS_I_NILFS(bmap->b_inode)->ns_dat;
}
static int nilfs_bmap_convert_error(struct nilfs_bmap *bmap,
const char *fname, int err)
{
struct inode *inode = bmap->b_inode;
if (err == -EINVAL) {
nilfs_error(inode->i_sb, fname,
"broken bmap (inode number=%lu)\n", inode->i_ino);
err = -EIO;
}
return err;
} }
/** /**
...@@ -66,8 +79,10 @@ int nilfs_bmap_lookup_at_level(struct nilfs_bmap *bmap, __u64 key, int level, ...@@ -66,8 +79,10 @@ int nilfs_bmap_lookup_at_level(struct nilfs_bmap *bmap, __u64 key, int level,
down_read(&bmap->b_sem); down_read(&bmap->b_sem);
ret = bmap->b_ops->bop_lookup(bmap, key, level, ptrp); ret = bmap->b_ops->bop_lookup(bmap, key, level, ptrp);
if (ret < 0) if (ret < 0) {
ret = nilfs_bmap_convert_error(bmap, __func__, ret);
goto out; goto out;
}
if (NILFS_BMAP_USE_VBN(bmap)) { if (NILFS_BMAP_USE_VBN(bmap)) {
ret = nilfs_dat_translate(nilfs_bmap_get_dat(bmap), *ptrp, ret = nilfs_dat_translate(nilfs_bmap_get_dat(bmap), *ptrp,
&blocknr); &blocknr);
...@@ -88,7 +103,8 @@ int nilfs_bmap_lookup_contig(struct nilfs_bmap *bmap, __u64 key, __u64 *ptrp, ...@@ -88,7 +103,8 @@ int nilfs_bmap_lookup_contig(struct nilfs_bmap *bmap, __u64 key, __u64 *ptrp,
down_read(&bmap->b_sem); down_read(&bmap->b_sem);
ret = bmap->b_ops->bop_lookup_contig(bmap, key, ptrp, maxblocks); ret = bmap->b_ops->bop_lookup_contig(bmap, key, ptrp, maxblocks);
up_read(&bmap->b_sem); up_read(&bmap->b_sem);
return ret;
return nilfs_bmap_convert_error(bmap, __func__, ret);
} }
static int nilfs_bmap_do_insert(struct nilfs_bmap *bmap, __u64 key, __u64 ptr) static int nilfs_bmap_do_insert(struct nilfs_bmap *bmap, __u64 key, __u64 ptr)
...@@ -144,7 +160,8 @@ int nilfs_bmap_insert(struct nilfs_bmap *bmap, ...@@ -144,7 +160,8 @@ int nilfs_bmap_insert(struct nilfs_bmap *bmap,
down_write(&bmap->b_sem); down_write(&bmap->b_sem);
ret = nilfs_bmap_do_insert(bmap, key, rec); ret = nilfs_bmap_do_insert(bmap, key, rec);
up_write(&bmap->b_sem); up_write(&bmap->b_sem);
return ret;
return nilfs_bmap_convert_error(bmap, __func__, ret);
} }
static int nilfs_bmap_do_delete(struct nilfs_bmap *bmap, __u64 key) static int nilfs_bmap_do_delete(struct nilfs_bmap *bmap, __u64 key)
...@@ -180,9 +197,12 @@ int nilfs_bmap_last_key(struct nilfs_bmap *bmap, unsigned long *key) ...@@ -180,9 +197,12 @@ int nilfs_bmap_last_key(struct nilfs_bmap *bmap, unsigned long *key)
down_read(&bmap->b_sem); down_read(&bmap->b_sem);
ret = bmap->b_ops->bop_last_key(bmap, &lastkey); ret = bmap->b_ops->bop_last_key(bmap, &lastkey);
if (!ret)
*key = lastkey;
up_read(&bmap->b_sem); up_read(&bmap->b_sem);
if (ret < 0)
ret = nilfs_bmap_convert_error(bmap, __func__, ret);
else
*key = lastkey;
return ret; return ret;
} }
...@@ -210,7 +230,8 @@ int nilfs_bmap_delete(struct nilfs_bmap *bmap, unsigned long key) ...@@ -210,7 +230,8 @@ int nilfs_bmap_delete(struct nilfs_bmap *bmap, unsigned long key)
down_write(&bmap->b_sem); down_write(&bmap->b_sem);
ret = nilfs_bmap_do_delete(bmap, key); ret = nilfs_bmap_do_delete(bmap, key);
up_write(&bmap->b_sem); up_write(&bmap->b_sem);
return ret;
return nilfs_bmap_convert_error(bmap, __func__, ret);
} }
static int nilfs_bmap_do_truncate(struct nilfs_bmap *bmap, unsigned long key) static int nilfs_bmap_do_truncate(struct nilfs_bmap *bmap, unsigned long key)
...@@ -261,7 +282,8 @@ int nilfs_bmap_truncate(struct nilfs_bmap *bmap, unsigned long key) ...@@ -261,7 +282,8 @@ int nilfs_bmap_truncate(struct nilfs_bmap *bmap, unsigned long key)
down_write(&bmap->b_sem); down_write(&bmap->b_sem);
ret = nilfs_bmap_do_truncate(bmap, key); ret = nilfs_bmap_do_truncate(bmap, key);
up_write(&bmap->b_sem); up_write(&bmap->b_sem);
return ret;
return nilfs_bmap_convert_error(bmap, __func__, ret);
} }
/** /**
...@@ -300,7 +322,8 @@ int nilfs_bmap_propagate(struct nilfs_bmap *bmap, struct buffer_head *bh) ...@@ -300,7 +322,8 @@ int nilfs_bmap_propagate(struct nilfs_bmap *bmap, struct buffer_head *bh)
down_write(&bmap->b_sem); down_write(&bmap->b_sem);
ret = bmap->b_ops->bop_propagate(bmap, bh); ret = bmap->b_ops->bop_propagate(bmap, bh);
up_write(&bmap->b_sem); up_write(&bmap->b_sem);
return ret;
return nilfs_bmap_convert_error(bmap, __func__, ret);
} }
/** /**
...@@ -344,7 +367,8 @@ int nilfs_bmap_assign(struct nilfs_bmap *bmap, ...@@ -344,7 +367,8 @@ int nilfs_bmap_assign(struct nilfs_bmap *bmap,
down_write(&bmap->b_sem); down_write(&bmap->b_sem);
ret = bmap->b_ops->bop_assign(bmap, bh, blocknr, binfo); ret = bmap->b_ops->bop_assign(bmap, bh, blocknr, binfo);
up_write(&bmap->b_sem); up_write(&bmap->b_sem);
return ret;
return nilfs_bmap_convert_error(bmap, __func__, ret);
} }
/** /**
...@@ -373,7 +397,8 @@ int nilfs_bmap_mark(struct nilfs_bmap *bmap, __u64 key, int level) ...@@ -373,7 +397,8 @@ int nilfs_bmap_mark(struct nilfs_bmap *bmap, __u64 key, int level)
down_write(&bmap->b_sem); down_write(&bmap->b_sem);
ret = bmap->b_ops->bop_mark(bmap, key, level); ret = bmap->b_ops->bop_mark(bmap, key, level);
up_write(&bmap->b_sem); up_write(&bmap->b_sem);
return ret;
return nilfs_bmap_convert_error(bmap, __func__, ret);
} }
/** /**
......
...@@ -104,8 +104,7 @@ int nilfs_btnode_submit_block(struct address_space *btnc, __u64 blocknr, ...@@ -104,8 +104,7 @@ int nilfs_btnode_submit_block(struct address_space *btnc, __u64 blocknr,
if (pblocknr == 0) { if (pblocknr == 0) {
pblocknr = blocknr; pblocknr = blocknr;
if (inode->i_ino != NILFS_DAT_INO) { if (inode->i_ino != NILFS_DAT_INO) {
struct inode *dat = struct inode *dat = NILFS_I_NILFS(inode)->ns_dat;
nilfs_dat_inode(NILFS_I_NILFS(inode));
/* blocknr is a virtual block number */ /* blocknr is a virtual block number */
err = nilfs_dat_translate(dat, blocknr, &pblocknr); err = nilfs_dat_translate(dat, blocknr, &pblocknr);
......
...@@ -91,7 +91,6 @@ static void nilfs_commit_chunk(struct page *page, ...@@ -91,7 +91,6 @@ static void nilfs_commit_chunk(struct page *page,
unsigned from, unsigned to) unsigned from, unsigned to)
{ {
struct inode *dir = mapping->host; struct inode *dir = mapping->host;
struct nilfs_sb_info *sbi = NILFS_SB(dir->i_sb);
loff_t pos = page_offset(page) + from; loff_t pos = page_offset(page) + from;
unsigned len = to - from; unsigned len = to - from;
unsigned nr_dirty, copied; unsigned nr_dirty, copied;
...@@ -103,7 +102,7 @@ static void nilfs_commit_chunk(struct page *page, ...@@ -103,7 +102,7 @@ static void nilfs_commit_chunk(struct page *page,
i_size_write(dir, pos + copied); i_size_write(dir, pos + copied);
if (IS_DIRSYNC(dir)) if (IS_DIRSYNC(dir))
nilfs_set_transaction_flag(NILFS_TI_SYNC); nilfs_set_transaction_flag(NILFS_TI_SYNC);
err = nilfs_set_file_dirty(sbi, dir, nr_dirty); err = nilfs_set_file_dirty(dir, nr_dirty);
WARN_ON(err); /* do not happen */ WARN_ON(err); /* do not happen */
unlock_page(page); unlock_page(page);
} }
......
...@@ -155,6 +155,7 @@ const struct inode_operations nilfs_file_inode_operations = { ...@@ -155,6 +155,7 @@ const struct inode_operations nilfs_file_inode_operations = {
.truncate = nilfs_truncate, .truncate = nilfs_truncate,
.setattr = nilfs_setattr, .setattr = nilfs_setattr,
.permission = nilfs_permission, .permission = nilfs_permission,
.fiemap = nilfs_fiemap,
}; };
/* end of file */ /* end of file */
...@@ -149,14 +149,9 @@ int nilfs_ifile_get_inode_block(struct inode *ifile, ino_t ino, ...@@ -149,14 +149,9 @@ int nilfs_ifile_get_inode_block(struct inode *ifile, ino_t ino,
} }
err = nilfs_palloc_get_entry_block(ifile, ino, 0, out_bh); err = nilfs_palloc_get_entry_block(ifile, ino, 0, out_bh);
if (unlikely(err)) { if (unlikely(err))
if (err == -EINVAL) nilfs_warning(sb, __func__, "unable to read inode: %lu",
nilfs_error(sb, __func__, "ifile is broken"); (unsigned long) ino);
else
nilfs_warning(sb, __func__,
"unable to read inode: %lu",
(unsigned long) ino);
}
return err; return err;
} }
......
...@@ -58,7 +58,7 @@ int nilfs_get_block(struct inode *inode, sector_t blkoff, ...@@ -58,7 +58,7 @@ int nilfs_get_block(struct inode *inode, sector_t blkoff,
struct nilfs_inode_info *ii = NILFS_I(inode); struct nilfs_inode_info *ii = NILFS_I(inode);
__u64 blknum = 0; __u64 blknum = 0;
int err = 0, ret; int err = 0, ret;
struct inode *dat = nilfs_dat_inode(NILFS_I_NILFS(inode)); struct inode *dat = NILFS_I_NILFS(inode)->ns_dat;
unsigned maxblocks = bh_result->b_size >> inode->i_blkbits; unsigned maxblocks = bh_result->b_size >> inode->i_blkbits;
down_read(&NILFS_MDT(dat)->mi_sem); down_read(&NILFS_MDT(dat)->mi_sem);
...@@ -96,11 +96,6 @@ int nilfs_get_block(struct inode *inode, sector_t blkoff, ...@@ -96,11 +96,6 @@ int nilfs_get_block(struct inode *inode, sector_t blkoff,
inode->i_ino, inode->i_ino,
(unsigned long long)blkoff); (unsigned long long)blkoff);
err = 0; err = 0;
} else if (err == -EINVAL) {
nilfs_error(inode->i_sb, __func__,
"broken bmap (inode=%lu)\n",
inode->i_ino);
err = -EIO;
} }
nilfs_transaction_abort(inode->i_sb); nilfs_transaction_abort(inode->i_sb);
goto out; goto out;
...@@ -109,6 +104,7 @@ int nilfs_get_block(struct inode *inode, sector_t blkoff, ...@@ -109,6 +104,7 @@ int nilfs_get_block(struct inode *inode, sector_t blkoff,
nilfs_transaction_commit(inode->i_sb); /* never fails */ nilfs_transaction_commit(inode->i_sb); /* never fails */
/* Error handling should be detailed */ /* Error handling should be detailed */
set_buffer_new(bh_result); set_buffer_new(bh_result);
set_buffer_delay(bh_result);
map_bh(bh_result, inode->i_sb, 0); /* dbn must be changed map_bh(bh_result, inode->i_sb, 0); /* dbn must be changed
to proper value */ to proper value */
} else if (ret == -ENOENT) { } else if (ret == -ENOENT) {
...@@ -185,10 +181,9 @@ static int nilfs_set_page_dirty(struct page *page) ...@@ -185,10 +181,9 @@ static int nilfs_set_page_dirty(struct page *page)
if (ret) { if (ret) {
struct inode *inode = page->mapping->host; struct inode *inode = page->mapping->host;
struct nilfs_sb_info *sbi = NILFS_SB(inode->i_sb);
unsigned nr_dirty = 1 << (PAGE_SHIFT - inode->i_blkbits); unsigned nr_dirty = 1 << (PAGE_SHIFT - inode->i_blkbits);
nilfs_set_file_dirty(sbi, inode, nr_dirty); nilfs_set_file_dirty(inode, nr_dirty);
} }
return ret; return ret;
} }
...@@ -229,7 +224,7 @@ static int nilfs_write_end(struct file *file, struct address_space *mapping, ...@@ -229,7 +224,7 @@ static int nilfs_write_end(struct file *file, struct address_space *mapping,
start + copied); start + copied);
copied = generic_write_end(file, mapping, pos, len, copied, page, copied = generic_write_end(file, mapping, pos, len, copied, page,
fsdata); fsdata);
nilfs_set_file_dirty(NILFS_SB(inode->i_sb), inode, nr_dirty); nilfs_set_file_dirty(inode, nr_dirty);
err = nilfs_transaction_commit(inode->i_sb); err = nilfs_transaction_commit(inode->i_sb);
return err ? : copied; return err ? : copied;
} }
...@@ -425,13 +420,12 @@ static int __nilfs_read_inode(struct super_block *sb, ...@@ -425,13 +420,12 @@ static int __nilfs_read_inode(struct super_block *sb,
struct nilfs_root *root, unsigned long ino, struct nilfs_root *root, unsigned long ino,
struct inode *inode) struct inode *inode)
{ {
struct nilfs_sb_info *sbi = NILFS_SB(sb); struct the_nilfs *nilfs = NILFS_SB(sb)->s_nilfs;
struct inode *dat = nilfs_dat_inode(sbi->s_nilfs);
struct buffer_head *bh; struct buffer_head *bh;
struct nilfs_inode *raw_inode; struct nilfs_inode *raw_inode;
int err; int err;
down_read(&NILFS_MDT(dat)->mi_sem); /* XXX */ down_read(&NILFS_MDT(nilfs->ns_dat)->mi_sem);
err = nilfs_ifile_get_inode_block(root->ifile, ino, &bh); err = nilfs_ifile_get_inode_block(root->ifile, ino, &bh);
if (unlikely(err)) if (unlikely(err))
goto bad_inode; goto bad_inode;
...@@ -461,7 +455,7 @@ static int __nilfs_read_inode(struct super_block *sb, ...@@ -461,7 +455,7 @@ static int __nilfs_read_inode(struct super_block *sb,
} }
nilfs_ifile_unmap_inode(root->ifile, ino, bh); nilfs_ifile_unmap_inode(root->ifile, ino, bh);
brelse(bh); brelse(bh);
up_read(&NILFS_MDT(dat)->mi_sem); /* XXX */ up_read(&NILFS_MDT(nilfs->ns_dat)->mi_sem);
nilfs_set_inode_flags(inode); nilfs_set_inode_flags(inode);
return 0; return 0;
...@@ -470,7 +464,7 @@ static int __nilfs_read_inode(struct super_block *sb, ...@@ -470,7 +464,7 @@ static int __nilfs_read_inode(struct super_block *sb,
brelse(bh); brelse(bh);
bad_inode: bad_inode:
up_read(&NILFS_MDT(dat)->mi_sem); /* XXX */ up_read(&NILFS_MDT(nilfs->ns_dat)->mi_sem);
return err; return err;
} }
...@@ -629,7 +623,7 @@ static void nilfs_truncate_bmap(struct nilfs_inode_info *ii, ...@@ -629,7 +623,7 @@ static void nilfs_truncate_bmap(struct nilfs_inode_info *ii,
if (!test_bit(NILFS_I_BMAP, &ii->i_state)) if (!test_bit(NILFS_I_BMAP, &ii->i_state))
return; return;
repeat: repeat:
ret = nilfs_bmap_last_key(ii->i_bmap, &b); ret = nilfs_bmap_last_key(ii->i_bmap, &b);
if (ret == -ENOENT) if (ret == -ENOENT)
return; return;
...@@ -646,14 +640,10 @@ static void nilfs_truncate_bmap(struct nilfs_inode_info *ii, ...@@ -646,14 +640,10 @@ static void nilfs_truncate_bmap(struct nilfs_inode_info *ii,
nilfs_bmap_truncate(ii->i_bmap, b) == 0)) nilfs_bmap_truncate(ii->i_bmap, b) == 0))
goto repeat; goto repeat;
failed: failed:
if (ret == -EINVAL) nilfs_warning(ii->vfs_inode.i_sb, __func__,
nilfs_error(ii->vfs_inode.i_sb, __func__, "failed to truncate bmap (ino=%lu, err=%d)",
"bmap is broken (ino=%lu)", ii->vfs_inode.i_ino); ii->vfs_inode.i_ino, ret);
else
nilfs_warning(ii->vfs_inode.i_sb, __func__,
"failed to truncate bmap (ino=%lu, err=%d)",
ii->vfs_inode.i_ino, ret);
} }
void nilfs_truncate(struct inode *inode) void nilfs_truncate(struct inode *inode)
...@@ -682,7 +672,7 @@ void nilfs_truncate(struct inode *inode) ...@@ -682,7 +672,7 @@ void nilfs_truncate(struct inode *inode)
nilfs_set_transaction_flag(NILFS_TI_SYNC); nilfs_set_transaction_flag(NILFS_TI_SYNC);
nilfs_mark_inode_dirty(inode); nilfs_mark_inode_dirty(inode);
nilfs_set_file_dirty(NILFS_SB(sb), inode, 0); nilfs_set_file_dirty(inode, 0);
nilfs_transaction_commit(sb); nilfs_transaction_commit(sb);
/* May construct a logical segment and may fail in sync mode. /* May construct a logical segment and may fail in sync mode.
But truncate has no return value. */ But truncate has no return value. */
...@@ -800,9 +790,9 @@ int nilfs_permission(struct inode *inode, int mask, unsigned int flags) ...@@ -800,9 +790,9 @@ int nilfs_permission(struct inode *inode, int mask, unsigned int flags)
return generic_permission(inode, mask, flags, NULL); return generic_permission(inode, mask, flags, NULL);
} }
int nilfs_load_inode_block(struct nilfs_sb_info *sbi, struct inode *inode, int nilfs_load_inode_block(struct inode *inode, struct buffer_head **pbh)
struct buffer_head **pbh)
{ {
struct nilfs_sb_info *sbi = NILFS_SB(inode->i_sb);
struct nilfs_inode_info *ii = NILFS_I(inode); struct nilfs_inode_info *ii = NILFS_I(inode);
int err; int err;
...@@ -843,9 +833,9 @@ int nilfs_inode_dirty(struct inode *inode) ...@@ -843,9 +833,9 @@ int nilfs_inode_dirty(struct inode *inode)
return ret; return ret;
} }
int nilfs_set_file_dirty(struct nilfs_sb_info *sbi, struct inode *inode, int nilfs_set_file_dirty(struct inode *inode, unsigned nr_dirty)
unsigned nr_dirty)
{ {
struct nilfs_sb_info *sbi = NILFS_SB(inode->i_sb);
struct nilfs_inode_info *ii = NILFS_I(inode); struct nilfs_inode_info *ii = NILFS_I(inode);
atomic_add(nr_dirty, &sbi->s_nilfs->ns_ndirtyblks); atomic_add(nr_dirty, &sbi->s_nilfs->ns_ndirtyblks);
...@@ -878,11 +868,10 @@ int nilfs_set_file_dirty(struct nilfs_sb_info *sbi, struct inode *inode, ...@@ -878,11 +868,10 @@ int nilfs_set_file_dirty(struct nilfs_sb_info *sbi, struct inode *inode,
int nilfs_mark_inode_dirty(struct inode *inode) int nilfs_mark_inode_dirty(struct inode *inode)
{ {
struct nilfs_sb_info *sbi = NILFS_SB(inode->i_sb);
struct buffer_head *ibh; struct buffer_head *ibh;
int err; int err;
err = nilfs_load_inode_block(sbi, inode, &ibh); err = nilfs_load_inode_block(inode, &ibh);
if (unlikely(err)) { if (unlikely(err)) {
nilfs_warning(inode->i_sb, __func__, nilfs_warning(inode->i_sb, __func__,
"failed to reget inode block.\n"); "failed to reget inode block.\n");
...@@ -924,3 +913,134 @@ void nilfs_dirty_inode(struct inode *inode) ...@@ -924,3 +913,134 @@ void nilfs_dirty_inode(struct inode *inode)
nilfs_mark_inode_dirty(inode); nilfs_mark_inode_dirty(inode);
nilfs_transaction_commit(inode->i_sb); /* never fails */ nilfs_transaction_commit(inode->i_sb); /* never fails */
} }
int nilfs_fiemap(struct inode *inode, struct fiemap_extent_info *fieinfo,
__u64 start, __u64 len)
{
struct the_nilfs *nilfs = NILFS_I_NILFS(inode);
__u64 logical = 0, phys = 0, size = 0;
__u32 flags = 0;
loff_t isize;
sector_t blkoff, end_blkoff;
sector_t delalloc_blkoff;
unsigned long delalloc_blklen;
unsigned int blkbits = inode->i_blkbits;
int ret, n;
ret = fiemap_check_flags(fieinfo, FIEMAP_FLAG_SYNC);
if (ret)
return ret;
mutex_lock(&inode->i_mutex);
isize = i_size_read(inode);
blkoff = start >> blkbits;
end_blkoff = (start + len - 1) >> blkbits;
delalloc_blklen = nilfs_find_uncommitted_extent(inode, blkoff,
&delalloc_blkoff);
do {
__u64 blkphy;
unsigned int maxblocks;
if (delalloc_blklen && blkoff == delalloc_blkoff) {
if (size) {
/* End of the current extent */
ret = fiemap_fill_next_extent(
fieinfo, logical, phys, size, flags);
if (ret)
break;
}
if (blkoff > end_blkoff)
break;
flags = FIEMAP_EXTENT_MERGED | FIEMAP_EXTENT_DELALLOC;
logical = blkoff << blkbits;
phys = 0;
size = delalloc_blklen << blkbits;
blkoff = delalloc_blkoff + delalloc_blklen;
delalloc_blklen = nilfs_find_uncommitted_extent(
inode, blkoff, &delalloc_blkoff);
continue;
}
/*
* Limit the number of blocks that we look up so as
* not to get into the next delayed allocation extent.
*/
maxblocks = INT_MAX;
if (delalloc_blklen)
maxblocks = min_t(sector_t, delalloc_blkoff - blkoff,
maxblocks);
blkphy = 0;
down_read(&NILFS_MDT(nilfs->ns_dat)->mi_sem);
n = nilfs_bmap_lookup_contig(
NILFS_I(inode)->i_bmap, blkoff, &blkphy, maxblocks);
up_read(&NILFS_MDT(nilfs->ns_dat)->mi_sem);
if (n < 0) {
int past_eof;
if (unlikely(n != -ENOENT))
break; /* error */
/* HOLE */
blkoff++;
past_eof = ((blkoff << blkbits) >= isize);
if (size) {
/* End of the current extent */
if (past_eof)
flags |= FIEMAP_EXTENT_LAST;
ret = fiemap_fill_next_extent(
fieinfo, logical, phys, size, flags);
if (ret)
break;
size = 0;
}
if (blkoff > end_blkoff || past_eof)
break;
} else {
if (size) {
if (phys && blkphy << blkbits == phys + size) {
/* The current extent goes on */
size += n << blkbits;
} else {
/* Terminate the current extent */
ret = fiemap_fill_next_extent(
fieinfo, logical, phys, size,
flags);
if (ret || blkoff > end_blkoff)
break;
/* Start another extent */
flags = FIEMAP_EXTENT_MERGED;
logical = blkoff << blkbits;
phys = blkphy << blkbits;
size = n << blkbits;
}
} else {
/* Start a new extent */
flags = FIEMAP_EXTENT_MERGED;
logical = blkoff << blkbits;
phys = blkphy << blkbits;
size = n << blkbits;
}
blkoff += n;
}
cond_resched();
} while (true);
/* If ret is 1 then we just hit the end of the extent array */
if (ret == 1)
ret = 0;
mutex_unlock(&inode->i_mutex);
return ret;
}
...@@ -233,7 +233,7 @@ nilfs_ioctl_do_get_vinfo(struct the_nilfs *nilfs, __u64 *posp, int flags, ...@@ -233,7 +233,7 @@ nilfs_ioctl_do_get_vinfo(struct the_nilfs *nilfs, __u64 *posp, int flags,
int ret; int ret;
down_read(&nilfs->ns_segctor_sem); down_read(&nilfs->ns_segctor_sem);
ret = nilfs_dat_get_vinfo(nilfs_dat_inode(nilfs), buf, size, nmembs); ret = nilfs_dat_get_vinfo(nilfs->ns_dat, buf, size, nmembs);
up_read(&nilfs->ns_segctor_sem); up_read(&nilfs->ns_segctor_sem);
return ret; return ret;
} }
...@@ -242,8 +242,7 @@ static ssize_t ...@@ -242,8 +242,7 @@ static ssize_t
nilfs_ioctl_do_get_bdescs(struct the_nilfs *nilfs, __u64 *posp, int flags, nilfs_ioctl_do_get_bdescs(struct the_nilfs *nilfs, __u64 *posp, int flags,
void *buf, size_t size, size_t nmembs) void *buf, size_t size, size_t nmembs)
{ {
struct inode *dat = nilfs_dat_inode(nilfs); struct nilfs_bmap *bmap = NILFS_I(nilfs->ns_dat)->i_bmap;
struct nilfs_bmap *bmap = NILFS_I(dat)->i_bmap;
struct nilfs_bdesc *bdescs = buf; struct nilfs_bdesc *bdescs = buf;
int ret, i; int ret, i;
...@@ -421,7 +420,7 @@ static int nilfs_ioctl_free_vblocknrs(struct the_nilfs *nilfs, ...@@ -421,7 +420,7 @@ static int nilfs_ioctl_free_vblocknrs(struct the_nilfs *nilfs,
size_t nmembs = argv->v_nmembs; size_t nmembs = argv->v_nmembs;
int ret; int ret;
ret = nilfs_dat_freev(nilfs_dat_inode(nilfs), buf, nmembs); ret = nilfs_dat_freev(nilfs->ns_dat, buf, nmembs);
return (ret < 0) ? ret : nmembs; return (ret < 0) ? ret : nmembs;
} }
...@@ -430,8 +429,7 @@ static int nilfs_ioctl_mark_blocks_dirty(struct the_nilfs *nilfs, ...@@ -430,8 +429,7 @@ static int nilfs_ioctl_mark_blocks_dirty(struct the_nilfs *nilfs,
struct nilfs_argv *argv, void *buf) struct nilfs_argv *argv, void *buf)
{ {
size_t nmembs = argv->v_nmembs; size_t nmembs = argv->v_nmembs;
struct inode *dat = nilfs_dat_inode(nilfs); struct nilfs_bmap *bmap = NILFS_I(nilfs->ns_dat)->i_bmap;
struct nilfs_bmap *bmap = NILFS_I(dat)->i_bmap;
struct nilfs_bdesc *bdescs = buf; struct nilfs_bdesc *bdescs = buf;
int ret, i; int ret, i;
...@@ -450,7 +448,7 @@ static int nilfs_ioctl_mark_blocks_dirty(struct the_nilfs *nilfs, ...@@ -450,7 +448,7 @@ static int nilfs_ioctl_mark_blocks_dirty(struct the_nilfs *nilfs,
/* skip dead block */ /* skip dead block */
continue; continue;
if (bdescs[i].bd_level == 0) { if (bdescs[i].bd_level == 0) {
ret = nilfs_mdt_mark_block_dirty(dat, ret = nilfs_mdt_mark_block_dirty(nilfs->ns_dat,
bdescs[i].bd_offset); bdescs[i].bd_offset);
if (ret < 0) { if (ret < 0) {
WARN_ON(ret == -ENOENT); WARN_ON(ret == -ENOENT);
......
...@@ -237,8 +237,6 @@ static int nilfs_mdt_read_block(struct inode *inode, unsigned long block, ...@@ -237,8 +237,6 @@ static int nilfs_mdt_read_block(struct inode *inode, unsigned long block,
* *
* %-ENOENT - the specified block does not exist (hole block) * %-ENOENT - the specified block does not exist (hole block)
* *
* %-EINVAL - bmap is broken. (the caller should call nilfs_error())
*
* %-EROFS - Read only filesystem (for create mode) * %-EROFS - Read only filesystem (for create mode)
*/ */
int nilfs_mdt_get_block(struct inode *inode, unsigned long blkoff, int create, int nilfs_mdt_get_block(struct inode *inode, unsigned long blkoff, int create,
...@@ -273,8 +271,6 @@ int nilfs_mdt_get_block(struct inode *inode, unsigned long blkoff, int create, ...@@ -273,8 +271,6 @@ int nilfs_mdt_get_block(struct inode *inode, unsigned long blkoff, int create,
* %-ENOMEM - Insufficient memory available. * %-ENOMEM - Insufficient memory available.
* *
* %-EIO - I/O error * %-EIO - I/O error
*
* %-EINVAL - bmap is broken. (the caller should call nilfs_error())
*/ */
int nilfs_mdt_delete_block(struct inode *inode, unsigned long block) int nilfs_mdt_delete_block(struct inode *inode, unsigned long block)
{ {
...@@ -350,8 +346,6 @@ int nilfs_mdt_forget_block(struct inode *inode, unsigned long block) ...@@ -350,8 +346,6 @@ int nilfs_mdt_forget_block(struct inode *inode, unsigned long block)
* %-EIO - I/O error * %-EIO - I/O error
* *
* %-ENOENT - the specified block does not exist (hole block) * %-ENOENT - the specified block does not exist (hole block)
*
* %-EINVAL - bmap is broken. (the caller should call nilfs_error())
*/ */
int nilfs_mdt_mark_block_dirty(struct inode *inode, unsigned long block) int nilfs_mdt_mark_block_dirty(struct inode *inode, unsigned long block)
{ {
...@@ -499,31 +493,29 @@ int nilfs_mdt_freeze_buffer(struct inode *inode, struct buffer_head *bh) ...@@ -499,31 +493,29 @@ int nilfs_mdt_freeze_buffer(struct inode *inode, struct buffer_head *bh)
struct buffer_head *bh_frozen; struct buffer_head *bh_frozen;
struct page *page; struct page *page;
int blkbits = inode->i_blkbits; int blkbits = inode->i_blkbits;
int ret = -ENOMEM;
page = grab_cache_page(&shadow->frozen_data, bh->b_page->index); page = grab_cache_page(&shadow->frozen_data, bh->b_page->index);
if (!page) if (!page)
return ret; return -ENOMEM;
if (!page_has_buffers(page)) if (!page_has_buffers(page))
create_empty_buffers(page, 1 << blkbits, 0); create_empty_buffers(page, 1 << blkbits, 0);
bh_frozen = nilfs_page_get_nth_block(page, bh_offset(bh) >> blkbits); bh_frozen = nilfs_page_get_nth_block(page, bh_offset(bh) >> blkbits);
if (bh_frozen) {
if (!buffer_uptodate(bh_frozen)) if (!buffer_uptodate(bh_frozen))
nilfs_copy_buffer(bh_frozen, bh); nilfs_copy_buffer(bh_frozen, bh);
if (list_empty(&bh_frozen->b_assoc_buffers)) { if (list_empty(&bh_frozen->b_assoc_buffers)) {
list_add_tail(&bh_frozen->b_assoc_buffers, list_add_tail(&bh_frozen->b_assoc_buffers,
&shadow->frozen_buffers); &shadow->frozen_buffers);
set_buffer_nilfs_redirected(bh); set_buffer_nilfs_redirected(bh);
} else { } else {
brelse(bh_frozen); /* already frozen */ brelse(bh_frozen); /* already frozen */
}
ret = 0;
} }
unlock_page(page); unlock_page(page);
page_cache_release(page); page_cache_release(page);
return ret; return 0;
} }
struct buffer_head * struct buffer_head *
......
...@@ -577,6 +577,7 @@ const struct inode_operations nilfs_dir_inode_operations = { ...@@ -577,6 +577,7 @@ const struct inode_operations nilfs_dir_inode_operations = {
.rename = nilfs_rename, .rename = nilfs_rename,
.setattr = nilfs_setattr, .setattr = nilfs_setattr,
.permission = nilfs_permission, .permission = nilfs_permission,
.fiemap = nilfs_fiemap,
}; };
const struct inode_operations nilfs_special_inode_operations = { const struct inode_operations nilfs_special_inode_operations = {
......
...@@ -190,11 +190,6 @@ static inline int nilfs_doing_construction(void) ...@@ -190,11 +190,6 @@ static inline int nilfs_doing_construction(void)
return nilfs_test_transaction_flag(NILFS_TI_WRITER); return nilfs_test_transaction_flag(NILFS_TI_WRITER);
} }
static inline struct inode *nilfs_dat_inode(const struct the_nilfs *nilfs)
{
return nilfs->ns_dat;
}
/* /*
* function prototype * function prototype
*/ */
...@@ -257,13 +252,13 @@ extern void nilfs_truncate(struct inode *); ...@@ -257,13 +252,13 @@ extern void nilfs_truncate(struct inode *);
extern void nilfs_evict_inode(struct inode *); extern void nilfs_evict_inode(struct inode *);
extern int nilfs_setattr(struct dentry *, struct iattr *); extern int nilfs_setattr(struct dentry *, struct iattr *);
int nilfs_permission(struct inode *inode, int mask, unsigned int flags); int nilfs_permission(struct inode *inode, int mask, unsigned int flags);
extern int nilfs_load_inode_block(struct nilfs_sb_info *, struct inode *, int nilfs_load_inode_block(struct inode *inode, struct buffer_head **pbh);
struct buffer_head **);
extern int nilfs_inode_dirty(struct inode *); extern int nilfs_inode_dirty(struct inode *);
extern int nilfs_set_file_dirty(struct nilfs_sb_info *, struct inode *, int nilfs_set_file_dirty(struct inode *inode, unsigned nr_dirty);
unsigned);
extern int nilfs_mark_inode_dirty(struct inode *); extern int nilfs_mark_inode_dirty(struct inode *);
extern void nilfs_dirty_inode(struct inode *); extern void nilfs_dirty_inode(struct inode *);
int nilfs_fiemap(struct inode *inode, struct fiemap_extent_info *fieinfo,
__u64 start, __u64 len);
/* super.c */ /* super.c */
extern struct inode *nilfs_alloc_inode(struct super_block *); extern struct inode *nilfs_alloc_inode(struct super_block *);
......
...@@ -491,7 +491,7 @@ unsigned nilfs_page_count_clean_buffers(struct page *page, ...@@ -491,7 +491,7 @@ unsigned nilfs_page_count_clean_buffers(struct page *page,
} }
return nc; return nc;
} }
void nilfs_mapping_init_once(struct address_space *mapping) void nilfs_mapping_init_once(struct address_space *mapping)
{ {
memset(mapping, 0, sizeof(*mapping)); memset(mapping, 0, sizeof(*mapping));
...@@ -546,3 +546,87 @@ int __nilfs_clear_page_dirty(struct page *page) ...@@ -546,3 +546,87 @@ int __nilfs_clear_page_dirty(struct page *page)
} }
return TestClearPageDirty(page); return TestClearPageDirty(page);
} }
/**
* nilfs_find_uncommitted_extent - find extent of uncommitted data
* @inode: inode
* @start_blk: start block offset (in)
* @blkoff: start offset of the found extent (out)
*
* This function searches an extent of buffers marked "delayed" which
* starts from a block offset equal to or larger than @start_blk. If
* such an extent was found, this will store the start offset in
* @blkoff and return its length in blocks. Otherwise, zero is
* returned.
*/
unsigned long nilfs_find_uncommitted_extent(struct inode *inode,
sector_t start_blk,
sector_t *blkoff)
{
unsigned int i;
pgoff_t index;
unsigned int nblocks_in_page;
unsigned long length = 0;
sector_t b;
struct pagevec pvec;
struct page *page;
if (inode->i_mapping->nrpages == 0)
return 0;
index = start_blk >> (PAGE_CACHE_SHIFT - inode->i_blkbits);
nblocks_in_page = 1U << (PAGE_CACHE_SHIFT - inode->i_blkbits);
pagevec_init(&pvec, 0);
repeat:
pvec.nr = find_get_pages_contig(inode->i_mapping, index, PAGEVEC_SIZE,
pvec.pages);
if (pvec.nr == 0)
return length;
if (length > 0 && pvec.pages[0]->index > index)
goto out;
b = pvec.pages[0]->index << (PAGE_CACHE_SHIFT - inode->i_blkbits);
i = 0;
do {
page = pvec.pages[i];
lock_page(page);
if (page_has_buffers(page)) {
struct buffer_head *bh, *head;
bh = head = page_buffers(page);
do {
if (b < start_blk)
continue;
if (buffer_delay(bh)) {
if (length == 0)
*blkoff = b;
length++;
} else if (length > 0) {
goto out_locked;
}
} while (++b, bh = bh->b_this_page, bh != head);
} else {
if (length > 0)
goto out_locked;
b += nblocks_in_page;
}
unlock_page(page);
} while (++i < pagevec_count(&pvec));
index = page->index + 1;
pagevec_release(&pvec);
cond_resched();
goto repeat;
out_locked:
unlock_page(page);
out:
pagevec_release(&pvec);
return length;
}
...@@ -66,6 +66,9 @@ void nilfs_mapping_init(struct address_space *mapping, ...@@ -66,6 +66,9 @@ void nilfs_mapping_init(struct address_space *mapping,
struct backing_dev_info *bdi, struct backing_dev_info *bdi,
const struct address_space_operations *aops); const struct address_space_operations *aops);
unsigned nilfs_page_count_clean_buffers(struct page *, unsigned, unsigned); unsigned nilfs_page_count_clean_buffers(struct page *, unsigned, unsigned);
unsigned long nilfs_find_uncommitted_extent(struct inode *inode,
sector_t start_blk,
sector_t *blkoff);
#define NILFS_PAGE_BUG(page, m, a...) \ #define NILFS_PAGE_BUG(page, m, a...) \
do { nilfs_page_bug(page); BUG(); } while (0) do { nilfs_page_bug(page); BUG(); } while (0)
......
...@@ -535,7 +535,7 @@ static int nilfs_recover_dsync_blocks(struct the_nilfs *nilfs, ...@@ -535,7 +535,7 @@ static int nilfs_recover_dsync_blocks(struct the_nilfs *nilfs,
if (unlikely(err)) if (unlikely(err))
goto failed_page; goto failed_page;
err = nilfs_set_file_dirty(sbi, inode, 1); err = nilfs_set_file_dirty(inode, 1);
if (unlikely(err)) if (unlikely(err))
goto failed_page; goto failed_page;
......
...@@ -27,14 +27,6 @@ ...@@ -27,14 +27,6 @@
#include <linux/types.h> #include <linux/types.h>
#include <linux/fs.h> #include <linux/fs.h>
/*
* Mount options
*/
struct nilfs_mount_options {
unsigned long mount_opt;
__u64 snapshot_cno;
};
struct the_nilfs; struct the_nilfs;
struct nilfs_sc_info; struct nilfs_sc_info;
......
...@@ -504,17 +504,6 @@ static int nilfs_segctor_add_file_block(struct nilfs_sc_info *sci, ...@@ -504,17 +504,6 @@ static int nilfs_segctor_add_file_block(struct nilfs_sc_info *sci,
return err; return err;
} }
static int nilfs_handle_bmap_error(int err, const char *fname,
struct inode *inode, struct super_block *sb)
{
if (err == -EINVAL) {
nilfs_error(sb, fname, "broken bmap (inode=%lu)\n",
inode->i_ino);
err = -EIO;
}
return err;
}
/* /*
* Callback functions that enumerate, mark, and collect dirty blocks * Callback functions that enumerate, mark, and collect dirty blocks
*/ */
...@@ -524,9 +513,8 @@ static int nilfs_collect_file_data(struct nilfs_sc_info *sci, ...@@ -524,9 +513,8 @@ static int nilfs_collect_file_data(struct nilfs_sc_info *sci,
int err; int err;
err = nilfs_bmap_propagate(NILFS_I(inode)->i_bmap, bh); err = nilfs_bmap_propagate(NILFS_I(inode)->i_bmap, bh);
if (unlikely(err < 0)) if (err < 0)
return nilfs_handle_bmap_error(err, __func__, inode, return err;
sci->sc_super);
err = nilfs_segctor_add_file_block(sci, bh, inode, err = nilfs_segctor_add_file_block(sci, bh, inode,
sizeof(struct nilfs_binfo_v)); sizeof(struct nilfs_binfo_v));
...@@ -539,13 +527,7 @@ static int nilfs_collect_file_node(struct nilfs_sc_info *sci, ...@@ -539,13 +527,7 @@ static int nilfs_collect_file_node(struct nilfs_sc_info *sci,
struct buffer_head *bh, struct buffer_head *bh,
struct inode *inode) struct inode *inode)
{ {
int err; return nilfs_bmap_propagate(NILFS_I(inode)->i_bmap, bh);
err = nilfs_bmap_propagate(NILFS_I(inode)->i_bmap, bh);
if (unlikely(err < 0))
return nilfs_handle_bmap_error(err, __func__, inode,
sci->sc_super);
return 0;
} }
static int nilfs_collect_file_bmap(struct nilfs_sc_info *sci, static int nilfs_collect_file_bmap(struct nilfs_sc_info *sci,
...@@ -588,9 +570,8 @@ static int nilfs_collect_dat_data(struct nilfs_sc_info *sci, ...@@ -588,9 +570,8 @@ static int nilfs_collect_dat_data(struct nilfs_sc_info *sci,
int err; int err;
err = nilfs_bmap_propagate(NILFS_I(inode)->i_bmap, bh); err = nilfs_bmap_propagate(NILFS_I(inode)->i_bmap, bh);
if (unlikely(err < 0)) if (err < 0)
return nilfs_handle_bmap_error(err, __func__, inode, return err;
sci->sc_super);
err = nilfs_segctor_add_file_block(sci, bh, inode, sizeof(__le64)); err = nilfs_segctor_add_file_block(sci, bh, inode, sizeof(__le64));
if (!err) if (!err)
...@@ -776,9 +757,8 @@ static int nilfs_test_metadata_dirty(struct the_nilfs *nilfs, ...@@ -776,9 +757,8 @@ static int nilfs_test_metadata_dirty(struct the_nilfs *nilfs,
ret++; ret++;
if (nilfs_mdt_fetch_dirty(nilfs->ns_sufile)) if (nilfs_mdt_fetch_dirty(nilfs->ns_sufile))
ret++; ret++;
if (ret || nilfs_doing_gc()) if ((ret || nilfs_doing_gc()) && nilfs_mdt_fetch_dirty(nilfs->ns_dat))
if (nilfs_mdt_fetch_dirty(nilfs_dat_inode(nilfs))) ret++;
ret++;
return ret; return ret;
} }
...@@ -814,7 +794,7 @@ static void nilfs_segctor_clear_metadata_dirty(struct nilfs_sc_info *sci) ...@@ -814,7 +794,7 @@ static void nilfs_segctor_clear_metadata_dirty(struct nilfs_sc_info *sci)
nilfs_mdt_clear_dirty(sci->sc_root->ifile); nilfs_mdt_clear_dirty(sci->sc_root->ifile);
nilfs_mdt_clear_dirty(nilfs->ns_cpfile); nilfs_mdt_clear_dirty(nilfs->ns_cpfile);
nilfs_mdt_clear_dirty(nilfs->ns_sufile); nilfs_mdt_clear_dirty(nilfs->ns_sufile);
nilfs_mdt_clear_dirty(nilfs_dat_inode(nilfs)); nilfs_mdt_clear_dirty(nilfs->ns_dat);
} }
static int nilfs_segctor_create_checkpoint(struct nilfs_sc_info *sci) static int nilfs_segctor_create_checkpoint(struct nilfs_sc_info *sci)
...@@ -923,7 +903,7 @@ static void nilfs_segctor_fill_in_super_root(struct nilfs_sc_info *sci, ...@@ -923,7 +903,7 @@ static void nilfs_segctor_fill_in_super_root(struct nilfs_sc_info *sci,
nilfs->ns_nongc_ctime : sci->sc_seg_ctime); nilfs->ns_nongc_ctime : sci->sc_seg_ctime);
raw_sr->sr_flags = 0; raw_sr->sr_flags = 0;
nilfs_write_inode_common(nilfs_dat_inode(nilfs), (void *)raw_sr + nilfs_write_inode_common(nilfs->ns_dat, (void *)raw_sr +
NILFS_SR_DAT_OFFSET(isz), 1); NILFS_SR_DAT_OFFSET(isz), 1);
nilfs_write_inode_common(nilfs->ns_cpfile, (void *)raw_sr + nilfs_write_inode_common(nilfs->ns_cpfile, (void *)raw_sr +
NILFS_SR_CPFILE_OFFSET(isz), 1); NILFS_SR_CPFILE_OFFSET(isz), 1);
...@@ -1179,7 +1159,7 @@ static int nilfs_segctor_collect_blocks(struct nilfs_sc_info *sci, int mode) ...@@ -1179,7 +1159,7 @@ static int nilfs_segctor_collect_blocks(struct nilfs_sc_info *sci, int mode)
sci->sc_stage.scnt++; /* Fall through */ sci->sc_stage.scnt++; /* Fall through */
case NILFS_ST_DAT: case NILFS_ST_DAT:
dat_stage: dat_stage:
err = nilfs_segctor_scan_file(sci, nilfs_dat_inode(nilfs), err = nilfs_segctor_scan_file(sci, nilfs->ns_dat,
&nilfs_sc_dat_ops); &nilfs_sc_dat_ops);
if (unlikely(err)) if (unlikely(err))
break; break;
...@@ -1563,7 +1543,6 @@ nilfs_segctor_update_payload_blocknr(struct nilfs_sc_info *sci, ...@@ -1563,7 +1543,6 @@ nilfs_segctor_update_payload_blocknr(struct nilfs_sc_info *sci,
return 0; return 0;
failed_bmap: failed_bmap:
err = nilfs_handle_bmap_error(err, __func__, inode, sci->sc_super);
return err; return err;
} }
...@@ -1783,6 +1762,7 @@ static void nilfs_clear_copied_buffers(struct list_head *list, int err) ...@@ -1783,6 +1762,7 @@ static void nilfs_clear_copied_buffers(struct list_head *list, int err)
if (!err) { if (!err) {
set_buffer_uptodate(bh); set_buffer_uptodate(bh);
clear_buffer_dirty(bh); clear_buffer_dirty(bh);
clear_buffer_delay(bh);
clear_buffer_nilfs_volatile(bh); clear_buffer_nilfs_volatile(bh);
} }
brelse(bh); /* for b_assoc_buffers */ brelse(bh); /* for b_assoc_buffers */
...@@ -1909,6 +1889,7 @@ static void nilfs_segctor_complete_write(struct nilfs_sc_info *sci) ...@@ -1909,6 +1889,7 @@ static void nilfs_segctor_complete_write(struct nilfs_sc_info *sci)
b_assoc_buffers) { b_assoc_buffers) {
set_buffer_uptodate(bh); set_buffer_uptodate(bh);
clear_buffer_dirty(bh); clear_buffer_dirty(bh);
clear_buffer_delay(bh);
clear_buffer_nilfs_volatile(bh); clear_buffer_nilfs_volatile(bh);
clear_buffer_nilfs_redirected(bh); clear_buffer_nilfs_redirected(bh);
if (bh == segbuf->sb_super_root) { if (bh == segbuf->sb_super_root) {
......
...@@ -111,12 +111,17 @@ void nilfs_error(struct super_block *sb, const char *function, ...@@ -111,12 +111,17 @@ void nilfs_error(struct super_block *sb, const char *function,
const char *fmt, ...) const char *fmt, ...)
{ {
struct nilfs_sb_info *sbi = NILFS_SB(sb); struct nilfs_sb_info *sbi = NILFS_SB(sb);
struct va_format vaf;
va_list args; va_list args;
va_start(args, fmt); va_start(args, fmt);
printk(KERN_CRIT "NILFS error (device %s): %s: ", sb->s_id, function);
vprintk(fmt, args); vaf.fmt = fmt;
printk("\n"); vaf.va = &args;
printk(KERN_CRIT "NILFS error (device %s): %s: %pV\n",
sb->s_id, function, &vaf);
va_end(args); va_end(args);
if (!(sb->s_flags & MS_RDONLY)) { if (!(sb->s_flags & MS_RDONLY)) {
...@@ -136,13 +141,17 @@ void nilfs_error(struct super_block *sb, const char *function, ...@@ -136,13 +141,17 @@ void nilfs_error(struct super_block *sb, const char *function,
void nilfs_warning(struct super_block *sb, const char *function, void nilfs_warning(struct super_block *sb, const char *function,
const char *fmt, ...) const char *fmt, ...)
{ {
struct va_format vaf;
va_list args; va_list args;
va_start(args, fmt); va_start(args, fmt);
printk(KERN_WARNING "NILFS warning (device %s): %s: ",
sb->s_id, function); vaf.fmt = fmt;
vprintk(fmt, args); vaf.va = &args;
printk("\n");
printk(KERN_WARNING "NILFS warning (device %s): %s: %pV\n",
sb->s_id, function, &vaf);
va_end(args); va_end(args);
} }
...@@ -1010,11 +1019,11 @@ static int nilfs_remount(struct super_block *sb, int *flags, char *data) ...@@ -1010,11 +1019,11 @@ static int nilfs_remount(struct super_block *sb, int *flags, char *data)
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;
unsigned long old_sb_flags; unsigned long old_sb_flags;
struct nilfs_mount_options old_opts; unsigned long old_mount_opt;
int err; int err;
old_sb_flags = sb->s_flags; old_sb_flags = sb->s_flags;
old_opts.mount_opt = sbi->s_mount_opt; old_mount_opt = sbi->s_mount_opt;
if (!parse_options(data, sb, 1)) { if (!parse_options(data, sb, 1)) {
err = -EINVAL; err = -EINVAL;
...@@ -1083,7 +1092,7 @@ static int nilfs_remount(struct super_block *sb, int *flags, char *data) ...@@ -1083,7 +1092,7 @@ static int nilfs_remount(struct super_block *sb, int *flags, char *data)
restore_opts: restore_opts:
sb->s_flags = old_sb_flags; sb->s_flags = old_sb_flags;
sbi->s_mount_opt = old_opts.mount_opt; sbi->s_mount_opt = old_mount_opt;
return err; return err;
} }
......
...@@ -329,7 +329,6 @@ int load_nilfs(struct the_nilfs *nilfs, struct nilfs_sb_info *sbi) ...@@ -329,7 +329,6 @@ int load_nilfs(struct the_nilfs *nilfs, struct nilfs_sb_info *sbi)
printk(KERN_INFO "NILFS: recovery complete.\n"); printk(KERN_INFO "NILFS: recovery complete.\n");
skip_recovery: skip_recovery:
set_nilfs_loaded(nilfs);
nilfs_clear_recovery_info(&ri); nilfs_clear_recovery_info(&ri);
sbi->s_super->s_flags = s_flags; sbi->s_super->s_flags = s_flags;
return 0; return 0;
...@@ -651,12 +650,11 @@ int nilfs_discard_segments(struct the_nilfs *nilfs, __u64 *segnump, ...@@ -651,12 +650,11 @@ int nilfs_discard_segments(struct the_nilfs *nilfs, __u64 *segnump,
int nilfs_count_free_blocks(struct the_nilfs *nilfs, sector_t *nblocks) int nilfs_count_free_blocks(struct the_nilfs *nilfs, sector_t *nblocks)
{ {
struct inode *dat = nilfs_dat_inode(nilfs);
unsigned long ncleansegs; unsigned long ncleansegs;
down_read(&NILFS_MDT(dat)->mi_sem); /* XXX */ down_read(&NILFS_MDT(nilfs->ns_dat)->mi_sem);
ncleansegs = nilfs_sufile_get_ncleansegs(nilfs->ns_sufile); ncleansegs = nilfs_sufile_get_ncleansegs(nilfs->ns_sufile);
up_read(&NILFS_MDT(dat)->mi_sem); /* XXX */ up_read(&NILFS_MDT(nilfs->ns_dat)->mi_sem);
*nblocks = (sector_t)ncleansegs * nilfs->ns_blocks_per_segment; *nblocks = (sector_t)ncleansegs * nilfs->ns_blocks_per_segment;
return 0; return 0;
} }
......
...@@ -36,8 +36,6 @@ ...@@ -36,8 +36,6 @@
/* 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 */
THE_NILFS_LOADED, /* Roll-back/roll-forward has done and
the latest checkpoint was loaded */
THE_NILFS_DISCONTINUED, /* 'next' pointer chain has broken */ THE_NILFS_DISCONTINUED, /* 'next' pointer chain has broken */
THE_NILFS_GC_RUNNING, /* gc process is running */ THE_NILFS_GC_RUNNING, /* gc process is running */
THE_NILFS_SB_DIRTY, /* super block is dirty */ THE_NILFS_SB_DIRTY, /* super block is dirty */
...@@ -178,7 +176,6 @@ static inline int nilfs_##name(struct the_nilfs *nilfs) \ ...@@ -178,7 +176,6 @@ static inline int nilfs_##name(struct the_nilfs *nilfs) \
} }
THE_NILFS_FNS(INIT, init) THE_NILFS_FNS(INIT, init)
THE_NILFS_FNS(LOADED, loaded)
THE_NILFS_FNS(DISCONTINUED, discontinued) THE_NILFS_FNS(DISCONTINUED, discontinued)
THE_NILFS_FNS(GC_RUNNING, gc_running) THE_NILFS_FNS(GC_RUNNING, gc_running)
THE_NILFS_FNS(SB_DIRTY, sb_dirty) THE_NILFS_FNS(SB_DIRTY, sb_dirty)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册