Re: dcache problems with vfat

Gordon Chaffee (chaffee@cs.berkeley.edu)
Wed, 6 Jan 1999 01:26:17 -0800 (PST)


Alexander Viro writes:
> All this aliases-related stuff looks ugly.

No kidding. In 2.0.x, the alias stuff was pretty easy. With the
dentry code in 2.1.x, it got much uglier, and it took me from about
2.1.70 to 2.1.115 to get all/most of the bugs worked out. Bill Hawes
and I spent quite a bit of time tracking down various inode/dentry
problems related to fat/vfat. Thankfully, Bill is a master of dentry
and inode problems and was able to make sense of things.

>Try
>
> $ mkdir a.long
> $ cd a~1.lon
> $ mkdir b
> $ cd b
> $ mv ../../a.long .
>
> ... and watch the fun.

Urghh. Yes, the checking if something is your parent is no longer using
inodes so it should also be checking aliases. Here is an untested bit of
code that tried to deal with this problem. It might not patch perfectly--
I created the patch of 2.1.131--but it should give the idea of what
I'm trying to do.

--- fs/vfat/namei.c~ Tue Dec 1 23:52:55 1998
+++ fs/vfat/namei.c Wed Jan 6 01:13:27 1999
@@ -1639,6 +1639,26 @@
return res;
}

+int vfat_equiv(struct dentry *dentry1, struct dentry *dentry2)
+{
+ struct list_head *head, *tmp;
+ struct dentry *alias;
+
+ if (dentry1 == dentry2) return 1;
+
+ head = &dentry1->d_inode->i_dentry;
+ if (dentry1->d_inode) {
+ tmp = dentry1->d_inode->i_dentry.next;
+ while (tmp != head) {
+ alias = list_entry(tmp, struct dentry, d_alias);
+ if (alias == dentry2)
+ return 1;
+ next = tmp->next;
+ }
+ }
+ return 0;
+}
+
int vfat_rename(struct inode *old_dir,struct dentry *old_dentry,
struct inode *new_dir,struct dentry *new_dentry)
{
@@ -1690,7 +1710,7 @@
walk = new_dentry;
/* prevent moving directory below itself */
for (;;) {
- if (walk == old_dentry) return -EINVAL;
+ if (vfat_equiv(walk, old_dentry)) return -EINVAL;
if (walk == walk->d_parent) break;
walk = walk->d_parent;
}

> Gordon, do we *really* need to be able to open something by short
> name? They introduce quite a lot of mess. BTW, example above "worked" the
> same way before changes in 131.

Yes, we really do need to be able to access by short names. Things like
Wine depend on them. I have a test suite that can be found at
http://bmrc.berkeley.edu/people/chaffee/vfat.html

It runs some alias tests like the above. I just added the above test
to my own copy of the suite (not the one of the web site).

- Gordon

-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.rutgers.edu
Please read the FAQ at http://www.tux.org/lkml/