From: David Woodhouse <dwmw2@infradead.org>
To: Valerie Aurora <vaurora@redhat.com>
Cc: Jan Blunck <jblunck@suse.de>,
Alexander Viro <viro@zeniv.linux.org.uk>,
Christoph Hellwig <hch@infradead.org>,
Andy Whitcroft <apw@canonical.com>,
Scott James Remnant <scott@canonical.com>,
Sandu Popa Marius <sandupopamarius@gmail.com>,
Jan Rekorajski <baggins@sith.mimuw.edu.pl>,
"J. R. Okajima" <hooanon05@yahoo.co.jp>,
Arnd Bergmann <arnd@arndb.de>,
Vladimir Dronnikov <dronnikov@gmail.com>,
Felix Fietkau <nbd@openwrt.org>,
linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org,
linux-mtd@lists.infradead.org
Subject: Re: [PATCH 16/41] whiteout: jffs2 whiteout support
Date: Thu, 22 Oct 2009 07:50:49 +0900 [thread overview]
Message-ID: <1256165449.22999.19.camel@macbook.infradead.org> (raw)
In-Reply-To: <1256152779-10054-17-git-send-email-vaurora@redhat.com>
On Wed, 2009-10-21 at 12:19 -0700, Valerie Aurora wrote:
> From: Felix Fietkau <nbd@openwrt.org>
>
> Add support for whiteout dentries to jffs2.
As discussed, there are a few places where JFFS2 will assume that a
dirent with fd->ino == 0 is a deletion dirent -- a kind of whiteout of
its own, used internally because it's a log-structured file system and
it needs to mark previously existing dirents as having been unlinked.
You're breaking that assumption. So, for example, your whiteouts are
going to get lost when the eraseblock containing them is garbage
collected -- because they'll be treated like deletion dirents, which
only need to remain on the medium for as long as the _real_ dirents
which they exist to kill.
This completely untested patch addresses some of it.
The other thing to verify is the three places in dir.c which check
whether whiteout/rmdir/rename should return -ENOTEMPTY. Those all do so
by checking whether the directory in question has any dirents with
fd->ino != 0 -- i.e. does it contain any _real_ dirents, or only the
deletion markers for dead stuff.
So that will now be _allowing_ you to remove a directory which contains
whiteouts, since you haven't changed the test. Is that intentional? It
seems sane at first glance.
diff --git a/fs/jffs2/build.c b/fs/jffs2/build.c
index c5e1450..4dc883f 100644
--- a/fs/jffs2/build.c
+++ b/fs/jffs2/build.c
@@ -217,8 +217,9 @@ static void jffs2_build_remove_unlinked_inode(struct jffs2_sb_info *c,
ic->scan_dents = fd->next;
if (!fd->ino) {
- /* It's a deletion dirent. Ignore it */
- dbg_fsbuild("child \"%s\" is a deletion dirent, skipping...\n", fd->name);
+ dbg_fsbuild("child \"%s\" is a %s, skipping...\n",
+ fd->name,
+ (fd->type == DT_WHT)?"whiteout":"deletion dirent");
jffs2_free_full_dirent(fd);
continue;
}
diff --git a/fs/jffs2/gc.c b/fs/jffs2/gc.c
index 090c556..7f5afbb 100644
--- a/fs/jffs2/gc.c
+++ b/fs/jffs2/gc.c
@@ -516,7 +516,7 @@ static int jffs2_garbage_collect_live(struct jffs2_sb_info *c, struct jffs2_era
break;
}
- if (fd && fd->ino) {
+ if (fd && (fd->ino || fd->type == DT_WHT)) {
ret = jffs2_garbage_collect_dirent(c, jeb, f, fd);
} else if (fd) {
ret = jffs2_garbage_collect_deletion_dirent(c, jeb, f, fd);
@@ -895,7 +895,7 @@ static int jffs2_garbage_collect_deletion_dirent(struct jffs2_sb_info *c, struct
continue;
/* If the name length doesn't match, or it's another deletion dirent, skip */
- if (rd->nsize != name_len || !je32_to_cpu(rd->ino))
+ if (rd->nsize != name_len || (!je32_to_cpu(rd->ino) && rd->type != DT_WHT))
continue;
/* OK, check the actual name now */
diff --git a/fs/jffs2/write.c b/fs/jffs2/write.c
index ca29440..bcd4b86 100644
--- a/fs/jffs2/write.c
+++ b/fs/jffs2/write.c
@@ -629,8 +629,9 @@ int jffs2_do_unlink(struct jffs2_sb_info *c, struct jffs2_inode_info *dir_f,
printk(KERN_WARNING "Deleting inode #%u with active dentry \"%s\"->ino #%u\n",
dead_f->inocache->ino, fd->name, fd->ino);
} else {
- D1(printk(KERN_DEBUG "Removing deletion dirent for \"%s\" from dir ino #%u\n",
- fd->name, dead_f->inocache->ino));
+ D1(printk(KERN_DEBUG "Removing %s for \"%s\" from dir ino #%u\n",
+ (fd->type == DT_WHT)?"whiteout":"deletion dirent",
+ fd->name, dead_f->inocache->ino));
}
if (fd->raw)
jffs2_mark_node_obsolete(c, fd->raw);
--
David Woodhouse Open Source Technology Centre
David.Woodhouse@intel.com Intel Corporation
next prev parent reply other threads:[~2009-10-21 22:50 UTC|newest]
Thread overview: 100+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-10-21 19:18 [RFC PATCH 00/40] Writable overlays (union mounts) Valerie Aurora
2009-10-21 19:18 ` [PATCH 01/41] VFS: BUG() if somebody tries to rehash an already hashed dentry Valerie Aurora
2009-10-21 19:19 ` [PATCH 02/41] VFS: propagate mnt_flags into do_loopback Valerie Aurora
2009-10-21 19:19 ` [PATCH 03/41] VFS: Make lookup_hash() return a struct path Valerie Aurora
2009-10-21 19:19 ` [PATCH 04/41] VFS: Remove unnecessary micro-optimization in cached_lookup() Valerie Aurora
2009-10-21 19:19 ` [PATCH 05/41] VFS: Make real_lookup() return a struct path Valerie Aurora
2009-10-21 19:19 ` [PATCH 06/41] VFS: Introduce dput() variant that maintains a kill-list Valerie Aurora
2009-10-21 19:19 ` [PATCH 07/41] VFS: Add read-only users count to superblock Valerie Aurora
2009-10-21 19:19 ` [PATCH 08/41] Don't replace nameidata path when following links Valerie Aurora
2009-10-21 19:19 ` [PATCH 09/41] whiteout: Don't return information about whiteouts to userspace Valerie Aurora
2009-10-21 19:19 ` [PATCH 10/41] whiteout: Add vfs_whiteout() and whiteout inode operation Valerie Aurora
2009-10-21 19:19 ` [PATCH 11/41] whiteout: Set S_OPAQUE inode flag when creating directories Valerie Aurora
2009-10-21 19:19 ` [PATCH 12/41] union-mount: Allow removal of a directory Valerie Aurora
2009-10-21 19:19 ` [PATCH 13/41] whiteout: tmpfs whiteout support Valerie Aurora
2009-10-21 19:19 ` [PATCH 14/41] whiteout: Split of ext2_append_link() from ext2_add_link() Valerie Aurora
2009-10-21 19:19 ` [PATCH 15/41] whiteout: ext2 whiteout support Valerie Aurora
2009-10-21 19:19 ` [PATCH 16/41] whiteout: jffs2 " Valerie Aurora
2009-10-21 19:19 ` [PATCH 17/41] whiteout: Add path_whiteout() helper Valerie Aurora
2009-10-21 19:19 ` [PATCH 18/41] union-mount: Documentation Valerie Aurora
2009-10-21 19:19 ` [PATCH 19/41] union-mount: Introduce MNT_UNION and MS_UNION flags Valerie Aurora
2009-10-21 19:19 ` [PATCH 20/41] union-mount: Introduce union_mount structure Valerie Aurora
2009-10-21 19:19 ` [PATCH 21/41] union-mount: Drive the union cache via dcache Valerie Aurora
2009-10-21 19:19 ` [PATCH 22/41] union-mount: Some checks during namespace changes Valerie Aurora
2009-10-21 19:19 ` [PATCH 23/41] union-mount: Changes to the namespace handling Valerie Aurora
2009-10-21 19:19 ` [PATCH 24/41] union-mount: Make lookup work for union-mounted file systems Valerie Aurora
2009-10-21 19:19 ` [PATCH 25/41] union-mount: stop lookup when directory has S_OPAQUE flag set Valerie Aurora
2009-10-21 19:19 ` [PATCH 26/41] union-mount: stop lookup when finding a whiteout Valerie Aurora
2009-10-21 19:19 ` [PATCH 27/41] union-mount: in-kernel file copy between union mounted filesystems Valerie Aurora
2009-10-21 19:19 ` [PATCH 28/41] union-mount: call do_whiteout() on unlink and rmdir Valerie Aurora
2009-10-21 19:19 ` [PATCH 29/41] union-mount: Always create topmost directory on open Valerie Aurora
2009-10-21 19:19 ` [PATCH 30/41] fallthru: Basic fallthru definitions Valerie Aurora
2009-10-21 19:19 ` [PATCH 31/41] fallthru: Support for fallthru entries in union mount lookup Valerie Aurora
2009-10-21 19:19 ` [PATCH 32/41] fallthru: ext2 fallthru support Valerie Aurora
2009-10-21 19:19 ` [PATCH 33/41] fallthru: jffs2 " Valerie Aurora
2009-10-21 19:19 ` [PATCH 34/41] fallthru: tmpfs " Valerie Aurora
2009-10-21 19:19 ` [PATCH 35/41] union-mount: Copy up directory entries on first readdir() Valerie Aurora
2009-10-21 19:19 ` [PATCH 36/41] union-mount: Increment read-only users count for read-only layer Valerie Aurora
2009-10-21 19:19 ` [PATCH 37/41] union-mount: Check read-only/read-write status of layers Valerie Aurora
2009-10-21 19:19 ` [PATCH 38/41] union-mount: Make pivot_root work with union mounts Valerie Aurora
2009-10-21 19:19 ` [PATCH 39/41] union-mount: Ignore read-only file system in permission checks Valerie Aurora
2009-10-21 19:19 ` [PATCH 40/41] union-mount: Make truncate work in all its glorious UNIX variations Valerie Aurora
2009-10-21 19:19 ` [PATCH 41/41] union-mount: Add support for rename by __union_copyup() Valerie Aurora
2009-12-01 4:57 ` Erez Zadok
2009-12-01 4:50 ` [PATCH 40/41] union-mount: Make truncate work in all its glorious UNIX variations Erez Zadok
2009-12-01 4:34 ` [PATCH 39/41] union-mount: Ignore read-only file system in permission checks Erez Zadok
2009-12-01 4:26 ` [PATCH 38/41] union-mount: Make pivot_root work with union mounts Erez Zadok
2009-12-01 4:18 ` [PATCH 35/41] union-mount: Copy up directory entries on first readdir() Erez Zadok
2009-12-01 4:17 ` [PATCH 34/41] fallthru: tmpfs fallthru support Erez Zadok
2009-12-01 4:17 ` [PATCH 33/41] fallthru: jffs2 " Erez Zadok
2009-12-01 4:17 ` [PATCH 32/41] fallthru: ext2 " Erez Zadok
2009-12-01 4:15 ` [PATCH 31/41] fallthru: Support for fallthru entries in union mount lookup Erez Zadok
2009-12-01 4:14 ` [PATCH 30/41] fallthru: Basic fallthru definitions Erez Zadok
2009-12-01 4:14 ` [PATCH 29/41] union-mount: Always create topmost directory on open Erez Zadok
2009-12-01 4:13 ` [PATCH 27/41] union-mount: in-kernel file copy between union mounted filesystems Erez Zadok
2009-12-01 4:11 ` [PATCH 26/41] union-mount: stop lookup when finding a whiteout Erez Zadok
2009-12-01 4:10 ` [PATCH 25/41] union-mount: stop lookup when directory has S_OPAQUE flag set Erez Zadok
2009-12-01 4:10 ` [PATCH 24/41] union-mount: Make lookup work for union-mounted file systems Erez Zadok
2009-11-30 9:15 ` [PATCH 23/41] union-mount: Changes to the namespace handling Erez Zadok
2009-11-30 9:04 ` [PATCH 22/41] union-mount: Some checks during namespace changes Erez Zadok
2009-11-30 8:57 ` [PATCH 21/41] union-mount: Drive the union cache via dcache Erez Zadok
2009-11-30 8:46 ` [PATCH 20/41] union-mount: Introduce union_mount structure Erez Zadok
2010-01-26 22:38 ` Valerie Aurora
2009-11-30 8:02 ` [PATCH 19/41] union-mount: Introduce MNT_UNION and MS_UNION flags Erez Zadok
2010-01-26 20:03 ` Valerie Aurora
2009-12-01 5:37 ` [PATCH 18/41] union-mount: Documentation Erez Zadok
2009-11-30 7:57 ` [PATCH 17/41] whiteout: Add path_whiteout() helper Erez Zadok
2010-01-26 20:02 ` Valerie Aurora
2009-10-21 22:50 ` David Woodhouse [this message]
2009-10-27 2:21 ` [PATCH 16/41] whiteout: jffs2 whiteout support Valerie Aurora
2009-11-30 7:51 ` Erez Zadok
2010-01-26 19:52 ` Valerie Aurora
2009-10-21 21:17 ` [PATCH 15/41] whiteout: ext2 " Andreas Dilger
2009-10-27 2:14 ` Valerie Aurora
2009-11-30 7:45 ` Erez Zadok
2009-11-30 6:32 ` [PATCH 14/41] whiteout: Split of ext2_append_link() from ext2_add_link() Erez Zadok
2009-11-30 6:26 ` [PATCH 13/41] whiteout: tmpfs whiteout support Erez Zadok
2010-01-21 2:02 ` Valerie Aurora
2009-11-30 6:13 ` [PATCH 12/41] union-mount: Allow removal of a directory Erez Zadok
2010-01-21 0:52 ` Valerie Aurora
2009-10-27 14:36 ` [PATCH 10/41] whiteout: Add vfs_whiteout() and whiteout inode operation Eric Paris
2009-10-27 21:22 ` Valerie Aurora
2009-11-30 3:04 ` Erez Zadok
2010-01-21 0:35 ` Valerie Aurora
2009-11-30 2:53 ` [PATCH 09/41] whiteout: Don't return information about whiteouts to userspace Erez Zadok
2010-01-21 0:19 ` Valerie Aurora
2009-11-30 2:44 ` [PATCH 08/41] Don't replace nameidata path when following links Erez Zadok
2009-11-30 2:33 ` [PATCH 07/41] VFS: Add read-only users count to superblock Erez Zadok
2009-11-30 2:28 ` [PATCH 06/41] VFS: Introduce dput() variant that maintains a kill-list Erez Zadok
2010-01-20 23:31 ` Valerie Aurora
2009-11-30 2:11 ` [PATCH 05/41] VFS: Make real_lookup() return a struct path Erez Zadok
2009-11-30 2:07 ` [PATCH 04/41] VFS: Remove unnecessary micro-optimization in cached_lookup() Erez Zadok
2009-12-10 21:25 ` Valerie Aurora
2009-11-30 2:02 ` [PATCH 03/41] VFS: Make lookup_hash() return a struct path Erez Zadok
2009-12-10 21:23 ` Valerie Aurora
2009-11-30 6:04 ` Erez Zadok
2009-12-10 21:24 ` Valerie Aurora
2009-11-30 1:43 ` [PATCH 01/41] VFS: BUG() if somebody tries to rehash an already hashed dentry Erez Zadok
2009-12-10 20:20 ` Valerie Aurora
2009-10-22 2:44 ` [RFC PATCH 00/40] Writable overlays (union mounts) hooanon05
2009-10-27 2:23 ` Valerie Aurora
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=1256165449.22999.19.camel@macbook.infradead.org \
--to=dwmw2@infradead.org \
--cc=apw@canonical.com \
--cc=arnd@arndb.de \
--cc=baggins@sith.mimuw.edu.pl \
--cc=dronnikov@gmail.com \
--cc=hch@infradead.org \
--cc=hooanon05@yahoo.co.jp \
--cc=jblunck@suse.de \
--cc=linux-fsdevel@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mtd@lists.infradead.org \
--cc=nbd@openwrt.org \
--cc=sandupopamarius@gmail.com \
--cc=scott@canonical.com \
--cc=vaurora@redhat.com \
--cc=viro@zeniv.linux.org.uk \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).