diff -rup linux-2.6.8/fs/reiserfs/xattr.c linux-2.6.8.fix/fs/reiserfs/xattr.c --- linux-2.6.8/fs/reiserfs/xattr.c 2004-08-14 01:38:08.000000000 -0400 +++ linux-2.6.8.fix/fs/reiserfs/xattr.c 2004-09-16 00:22:19.000000000 -0400 @@ -588,12 +588,18 @@ if (err || buffer_size == 0 || !buffer) break; } - inode->i_ctime = CURRENT_TIME; - mark_inode_dirty (inode); + /* We can't mark the inode dirty if it's not hashed. This is the case + * when we're inheriting the default ACL. If we dirty it, the inode + * gets marked dirty, but won't (ever) make it onto the dirty list until + * it's synced explicitly to clear I_DIRTY. This is bad. */ + if (!hlist_unhashed(&inode->i_hash)) { + inode->i_ctime = CURRENT_TIME; + mark_inode_dirty (inode); + } out_filp: up (&xinode->i_sem); fput(fp); out: