Re: [1/4] dst: Distributed storage documentation.

2007-12-02 Thread Matt Mackall
On Thu, Nov 29, 2007 at 03:53:23PM +0300, Evgeniy Polyakov wrote:
 
 Distributed storage documentation.
 
 Algorithms used in the system, userspace interfaces
 (sysfs dirs and files), design and implementation details
 are described here.

Can you give us a summary of how this differs from using device mapper
with NBD?

-- 
Mathematics is the supreme nostalgia of our time.
-
To unsubscribe from this list: send the line unsubscribe linux-fsdevel in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[rfc][patch 2/2] inotify: remove debug code

2007-12-02 Thread Nick Piggin

The inotify debugging code is supposed to verify that the
DCACHE_INOTIFY_PARENT_WATCHED scalability optimisation does not result in
notifications getting lost nor extra needless locking generated.

Unfortunately there are also some races in the debugging code. And it isn't
very good at finding problems anyway. So remove it for now.

Signed-off-by: Nick Piggin [EMAIL PROTECTED]
---
Index: linux-2.6/fs/dcache.c
===
--- linux-2.6.orig/fs/dcache.c
+++ linux-2.6/fs/dcache.c
@@ -1408,9 +1408,6 @@ void d_delete(struct dentry * dentry)
if (atomic_read(dentry-d_count) == 1) {
dentry_iput(dentry);
fsnotify_nameremove(dentry, isdir);
-
-   /* remove this and other inotify debug checks after 2.6.18 */
-   dentry-d_flags = ~DCACHE_INOTIFY_PARENT_WATCHED;
return;
}
 
Index: linux-2.6/fs/inotify.c
===
--- linux-2.6.orig/fs/inotify.c
+++ linux-2.6/fs/inotify.c
@@ -168,20 +168,14 @@ static void set_dentry_child_flags(struc
struct dentry *child;
 
list_for_each_entry(child, alias-d_subdirs, d_u.d_child) {
-   if (!child-d_inode) {
-   WARN_ON(child-d_flags  
DCACHE_INOTIFY_PARENT_WATCHED);
+   if (!child-d_inode)
continue;
-   }
+
spin_lock(child-d_lock);
-   if (watched) {
-   WARN_ON(child-d_flags 
-   DCACHE_INOTIFY_PARENT_WATCHED);
+   if (watched)
child-d_flags |= DCACHE_INOTIFY_PARENT_WATCHED;
-   } else {
-   WARN_ON(!(child-d_flags 
-   DCACHE_INOTIFY_PARENT_WATCHED));
-   child-d_flags=~DCACHE_INOTIFY_PARENT_WATCHED;
-   }
+   else
+   child-d_flags =~DCACHE_INOTIFY_PARENT_WATCHED;
spin_unlock(child-d_lock);
}
}
@@ -253,7 +247,6 @@ void inotify_d_instantiate(struct dentry
if (!inode)
return;
 
-   WARN_ON(entry-d_flags  DCACHE_INOTIFY_PARENT_WATCHED);
spin_lock(entry-d_lock);
parent = entry-d_parent;
if (parent-d_inode  inotify_inode_watched(parent-d_inode))
-
To unsubscribe from this list: send the line unsubscribe linux-fsdevel in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[rfc][patch 1/2] inotify: fix race

2007-12-02 Thread Nick Piggin
Hmm, thinking I'd better just take a hammer to this inotify problem
despite the fact I cannot confirm the root cause of the warning messages.
Possibilities include the race being fixed here, and races in the
debug code itself.

--

There is a race between setting an inode's children's parent watched flag
when placing the first watch on a parent, and instantiating new children of
that parent: a child could miss having its flags set by set_dentry_child_flags,
but then inotify_d_instantiate might still see !inotify_inode_watched.

The solution is to set_dentry_child_flags after adding the watch. Locking is
taken care of, because both set_dentry_child_flags and inotify_d_instantiate
hold dcache_lock and child-d_locks.

Signed-off-by: Nick Piggin [EMAIL PROTECTED]
---
Index: linux-2.6/fs/inotify.c
===
--- linux-2.6.orig/fs/inotify.c
+++ linux-2.6/fs/inotify.c
@@ -627,6 +627,7 @@ s32 inotify_add_watch(struct inotify_han
  struct inode *inode, u32 mask)
 {
int ret = 0;
+   int newly_watched;
 
/* don't allow invalid bits: we don't want flags set */
mask = IN_ALL_EVENTS | IN_ONESHOT;
@@ -653,12 +654,18 @@ s32 inotify_add_watch(struct inotify_han
 */
watch-inode = igrab(inode);
 
-   if (!inotify_inode_watched(inode))
-   set_dentry_child_flags(inode, 1);
-
/* Add the watch to the handle's and the inode's list */
+   newly_watched = !inotify_inode_watched(inode);
list_add(watch-h_list, ih-watches);
list_add(watch-i_list, inode-inotify_watches);
+   /*
+* Set child flags _after_ adding the watch, so there is no race
+* windows where newly instantiated children could miss their parent's
+* watched flag.
+*/
+   if (newly_watched)
+   set_dentry_child_flags(inode, 1);
+
 out:
mutex_unlock(ih-mutex);
mutex_unlock(inode-inotify_mutex);
-
To unsubscribe from this list: send the line unsubscribe linux-fsdevel in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html