On Thu, 23 May 2019 at 08:05, <[1]sf...@users.sourceforge.net> wrote:
Kirill Kolyshkin: > The only way to make sure is to retry reading /proc/mounts. Or, do > stat+statfs > (exactly as you suggested below) to check that this is indeed the aufs root > directory (and then you still need to retry reading /proc/mounts). Give me some more time about this topic.A I will consider again. Your point is that the default value 1 for the new ProcMount_Times doesn't help you, right? Exactly. A > This is correct for read-write mounts, what about read-only ones? For this another topic, I have a plan to introduce a new local lock. Does this help you? I believe it is, thank you! A commit 79235f42eca7a6290df1007ba786d3eb88f482e7 Author: J. R. Okajima <[2]hooanon...@gmail.com> Date:A A Thu May 23 23:20:21 2019 +0900 A A aufs: bugfix, protect creating XINO from concurrent mounts A A At the mount-time, XINO files are created and removed very soon.A When A A multiple mounts with being given the same XINO file path executed in A A parallel, some of them may fail in creating XINO due to EEXIST. A A Introducing a local mutex, put it in a critical region. A A Obviously this is unnecessary overhead when the XINO file path is not A A same, and such lock should be done by inode_lock() for the parent dir. A A Actually au_xino_create2() behaves in this way.A Then why didn't I apply A A the same way to this au_xino_create()?A It is just my laziness.A Calling A A VFS filp_open() here is easy for me. A A Reported-by: Kirill Kolyshkin <[3]kolysh...@gmail.com> A A Signed-off-by: J. R. Okajima <[4]hooanon...@gmail.com> diff --git a/fs/aufs/xino.c b/fs/aufs/xino.c index 74682b6a97eb..7de402b3bc34 100644 --- a/fs/aufs/xino.c +++ b/fs/aufs/xino.c @@ -153,16 +153,19 @@ struct file *au_xino_create(struct super_block *sb, char *fpath, int silent) A A A A struct dentry *h_parent, *d; A A A A struct inode *h_dir, *inode; A A A A int err; +A A A A static DEFINE_MUTEX(mtx); A A A A /* A A A A A * at mount-time, and the xino file is the default path, A A A A A * hnotify is disabled so we have no notify events to ignore. A A A A A * when a user specified the xino, we cannot get au_hdir to be ignored. A A A A A */ +A A A A mutex_lock(&mtx); A A A A file = vfsub_filp_open(fpath, O_RDWR | O_CREAT | O_EXCL | O_LARGEFILE A A A A A A A A A A A A A A A A /* | __FMODE_NONOTIFY */, A A A A A A A A A A A A A A A A 0666); A A A A if (IS_ERR(file)) { +A A A A A A A A mutex_unlock(&mtx); A A A A A A A A if (!silent) A A A A A A A A A A A A pr_err("open %s(%ld)\n", fpath, PTR_ERR(file)); A A A A A A A A return file; @@ -172,6 +175,7 @@ struct file *au_xino_create(struct super_block *sb, char *fpath, int silent) A A A A err = 0; A A A A d = file->f_path.dentry; A A A A h_parent = au_dget_parent_lock(d, AuLsc_I_PARENT); +A A A A mutex_unlock(&mtx); A A A A /* mnt_want_write() is unnecessary here */ A A A A h_dir = d_inode(h_parent); A A A A inode = file_inode(file); References 1. mailto:sf...@users.sourceforge.net 2. mailto:hooanon...@gmail.com 3. mailto:kolysh...@gmail.com 4. mailto:hooanon...@gmail.com