Whamcloud - gitweb
Branch b1_6
authorjohann <johann>
Mon, 19 Nov 2007 15:09:36 +0000 (15:09 +0000)
committerjohann <johann>
Mon, 19 Nov 2007 15:09:36 +0000 (15:09 +0000)
b=12266
i=green
i=adilger

Concurrent access to the same directory from multiple clients with
intensive file creation/removal can cause a client node to spin in
ll_readdir(). i_version must be increased every time the lock is
cancelled to ensure a revalidate is done.

lustre/ChangeLog
lustre/llite/file.c
lustre/llite/namei.c

index 6546c5b..3375cb0 100644 (file)
@@ -91,6 +91,16 @@ Details    : Change the structure of stats under obdfilter and mds to
             The "uuid"s file would list the uuids of _active_ exports. 
             And the clear entry is to clear all stats and stale nids.
 
+Severity   : normal
+Frequency  : rare
+Bugzilla   : 12266
+Description: Processes looping in ll_readdir() on Lustre clients finally causing
+            a full node pseudo-hang
+Details    : Concurrent access to the same directory from multiple clients with
+            intensive file creation/removal can cause a client node to spin in
+            ll_readdir(). i_version must be increased every time the lock is
+            cancelled to ensure a revalidate is done.
+
 --------------------------------------------------------------------------------
 
 2007-10-26         Cluster File Systems, Inc. <info@clusterfs.com>
index 595daad..e90f1c1 100644 (file)
@@ -2302,6 +2302,8 @@ loff_t ll_file_seek(struct file *file, loff_t offset, int origin)
 #if (LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0))
                         file->f_reada = 0;
                         file->f_version = ++event;
+#else
+                        file->f_version = 0;
 #endif
                 }
                 retval = offset;
index c47986b..905dfde 100644 (file)
@@ -249,6 +249,7 @@ int ll_mdc_blocking_ast(struct ldlm_lock *lock, struct ldlm_lock_desc *desc,
                                inode->i_ino);
                         truncate_inode_pages(inode->i_mapping, 0);
                         ll_drop_negative_dentry(inode);
+                        inode->i_version++; /* XXX: remove with inode version*/
                 }
 
                 if (inode->i_sb->s_root &&