region = pregion;
result = start;
@@ -1241,10 +1241,10 @@ unsigned long do_mmap(struct file *file,
- up_write(&nommu_region_sem);
error:
+ mas_destroy(&mas);
if (region->vm_file)
- fput(region->vm_file);
+ vmr_fput(region);
struct address_space *mapping;
int error;
@@ -1031,6 +1055,13 @@ static int loop_configure(struct loop_device *lo, fmode_t mode,
- /* suppress uevents while reconfiguring the device */
- dev_set_uevent_suppress(disk_to_dev(lo->lo_disk), 1);
+ /* This is safe, since we have a reference from open(). */
+ __module_get(THIS_MODULE);
+ f = loop_real_file(file);
+ if (f) {
+ fput(virt_file);
/* This is safe: open() is still holding a reference. */
module_put(THIS_MODULE);
- goto done;
+ return error;
@@ -1154,6 +1188,7 @@ static int loop_configure(struct loop_device *lo, fmode_t mode,
static void __loop_clr_fd(struct loop_device *lo, bool release)
{