mirror of
				https://git.proxmox.com/git/mirror_zfs.git
				synced 2025-10-26 18:05:04 +03:00 
			
		
		
		
	Modifying XATTRs doesnt change the ctime
Changing any metadata, should modify the ctime. Reviewed-by: Chunwei Chen <tuxoko@gmail.com> Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Signed-off-by: gaurkuma <gauravk.18@gmail.com> Closes #3644 Closes #6586
This commit is contained in:
		
							parent
							
								
									a2a0440918
								
							
						
					
					
						commit
						d3e7d981d4
					
				@ -248,8 +248,17 @@ zfs_sa_set_xattr(znode_t *zp)
 | 
			
		||||
	if (error) {
 | 
			
		||||
		dmu_tx_abort(tx);
 | 
			
		||||
	} else {
 | 
			
		||||
		VERIFY0(sa_update(zp->z_sa_hdl, SA_ZPL_DXATTR(zfsvfs),
 | 
			
		||||
		    obj, size, tx));
 | 
			
		||||
		int count = 0;
 | 
			
		||||
		sa_bulk_attr_t bulk[2];
 | 
			
		||||
		uint64_t ctime[2];
 | 
			
		||||
 | 
			
		||||
		zfs_tstamp_update_setup(zp, STATE_CHANGED, NULL, ctime);
 | 
			
		||||
		SA_ADD_BULK_ATTR(bulk, count, SA_ZPL_DXATTR(zfsvfs),
 | 
			
		||||
		    NULL, obj, size);
 | 
			
		||||
		SA_ADD_BULK_ATTR(bulk, count, SA_ZPL_CTIME(zfsvfs),
 | 
			
		||||
		    NULL, &ctime, 16);
 | 
			
		||||
		VERIFY0(sa_bulk_update(zp->z_sa_hdl, bulk, count, tx));
 | 
			
		||||
 | 
			
		||||
		dmu_tx_commit(tx);
 | 
			
		||||
	}
 | 
			
		||||
out_free:
 | 
			
		||||
 | 
			
		||||
