Skip to content

Commit

Permalink
call_usermodehelper() should wait for process
Browse files Browse the repository at this point in the history
As of Linux 3.4 the UMH_WAIT_* constants were renumbered.  In
particular, the meaning of "1" changed from UMH_WAIT_PROC (wait for
process to complete), to UMH_WAIT_EXEC (wait for the exec, but not the
process).  A number of call sites used the number 1 instead of the
constant name, so the behavior was not as expected on kernels with this
change.

One visible consequence of this change was that processes accessing
automounted snapshots received an ELOOP error because they failed to
wait for zfs.mount to complete.

Signed-off-by: Brian Behlendorf <[email protected]>
Closes openzfs#816
  • Loading branch information
nedbass authored and behlendorf committed Jan 10, 2013
1 parent 1c50c99 commit 761394b
Show file tree
Hide file tree
Showing 3 changed files with 4 additions and 4 deletions.
2 changes: 1 addition & 1 deletion module/zfs/vdev_disk.c
Original file line number Diff line number Diff line change
Expand Up @@ -159,7 +159,7 @@ vdev_elevator_switch(vdev_t *v, char *elevator)
char *envp[] = { NULL };

argv[2] = kmem_asprintf(SET_SCHEDULER_CMD, device, elevator);
error = call_usermodehelper(argv[0], argv, envp, 1);
error = call_usermodehelper(argv[0], argv, envp, UMH_WAIT_PROC);
strfree(argv[2]);
}
#endif /* HAVE_ELEVATOR_CHANGE */
Expand Down
4 changes: 2 additions & 2 deletions module/zfs/zfs_ctldir.c
Original file line number Diff line number Diff line change
Expand Up @@ -696,7 +696,7 @@ __zfsctl_unmount_snapshot(zfs_snapentry_t *sep, int flags)

argv[2] = kmem_asprintf(SET_UNMOUNT_CMD,
flags & MNT_FORCE ? "-f " : "", sep->se_path);
error = call_usermodehelper(argv[0], argv, envp, 1);
error = call_usermodehelper(argv[0], argv, envp, UMH_WAIT_PROC);
strfree(argv[2]);

/*
Expand Down Expand Up @@ -822,7 +822,7 @@ zfsctl_mount_snapshot(struct path *path, int flags)
* to safely abort the automount. This should be very rare.
*/
argv[2] = kmem_asprintf(SET_MOUNT_CMD, full_name, full_path);
error = call_usermodehelper(argv[0], argv, envp, 1);
error = call_usermodehelper(argv[0], argv, envp, UMH_WAIT_PROC);
strfree(argv[2]);
if (error) {
printk("ZFS: Unable to automount %s at %s: %d\n",
Expand Down
2 changes: 1 addition & 1 deletion module/zpios/pios.c
Original file line number Diff line number Diff line change
Expand Up @@ -92,7 +92,7 @@ int zpios_upcall(char *path, char *phase, run_args_t *run_args, int rc)
envp[2] = "PATH=/sbin:/usr/sbin:/bin:/usr/bin";
envp[3] = NULL;

return call_usermodehelper(path, argv, envp, 1);
return call_usermodehelper(path, argv, envp, UMH_WAIT_PROC);
}

static uint64_t
Expand Down

0 comments on commit 761394b

Please sign in to comment.