Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs
Pull vfs fixes from Al Viro: "A couple of fixes; one for automount/lazy umount race, another a classic "we don't protect the refcount transition to zero with the lock that protects looking for object in hash" kind of crap in lockd." * 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs: close the race in nlmsvc_free_block() do_add_mount()/umount -l races
This commit is contained in:
@@ -289,7 +289,6 @@ static void nlmsvc_free_block(struct kref *kref)
|
|||||||
dprintk("lockd: freeing block %p...\n", block);
|
dprintk("lockd: freeing block %p...\n", block);
|
||||||
|
|
||||||
/* Remove block from file's list of blocks */
|
/* Remove block from file's list of blocks */
|
||||||
mutex_lock(&file->f_mutex);
|
|
||||||
list_del_init(&block->b_flist);
|
list_del_init(&block->b_flist);
|
||||||
mutex_unlock(&file->f_mutex);
|
mutex_unlock(&file->f_mutex);
|
||||||
|
|
||||||
@@ -303,7 +302,7 @@ static void nlmsvc_free_block(struct kref *kref)
|
|||||||
static void nlmsvc_release_block(struct nlm_block *block)
|
static void nlmsvc_release_block(struct nlm_block *block)
|
||||||
{
|
{
|
||||||
if (block != NULL)
|
if (block != NULL)
|
||||||
kref_put(&block->b_count, nlmsvc_free_block);
|
kref_put_mutex(&block->b_count, nlmsvc_free_block, &block->b_file->f_mutex);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@@ -1886,8 +1886,14 @@ static int do_add_mount(struct mount *newmnt, struct path *path, int mnt_flags)
|
|||||||
return err;
|
return err;
|
||||||
|
|
||||||
err = -EINVAL;
|
err = -EINVAL;
|
||||||
if (!(mnt_flags & MNT_SHRINKABLE) && !check_mnt(real_mount(path->mnt)))
|
if (unlikely(!check_mnt(real_mount(path->mnt)))) {
|
||||||
goto unlock;
|
/* that's acceptable only for automounts done in private ns */
|
||||||
|
if (!(mnt_flags & MNT_SHRINKABLE))
|
||||||
|
goto unlock;
|
||||||
|
/* ... and for those we'd better have mountpoint still alive */
|
||||||
|
if (!real_mount(path->mnt)->mnt_ns)
|
||||||
|
goto unlock;
|
||||||
|
}
|
||||||
|
|
||||||
/* Refuse the same filesystem on the same mount point */
|
/* Refuse the same filesystem on the same mount point */
|
||||||
err = -EBUSY;
|
err = -EBUSY;
|
||||||
|
Reference in New Issue
Block a user