On Fri, Jul 15, 2016 at 01:39:43PM -0400, Waiman Long wrote:
>  void iterate_bdevs(void (*func)(struct block_device *, void *), void *arg)
>  {
>       struct inode *inode, *old_inode = NULL;
> +     DEFINE_DLOCK_LIST_ITER(iter);
>  
> -     spin_lock(&blockdev_superblock->s_inode_list_lock);
> -     list_for_each_entry(inode, &blockdev_superblock->s_inodes, i_sb_list) {
> -             struct address_space *mapping = inode->i_mapping;
> +     while (dlock_list_next(&blockdev_superblock->s_inodes, &iter)) {
> +             struct address_space *mapping;
>  
> +             inode   = list_entry(iter.curr, struct inode, i_sb_list);
> +             mapping = inode->i_mapping;

TBH, I would very much prefer something like
        DEFINE_DLOCK_LIST_ITER(iter, &blockdev_superblock->s_inodes);

        dlist_for_each_entry(inode, &iter, i_sb_list) {
                mapping = inode->i_mapping;

> -             spin_unlock(&blockdev_superblock->s_inode_list_lock);
> +             spin_unlock(iter.lock);

... and this might be worth dlist_{un,re}lock(&iter);

Reply via email to