|
@@ -191,6 +191,33 @@ xfs_attr_calc_size(
|
|
|
return nblks;
|
|
|
}
|
|
|
|
|
|
+STATIC int
|
|
|
+xfs_attr_try_sf_addname(
|
|
|
+ struct xfs_inode *dp,
|
|
|
+ struct xfs_da_args *args)
|
|
|
+{
|
|
|
+
|
|
|
+ struct xfs_mount *mp = dp->i_mount;
|
|
|
+ int error, error2;
|
|
|
+
|
|
|
+ error = xfs_attr_shortform_addname(args);
|
|
|
+ if (error == -ENOSPC)
|
|
|
+ return error;
|
|
|
+
|
|
|
+ /*
|
|
|
+ * Commit the shortform mods, and we're done.
|
|
|
+ * NOTE: this is also the error path (EEXIST, etc).
|
|
|
+ */
|
|
|
+ if (!error && (args->flags & ATTR_KERNOTIME) == 0)
|
|
|
+ xfs_trans_ichgtime(args->trans, dp, XFS_ICHGTIME_CHG);
|
|
|
+
|
|
|
+ if (mp->m_flags & XFS_MOUNT_WSYNC)
|
|
|
+ xfs_trans_set_sync(args->trans);
|
|
|
+
|
|
|
+ error2 = xfs_trans_commit(args->trans);
|
|
|
+ return error ? error : error2;
|
|
|
+}
|
|
|
+
|
|
|
int
|
|
|
xfs_attr_set(
|
|
|
struct xfs_inode *dp,
|
|
@@ -204,7 +231,7 @@ xfs_attr_set(
|
|
|
struct xfs_da_args args;
|
|
|
struct xfs_trans_res tres;
|
|
|
int rsvd = (flags & ATTR_ROOT) != 0;
|
|
|
- int error, err2, local;
|
|
|
+ int error, local;
|
|
|
|
|
|
XFS_STATS_INC(mp, xs_attr_set);
|
|
|
|
|
@@ -281,30 +308,10 @@ xfs_attr_set(
|
|
|
* Try to add the attr to the attribute list in
|
|
|
* the inode.
|
|
|
*/
|
|
|
- error = xfs_attr_shortform_addname(&args);
|
|
|
+ error = xfs_attr_try_sf_addname(dp, &args);
|
|
|
if (error != -ENOSPC) {
|
|
|
- /*
|
|
|
- * Commit the shortform mods, and we're done.
|
|
|
- * NOTE: this is also the error path (EEXIST, etc).
|
|
|
- */
|
|
|
- ASSERT(args.trans != NULL);
|
|
|
-
|
|
|
- /*
|
|
|
- * If this is a synchronous mount, make sure that
|
|
|
- * the transaction goes to disk before returning
|
|
|
- * to the user.
|
|
|
- */
|
|
|
- if (mp->m_flags & XFS_MOUNT_WSYNC)
|
|
|
- xfs_trans_set_sync(args.trans);
|
|
|
-
|
|
|
- if (!error && (flags & ATTR_KERNOTIME) == 0) {
|
|
|
- xfs_trans_ichgtime(args.trans, dp,
|
|
|
- XFS_ICHGTIME_CHG);
|
|
|
- }
|
|
|
- err2 = xfs_trans_commit(args.trans);
|
|
|
xfs_iunlock(dp, XFS_ILOCK_EXCL);
|
|
|
-
|
|
|
- return error ? error : err2;
|
|
|
+ return error;
|
|
|
}
|
|
|
|
|
|
/*
|