From: Stanislav Brabec <sbrabec@suse.com>
To: util-linux <util-linux@vger.kernel.org>
Cc: "David Sterba" <dsterba@suse.cz>, "Søren Holm" <sgh@sgh.dk>
Subject: [PATCH?] fix mount -a on btrfs bind mount
Date: Thu, 26 Nov 2015 18:00:09 +0100 [thread overview]
Message-ID: <56573A99.9060009@suse.com> (raw)
If I have a fstab that contains:
UUID=1f976144-6c23-4622-bf6c-cd9821acc49d /var/log btrfs subvol=@/var/log 0 0
/var/log /local/nfsv4/log none bind,private
When calling "mount -a" multiple times, it mounts the bind
mount again and again.
Here are related mountinfo entries with my kernel:
44 34 0:30 /@/var/log /var/log rw,relatime shared:27 - btrfs /dev/vda2 rw,space_cache,subvolid=269,subvol=/@/var/log
95 34 0:30 /@/var/log /local/nfsv4/log rw,relatime - btrfs /dev/vda2 rw,space_cache,subvolid=269,subvol=/@/var/log
Debugging this case, I found that the btrfs specific code in
mnt_table_get_fs_root() returns bad value:
after remove_mountpoint_from_path() root is "/"
mnt_table_find_target(tb, "/var/log", MNT_ITER_BACKWARD)
returns src_root set to "/@/var/log".
startswith() does not match and the snprintf() attempts to
construct the final root value by concatenating of both
strings:
FS root result: /@/var/log/
It looks strange, and it does not work:
Then it returns to mnt_table_is_fs_mounted(), and the iterator
while (mnt_table_next_fs(tb, &itr, &fs) == 0)
could never get a match.
In section starting with if (root)
and mnt_fs_get_root(fs) returns "/@/var/log"
This is compared with "/@/var/log/" above, and match is never
got.
Here is a possible easy fix. If it is correct, the code should
be simplified to remove string copying there.
I am not sure whether it has any side effect, but it helps in
my case.
Note that 41510d26ddd9a4c83f8589dded539e2985535dcf added a
patch to "else if" part of this if, that is also a bit
suspicious: btrfs path should not contain "//" instead of
"/{subvolume}/", at least not in a correct use.
---
libmount/src/tab.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/libmount/src/tab.c b/libmount/src/tab.c
index 0df8d49..44894e9 100644
--- a/libmount/src/tab.c
+++ b/libmount/src/tab.c
@@ -1252,7 +1252,7 @@ struct libmnt_fs *mnt_table_get_fs_root(struct libmnt_table *tb,
if (!tmp)
goto err;
- snprintf(tmp, sz, "%s%s", src_root, root);
+ snprintf(tmp, sz, "%s", src_root);
free(root);
root = tmp;
}
--
2.6.3
--
Best Regards / S pozdravem,
Stanislav Brabec
software developer
---------------------------------------------------------------------
SUSE LINUX, s. r. o. e-mail: sbrabec@suse.com
Lihovarská 1060/12 tel: +49 911 7405384547
190 00 Praha 9 fax: +420 284 084 001
Czech Republic http://www.suse.cz/
PGP: 830B 40D5 9E05 35D8 5E27 6FA3 717C 209F A04F CD76
next reply other threads:[~2015-11-26 17:55 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-11-26 17:00 Stanislav Brabec [this message]
-- strict thread matches above, loose matches on Subject: below --
2015-11-26 17:11 [PATCH?] fix mount -a on btrfs bind mount Stanislav Brabec
2015-11-27 17:15 ` [PATCH] " Stanislav Brabec
2015-12-02 12:51 ` Karel Zak
2015-12-02 16:26 ` Stanislav Brabec
2015-12-04 14:32 ` David Sterba
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=56573A99.9060009@suse.com \
--to=sbrabec@suse.com \
--cc=dsterba@suse.cz \
--cc=sgh@sgh.dk \
--cc=util-linux@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.