@ -495,6 +495,12 @@ zpl_xattr_set_dir(struct inode *ip, const char *name, const void *value,
 | 
			
		||||
		error = wrote;
 | 
			
		||||
 | 
			
		||||
out:
 | 
			
		||||
 | 
			
		||||
	if (error == 0) {
 | 
			
		||||
		ip->i_ctime = current_time(ip);
 | 
			
		||||
		zfs_mark_inode_dirty(ip);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (vap)
 | 
			
		||||
		kmem_free(vap, sizeof (vattr_t));
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -3,10 +3,11 @@ include $(top_srcdir)/config/Rules.am
 | 
			
		||||
pkgdatadir = $(datadir)/@PACKAGE@/zfs-tests/tests/functional/ctime
 | 
			
		||||
 | 
			
		||||
dist_pkgdata_SCRIPTS = \
 | 
			
		||||
	ctime_001_pos.ksh \
 | 
			
		||||
	cleanup.ksh \
 | 
			
		||||
	setup.ksh
 | 
			
		||||
 | 
			
		||||
pkgexecdir = $(datadir)/@PACKAGE@/zfs-tests/tests/functional/ctime
 | 
			
		||||
 | 
			
		||||
pkgexec_PROGRAMS = ctime_001_pos
 | 
			
		||||
ctime_001_pos_SOURCES = ctime_001_pos.c
 | 
			
		||||
pkgexec_PROGRAMS = ctime
 | 
			
		||||
ctime_SOURCES = ctime.c
 | 
			
		||||
 | 
			
		||||
@ -31,6 +31,7 @@
 | 
			
		||||
 | 
			
		||||
#include <sys/types.h>
 | 
			
		||||
#include <sys/stat.h>
 | 
			
		||||
#include <sys/xattr.h>
 | 
			
		||||
#include <utime.h>
 | 
			
		||||
#include <stdio.h>
 | 
			
		||||
#include <stdlib.h>
 | 
			
		||||
@ -250,6 +251,24 @@ do_chown(const char *pfile)
 | 
			
		||||
	return (ret);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int
 | 
			
		||||
do_xattr(const char *pfile)
 | 
			
		||||
{
 | 
			
		||||
	int ret = 0;
 | 
			
		||||
	char *value = "user.value";
 | 
			
		||||
 | 
			
		||||
	if (pfile == NULL) {
 | 
			
		||||
		return (-1);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (setxattr(pfile, "user.x", value, strlen(value), 0) == -1) {
 | 
			
		||||
		(void) fprintf(stderr, "setxattr(%s, %d, %d) failed with errno "
 | 
			
		||||
		    "%d\n", pfile, (int)getuid(), (int)getgid(), errno);
 | 
			
		||||
		return (1);
 | 
			
		||||
	}
 | 
			
		||||
	return (ret);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
cleanup(void)
 | 
			
		||||
{
 | 
			
		||||
@ -270,6 +289,7 @@ static timetest_t timetest_table[] = {
 | 
			
		||||
	{ ST_CTIME,	"st_ctime",	do_chown 	},
 | 
			
		||||
	{ ST_CTIME,	"st_ctime",	do_link		},
 | 
			
		||||
	{ ST_CTIME,	"st_ctime",	do_utime	},
 | 
			
		||||
	{ ST_CTIME,	"st_ctime",	do_xattr	},
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#define	NCOMMAND (sizeof (timetest_table) / sizeof (timetest_table[0]))
 | 
			
		||||
@ -281,7 +301,6 @@ main(int argc, char *argv[])
 | 
			
		||||
	int i, ret, fd;
 | 
			
		||||
	char *penv[] = {"TESTDIR", "TESTFILE0"};
 | 
			
		||||
 | 
			
		||||
	(void) fprintf(stdout, "Verify [acm]time is modified appropriately.\n");
 | 
			
		||||
	(void) atexit(cleanup);
 | 
			
		||||
 | 
			
		||||
	/*
 | 
			
		||||
@ -347,6 +366,5 @@ main(int argc, char *argv[])
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	(void) fprintf(stdout, "PASS\n");
 | 
			
		||||
	return (0);
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										44
									
								
								tests/zfs-tests/tests/functional/ctime/ctime_001_pos.ksh
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										44
									
								
								tests/zfs-tests/tests/functional/ctime/ctime_001_pos.ksh
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,44 @@
 | 
			
		||||
#!/bin/ksh -p
 | 
			
		||||
#
 | 
			
		||||
# CDDL HEADER START
 | 
			
		||||
#
 | 
			
		||||
# The contents of this file are subject to the terms of the
 | 
			
		||||
# Common Development and Distribution License (the "License").
 | 
			
		||||
# You may not use this file except in compliance with the License.
 | 
			
		||||
#
 | 
			
		||||
# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
 | 
			
		||||
# or http://www.opensolaris.org/os/licensing.
 | 
			
		||||
# See the License for the specific language governing permissions
 | 
			
		||||
# and limitations under the License.
 | 
			
		||||
#
 | 
			
		||||
# When distributing Covered Code, include this CDDL HEADER in each
 | 
			
		||||
# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
 | 
			
		||||
# If applicable, add the following below this CDDL HEADER, with the
 | 
			
		||||
# fields enclosed by brackets "[]" replaced with your own identifying
 | 
			
		||||
# information: Portions Copyright [yyyy] [name of copyright owner]
 | 
			
		||||
#
 | 
			
		||||
# CDDL HEADER END
 | 
			
		||||
#
 | 
			
		||||
# Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
 | 
			
		||||
# Use is subject to license terms.
 | 
			
		||||
#
 | 
			
		||||
 | 
			
		||||
. $STF_SUITE/include/libtest.shlib
 | 
			
		||||
# . $STF_SUITE/tests/functional/xattr/xattr_common.kshlib
 | 
			
		||||
 | 
			
		||||
#
 | 
			
		||||
# DESCRIPTION:
 | 
			
		||||
#
 | 
			
		||||
# Verify [acm]time is modified appropriately with xattr=on|sa
 | 
			
		||||
 | 
			
		||||
set -A args "sa" "on"
 | 
			
		||||
 | 
			
		||||
log_note "Verify [acm]time is modified appropriately."
 | 
			
		||||
 | 
			
		||||
for arg in ${args[*]}; do
 | 
			
		||||
	log_note "Testing with xattr set to $arg"
 | 
			
		||||
	log_must zfs set xattr=$arg $TESTPOOL
 | 
			
		||||
	log_must $STF_SUITE/tests/functional/ctime/ctime
 | 
			
		||||
done
 | 
			
		||||
 | 
			
		||||
log_pass "PASS"
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user