[PATCH 3/3] ovl: index dir act as work dir

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



With index=on, let index dir act as the work dir for copy up and
cleanups.  This will help implementing whiteout inode sharing.

We still create the "work" dir on mount regardless of index=on
and it is used to test the features supported by upper fs.
One reason is that before the feature tests, we do not know if
index could be enabled or not.

The reason we do not use "index" directory also as workdir with
index=off is because the existence of the "index" directory acts
as a simple persistent signal that index was enabled on this
filesystem and tools may want to use that signal.

Signed-off-by: Amir Goldstein <amir73il@xxxxxxxxx>
---

Miklos,

It is worth mentioning that I contemplated about the right point to
overload workdir with indexdir.

I decided to go for ofs->workdir and not ovl_workdir(), because
it makes the patch touch less code and avoids future uninterntional
uses of ofs->workdir after 'work' dir has been retired.

That said, I do not feel strongly about it, so I could go for
ovl_workdir() if you prefer.

I do feel strongly about the decision to keep 'work' dir for
index=off case.

Thanks,
Amir.

 fs/overlayfs/super.c | 14 +++++++++-----
 1 file changed, 9 insertions(+), 5 deletions(-)

diff --git a/fs/overlayfs/super.c b/fs/overlayfs/super.c
index 732ad5495c92..b91b23a0366c 100644
--- a/fs/overlayfs/super.c
+++ b/fs/overlayfs/super.c
@@ -1777,17 +1777,21 @@ static int ovl_fill_super(struct super_block *sb, void *data, int silent)
 		sb->s_flags |= SB_RDONLY;
 
 	if (!(ovl_force_readonly(ofs)) && ofs->config.index) {
+		/* index dir will act also as workdir */
+		dput(ofs->workdir);
+		ofs->workdir = NULL;
+		iput(ofs->workdir_trap);
+		ofs->workdir_trap = NULL;
+
 		err = ovl_get_indexdir(sb, ofs, oe, &upperpath);
 		if (err)
 			goto out_free_oe;
 
 		/* Force r/o mount with no index dir */
-		if (!ofs->indexdir) {
-			dput(ofs->workdir);
-			ofs->workdir = NULL;
+		if (ofs->indexdir)
+			ofs->workdir = dget(ofs->indexdir);
+		else
 			sb->s_flags |= SB_RDONLY;
-		}
-
 	}
 
 	err = ovl_check_overlapping_layers(sb, ofs);
-- 
2.17.1




[Index of Archives]     [Linux Filesystems Devel]     [Linux NFS]     [Linux NILFS]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux