Olhando para o Linux v4.17, acho que podemos dizer que umount
on /
é equivalente a umount
on /..
. E /..
acessa o "topo da pilha de pontos de montagem".
# stat -f / --format %T
ext2/ext3
# stat -f /.. --format %T
tmpfs
Esse comportamento obscuro de ..
parece ser permitido pelo POSIX. Apenas diz "Como um caso especial, no diretório raiz, ponto-ponto pode se referir ao próprio diretório raiz." (POSIX.1-2017, secção 4.13 "Resolução do nome do caminho").
Se você deseja generalizar isso e definir o comportamento implementado por umount
em outros pontos de montagem, fazer uma comparação com ..
não funciona tão bem. O termo "topo da pilha de pontos de montagem" ainda se aplica, embora não soe como uma definição muito formal:).
Código fonte do kernel
Veja onde path_mountpoint()
chama follow_mount()
.
/**
* path_mountpoint - look up a path to be umounted
* @nd: lookup context
* @flags: lookup flags
* @path: pointer to container for result
*
* Look up the given name, but don't attempt to revalidate the last component.
* Returns 0 and "path" will be valid on success; Returns error otherwise.
*/
static int
path_mountpoint(struct nameidata *nd, unsigned flags, struct path *path)
{
const char *s = path_init(nd, flags);
int err;
if (IS_ERR(s))
return PTR_ERR(s);
while (!(err = link_path_walk(s, nd)) &&
(err = mountpoint_last(nd)) > 0) {
s = trailing_symlink(nd);
if (IS_ERR(s)) {
err = PTR_ERR(s);
break;
}
}
if (!err) {
*path = nd->path;
nd->path.mnt = NULL;
nd->path.dentry = NULL;
follow_mount(path);
}
terminate_walk(nd);
return err;
}
O comentário para follow_mount()
soou como relevante para a pergunta. E menciona follow_dotdot()
como o usuário principal, o que sugeriu essa linha de investigação.
/*
* Skip to top of mountpoint pile in refwalk mode for follow_dotdot()
*/
static void follow_mount(struct path *path)
{
while (d_mountpoint(path->dentry)) {
struct vfsmount *mounted = lookup_mnt(path);
if (!mounted)
break;
dput(path->dentry);
mntput(path->mnt);
path->mnt = mounted;
path->dentry = dget(mounted->mnt_root);
}
}
static int follow_dotdot(struct nameidata *nd)
Eu estava pensando em como ..
("dotdot") poderia passar de um ponto de montagem para seu pai, por exemplo %código%. Mas eu não tinha considerado anteriormente que isso poderia "pular para o topo da pilha de pontos de montagem". Isso acontece mesmo se a montagem superior não for a que contém o diretório /tmp/..
original!