All of lore.kernel.org
 help / color / mirror / Atom feed
From: Stanislav Brabec <sbrabec@suse.cz>
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:11:47 +0100	[thread overview]
Message-ID: <56573D53.1020406@suse.cz> (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

             reply	other threads:[~2015-11-26 17:11 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-11-26 17:11 Stanislav Brabec [this message]
2015-11-27 17:15 ` [PATCH] fix mount -a on btrfs bind mount Stanislav Brabec
2015-12-02 12:51   ` Karel Zak
2015-12-02 16:26     ` Stanislav Brabec
2015-12-04 14:32     ` David Sterba
  -- strict thread matches above, loose matches on Subject: below --
2015-11-26 17:00 [PATCH?] " Stanislav Brabec

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=56573D53.1020406@suse.cz \
    --to=sbrabec@suse.cz \
    --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.