From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: util-linux-owner@vger.kernel.org Received: from mx2.suse.de ([195.135.220.15]:48185 "EHLO mx2.suse.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750916AbdBWOE5 (ORCPT ); Thu, 23 Feb 2017 09:04:57 -0500 Received: from relay1.suse.de (charybdis-ext.suse.de [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id 4ADC8ABD3 for ; Thu, 23 Feb 2017 14:04:56 +0000 (UTC) From: Petr Vorel To: util-linux@vger.kernel.org Cc: Petr Vorel Subject: [PATCH 2/2] libmount: return tab entry for default node Date: Thu, 23 Feb 2017 15:04:44 +0100 Message-Id: <20170223140444.17916-2-pvorel@suse.cz> In-Reply-To: <20170223140444.17916-1-pvorel@suse.cz> References: <20170223140444.17916-1-pvorel@suse.cz> Sender: util-linux-owner@vger.kernel.org List-ID: This is useful for lsblk. Signed-off-by: Petr Vorel --- Hope it didn't break fsck, which uses btrfs_get_default_subvol_id() as well. --- libmount/src/tab.c | 29 ++++++++++++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/libmount/src/tab.c b/libmount/src/tab.c index 8cf11814f..2865fd92a 100644 --- a/libmount/src/tab.c +++ b/libmount/src/tab.c @@ -936,6 +936,8 @@ struct libmnt_fs *mnt_table_find_target(struct libmnt_table *tb, const char *pat * The 2nd, 3rd and 4th iterations are not performed when the @tb cache is not * set (see mnt_table_set_cache()). * + * For btrfs returns tab entry for default id. + * * Note that NULL is a valid source path; it will be replaced with "none". The * "none" is used in /proc/{mounts,self/mountinfo} for pseudo filesystems. * @@ -958,9 +960,34 @@ struct libmnt_fs *mnt_table_find_srcpath(struct libmnt_table *tb, const char *pa /* native paths */ mnt_reset_iter(&itr, direction); + while(mnt_table_next_fs(tb, &itr, &fs) == 0) { - if (mnt_fs_streq_srcpath(fs, path)) + + if (mnt_fs_streq_srcpath(fs, path)) { +#ifdef HAVE_BTRFS_SUPPORT + if (mnt_fs_is_btrfs(fs)) { + uint64_t default_id = btrfs_get_default_subvol_id(mnt_fs_get_target(fs)); + uint64_t subvol_id; + char *val; + size_t len; + + if (default_id == UINT64_MAX) { + DBG(TAB, ul_debug("not found btrfs volume setting")); + return fs; + } + + if (mnt_fs_get_option(fs, "subvolid", &val, &len) == 0) { + if (mnt_parse_offset(val, len, &subvol_id)) { + DBG(TAB, ul_debugobj(tb, "failed to parse subvolid=")); + continue; + } + if (subvol_id != default_id) + continue; + } + } +#endif /* HAVE_BTRFS_SUPPORT */ return fs; + } if (mnt_fs_get_tag(fs, NULL, NULL) == 0) ntags++; } -- 2.11.0