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
This commit is contained in:
commit
b65f0d673a
|
@ -4268,6 +4268,7 @@ NILFS2 FILESYSTEM
|
|||
M: KONISHI Ryusuke <konishi.ryusuke@lab.ntt.co.jp>
|
||||
L: linux-nilfs@vger.kernel.org
|
||||
W: http://www.nilfs.org/en/
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/ryusuke/nilfs2.git
|
||||
S: Supported
|
||||
F: Documentation/filesystems/nilfs2.txt
|
||||
F: fs/nilfs2/
|
||||
|
|
|
@ -35,7 +35,20 @@
|
|||
|
||||
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,
|
|||
|
||||
down_read(&bmap->b_sem);
|
||||
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;
|
||||
}
|
||||
if (NILFS_BMAP_USE_VBN(bmap)) {
|
||||
ret = nilfs_dat_translate(nilfs_bmap_get_dat(bmap), *ptrp,
|
||||
&blocknr);
|
||||
|
@ -88,7 +103,8 @@ int nilfs_bmap_lookup_contig(struct nilfs_bmap *bmap, __u64 key, __u64 *ptrp,
|
|||
down_read(&bmap->b_sem);
|
||||
ret = bmap->b_ops->bop_lookup_contig(bmap, key, ptrp, maxblocks);
|
||||
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)
|
||||
|
@ -144,7 +160,8 @@ int nilfs_bmap_insert(struct nilfs_bmap *bmap,
|
|||
down_write(&bmap->b_sem);
|
||||
ret = nilfs_bmap_do_insert(bmap, key, rec);
|
||||
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)
|
||||
|
@ -180,9 +197,12 @@ int nilfs_bmap_last_key(struct nilfs_bmap *bmap, unsigned long *key)
|
|||
|
||||
down_read(&bmap->b_sem);
|
||||
ret = bmap->b_ops->bop_last_key(bmap, &lastkey);
|
||||
if (!ret)
|
||||
*key = lastkey;
|
||||
up_read(&bmap->b_sem);
|
||||
|
||||
if (ret < 0)
|
||||
ret = nilfs_bmap_convert_error(bmap, __func__, ret);
|
||||
else
|
||||
*key = lastkey;
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
@ -210,7 +230,8 @@ int nilfs_bmap_delete(struct nilfs_bmap *bmap, unsigned long key)
|
|||
down_write(&bmap->b_sem);
|
||||
ret = nilfs_bmap_do_delete(bmap, key);
|
||||
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)
|
||||
|
@ -261,7 +282,8 @@ int nilfs_bmap_truncate(struct nilfs_bmap *bmap, unsigned long key)
|
|||
down_write(&bmap->b_sem);
|
||||
ret = nilfs_bmap_do_truncate(bmap, key);
|
||||
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)
|
|||
down_write(&bmap->b_sem);
|
||||
ret = bmap->b_ops->bop_propagate(bmap, bh);
|
||||
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,
|
|||
down_write(&bmap->b_sem);
|
||||
ret = bmap->b_ops->bop_assign(bmap, bh, blocknr, binfo);
|
||||
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)
|
|||
down_write(&bmap->b_sem);
|
||||
ret = bmap->b_ops->bop_mark(bmap, key, level);
|
||||
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,
|
|||
if (pblocknr == 0) {
|
||||
pblocknr = blocknr;
|
||||
if (inode->i_ino != NILFS_DAT_INO) {
|
||||
struct inode *dat =
|
||||
nilfs_dat_inode(NILFS_I_NILFS(inode));
|
||||
struct inode *dat = NILFS_I_NILFS(inode)->ns_dat;
|
||||
|
||||
/* blocknr is a virtual block number */
|
||||
err = nilfs_dat_translate(dat, blocknr, &pblocknr);
|
||||
|
|
|
@ -91,7 +91,6 @@ static void nilfs_commit_chunk(struct page *page,
|
|||
unsigned from, unsigned to)
|
||||
{
|
||||
struct inode *dir = mapping->host;
|
||||
struct nilfs_sb_info *sbi = NILFS_SB(dir->i_sb);
|
||||
loff_t pos = page_offset(page) + from;
|
||||
unsigned len = to - from;
|
||||
unsigned nr_dirty, copied;
|
||||
|
@ -103,7 +102,7 @@ static void nilfs_commit_chunk(struct page *page,
|
|||
i_size_write(dir, pos + copied);
|
||||
if (IS_DIRSYNC(dir))
|
||||
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 */
|
||||
unlock_page(page);
|
||||
}
|
||||
|
|
|
@ -155,6 +155,7 @@ const struct inode_operations nilfs_file_inode_operations = {
|
|||
.truncate = nilfs_truncate,
|
||||
.setattr = nilfs_setattr,
|
||||
.permission = nilfs_permission,
|
||||
.fiemap = nilfs_fiemap,
|
||||
};
|
||||
|
||||
/* end of file */
|
||||
|
|
|
@ -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);
|
||||
if (unlikely(err)) {
|
||||
if (err == -EINVAL)
|
||||
nilfs_error(sb, __func__, "ifile is broken");
|
||||
else
|
||||
nilfs_warning(sb, __func__,
|
||||
"unable to read inode: %lu",
|
||||
(unsigned long) ino);
|
||||
}
|
||||
if (unlikely(err))
|
||||
nilfs_warning(sb, __func__, "unable to read inode: %lu",
|
||||
(unsigned long) ino);
|
||||
return err;
|
||||
}
|
||||
|
||||
|
|
|
@ -58,7 +58,7 @@ int nilfs_get_block(struct inode *inode, sector_t blkoff,
|
|||
struct nilfs_inode_info *ii = NILFS_I(inode);
|
||||
__u64 blknum = 0;
|
||||
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;
|
||||
|
||||
down_read(&NILFS_MDT(dat)->mi_sem);
|
||||
|
@ -96,11 +96,6 @@ int nilfs_get_block(struct inode *inode, sector_t blkoff,
|
|||
inode->i_ino,
|
||||
(unsigned long long)blkoff);
|
||||
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);
|
||||
goto out;
|
||||
|
@ -109,6 +104,7 @@ int nilfs_get_block(struct inode *inode, sector_t blkoff,
|
|||
nilfs_transaction_commit(inode->i_sb); /* never fails */
|
||||
/* Error handling should be detailed */
|
||||
set_buffer_new(bh_result);
|
||||
set_buffer_delay(bh_result);
|
||||
map_bh(bh_result, inode->i_sb, 0); /* dbn must be changed
|
||||
to proper value */
|
||||
} else if (ret == -ENOENT) {
|
||||
|
@ -185,10 +181,9 @@ static int nilfs_set_page_dirty(struct page *page)
|
|||
|
||||
if (ret) {
|
||||
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);
|
||||
|
||||
nilfs_set_file_dirty(sbi, inode, nr_dirty);
|
||||
nilfs_set_file_dirty(inode, nr_dirty);
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
@ -229,7 +224,7 @@ static int nilfs_write_end(struct file *file, struct address_space *mapping,
|
|||
start + copied);
|
||||
copied = generic_write_end(file, mapping, pos, len, copied, page,
|
||||
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);
|
||||
return err ? : copied;
|
||||
}
|
||||
|
@ -425,13 +420,12 @@ static int __nilfs_read_inode(struct super_block *sb,
|
|||
struct nilfs_root *root, unsigned long ino,
|
||||
struct inode *inode)
|
||||
{
|
||||
struct nilfs_sb_info *sbi = NILFS_SB(sb);
|
||||
struct inode *dat = nilfs_dat_inode(sbi->s_nilfs);
|
||||
struct the_nilfs *nilfs = NILFS_SB(sb)->s_nilfs;
|
||||
struct buffer_head *bh;
|
||||
struct nilfs_inode *raw_inode;
|
||||
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);
|
||||
if (unlikely(err))
|
||||
goto bad_inode;
|
||||
|
@ -461,7 +455,7 @@ static int __nilfs_read_inode(struct super_block *sb,
|
|||
}
|
||||
nilfs_ifile_unmap_inode(root->ifile, ino, 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);
|
||||
return 0;
|
||||
|
||||
|
@ -470,7 +464,7 @@ static int __nilfs_read_inode(struct super_block *sb,
|
|||
brelse(bh);
|
||||
|
||||
bad_inode:
|
||||
up_read(&NILFS_MDT(dat)->mi_sem); /* XXX */
|
||||
up_read(&NILFS_MDT(nilfs->ns_dat)->mi_sem);
|
||||
return err;
|
||||
}
|
||||
|
||||
|
@ -629,7 +623,7 @@ static void nilfs_truncate_bmap(struct nilfs_inode_info *ii,
|
|||
|
||||
if (!test_bit(NILFS_I_BMAP, &ii->i_state))
|
||||
return;
|
||||
repeat:
|
||||
repeat:
|
||||
ret = nilfs_bmap_last_key(ii->i_bmap, &b);
|
||||
if (ret == -ENOENT)
|
||||
return;
|
||||
|
@ -646,14 +640,10 @@ static void nilfs_truncate_bmap(struct nilfs_inode_info *ii,
|
|||
nilfs_bmap_truncate(ii->i_bmap, b) == 0))
|
||||
goto repeat;
|
||||
|
||||
failed:
|
||||
if (ret == -EINVAL)
|
||||
nilfs_error(ii->vfs_inode.i_sb, __func__,
|
||||
"bmap is broken (ino=%lu)", ii->vfs_inode.i_ino);
|
||||
else
|
||||
nilfs_warning(ii->vfs_inode.i_sb, __func__,
|
||||
"failed to truncate bmap (ino=%lu, err=%d)",
|
||||
ii->vfs_inode.i_ino, ret);
|
||||
failed:
|
||||
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)
|
||||
|
@ -682,7 +672,7 @@ void nilfs_truncate(struct inode *inode)
|
|||
nilfs_set_transaction_flag(NILFS_TI_SYNC);
|
||||
|
||||
nilfs_mark_inode_dirty(inode);
|
||||
nilfs_set_file_dirty(NILFS_SB(sb), inode, 0);
|
||||
nilfs_set_file_dirty(inode, 0);
|
||||
nilfs_transaction_commit(sb);
|
||||
/* May construct a logical segment and may fail in sync mode.
|
||||
But truncate has no return value. */
|
||||
|
@ -800,9 +790,9 @@ int nilfs_permission(struct inode *inode, int mask, unsigned int flags)
|
|||
return generic_permission(inode, mask, flags, NULL);
|
||||
}
|
||||
|
||||
int nilfs_load_inode_block(struct nilfs_sb_info *sbi, struct inode *inode,
|
||||
struct buffer_head **pbh)
|
||||
int nilfs_load_inode_block(struct inode *inode, struct buffer_head **pbh)
|
||||
{
|
||||
struct nilfs_sb_info *sbi = NILFS_SB(inode->i_sb);
|
||||
struct nilfs_inode_info *ii = NILFS_I(inode);
|
||||
int err;
|
||||
|
||||
|
@ -843,9 +833,9 @@ int nilfs_inode_dirty(struct inode *inode)
|
|||
return ret;
|
||||
}
|
||||
|
||||
int nilfs_set_file_dirty(struct nilfs_sb_info *sbi, struct inode *inode,
|
||||
unsigned nr_dirty)
|
||||
int nilfs_set_file_dirty(struct inode *inode, unsigned nr_dirty)
|
||||
{
|
||||
struct nilfs_sb_info *sbi = NILFS_SB(inode->i_sb);
|
||||
struct nilfs_inode_info *ii = NILFS_I(inode);
|
||||
|
||||
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,
|
|||
|
||||
int nilfs_mark_inode_dirty(struct inode *inode)
|
||||
{
|
||||
struct nilfs_sb_info *sbi = NILFS_SB(inode->i_sb);
|
||||
struct buffer_head *ibh;
|
||||
int err;
|
||||
|
||||
err = nilfs_load_inode_block(sbi, inode, &ibh);
|
||||
err = nilfs_load_inode_block(inode, &ibh);
|
||||
if (unlikely(err)) {
|
||||
nilfs_warning(inode->i_sb, __func__,
|
||||
"failed to reget inode block.\n");
|
||||
|
@ -924,3 +913,134 @@ void nilfs_dirty_inode(struct inode *inode)
|
|||
nilfs_mark_inode_dirty(inode);
|
||||
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,
|
|||
int ret;
|
||||
|
||||
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);
|
||||
return ret;
|
||||
}
|
||||
|
@ -242,8 +242,7 @@ static ssize_t
|
|||
nilfs_ioctl_do_get_bdescs(struct the_nilfs *nilfs, __u64 *posp, int flags,
|
||||
void *buf, size_t size, size_t nmembs)
|
||||
{
|
||||
struct inode *dat = nilfs_dat_inode(nilfs);
|
||||
struct nilfs_bmap *bmap = NILFS_I(dat)->i_bmap;
|
||||
struct nilfs_bmap *bmap = NILFS_I(nilfs->ns_dat)->i_bmap;
|
||||
struct nilfs_bdesc *bdescs = buf;
|
||||
int ret, i;
|
||||
|
||||
|
@ -421,7 +420,7 @@ static int nilfs_ioctl_free_vblocknrs(struct the_nilfs *nilfs,
|
|||
size_t nmembs = argv->v_nmembs;
|
||||
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;
|
||||
}
|
||||
|
@ -430,8 +429,7 @@ static int nilfs_ioctl_mark_blocks_dirty(struct the_nilfs *nilfs,
|
|||
struct nilfs_argv *argv, void *buf)
|
||||
{
|
||||
size_t nmembs = argv->v_nmembs;
|
||||
struct inode *dat = nilfs_dat_inode(nilfs);
|
||||
struct nilfs_bmap *bmap = NILFS_I(dat)->i_bmap;
|
||||
struct nilfs_bmap *bmap = NILFS_I(nilfs->ns_dat)->i_bmap;
|
||||
struct nilfs_bdesc *bdescs = buf;
|
||||
int ret, i;
|
||||
|
||||
|
@ -450,7 +448,7 @@ static int nilfs_ioctl_mark_blocks_dirty(struct the_nilfs *nilfs,
|
|||
/* skip dead block */
|
||||
continue;
|
||||
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);
|
||||
if (ret < 0) {
|
||||
WARN_ON(ret == -ENOENT);
|
||||
|
|
|
@ -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)
|
||||
*
|
||||
* %-EINVAL - bmap is broken. (the caller should call nilfs_error())
|
||||
*
|
||||
* %-EROFS - Read only filesystem (for create mode)
|
||||
*/
|
||||
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.
|
||||
*
|
||||
* %-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)
|
||||
{
|
||||
|
@ -350,8 +346,6 @@ int nilfs_mdt_forget_block(struct inode *inode, unsigned long block)
|
|||
* %-EIO - I/O error
|
||||
*
|
||||
* %-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)
|
||||
{
|
||||
|
@ -499,31 +493,29 @@ int nilfs_mdt_freeze_buffer(struct inode *inode, struct buffer_head *bh)
|
|||
struct buffer_head *bh_frozen;
|
||||
struct page *page;
|
||||
int blkbits = inode->i_blkbits;
|
||||
int ret = -ENOMEM;
|
||||
|
||||
page = grab_cache_page(&shadow->frozen_data, bh->b_page->index);
|
||||
if (!page)
|
||||
return ret;
|
||||
return -ENOMEM;
|
||||
|
||||
if (!page_has_buffers(page))
|
||||
create_empty_buffers(page, 1 << blkbits, 0);
|
||||
|
||||
bh_frozen = nilfs_page_get_nth_block(page, bh_offset(bh) >> blkbits);
|
||||
if (bh_frozen) {
|
||||
if (!buffer_uptodate(bh_frozen))
|
||||
nilfs_copy_buffer(bh_frozen, bh);
|
||||
if (list_empty(&bh_frozen->b_assoc_buffers)) {
|
||||
list_add_tail(&bh_frozen->b_assoc_buffers,
|
||||
&shadow->frozen_buffers);
|
||||
set_buffer_nilfs_redirected(bh);
|
||||
} else {
|
||||
brelse(bh_frozen); /* already frozen */
|
||||
}
|
||||
ret = 0;
|
||||
|
||||
if (!buffer_uptodate(bh_frozen))
|
||||
nilfs_copy_buffer(bh_frozen, bh);
|
||||
if (list_empty(&bh_frozen->b_assoc_buffers)) {
|
||||
list_add_tail(&bh_frozen->b_assoc_buffers,
|
||||
&shadow->frozen_buffers);
|
||||
set_buffer_nilfs_redirected(bh);
|
||||
} else {
|
||||
brelse(bh_frozen); /* already frozen */
|
||||
}
|
||||
|
||||
unlock_page(page);
|
||||
page_cache_release(page);
|
||||
return ret;
|
||||
return 0;
|
||||
}
|
||||
|
||||
struct buffer_head *
|
||||
|
|
|
@ -577,6 +577,7 @@ const struct inode_operations nilfs_dir_inode_operations = {
|
|||
.rename = nilfs_rename,
|
||||
.setattr = nilfs_setattr,
|
||||
.permission = nilfs_permission,
|
||||
.fiemap = nilfs_fiemap,
|
||||
};
|
||||
|
||||
const struct inode_operations nilfs_special_inode_operations = {
|
||||
|
|
|
@ -190,11 +190,6 @@ static inline int nilfs_doing_construction(void)
|
|||
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
|
||||
*/
|
||||
|
@ -257,13 +252,13 @@ extern void nilfs_truncate(struct inode *);
|
|||
extern void nilfs_evict_inode(struct inode *);
|
||||
extern int nilfs_setattr(struct dentry *, struct iattr *);
|
||||
int nilfs_permission(struct inode *inode, int mask, unsigned int flags);
|
||||
extern int nilfs_load_inode_block(struct nilfs_sb_info *, struct inode *,
|
||||
struct buffer_head **);
|
||||
int nilfs_load_inode_block(struct inode *inode, struct buffer_head **pbh);
|
||||
extern int nilfs_inode_dirty(struct inode *);
|
||||
extern int nilfs_set_file_dirty(struct nilfs_sb_info *, struct inode *,
|
||||
unsigned);
|
||||
int nilfs_set_file_dirty(struct inode *inode, unsigned nr_dirty);
|
||||
extern int nilfs_mark_inode_dirty(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 */
|
||||
extern struct inode *nilfs_alloc_inode(struct super_block *);
|
||||
|
|
|
@ -546,3 +546,87 @@ int __nilfs_clear_page_dirty(struct page *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,
|
|||
struct backing_dev_info *bdi,
|
||||
const struct address_space_operations *aops);
|
||||
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...) \
|
||||
do { nilfs_page_bug(page); BUG(); } while (0)
|
||||
|
|
|
@ -535,7 +535,7 @@ static int nilfs_recover_dsync_blocks(struct the_nilfs *nilfs,
|
|||
if (unlikely(err))
|
||||
goto failed_page;
|
||||
|
||||
err = nilfs_set_file_dirty(sbi, inode, 1);
|
||||
err = nilfs_set_file_dirty(inode, 1);
|
||||
if (unlikely(err))
|
||||
goto failed_page;
|
||||
|
||||
|
|
|
@ -27,14 +27,6 @@
|
|||
#include <linux/types.h>
|
||||
#include <linux/fs.h>
|
||||
|
||||
/*
|
||||
* Mount options
|
||||
*/
|
||||
struct nilfs_mount_options {
|
||||
unsigned long mount_opt;
|
||||
__u64 snapshot_cno;
|
||||
};
|
||||
|
||||
struct the_nilfs;
|
||||
struct nilfs_sc_info;
|
||||
|
||||
|
|
|
@ -504,17 +504,6 @@ static int nilfs_segctor_add_file_block(struct nilfs_sc_info *sci,
|
|||
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
|
||||
*/
|
||||
|
@ -524,9 +513,8 @@ static int nilfs_collect_file_data(struct nilfs_sc_info *sci,
|
|||
int err;
|
||||
|
||||
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);
|
||||
if (err < 0)
|
||||
return err;
|
||||
|
||||
err = nilfs_segctor_add_file_block(sci, bh, inode,
|
||||
sizeof(struct nilfs_binfo_v));
|
||||
|
@ -539,13 +527,7 @@ static int nilfs_collect_file_node(struct nilfs_sc_info *sci,
|
|||
struct buffer_head *bh,
|
||||
struct inode *inode)
|
||||
{
|
||||
int err;
|
||||
|
||||
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;
|
||||
return nilfs_bmap_propagate(NILFS_I(inode)->i_bmap, bh);
|
||||
}
|
||||
|
||||
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,
|
|||
int err;
|
||||
|
||||
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);
|
||||
if (err < 0)
|
||||
return err;
|
||||
|
||||
err = nilfs_segctor_add_file_block(sci, bh, inode, sizeof(__le64));
|
||||
if (!err)
|
||||
|
@ -776,9 +757,8 @@ static int nilfs_test_metadata_dirty(struct the_nilfs *nilfs,
|
|||
ret++;
|
||||
if (nilfs_mdt_fetch_dirty(nilfs->ns_sufile))
|
||||
ret++;
|
||||
if (ret || nilfs_doing_gc())
|
||||
if (nilfs_mdt_fetch_dirty(nilfs_dat_inode(nilfs)))
|
||||
ret++;
|
||||
if ((ret || nilfs_doing_gc()) && nilfs_mdt_fetch_dirty(nilfs->ns_dat))
|
||||
ret++;
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
@ -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(nilfs->ns_cpfile);
|
||||
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)
|
||||
|
@ -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);
|
||||
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_write_inode_common(nilfs->ns_cpfile, (void *)raw_sr +
|
||||
NILFS_SR_CPFILE_OFFSET(isz), 1);
|
||||
|
@ -1179,7 +1159,7 @@ static int nilfs_segctor_collect_blocks(struct nilfs_sc_info *sci, int mode)
|
|||
sci->sc_stage.scnt++; /* Fall through */
|
||||
case NILFS_ST_DAT:
|
||||
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);
|
||||
if (unlikely(err))
|
||||
break;
|
||||
|
@ -1563,7 +1543,6 @@ nilfs_segctor_update_payload_blocknr(struct nilfs_sc_info *sci,
|
|||
return 0;
|
||||
|
||||
failed_bmap:
|
||||
err = nilfs_handle_bmap_error(err, __func__, inode, sci->sc_super);
|
||||
return err;
|
||||
}
|
||||
|
||||
|
@ -1783,6 +1762,7 @@ static void nilfs_clear_copied_buffers(struct list_head *list, int err)
|
|||
if (!err) {
|
||||
set_buffer_uptodate(bh);
|
||||
clear_buffer_dirty(bh);
|
||||
clear_buffer_delay(bh);
|
||||
clear_buffer_nilfs_volatile(bh);
|
||||
}
|
||||
brelse(bh); /* for b_assoc_buffers */
|
||||
|
@ -1909,6 +1889,7 @@ static void nilfs_segctor_complete_write(struct nilfs_sc_info *sci)
|
|||
b_assoc_buffers) {
|
||||
set_buffer_uptodate(bh);
|
||||
clear_buffer_dirty(bh);
|
||||
clear_buffer_delay(bh);
|
||||
clear_buffer_nilfs_volatile(bh);
|
||||
clear_buffer_nilfs_redirected(bh);
|
||||
if (bh == segbuf->sb_super_root) {
|
||||
|
|
|
@ -111,12 +111,17 @@ void nilfs_error(struct super_block *sb, const char *function,
|
|||
const char *fmt, ...)
|
||||
{
|
||||
struct nilfs_sb_info *sbi = NILFS_SB(sb);
|
||||
struct va_format vaf;
|
||||
va_list args;
|
||||
|
||||
va_start(args, fmt);
|
||||
printk(KERN_CRIT "NILFS error (device %s): %s: ", sb->s_id, function);
|
||||
vprintk(fmt, args);
|
||||
printk("\n");
|
||||
|
||||
vaf.fmt = fmt;
|
||||
vaf.va = &args;
|
||||
|
||||
printk(KERN_CRIT "NILFS error (device %s): %s: %pV\n",
|
||||
sb->s_id, function, &vaf);
|
||||
|
||||
va_end(args);
|
||||
|
||||
if (!(sb->s_flags & MS_RDONLY)) {
|
||||
|
@ -136,13 +141,17 @@ void nilfs_error(struct super_block *sb, const char *function,
|
|||
void nilfs_warning(struct super_block *sb, const char *function,
|
||||
const char *fmt, ...)
|
||||
{
|
||||
struct va_format vaf;
|
||||
va_list args;
|
||||
|
||||
va_start(args, fmt);
|
||||
printk(KERN_WARNING "NILFS warning (device %s): %s: ",
|
||||
sb->s_id, function);
|
||||
vprintk(fmt, args);
|
||||
printk("\n");
|
||||
|
||||
vaf.fmt = fmt;
|
||||
vaf.va = &args;
|
||||
|
||||
printk(KERN_WARNING "NILFS warning (device %s): %s: %pV\n",
|
||||
sb->s_id, function, &vaf);
|
||||
|
||||
va_end(args);
|
||||
}
|
||||
|
||||
|
@ -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 the_nilfs *nilfs = sbi->s_nilfs;
|
||||
unsigned long old_sb_flags;
|
||||
struct nilfs_mount_options old_opts;
|
||||
unsigned long old_mount_opt;
|
||||
int err;
|
||||
|
||||
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)) {
|
||||
err = -EINVAL;
|
||||
|
@ -1083,7 +1092,7 @@ static int nilfs_remount(struct super_block *sb, int *flags, char *data)
|
|||
|
||||
restore_opts:
|
||||
sb->s_flags = old_sb_flags;
|
||||
sbi->s_mount_opt = old_opts.mount_opt;
|
||||
sbi->s_mount_opt = old_mount_opt;
|
||||
return err;
|
||||
}
|
||||
|
||||
|
|
|
@ -329,7 +329,6 @@ int load_nilfs(struct the_nilfs *nilfs, struct nilfs_sb_info *sbi)
|
|||
printk(KERN_INFO "NILFS: recovery complete.\n");
|
||||
|
||||
skip_recovery:
|
||||
set_nilfs_loaded(nilfs);
|
||||
nilfs_clear_recovery_info(&ri);
|
||||
sbi->s_super->s_flags = s_flags;
|
||||
return 0;
|
||||
|
@ -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)
|
||||
{
|
||||
struct inode *dat = nilfs_dat_inode(nilfs);
|
||||
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);
|
||||
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;
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -36,8 +36,6 @@
|
|||
/* the_nilfs struct */
|
||||
enum {
|
||||
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_GC_RUNNING, /* gc process is running */
|
||||
THE_NILFS_SB_DIRTY, /* super block is dirty */
|
||||
|
@ -178,7 +176,6 @@ static inline int nilfs_##name(struct the_nilfs *nilfs) \
|
|||
}
|
||||
|
||||
THE_NILFS_FNS(INIT, init)
|
||||
THE_NILFS_FNS(LOADED, loaded)
|
||||
THE_NILFS_FNS(DISCONTINUED, discontinued)
|
||||
THE_NILFS_FNS(GC_RUNNING, gc_running)
|
||||
THE_NILFS_FNS(SB_DIRTY, sb_dirty)
|
||||
|
|
Loading…
Reference in New Issue