--- /dev/null
+Index: linux-2.6.5-7.311/include/linux/ext3_fs.h
+===================================================================
+--- linux-2.6.5-7.311.orig/include/linux/ext3_fs.h
++++ linux-2.6.5-7.311/include/linux/ext3_fs.h
+@@ -752,6 +752,13 @@ struct dir_private_info {
+ #define ERR_BAD_DX_DIR -75000
+
+ /*
++ * Indicates that ctime should not be updated in ext3_xattr_set_handle()
++ */
++#ifndef XATTR_NO_CTIME
++#define XATTR_NO_CTIME 0x80
++#endif
++
++/*
+ * Function prototypes
+ */
+
+Index: linux-2.6.5-7.311/fs/ext3/xattr.c
+===================================================================
+--- linux-2.6.5-7.311.orig/fs/ext3/xattr.c
++++ linux-2.6.5-7.311/fs/ext3/xattr.c
+@@ -89,7 +89,7 @@
+
+ static int ext3_xattr_set_handle2(handle_t *, struct inode *,
+ struct buffer_head *,
+- struct ext3_xattr_header *);
++ struct ext3_xattr_header *, int);
+
+ static int ext3_xattr_cache_insert(struct buffer_head *);
+ static struct buffer_head *ext3_xattr_cache_find(struct inode *,
+@@ -1302,7 +1302,7 @@ skip_replace:
+ }
+ error = ext3_xattr_set_handle2(handle, inode, bh,
+ IS_LAST_ENTRY(ENTRY(header+1)) ?
+- NULL : header);
++ NULL : header, flags);
+
+ cleanup:
+ brelse(bh);
+@@ -1318,7 +1318,7 @@ cleanup:
+ static int
+ ext3_xattr_set_handle2(handle_t *handle, struct inode *inode,
+ struct buffer_head *old_bh,
+- struct ext3_xattr_header *header)
++ struct ext3_xattr_header *header, int flags)
+ {
+ struct super_block *sb = inode->i_sb;
+ struct buffer_head *new_bh = NULL;
+@@ -1401,7 +1401,8 @@ getblk_failed:
+
+ /* Update the inode. */
+ EXT3_I(inode)->i_file_acl = new_bh ? new_bh->b_blocknr : 0;
+- inode->i_ctime = CURRENT_TIME;
++ if (!(flags & XATTR_NO_CTIME))
++ inode->i_ctime = CURRENT_TIME;
+ ext3_mark_inode_dirty(handle, inode);
+ if (IS_SYNC(inode))
+ handle->h_sync = 1;