···18721872 return err;18731873}1874187418751875+static int do_add_mount(struct vfsmount *, struct path *, int);18761876+18751877/*18761878 * create a new mount for userspace and request it to be added into the18771879 * namespace's tree···1911190919121910 if (m->mnt_sb == path->mnt->mnt_sb &&19131911 m->mnt_root == path->dentry) {19141914- mnt_clear_expiry(m);19151915- mntput(m);19161916- mntput(m);19171917- return -ELOOP;19121912+ err = -ELOOP;19131913+ goto fail;19181914 }1919191519201916 err = do_add_mount(m, path, path->mnt->mnt_flags | MNT_SHRINKABLE);19211921- if (err) {19221922- mnt_clear_expiry(m);19231923- mntput(m);19241924- mntput(m);19171917+ if (!err)19181918+ return 0;19191919+fail:19201920+ /* remove m from any expiration list it may be on */19211921+ if (!list_empty(&m->mnt_expire)) {19221922+ down_write(&namespace_sem);19231923+ br_write_lock(vfsmount_lock);19241924+ list_del_init(&m->mnt_expire);19251925+ br_write_unlock(vfsmount_lock);19261926+ up_write(&namespace_sem);19251927 }19281928+ mntput(m);19291929+ mntput(m);19261930 return err;19271931}1928193219291933/*19301934 * add a mount into a namespace's mount tree19311935 */19321932-int do_add_mount(struct vfsmount *newmnt, struct path *path, int mnt_flags)19361936+static int do_add_mount(struct vfsmount *newmnt, struct path *path, int mnt_flags)19331937{19341938 int err;19351939···19621954 goto unlock;1963195519641956 newmnt->mnt_flags = mnt_flags;19651965- if ((err = graft_tree(newmnt, path)))19661966- goto unlock;19671967-19681968- up_write(&namespace_sem);19691969- return 0;19571957+ err = graft_tree(newmnt, path);1970195819711959unlock:19721960 up_write(&namespace_sem);···19851981 up_write(&namespace_sem);19861982}19871983EXPORT_SYMBOL(mnt_set_expiry);19881988-19891989-/*19901990- * Remove a vfsmount from any expiration list it may be on19911991- */19921992-void mnt_clear_expiry(struct vfsmount *mnt)19931993-{19941994- if (!list_empty(&mnt->mnt_expire)) {19951995- down_write(&namespace_sem);19961996- br_write_lock(vfsmount_lock);19971997- list_del_init(&mnt->mnt_expire);19981998- br_write_unlock(vfsmount_lock);19991999- up_write(&namespace_sem);20002000- }20012001-}2002198420031985/*20041986 * process a list of expirable mountpoints with the intent of discarding any