return NULL;
}
+/*
+ * Replace a shortform xattr if it's the right length. Returns 0 on success,
+ * -ENOSPC if the length is wrong, or -ENOATTR if the attr was not found.
+ */
+int
+xfs_attr_shortform_replace(
+ struct xfs_da_args *args)
+{
+ struct xfs_attr_sf_entry *sfe;
+
+ ASSERT(args->dp->i_af.if_format == XFS_DINODE_FMT_LOCAL);
+
+ trace_xfs_attr_sf_replace(args);
+
+ sfe = xfs_attr_sf_findname(args);
+ if (!sfe)
+ return -ENOATTR;
+
+ if (args->attr_filter & XFS_ATTR_PARENT) {
+ if (sfe->namelen != args->new_namelen ||
+ sfe->valuelen != args->new_valuelen)
+ return -ENOSPC;
+
+ memcpy(sfe->nameval, args->new_name, sfe->namelen);
+ memcpy(&sfe->nameval[sfe->namelen], args->new_value,
+ sfe->valuelen);
+ } else {
+ if (sfe->valuelen != args->valuelen)
+ return -ENOSPC;
+ memcpy(&sfe->nameval[sfe->namelen], args->value,
+ sfe->valuelen);
+ }
+
+ xfs_trans_log_inode(args->trans, args->dp,
+ XFS_ILOG_CORE | XFS_ILOG_ADATA);
+ return 0;
+}
+
/*
* Add a name/value pair to the shortform attribute list.
* Overflow from the inode has already been checked for.
* Internal routines when attribute fork size < XFS_LITINO(mp).
*/
void xfs_attr_shortform_create(struct xfs_da_args *args);
+int xfs_attr_shortform_replace(struct xfs_da_args *args);
void xfs_attr_shortform_add(struct xfs_da_args *args, int forkoff);
int xfs_attr_shortform_getvalue(struct xfs_da_args *args);
int xfs_attr_shortform_to_leaf(struct xfs_da_args *args);
DEFINE_ATTR_EVENT(xfs_attr_sf_create);
DEFINE_ATTR_EVENT(xfs_attr_sf_lookup);
DEFINE_ATTR_EVENT(xfs_attr_sf_remove);
+DEFINE_ATTR_EVENT(xfs_attr_sf_replace);
DEFINE_ATTR_EVENT(xfs_attr_sf_to_leaf);
DEFINE_ATTR_EVENT(xfs_attr_leaf_add);