lkml.org 
[lkml]   [2012]   [Jul]   [3]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5/8] vfs: Create function for iterating over block devices
    Date
    Signed-off-by: Jan Kara <jack@suse.cz>
    ---
    fs/block_dev.c | 36 ++++++++++++++++++++++++++++++++++++
    include/linux/fs.h | 1 +
    2 files changed, 37 insertions(+), 0 deletions(-)

    diff --git a/fs/block_dev.c b/fs/block_dev.c
    index c2bbe1f..1e51919 100644
    --- a/fs/block_dev.c
    +++ b/fs/block_dev.c
    @@ -1710,3 +1710,39 @@ int __invalidate_device(struct block_device *bdev, bool kill_dirty)
    return res;
    }
    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);
    +}
    diff --git a/include/linux/fs.h b/include/linux/fs.h
    index 17fd887..d0892e6 100644
    --- a/include/linux/fs.h
    +++ b/include/linux/fs.h
    @@ -2091,6 +2091,7 @@ extern sector_t blkdev_max_block(struct block_device *bdev);
    extern void bd_forget(struct inode *inode);
    extern void bdput(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 void kill_bdev(struct block_device *);
    extern struct super_block *freeze_bdev(struct block_device *);
    --
    1.7.1


    \
     
     \ /
      Last update: 2012-07-03 17:21    [W:0.027 / U:34.008 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site