Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 213761
b: refs/heads/master
c: 032dbb3
h: refs/heads/master
i:
  213759: 63195d2
v: v3
  • Loading branch information
Ryusuke Konishi committed Oct 23, 2010
1 parent 4a9866c commit 66a8c34
Show file tree
Hide file tree
Showing 7 changed files with 54 additions and 38 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: f1e89c86fdd0f5e59f6768146c86437934202033
refs/heads/master: 032dbb3b503a30fce732ec4c05525d0abed1f1d6
23 changes: 8 additions & 15 deletions trunk/fs/nilfs2/cpfile.c
Original file line number Diff line number Diff line change
Expand Up @@ -863,26 +863,19 @@ int nilfs_cpfile_is_snapshot(struct inode *cpfile, __u64 cno)
*/
int nilfs_cpfile_change_cpmode(struct inode *cpfile, __u64 cno, int mode)
{
struct the_nilfs *nilfs;
int ret;

nilfs = NILFS_MDT(cpfile)->mi_nilfs;

switch (mode) {
case NILFS_CHECKPOINT:
/*
* Check for protecting existing snapshot mounts:
* ns_mount_mutex is used to make this operation atomic and
* exclusive with a new mount job. Though it doesn't cover
* umount, it's enough for the purpose.
*/
if (nilfs_checkpoint_is_mounted(nilfs, cno, 1)) {
/* Current implementation does not have to protect
plain read-only mounts since they are exclusive
with a read/write mount and are protected from the
cleaner. */
if (nilfs_checkpoint_is_mounted(cpfile->i_sb, cno))
/*
* Current implementation does not have to protect
* plain read-only mounts since they are exclusive
* with a read/write mount and are protected from the
* cleaner.
*/
ret = -EBUSY;
} else
else
ret = nilfs_cpfile_clear_snapshot(cpfile, cno);
return ret;
case NILFS_SNAPSHOT:
Expand Down
10 changes: 10 additions & 0 deletions trunk/fs/nilfs2/inode.c
Original file line number Diff line number Diff line change
Expand Up @@ -506,6 +506,16 @@ static int nilfs_iget_set(struct inode *inode, void *opaque)
return 0;
}

struct inode *nilfs_ilookup(struct super_block *sb, struct nilfs_root *root,
unsigned long ino)
{
struct nilfs_iget_args args = {
.ino = ino, .root = root, .cno = 0, .for_gc = 0
};

return ilookup5(sb, ino, nilfs_iget_test, &args);
}

struct inode *nilfs_iget_locked(struct super_block *sb, struct nilfs_root *root,
unsigned long ino)
{
Expand Down
3 changes: 3 additions & 0 deletions trunk/fs/nilfs2/nilfs.h
Original file line number Diff line number Diff line change
Expand Up @@ -244,6 +244,8 @@ extern int nilfs_get_block(struct inode *, sector_t, struct buffer_head *, int);
extern void nilfs_set_inode_flags(struct inode *);
extern int nilfs_read_inode_common(struct inode *, struct nilfs_inode *);
extern void nilfs_write_inode_common(struct inode *, struct nilfs_inode *, int);
struct inode *nilfs_ilookup(struct super_block *sb, struct nilfs_root *root,
unsigned long ino);
struct inode *nilfs_iget_locked(struct super_block *sb, struct nilfs_root *root,
unsigned long ino);
struct inode *nilfs_iget(struct super_block *sb, struct nilfs_root *root,
Expand Down Expand Up @@ -285,6 +287,7 @@ extern int nilfs_commit_super(struct nilfs_sb_info *, int);
extern int nilfs_cleanup_super(struct nilfs_sb_info *);
int nilfs_attach_checkpoint(struct nilfs_sb_info *sbi, __u64 cno, int curr_mnt,
struct nilfs_root **root);
int nilfs_checkpoint_is_mounted(struct super_block *sb, __u64 cno);

/* gcinode.c */
int nilfs_gccache_submit_read_data(struct inode *, sector_t, sector_t, __u64,
Expand Down
32 changes: 32 additions & 0 deletions trunk/fs/nilfs2/super.c
Original file line number Diff line number Diff line change
Expand Up @@ -833,6 +833,38 @@ static int nilfs_try_to_shrink_tree(struct dentry *root_dentry)
return nilfs_tree_was_touched(root_dentry);
}

int nilfs_checkpoint_is_mounted(struct super_block *sb, __u64 cno)
{
struct the_nilfs *nilfs = NILFS_SB(sb)->s_nilfs;
struct nilfs_root *root;
struct inode *inode;
struct dentry *dentry;
int ret;

if (cno < 0 || cno > nilfs->ns_cno)
return false;

if (cno >= nilfs_last_cno(nilfs))
return true; /* protect recent checkpoints */

ret = false;
root = nilfs_lookup_root(NILFS_SB(sb)->s_nilfs, cno);
if (root) {
inode = nilfs_ilookup(sb, root, NILFS_ROOT_INO);
if (inode) {
dentry = d_find_alias(inode);
if (dentry) {
if (nilfs_tree_was_touched(dentry))
ret = nilfs_try_to_shrink_tree(dentry);
dput(dentry);
}
iput(inode);
}
nilfs_put_root(root);
}
return ret;
}

/**
* nilfs_fill_super() - initialize a super block instance
* @sb: super_block
Expand Down
21 changes: 0 additions & 21 deletions trunk/fs/nilfs2/the_nilfs.c
Original file line number Diff line number Diff line change
Expand Up @@ -769,24 +769,3 @@ void nilfs_put_root(struct nilfs_root *root)
kfree(root);
}
}

int nilfs_checkpoint_is_mounted(struct the_nilfs *nilfs, __u64 cno,
int snapshot_mount)
{
struct nilfs_root *root;
int ret;

if (cno < 0 || cno > nilfs->ns_cno)
return false;

if (cno >= nilfs_last_cno(nilfs))
return true; /* protect recent checkpoints */

ret = false;
root = nilfs_lookup_root(nilfs, cno);
if (root) {
ret = true;
nilfs_put_root(root);
}
return ret;
}
1 change: 0 additions & 1 deletion trunk/fs/nilfs2/the_nilfs.h
Original file line number Diff line number Diff line change
Expand Up @@ -242,7 +242,6 @@ struct nilfs_root *nilfs_find_or_create_root(struct the_nilfs *nilfs,
__u64 cno);
void nilfs_put_root(struct nilfs_root *root);
struct nilfs_sb_info *nilfs_find_sbinfo(struct the_nilfs *, int, __u64);
int nilfs_checkpoint_is_mounted(struct the_nilfs *, __u64, int);
int nilfs_near_disk_full(struct the_nilfs *);
void nilfs_fall_back_super_block(struct the_nilfs *);
void nilfs_swap_super_block(struct the_nilfs *);
Expand Down

0 comments on commit 66a8c34

Please sign in to comment.