Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions include/os/linux/zfs/sys/trace_acl.h
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ DECLARE_EVENT_CLASS(zfs_ace_class,
__field(uint8_t, z_atime_dirty)
__field(uint8_t, z_zn_prefetch)
__field(uint_t, z_blksz)
__field(uint_t, z_seq)
__field(uint64_t, z_seq)
__field(uint64_t, z_mapcnt)
__field(uint64_t, z_size)
__field(uint64_t, z_pflags)
Expand Down Expand Up @@ -111,7 +111,7 @@ DECLARE_EVENT_CLASS(zfs_ace_class,
__entry->mask_matched = mask_matched;
),
TP_printk("zn { id %llu unlinked %u atime_dirty %u "
"zn_prefetch %u blksz %u seq %u "
"zn_prefetch %u blksz %u seq %llu "
"mapcnt %llu size %llu pflags %llu "
"sync_cnt %u "
"mode 0x%x is_sa %d is_ctldir %d "
Expand Down
1 change: 1 addition & 0 deletions include/sys/zfs_sa.h
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,7 @@ typedef enum zpl_attr {
ZPL_DACL_ACES,
ZPL_DXATTR,
ZPL_PROJID,
ZPL_SEQ,
ZPL_END
} zpl_attr_t;

Expand Down
27 changes: 26 additions & 1 deletion include/sys/zfs_znode.h
Original file line number Diff line number Diff line change
Expand Up @@ -112,6 +112,30 @@ extern "C" {
#define SA_ZPL_DXATTR(z) z->z_attr_table[ZPL_DXATTR]
#define SA_ZPL_PAD(z) z->z_attr_table[ZPL_PAD]
#define SA_ZPL_PROJID(z) z->z_attr_table[ZPL_PROJID]
#define SA_ZPL_SEQ(z) z->z_attr_table[ZPL_SEQ]

/*
* may_grow for a dmu_tx_hold_sa() that may persist z_seq: the SA layout
* grows the first time SA_ZPL_SEQ is added, so grow until z_has_seq is
* set. z_has_seq is an in-core only marker (see znode_t) and is never
* persisted, so no global pflag bit is consumed.
*/
#define ZFS_SEQ_MAY_GROW(zp) \
((zp)->z_has_seq ? B_FALSE : B_TRUE)

/*
* Persist zp->z_seq: mark z_has_seq and add SA_ZPL_SEQ to the caller's
* bulk. No-op for legacy (non-SA-native) znodes. Chunked writers add
* SA_ZPL_SEQ once before their loop and set z_has_seq per chunk instead.
*/
#define ZFS_PERSIST_SEQ(zp, bulk, count) \
{ \
if ((zp)->z_is_sa) { \
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't feel strongly about it, but my feeling is this would probably be more readable without the macro. I also wonder if the if ((zp)->z_is_sa) check is really needed. While I didn't audit every call site in general it looks like it would be straight forward to add this only to the SA code paths.

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Without the guard, sa_bulk_update panics on non-SA znodes. SA_ZPL_PROJID has the same constraint but is gated via if (projid != ZFS_INVALID_PROJID). z_seq is always set, so we check z_is_sa directly.

(zp)->z_has_seq = B_TRUE; \
SA_ADD_BULK_ATTR((bulk), (count), SA_ZPL_SEQ(ZTOZSB(zp)), \
NULL, &(zp)->z_seq, 8); \
} \
}

/*
* Is ID ephemeral?
Expand Down Expand Up @@ -194,8 +218,9 @@ typedef struct znode {
boolean_t z_is_sa; /* are we native sa? */
boolean_t z_is_ctldir; /* are we .zfs entry */
boolean_t z_suspended; /* extra ref from a suspend? */
boolean_t z_has_seq; /* SA_ZPL_SEQ present (in-core only) */
uint_t z_blksz; /* block size in bytes */
uint_t z_seq; /* modification sequence number */
uint64_t z_seq; /* modification sequence number */
uint64_t z_mapcnt; /* number of pages mapped to file */
uint64_t z_dnodesize; /* dnode size */
uint64_t z_size; /* file size (cached) */
Expand Down
3 changes: 2 additions & 1 deletion module/os/freebsd/zfs/zfs_acl.c
Original file line number Diff line number Diff line change
Expand Up @@ -1170,7 +1170,7 @@ zfs_aclset_common(znode_t *zp, zfs_acl_t *aclp, cred_t *cr, dmu_tx_t *tx)
dmu_object_type_t otype;
zfs_acl_locator_cb_t locate = { 0 };
uint64_t mode;
sa_bulk_attr_t bulk[5];
sa_bulk_attr_t bulk[6];
uint64_t ctime[2];
int count = 0;
zfs_acl_phys_t acl_phys;
Expand Down Expand Up @@ -1316,6 +1316,7 @@ zfs_aclset_common(znode_t *zp, zfs_acl_t *aclp, cred_t *cr, dmu_tx_t *tx)
zp->z_pflags |= ZFS_ACL_TRIVIAL;

zfs_tstamp_update_setup(zp, STATE_CHANGED, NULL, ctime);
ZFS_PERSIST_SEQ(zp, bulk, count);
return (sa_bulk_update(zp->z_sa_hdl, bulk, count, tx));
}

Expand Down
12 changes: 8 additions & 4 deletions module/os/freebsd/zfs/zfs_dir.c
Original file line number Diff line number Diff line change
Expand Up @@ -394,9 +394,9 @@ zfs_purgedir(znode_t *dzp)
(ZTOV(xzp)->v_type == VLNK));

tx = dmu_tx_create(zfsvfs->z_os);
dmu_tx_hold_sa(tx, dzp->z_sa_hdl, B_FALSE);
dmu_tx_hold_sa(tx, dzp->z_sa_hdl, ZFS_SEQ_MAY_GROW(dzp));
dmu_tx_hold_zap(tx, dzp->z_id, FALSE, zap->za_name);
dmu_tx_hold_sa(tx, xzp->z_sa_hdl, B_FALSE);
dmu_tx_hold_sa(tx, xzp->z_sa_hdl, ZFS_SEQ_MAY_GROW(xzp));
dmu_tx_hold_zap(tx, zfsvfs->z_unlinkedobj, FALSE, NULL);
/* Is this really needed ? */
zfs_sa_upgrade_txholds(tx, xzp);
Expand Down Expand Up @@ -584,7 +584,7 @@ zfs_link_create(znode_t *dzp, const char *name, znode_t *zp, dmu_tx_t *tx,
vnode_t *vp = ZTOV(zp);
uint64_t value;
int zp_is_dir = (vp->v_type == VDIR);
sa_bulk_attr_t bulk[5];
sa_bulk_attr_t bulk[6];
uint64_t mtime[2], ctime[2];
int count = 0;
int error;
Expand Down Expand Up @@ -647,6 +647,7 @@ zfs_link_create(znode_t *dzp, const char *name, znode_t *zp, dmu_tx_t *tx,
ctime, sizeof (ctime));
zfs_tstamp_update_setup(zp, STATE_CHANGED, mtime,
ctime);
ZFS_PERSIST_SEQ(zp, bulk, count);
}
error = sa_bulk_update(zp->z_sa_hdl, bulk, count, tx);
ASSERT0(error);
Expand All @@ -665,6 +666,7 @@ zfs_link_create(znode_t *dzp, const char *name, znode_t *zp, dmu_tx_t *tx,
SA_ADD_BULK_ATTR(bulk, count, SA_ZPL_FLAGS(zfsvfs), NULL,
&dzp->z_pflags, sizeof (dzp->z_pflags));
zfs_tstamp_update_setup(dzp, CONTENT_MODIFIED, mtime, ctime);
ZFS_PERSIST_SEQ(dzp, bulk, count);
error = sa_bulk_update(dzp->z_sa_hdl, bulk, count, tx);
ASSERT0(error);
return (0);
Expand Down Expand Up @@ -729,7 +731,7 @@ zfs_link_destroy(znode_t *dzp, const char *name, znode_t *zp, dmu_tx_t *tx,
vnode_t *vp = ZTOV(zp);
int zp_is_dir = (vp->v_type == VDIR);
boolean_t unlinked = B_FALSE;
sa_bulk_attr_t bulk[5];
sa_bulk_attr_t bulk[6];
uint64_t mtime[2], ctime[2];
int count = 0;
int error;
Expand Down Expand Up @@ -771,6 +773,7 @@ zfs_link_destroy(znode_t *dzp, const char *name, znode_t *zp, dmu_tx_t *tx,
NULL, &zp->z_pflags, sizeof (zp->z_pflags));
zfs_tstamp_update_setup(zp, STATE_CHANGED, mtime,
ctime);
ZFS_PERSIST_SEQ(zp, bulk, count);
}
SA_ADD_BULK_ATTR(bulk, count, SA_ZPL_LINKS(zfsvfs),
NULL, &zp->z_links, sizeof (zp->z_links));
Expand All @@ -797,6 +800,7 @@ zfs_link_destroy(znode_t *dzp, const char *name, znode_t *zp, dmu_tx_t *tx,
SA_ADD_BULK_ATTR(bulk, count, SA_ZPL_FLAGS(zfsvfs),
NULL, &dzp->z_pflags, sizeof (dzp->z_pflags));
zfs_tstamp_update_setup(dzp, CONTENT_MODIFIED, mtime, ctime);
ZFS_PERSIST_SEQ(dzp, bulk, count);
error = sa_bulk_update(dzp->z_sa_hdl, bulk, count, tx);
ASSERT0(error);

Expand Down
34 changes: 21 additions & 13 deletions module/os/freebsd/zfs/zfs_vnops_os.c
Original file line number Diff line number Diff line change
Expand Up @@ -1138,7 +1138,7 @@ zfs_create(znode_t *dzp, const char *name, vattr_t *vap, int excl, int mode,
if (fuid_dirtied)
zfs_fuid_txhold(zfsvfs, tx);
dmu_tx_hold_zap(tx, dzp->z_id, TRUE, name);
dmu_tx_hold_sa(tx, dzp->z_sa_hdl, B_FALSE);
dmu_tx_hold_sa(tx, dzp->z_sa_hdl, ZFS_SEQ_MAY_GROW(dzp));
if (!zfsvfs->z_use_sa &&
acl_ids.z_aclp->z_acl_bytes > ZFS_ACE_SPACE) {
dmu_tx_hold_write(tx, DMU_NEW_OBJECT,
Expand Down Expand Up @@ -1269,7 +1269,8 @@ zfs_remove_(vnode_t *dvp, vnode_t *vp, const char *name, cred_t *cr)
*/
tx = dmu_tx_create(zfsvfs->z_os);
dmu_tx_hold_zap(tx, dzp->z_id, FALSE, name);
dmu_tx_hold_sa(tx, zp->z_sa_hdl, B_FALSE);
dmu_tx_hold_sa(tx, zp->z_sa_hdl, ZFS_SEQ_MAY_GROW(zp));
dmu_tx_hold_sa(tx, dzp->z_sa_hdl, ZFS_SEQ_MAY_GROW(dzp));
zfs_sa_upgrade_txholds(tx, zp);
zfs_sa_upgrade_txholds(tx, dzp);

Expand Down Expand Up @@ -1497,6 +1498,7 @@ zfs_mkdir(znode_t *dzp, const char *dirname, vattr_t *vap, znode_t **zpp,
tx = dmu_tx_create(zfsvfs->z_os);
dmu_tx_hold_zap(tx, dzp->z_id, TRUE, dirname);
dmu_tx_hold_zap(tx, DMU_NEW_OBJECT, FALSE, NULL);
dmu_tx_hold_sa(tx, dzp->z_sa_hdl, ZFS_SEQ_MAY_GROW(dzp));
fuid_dirtied = zfsvfs->z_fuid_dirty;
if (fuid_dirtied)
zfs_fuid_txhold(zfsvfs, tx);
Expand Down Expand Up @@ -1605,7 +1607,8 @@ zfs_rmdir_(vnode_t *dvp, vnode_t *vp, const char *name, cred_t *cr)

tx = dmu_tx_create(zfsvfs->z_os);
dmu_tx_hold_zap(tx, dzp->z_id, FALSE, name);
dmu_tx_hold_sa(tx, zp->z_sa_hdl, B_FALSE);
dmu_tx_hold_sa(tx, zp->z_sa_hdl, ZFS_SEQ_MAY_GROW(zp));
dmu_tx_hold_sa(tx, dzp->z_sa_hdl, ZFS_SEQ_MAY_GROW(dzp));
dmu_tx_hold_zap(tx, zfsvfs->z_unlinkedobj, FALSE, NULL);
zfs_sa_upgrade_txholds(tx, zp);
zfs_sa_upgrade_txholds(tx, dzp);
Expand Down Expand Up @@ -2318,7 +2321,7 @@ zfs_setattr(znode_t *zp, vattr_t *vap, int flags, cred_t *cr, zidmap_t *mnt_ns)
boolean_t skipaclchk = (flags & ATTR_NOACLCHECK) ? B_TRUE : B_FALSE;
boolean_t fuid_dirtied = B_FALSE;
boolean_t handle_eadir = B_FALSE;
sa_bulk_attr_t bulk[7], xattr_bulk[7];
sa_bulk_attr_t bulk[9], xattr_bulk[7];
int count = 0, xattr_count = 0;

if (mask == 0)
Expand Down Expand Up @@ -2758,7 +2761,8 @@ zfs_setattr(znode_t *zp, vattr_t *vap, int flags, cred_t *cr, zidmap_t *mnt_ns)
if (((mask & AT_XVATTR) &&
XVA_ISSET_REQ(xvap, XAT_AV_SCANSTAMP)) ||
(projid != ZFS_INVALID_PROJID &&
!(zp->z_pflags & ZFS_PROJID)))
!(zp->z_pflags & ZFS_PROJID)) ||
!zp->z_has_seq)
dmu_tx_hold_sa(tx, zp->z_sa_hdl, B_TRUE);
else
dmu_tx_hold_sa(tx, zp->z_sa_hdl, B_FALSE);
Expand Down Expand Up @@ -2921,6 +2925,8 @@ zfs_setattr(znode_t *zp, vattr_t *vap, int flags, cred_t *cr, zidmap_t *mnt_ns)
}
}

ZFS_PERSIST_SEQ(zp, bulk, count);

/*
* Do this after setting timestamps to prevent timestamp
* update from toggling bit
Expand Down Expand Up @@ -3464,16 +3470,16 @@ zfs_do_rename_impl(vnode_t *sdvp, vnode_t **svpp, struct componentname *scnp,
}

tx = dmu_tx_create(zfsvfs->z_os);
dmu_tx_hold_sa(tx, szp->z_sa_hdl, B_FALSE);
dmu_tx_hold_sa(tx, sdzp->z_sa_hdl, B_FALSE);
dmu_tx_hold_sa(tx, szp->z_sa_hdl, ZFS_SEQ_MAY_GROW(szp));
dmu_tx_hold_sa(tx, sdzp->z_sa_hdl, ZFS_SEQ_MAY_GROW(sdzp));
dmu_tx_hold_zap(tx, sdzp->z_id, FALSE, snm);
dmu_tx_hold_zap(tx, tdzp->z_id, TRUE, tnm);
if (sdzp != tdzp) {
dmu_tx_hold_sa(tx, tdzp->z_sa_hdl, B_FALSE);
dmu_tx_hold_sa(tx, tdzp->z_sa_hdl, ZFS_SEQ_MAY_GROW(tdzp));
zfs_sa_upgrade_txholds(tx, tdzp);
}
if (tzp) {
dmu_tx_hold_sa(tx, tzp->z_sa_hdl, B_FALSE);
dmu_tx_hold_sa(tx, tzp->z_sa_hdl, ZFS_SEQ_MAY_GROW(tzp));
zfs_sa_upgrade_txholds(tx, tzp);
}

Expand Down Expand Up @@ -3672,7 +3678,7 @@ zfs_symlink(znode_t *dzp, const char *name, vattr_t *vap,
dmu_tx_hold_zap(tx, dzp->z_id, TRUE, name);
dmu_tx_hold_sa_create(tx, acl_ids.z_aclp->z_acl_bytes +
ZFS_SA_BASE_ATTR_SIZE + len);
dmu_tx_hold_sa(tx, dzp->z_sa_hdl, B_FALSE);
dmu_tx_hold_sa(tx, dzp->z_sa_hdl, ZFS_SEQ_MAY_GROW(dzp));
if (!zfsvfs->z_use_sa && acl_ids.z_aclp->z_acl_bytes > ZFS_ACE_SPACE) {
dmu_tx_hold_write(tx, DMU_NEW_OBJECT, 0,
acl_ids.z_aclp->z_acl_bytes);
Expand Down Expand Up @@ -3894,7 +3900,8 @@ zfs_link(znode_t *tdzp, znode_t *szp, const char *name, cred_t *cr,
}

tx = dmu_tx_create(zfsvfs->z_os);
dmu_tx_hold_sa(tx, szp->z_sa_hdl, B_FALSE);
dmu_tx_hold_sa(tx, szp->z_sa_hdl, ZFS_SEQ_MAY_GROW(szp));
dmu_tx_hold_sa(tx, tdzp->z_sa_hdl, ZFS_SEQ_MAY_GROW(tdzp));
dmu_tx_hold_zap(tx, tdzp->z_id, TRUE, name);
zfs_sa_upgrade_txholds(tx, szp);
zfs_sa_upgrade_txholds(tx, tdzp);
Expand Down Expand Up @@ -4458,7 +4465,7 @@ zfs_putpages(struct vnode *vp, vm_page_t *ma, size_t len, int flags,
tx = dmu_tx_create(zfsvfs->z_os);
dmu_tx_hold_write(tx, zp->z_id, off, len);

dmu_tx_hold_sa(tx, zp->z_sa_hdl, B_FALSE);
dmu_tx_hold_sa(tx, zp->z_sa_hdl, ZFS_SEQ_MAY_GROW(zp));
zfs_sa_upgrade_txholds(tx, zp);
err = dmu_tx_assign(tx, DMU_TX_WAIT);
if (err != 0) {
Expand All @@ -4482,7 +4489,7 @@ zfs_putpages(struct vnode *vp, vm_page_t *ma, size_t len, int flags,

if (err == 0) {
uint64_t mtime[2], ctime[2];
sa_bulk_attr_t bulk[3];
sa_bulk_attr_t bulk[4];
int count = 0;

SA_ADD_BULK_ATTR(bulk, count, SA_ZPL_MTIME(zfsvfs), NULL,
Expand All @@ -4492,6 +4499,7 @@ zfs_putpages(struct vnode *vp, vm_page_t *ma, size_t len, int flags,
SA_ADD_BULK_ATTR(bulk, count, SA_ZPL_FLAGS(zfsvfs), NULL,
&zp->z_pflags, 8);
zfs_tstamp_update_setup(zp, CONTENT_MODIFIED, mtime, ctime);
ZFS_PERSIST_SEQ(zp, bulk, count);
err = sa_bulk_update(zp->z_sa_hdl, bulk, count, tx);
ASSERT0(err);

Expand Down
41 changes: 39 additions & 2 deletions module/os/freebsd/zfs/zfs_znode_os.c
Original file line number Diff line number Diff line change
Expand Up @@ -151,6 +151,7 @@ zfs_znode_cache_constructor(void *buf, void *arg, int kmflags)
zp->z_xattr_cached = NULL;
zp->z_xattr_parent = 0;
zp->z_vnode = NULL;
zp->z_has_seq = B_FALSE;

return (0);
}
Expand Down Expand Up @@ -490,6 +491,21 @@ zfs_znode_alloc(zfsvfs_t *zfsvfs, dmu_buf_t *db, int blksz,
return (NULL);
}

/*
* Restore z_seq from SA_ZPL_SEQ when present, marking the file migrated
* via the in-core z_has_seq (never persisted). Absence keeps the
* default z_seq; FreeBSD's va_filerev never folded ctime in, so no
* seed is needed across the upgrade.
*
* Note: after 'zfs rollback' this path restores the snapshot's
* SA_ZPL_SEQ; va_filerev advances again from there on the next modify.
*/
if (zp->z_is_sa && sa_lookup(zp->z_sa_hdl, SA_ZPL_SEQ(zfsvfs),
&zp->z_seq, sizeof (zp->z_seq)) == 0)
zp->z_has_seq = B_TRUE;
else
zp->z_has_seq = B_FALSE;

zp->z_projid = projid;
zp->z_mode = mode;

Expand Down Expand Up @@ -1187,6 +1203,26 @@ zfs_rezget(znode_t *zp)
}

zp->z_projid = projid;

/*
* Recompute the in-core z_has_seq marker from disk. rezget reloads a
* znode in place (rollback, recv); a stale TRUE marker must not survive
* or ZFS_SEQ_MAY_GROW() would skip the grow reservation while
* SA_ZPL_SEQ is gone on disk.
*
* Advance z_seq to signal that content may have changed
* (rollback, recv). After recv the on-disk SA_ZPL_SEQ may be the
* sender's higher value, so take MAX(in-core, on-disk) + 1 to
* stay above anything an NFS client could have observed via the
* cold-load path, preserving change-cookie monotonicity. The new
* value persists on the next modify.
*/
uint64_t tmp_seq = 0;
zp->z_has_seq = (zp->z_is_sa &&
sa_lookup(zp->z_sa_hdl, SA_ZPL_SEQ(zfsvfs),
&tmp_seq, sizeof (tmp_seq)) == 0);
zp->z_seq = MAX(zp->z_seq, tmp_seq) + 1;
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Many/most of dnodes on the dataset may not have the znodes allocated, so they won't get the bump. With all good intention, I am not sure this is not consistent/predictable enough. Same is on Linux.


zp->z_mode = mode;

if (gen != zp->z_gen) {
Expand Down Expand Up @@ -1668,7 +1704,7 @@ zfs_freesp(znode_t *zp, uint64_t off, uint64_t len, int flag, boolean_t log)
zilog_t *zilog = zfsvfs->z_log;
uint64_t mode;
uint64_t mtime[2], ctime[2];
sa_bulk_attr_t bulk[3];
sa_bulk_attr_t bulk[4];
int count = 0;
int error;

Expand All @@ -1695,7 +1731,7 @@ zfs_freesp(znode_t *zp, uint64_t off, uint64_t len, int flag, boolean_t log)
return (error);
log:
tx = dmu_tx_create(zfsvfs->z_os);
dmu_tx_hold_sa(tx, zp->z_sa_hdl, B_FALSE);
dmu_tx_hold_sa(tx, zp->z_sa_hdl, ZFS_SEQ_MAY_GROW(zp));
zfs_sa_upgrade_txholds(tx, zp);
error = dmu_tx_assign(tx, DMU_TX_WAIT);
if (error) {
Expand All @@ -1708,6 +1744,7 @@ zfs_freesp(znode_t *zp, uint64_t off, uint64_t len, int flag, boolean_t log)
SA_ADD_BULK_ATTR(bulk, count, SA_ZPL_FLAGS(zfsvfs),
NULL, &zp->z_pflags, 8);
zfs_tstamp_update_setup(zp, CONTENT_MODIFIED, mtime, ctime);
ZFS_PERSIST_SEQ(zp, bulk, count);
error = sa_bulk_update(zp->z_sa_hdl, bulk, count, tx);
ASSERT0(error);

Expand Down
3 changes: 2 additions & 1 deletion module/os/linux/zfs/zfs_acl.c
Original file line number Diff line number Diff line change
Expand Up @@ -1359,7 +1359,7 @@ zfs_aclset_common(znode_t *zp, zfs_acl_t *aclp, cred_t *cr, dmu_tx_t *tx)
dmu_object_type_t otype;
zfs_acl_locator_cb_t locate = { 0 };
uint64_t mode;
sa_bulk_attr_t bulk[5];
sa_bulk_attr_t bulk[6];
uint64_t ctime[2];
int count = 0;
zfs_acl_phys_t acl_phys;
Expand Down Expand Up @@ -1501,6 +1501,7 @@ zfs_aclset_common(znode_t *zp, zfs_acl_t *aclp, cred_t *cr, dmu_tx_t *tx)
zp->z_pflags |= ZFS_ACL_TRIVIAL;

zfs_tstamp_update_setup(zp, STATE_CHANGED, NULL, ctime);
ZFS_PERSIST_SEQ(zp, bulk, count);
return (sa_bulk_update(zp->z_sa_hdl, bulk, count, tx));
}

Expand Down
Loading
Loading