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) {
|
if (error) {
|
||||||
dmu_tx_abort(tx);
|
dmu_tx_abort(tx);
|
||||||
} else {
|
} else {
|
||||||
VERIFY0(sa_update(zp->z_sa_hdl, SA_ZPL_DXATTR(zfsvfs),
|
int count = 0;
|
||||||
obj, size, tx));
|
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);
|
dmu_tx_commit(tx);
|
||||||
}
|
}
|
||||||
out_free:
|
out_free:
|
||||||
|
|
|
@ -495,6 +495,12 @@ zpl_xattr_set_dir(struct inode *ip, const char *name, const void *value,
|
||||||
error = wrote;
|
error = wrote;
|
||||||
|
|
||||||
out:
|
out:
|
||||||
|
|
||||||
|
if (error == 0) {
|
||||||
|
ip->i_ctime = current_time(ip);
|
||||||
|
zfs_mark_inode_dirty(ip);
|
||||||
|
}
|
||||||
|
|
||||||
if (vap)
|
if (vap)
|
||||||
kmem_free(vap, sizeof (vattr_t));
|
kmem_free(vap, sizeof (vattr_t));
|
||||||
|
|
||||||
|
|
|
@ -3,10 +3,11 @@ include $(top_srcdir)/config/Rules.am
|
||||||
pkgdatadir = $(datadir)/@PACKAGE@/zfs-tests/tests/functional/ctime
|
pkgdatadir = $(datadir)/@PACKAGE@/zfs-tests/tests/functional/ctime
|
||||||
|
|
||||||
dist_pkgdata_SCRIPTS = \
|
dist_pkgdata_SCRIPTS = \
|
||||||
|
ctime_001_pos.ksh \
|
||||||
cleanup.ksh \
|
cleanup.ksh \
|
||||||
setup.ksh
|
setup.ksh
|
||||||
|
|
||||||
pkgexecdir = $(datadir)/@PACKAGE@/zfs-tests/tests/functional/ctime
|
pkgexecdir = $(datadir)/@PACKAGE@/zfs-tests/tests/functional/ctime
|
||||||
|
|
||||||
pkgexec_PROGRAMS = ctime_001_pos
|
pkgexec_PROGRAMS = ctime
|
||||||
ctime_001_pos_SOURCES = ctime_001_pos.c
|
ctime_SOURCES = ctime.c
|
||||||
|
|
|
@ -31,6 +31,7 @@
|
||||||
|
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
|
#include <sys/xattr.h>
|
||||||
#include <utime.h>
|
#include <utime.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
@ -250,6 +251,24 @@ do_chown(const char *pfile)
|
||||||
return (ret);
|
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
|
static void
|
||||||
cleanup(void)
|
cleanup(void)
|
||||||
{
|
{
|
||||||
|
@ -270,6 +289,7 @@ static timetest_t timetest_table[] = {
|
||||||
{ ST_CTIME, "st_ctime", do_chown },
|
{ ST_CTIME, "st_ctime", do_chown },
|
||||||
{ ST_CTIME, "st_ctime", do_link },
|
{ ST_CTIME, "st_ctime", do_link },
|
||||||
{ ST_CTIME, "st_ctime", do_utime },
|
{ ST_CTIME, "st_ctime", do_utime },
|
||||||
|
{ ST_CTIME, "st_ctime", do_xattr },
|
||||||
};
|
};
|
||||||
|
|
||||||
#define NCOMMAND (sizeof (timetest_table) / sizeof (timetest_table[0]))
|
#define NCOMMAND (sizeof (timetest_table) / sizeof (timetest_table[0]))
|
||||||
|
@ -281,7 +301,6 @@ main(int argc, char *argv[])
|
||||||
int i, ret, fd;
|
int i, ret, fd;
|
||||||
char *penv[] = {"TESTDIR", "TESTFILE0"};
|
char *penv[] = {"TESTDIR", "TESTFILE0"};
|
||||||
|
|
||||||
(void) fprintf(stdout, "Verify [acm]time is modified appropriately.\n");
|
|
||||||
(void) atexit(cleanup);
|
(void) atexit(cleanup);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -347,6 +366,5 @@ main(int argc, char *argv[])
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
(void) fprintf(stdout, "PASS\n");
|
|
||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
|
@ -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