Index: linux-2.6.9-67.0.20/include/linux/ext3_fs.h =================================================================== --- linux-2.6.9-67.0.20.orig/include/linux/ext3_fs.h +++ linux-2.6.9-67.0.20/include/linux/ext3_fs.h @@ -873,6 +873,13 @@ struct mmp_struct { #define EXT3_MMP_MIN_CHECK_INTERVAL 5 /* + * 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.9-67.0.20/fs/ext3/xattr.c =================================================================== --- linux-2.6.9-67.0.20.orig/fs/ext3/xattr.c +++ linux-2.6.9-67.0.20/fs/ext3/xattr.c @@ -91,7 +91,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(handle_t *, struct inode *, @@ -1215,12 +1215,12 @@ skip_replace: /* This block is now empty. */ if (bh && header == HDR(bh)) unlock_buffer(bh); /* we were modifying in-place. */ - error = ext3_xattr_set_handle2(handle, inode, bh, NULL); + error = ext3_xattr_set_handle2(handle, inode, bh, NULL, flags); } else { ext3_xattr_rehash(header, here); if (bh && header == HDR(bh)) unlock_buffer(bh); /* we were modifying in-place. */ - error = ext3_xattr_set_handle2(handle, inode, bh, header); + error = ext3_xattr_set_handle2(handle, inode, bh, header, flags); } cleanup: @@ -1237,7 +1237,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; @@ -1311,7 +1311,8 @@ getblk_failed: /* Update the inode. */ EXT3_I(inode)->i_file_acl = new_bh ? new_bh->b_blocknr : 0; - inode->i_ctime = ext3_current_time(inode); + if (!(flags & XATTR_NO_CTIME)) + inode->i_ctime = ext3_current_time(inode); ext3_mark_inode_dirty(handle, inode); if (IS_SYNC(inode)) handle->h_sync = 1;