aboutsummaryrefslogtreecommitdiffstats
path: root/include/linux/fs.h
diff options
context:
space:
mode:
authorJosef Bacik <josef@redhat.com>2010-03-23 10:34:56 -0400
committerAl Viro <viro@zeniv.linux.org.uk>2010-05-21 18:31:18 -0400
commit18e9e5104fcd9a973ffe3eed3816c87f2a1b6cd2 (patch)
tree635369c866fcb384223618c878e0b4c317790634 /include/linux/fs.h
parente1e46bf1866317d4f86f66bf18d3f07317d9f9ee (diff)
Introduce freeze_super and thaw_super for the fsfreeze ioctl
Currently the way we do freezing is by passing sb>s_bdev to freeze_bdev and then letting it do all the work. But freezing is more of an fs thing, and doesn't really have much to do with the bdev at all, all the work gets done with the super. In btrfs we do not populate s_bdev, since we can have multiple bdev's for one fs and setting s_bdev makes removing devices from a pool kind of tricky. This means that freezing a btrfs filesystem fails, which causes us to corrupt with things like tux-on-ice which use the fsfreeze mechanism. So instead of populating sb->s_bdev with a random bdev in our pool, I've broken the actual fs freezing stuff into freeze_super and thaw_super. These just take the super_block that we're freezing and does the appropriate work. It's basically just copy and pasted from freeze_bdev. I've then converted freeze_bdev over to use the new super helpers. I've tested this with ext4 and btrfs and verified everything continues to work the same as before. The only new gotcha is multiple calls to the fsfreeze ioctl will return EBUSY if the fs is already frozen. I thought this was a better solution than adding a freeze counter to the super_block, but if everybody hates this idea I'm open to suggestions. Thanks, Signed-off-by: Josef Bacik <josef@redhat.com> Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Diffstat (limited to 'include/linux/fs.h')
-rw-r--r--include/linux/fs.h2
1 files changed, 2 insertions, 0 deletions
diff --git a/include/linux/fs.h b/include/linux/fs.h
index eeb04ba17b63..d51256bc6328 100644
--- a/include/linux/fs.h
+++ b/include/linux/fs.h
@@ -1797,6 +1797,8 @@ extern void drop_collected_mounts(struct vfsmount *);
1797extern int iterate_mounts(int (*)(struct vfsmount *, void *), void *, 1797extern int iterate_mounts(int (*)(struct vfsmount *, void *), void *,
1798 struct vfsmount *); 1798 struct vfsmount *);
1799extern int vfs_statfs(struct dentry *, struct kstatfs *); 1799extern int vfs_statfs(struct dentry *, struct kstatfs *);
1800extern int freeze_super(struct super_block *super);
1801extern int thaw_super(struct super_block *super);
1800 1802
1801extern int current_umask(void); 1803extern int current_umask(void);
1802 1804