|
@@ -0,0 +1,69 @@
|
|
|
+From patchwork Wed Mar 28 06:39:09 2018
|
|
|
+Content-Type: text/plain; charset="utf-8"
|
|
|
+MIME-Version: 1.0
|
|
|
+Content-Transfer-Encoding: 7bit
|
|
|
+Subject: btrfs-progs: mkfs/rootdir: Don't follow symbolic link when calcuating
|
|
|
+ size
|
|
|
+From: Qu Wenruo <wqu@suse.com>
|
|
|
+X-Patchwork-Id: 10312225
|
|
|
+Message-Id: <20180328063909.937-1-wqu@suse.com>
|
|
|
+To: linux-btrfs@vger.kernel.org
|
|
|
+Date: Wed, 28 Mar 2018 14:39:09 +0800
|
|
|
+
|
|
|
+[BUG]
|
|
|
+If we have a symbolic link in rootdir pointing to non-existing location,
|
|
|
+mkfs.btrfs --rootdir will just fail:
|
|
|
+------
|
|
|
+$ mkfs.btrfs -f --rootdir /tmp/rootdir/ /dev/data/btrfs
|
|
|
+btrfs-progs v4.15.1
|
|
|
+See http://btrfs.wiki.kernel.org for more information.
|
|
|
+
|
|
|
+ERROR: ftw subdir walk of /tmp/rootdir/ failed: No such file or directory
|
|
|
+------
|
|
|
+
|
|
|
+[CAUSE]
|
|
|
+Commit 599a0abed564 ("btrfs-progs: mkfs/rootdir: Use over-reserve method
|
|
|
+to make size estimate easier") add extra ftw walk to estimate the
|
|
|
+filesystem size.
|
|
|
+
|
|
|
+Such default ftw walk will follow symbolic link and gives ENOENT error.
|
|
|
+
|
|
|
+[FIX]
|
|
|
+Use nftw() to specify FTW_PHYS so we won't follow symbolic link for size
|
|
|
+calculation.
|
|
|
+
|
|
|
+Reported-by: Alexander Kanavin <alexander.kanavin@intel.com>
|
|
|
+Fixes: 599a0abed564 ("btrfs-progs: mkfs/rootdir: Use over-reserve method to make size estimate easier")
|
|
|
+Signed-off-by: Qu Wenruo <wqu@suse.com>
|
|
|
+Upstream-Status: Submitted [https://patchwork.kernel.org/patch/10312225/]
|
|
|
+---
|
|
|
+ mkfs/rootdir.c | 9 +++++++--
|
|
|
+ 1 file changed, 7 insertions(+), 2 deletions(-)
|
|
|
+
|
|
|
+diff --git a/mkfs/rootdir.c b/mkfs/rootdir.c
|
|
|
+index a1d223a2408a..33c3ff1e18cf 100644
|
|
|
+--- a/mkfs/rootdir.c
|
|
|
++++ b/mkfs/rootdir.c
|
|
|
+@@ -696,7 +696,7 @@ out:
|
|
|
+ }
|
|
|
+
|
|
|
+ static int ftw_add_entry_size(const char *fpath, const struct stat *st,
|
|
|
+- int type)
|
|
|
++ int type, struct FTW *ftwbuf)
|
|
|
+ {
|
|
|
+ /*
|
|
|
+ * Failed to read the directory, mostly due to EPERM. Abort ASAP, so
|
|
|
+@@ -731,7 +731,12 @@ u64 btrfs_mkfs_size_dir(const char *dir_name, u32 sectorsize, u64 min_dev_size,
|
|
|
+ fs_block_size = sectorsize;
|
|
|
+ ftw_data_size = 0;
|
|
|
+ ftw_meta_nr_inode = 0;
|
|
|
+- ret = ftw(dir_name, ftw_add_entry_size, 10);
|
|
|
++
|
|
|
++ /*
|
|
|
++ * Symbolic link is not followed when creating files, so no need to
|
|
|
++ * follow them here.
|
|
|
++ */
|
|
|
++ ret = nftw(dir_name, ftw_add_entry_size, 10, FTW_PHYS);
|
|
|
+ if (ret < 0) {
|
|
|
+ error("ftw subdir walk of %s failed: %s", dir_name,
|
|
|
+ strerror(errno));
|