mirror of
https://github.com/FEX-Emu/linux.git
synced 2024-12-28 12:25:31 +00:00
vfs: Create function for iterating over block devices
Signed-off-by: Jan Kara <jack@suse.cz> Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
This commit is contained in:
parent
b3de653105
commit
5c0d6b60a0
@ -1710,3 +1710,39 @@ int __invalidate_device(struct block_device *bdev, bool kill_dirty)
|
|||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(__invalidate_device);
|
EXPORT_SYMBOL(__invalidate_device);
|
||||||
|
|
||||||
|
void iterate_bdevs(void (*func)(struct block_device *, void *), void *arg)
|
||||||
|
{
|
||||||
|
struct inode *inode, *old_inode = NULL;
|
||||||
|
|
||||||
|
spin_lock(&inode_sb_list_lock);
|
||||||
|
list_for_each_entry(inode, &blockdev_superblock->s_inodes, i_sb_list) {
|
||||||
|
struct address_space *mapping = inode->i_mapping;
|
||||||
|
|
||||||
|
spin_lock(&inode->i_lock);
|
||||||
|
if (inode->i_state & (I_FREEING|I_WILL_FREE|I_NEW) ||
|
||||||
|
mapping->nrpages == 0) {
|
||||||
|
spin_unlock(&inode->i_lock);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
__iget(inode);
|
||||||
|
spin_unlock(&inode->i_lock);
|
||||||
|
spin_unlock(&inode_sb_list_lock);
|
||||||
|
/*
|
||||||
|
* We hold a reference to 'inode' so it couldn't have been
|
||||||
|
* removed from s_inodes list while we dropped the
|
||||||
|
* inode_sb_list_lock. We cannot iput the inode now as we can
|
||||||
|
* be holding the last reference and we cannot iput it under
|
||||||
|
* inode_sb_list_lock. So we keep the reference and iput it
|
||||||
|
* later.
|
||||||
|
*/
|
||||||
|
iput(old_inode);
|
||||||
|
old_inode = inode;
|
||||||
|
|
||||||
|
func(I_BDEV(inode), arg);
|
||||||
|
|
||||||
|
spin_lock(&inode_sb_list_lock);
|
||||||
|
}
|
||||||
|
spin_unlock(&inode_sb_list_lock);
|
||||||
|
iput(old_inode);
|
||||||
|
}
|
||||||
|
@ -2102,6 +2102,7 @@ extern sector_t blkdev_max_block(struct block_device *bdev);
|
|||||||
extern void bd_forget(struct inode *inode);
|
extern void bd_forget(struct inode *inode);
|
||||||
extern void bdput(struct block_device *);
|
extern void bdput(struct block_device *);
|
||||||
extern void invalidate_bdev(struct block_device *);
|
extern void invalidate_bdev(struct block_device *);
|
||||||
|
extern void iterate_bdevs(void (*)(struct block_device *, void *), void *);
|
||||||
extern int sync_blockdev(struct block_device *bdev);
|
extern int sync_blockdev(struct block_device *bdev);
|
||||||
extern void kill_bdev(struct block_device *);
|
extern void kill_bdev(struct block_device *);
|
||||||
extern struct super_block *freeze_bdev(struct block_device *);
|
extern struct super_block *freeze_bdev(struct block_device *);
|
||||||
@ -2123,6 +2124,10 @@ static inline int thaw_bdev(struct block_device *bdev, struct super_block *sb)
|
|||||||
{
|
{
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline void iterate_bdevs(void (*f)(struct block_device *, void *), void *arg)
|
||||||
|
{
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
extern int sync_filesystem(struct super_block *);
|
extern int sync_filesystem(struct super_block *);
|
||||||
extern const struct file_operations def_blk_fops;
|
extern const struct file_operations def_blk_fops;
|
||||||
|
Loading…
Reference in New Issue
Block a user