Btrfs: mount ro and remount support

This patch adds mount ro and remount support. The main
changes in patch are: adding btrfs_remount and related
helper function; splitting the transaction related code
out of close_ctree into btrfs_commit_super; updating
allocator to properly handle read only block group.

Signed-off-by: Yan Zheng <zheng.yan@oracle.com>
This commit is contained in:
Yan Zheng
2008-11-12 14:34:12 -05:00
committed by Chris Mason
parent f3465ca44e
commit c146afad2c
7 changed files with 166 additions and 61 deletions

View File

@ -1808,10 +1808,6 @@ void btrfs_orphan_cleanup(struct btrfs_root *root)
struct inode *inode;
int ret = 0, nr_unlink = 0, nr_truncate = 0;
/* don't do orphan cleanup if the fs is readonly. */
if (root->fs_info->sb->s_flags & MS_RDONLY)
return;
path = btrfs_alloc_path();
if (!path)
return;
@ -3050,7 +3046,7 @@ static struct dentry *btrfs_lookup(struct inode *dir, struct dentry *dentry,
struct btrfs_root *root = bi->root;
struct btrfs_root *sub_root = root;
struct btrfs_key location;
int ret, new, do_orphan = 0;
int ret, new;
if (dentry->d_name.len > BTRFS_NAME_LEN)
return ERR_PTR(-ENAMETOOLONG);
@ -3076,13 +3072,9 @@ static struct dentry *btrfs_lookup(struct inode *dir, struct dentry *dentry,
if (new && root != sub_root) {
igrab(inode);
sub_root->inode = inode;
do_orphan = 1;
}
}
if (unlikely(do_orphan))
btrfs_orphan_cleanup(sub_root);
return d_splice_alias(inode, dentry);
}
@ -3237,7 +3229,7 @@ int btrfs_write_inode(struct inode *inode, int wait)
struct btrfs_trans_handle *trans;
int ret = 0;
if (root->fs_info->closing > 1)
if (root->fs_info->btree_inode == inode)
return 0;
if (wait) {
@ -4625,6 +4617,9 @@ int btrfs_start_delalloc_inodes(struct btrfs_root *root)
struct inode *inode;
unsigned long flags;
if (root->fs_info->sb->s_flags & MS_RDONLY)
return -EROFS;
spin_lock_irqsave(&root->fs_info->delalloc_lock, flags);
while(!list_empty(head)) {
binode = list_entry(head->next, struct btrfs_inode,