vfs: Provide function to get superblock and wait for it to thaw
In quota code we need to find a superblock corresponding to a device and wait for superblock to be unfrozen. However this waiting has to happen without s_umount semaphore because that is required for superblock to thaw. So provide a function in VFS for this to keep dances with s_umount where they belong. [AV: implementation switched to saner variant] Signed-off-by: Jan Kara <jack@suse.cz> Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
This commit is contained in:
parent
074b85175a
commit
6b6dc836a1
2 changed files with 23 additions and 0 deletions
22
fs/super.c
22
fs/super.c
|
@ -633,6 +633,28 @@ rescan:
|
||||||
|
|
||||||
EXPORT_SYMBOL(get_super);
|
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
|
* get_active_super - get an active reference to the superblock of a device
|
||||||
* @bdev: device to get the superblock for
|
* @bdev: device to get the superblock for
|
||||||
|
|
|
@ -2496,6 +2496,7 @@ extern void get_filesystem(struct file_system_type *fs);
|
||||||
extern void put_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 file_system_type *get_fs_type(const char *name);
|
||||||
extern struct super_block *get_super(struct block_device *);
|
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 struct super_block *get_active_super(struct block_device *bdev);
|
||||||
extern void drop_super(struct super_block *sb);
|
extern void drop_super(struct super_block *sb);
|
||||||
extern void iterate_supers(void (*)(struct super_block *, void *), void *);
|
extern void iterate_supers(void (*)(struct super_block *, void *), void *);
|
||||||
|
|
Loading…
Add table
Reference in a new issue