@ -3520,7 +3520,7 @@ int kvm_vm_ioctl_get_dirty_log(struct kvm *kvm,
if ( log - > slot > = KVM_MEMORY_SLOTS )
goto out ;
memslot = & kvm - > memslots - > memslots [ log - > slot ] ;
memslot = id_to_memslot ( kvm - > memslots , log - > slot ) ;
r = - ENOENT ;
if ( ! memslot - > dirty_bitmap )
goto out ;
@ -3531,27 +3531,27 @@ int kvm_vm_ioctl_get_dirty_log(struct kvm *kvm,
/* If nothing is dirty, don't bother messing with page tables. */
if ( nr_dirty_pages ) {
struct kvm_memslots * slots , * old_slots ;
unsigned long * dirty_bitmap ;
unsigned long * dirty_bitmap , * dirty_bitmap_head ;
dirty_bitmap = memslot - > dirty_bitmap_head ;
if ( memslot - > dirty_bitmap = = dirty_bitmap )
dirty_bitmap + = n / sizeof ( long ) ;
memset ( dirty_bitmap , 0 , n ) ;
dirty_bitmap = memslot - > dirty_bitmap ;
dirty_bitmap_head = memslot - > dirty_bitmap_head ;
if ( dirty_bitmap = = dirty_bitmap_head )
dirty_bitmap_head + = n / sizeof ( long ) ;
memset ( dirty_bitmap_head , 0 , n ) ;
r = - ENOMEM ;
slots = kzalloc ( sizeof ( struct kvm_memslots ) , GFP_KERNEL ) ;
if ( ! slots )
goto out ;
memcpy ( slots , kvm - > memslots , sizeof ( struct kvm_memslots ) ) ;
memslot = & slots - > memslots [ log - > slot ] ;
memslot - > dirty_bitmap = dirty_bitmap ;
memslot = id_to_memslot ( slots , log - > slot ) ;
memslot - > nr_dirty_pages = 0 ;
memslot - > dirty_bitmap = dirty_bitmap_head ;
update_memslots ( slots , NULL ) ;
old_slots = kvm - > memslots ;
rcu_assign_pointer ( kvm - > memslots , slots ) ;
synchronize_srcu_expedited ( & kvm - > srcu ) ;
dirty_bitmap = old_slots - > memslots [ log - > slot ] . dirty_bitmap ;
kfree ( old_slots ) ;
write_protect_slot ( kvm , memslot , dirty_bitmap , nr_dirty_pages ) ;