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;