diff --git a/[refs] b/[refs] index 9e310026ce86..820cc23cfdc8 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 074b85175a43a23fdbde60f55feea636e0bf0f85 +refs/heads/master: 6b6dc836a195e077e76977b6c020a73de411b46d diff --git a/trunk/fs/super.c b/trunk/fs/super.c index 6015c02296b7..6277ec6cb60a 100644 --- a/trunk/fs/super.c +++ b/trunk/fs/super.c @@ -633,6 +633,28 @@ struct super_block *get_super(struct block_device *bdev) EXPORT_SYMBOL(get_super); +/** + * get_super_thawed - get thawed superblock of a device + * @bdev: device to get the superblock for + * + * Scans the superblock list and finds the superblock of the file system + * mounted on the device. The superblock is returned once it is thawed + * (or immediately if it was not frozen). %NULL is returned if no match + * is found. + */ +struct super_block *get_super_thawed(struct block_device *bdev) +{ + while (1) { + struct super_block *s = get_super(bdev); + if (!s || s->s_frozen == SB_UNFROZEN) + return s; + up_read(&s->s_umount); + vfs_check_frozen(s, SB_FREEZE_WRITE); + put_super(s); + } +} +EXPORT_SYMBOL(get_super_thawed); + /** * get_active_super - get an active reference to the superblock of a device * @bdev: device to get the superblock for diff --git a/trunk/include/linux/fs.h b/trunk/include/linux/fs.h index 386da09f229d..69cd5bb640f5 100644 --- a/trunk/include/linux/fs.h +++ b/trunk/include/linux/fs.h @@ -2496,6 +2496,7 @@ extern void get_filesystem(struct file_system_type *fs); extern void put_filesystem(struct file_system_type *fs); extern struct file_system_type *get_fs_type(const char *name); extern struct super_block *get_super(struct block_device *); +extern struct super_block *get_super_thawed(struct block_device *); extern struct super_block *get_active_super(struct block_device *bdev); extern void drop_super(struct super_block *sb); extern void iterate_supers(void (*)(struct super_block *, void *), void *);