sd: open code revalidate_disk
[linux-2.6-microblaze.git] / fs / namespace.c
index 016553d..bae0e95 100644 (file)
@@ -1706,34 +1706,38 @@ static inline bool may_mandlock(void)
 }
 #endif
 
-int path_umount(struct path *path, int flags)
+static int can_umount(const struct path *path, int flags)
 {
-       struct mount *mnt;
-       int retval;
+       struct mount *mnt = real_mount(path->mnt);
 
        if (flags & ~(MNT_FORCE | MNT_DETACH | MNT_EXPIRE | UMOUNT_NOFOLLOW))
                return -EINVAL;
        if (!may_mount())
                return -EPERM;
-
-       mnt = real_mount(path->mnt);
-       retval = -EINVAL;
        if (path->dentry != path->mnt->mnt_root)
-               goto dput_and_out;
+               return -EINVAL;
        if (!check_mnt(mnt))
-               goto dput_and_out;
+               return -EINVAL;
        if (mnt->mnt.mnt_flags & MNT_LOCKED) /* Check optimistically */
-               goto dput_and_out;
-       retval = -EPERM;
+               return -EINVAL;
        if (flags & MNT_FORCE && !capable(CAP_SYS_ADMIN))
-               goto dput_and_out;
+               return -EPERM;
+       return 0;
+}
+
+int path_umount(struct path *path, int flags)
+{
+       struct mount *mnt = real_mount(path->mnt);
+       int ret;
+
+       ret = can_umount(path, flags);
+       if (!ret)
+               ret = do_umount(mnt, flags);
 
-       retval = do_umount(mnt, flags);
-dput_and_out:
        /* we mustn't call path_put() as that would clear mnt_expiry_mark */
        dput(path->dentry);
        mntput_no_expire(mnt);
-       return retval;
+       return ret;
 }
 
 static int ksys_umount(char __user *name, int flags)