Skip to content

Commit

Permalink
xfs: move xfs_attr_use_log_assist usage out of libxfs
Browse files Browse the repository at this point in the history
The LARP patchset added an awkward coupling point between libxfs and
what would be libxlog, if the XFS log were actually its own library.
Move the code that sets up logged xattr updates out of libxfs and into
xfs_xattr.c so that libxfs no longer has to know about xlog_* functions.

Signed-off-by: Darrick J. Wong <djwong@kernel.org>
Reviewed-by: Dave Chinner <dchinner@redhat.com>
Signed-off-by: Dave Chinner <david@fromorbit.com>
  • Loading branch information
Darrick J. Wong authored and Dave Chinner committed May 27, 2022
1 parent d9c61cc commit efc2efe
Show file tree
Hide file tree
Showing 6 changed files with 39 additions and 19 deletions.
12 changes: 1 addition & 11 deletions fs/xfs/libxfs/xfs_attr.c
Original file line number Diff line number Diff line change
Expand Up @@ -982,7 +982,6 @@ xfs_attr_set(
int error, local;
int rmt_blks = 0;
unsigned int total;
bool use_logging = xfs_has_larp(mp);

if (xfs_is_shutdown(dp->i_mount))
return -EIO;
Expand Down Expand Up @@ -1027,20 +1026,14 @@ xfs_attr_set(
rmt_blks = xfs_attr3_rmt_blocks(mp, XFS_XATTR_SIZE_MAX);
}

if (use_logging) {
error = xfs_attr_grab_log_assist(mp);
if (error)
return error;
}

/*
* Root fork attributes can use reserved data blocks for this
* operation if necessary
*/
xfs_init_attr_trans(args, &tres, &total);
error = xfs_trans_alloc_inode(dp, &tres, total, 0, rsvd, &args->trans);
if (error)
goto drop_incompat;
return error;

if (args->value || xfs_inode_hasattr(dp)) {
error = xfs_iext_count_may_overflow(dp, XFS_ATTR_FORK,
Expand Down Expand Up @@ -1100,9 +1093,6 @@ xfs_attr_set(
error = xfs_trans_commit(args->trans);
out_unlock:
xfs_iunlock(dp, XFS_ILOCK_EXCL);
drop_incompat:
if (use_logging)
xfs_attr_rele_log_assist(mp);
return error;

out_trans_cancel:
Expand Down
3 changes: 2 additions & 1 deletion fs/xfs/xfs_acl.c
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
#include "xfs_error.h"
#include "xfs_acl.h"
#include "xfs_trans.h"
#include "xfs_xattr.h"

#include <linux/posix_acl_xattr.h>

Expand Down Expand Up @@ -202,7 +203,7 @@ __xfs_set_acl(struct inode *inode, struct posix_acl *acl, int type)
xfs_acl_to_disk(args.value, acl);
}

error = xfs_attr_set(&args);
error = xfs_attr_change(&args);
kmem_free(args.value);

/*
Expand Down
3 changes: 2 additions & 1 deletion fs/xfs/xfs_ioctl.c
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@
#include "xfs_health.h"
#include "xfs_reflink.h"
#include "xfs_ioctl.h"
#include "xfs_xattr.h"

#include <linux/mount.h>
#include <linux/namei.h>
Expand Down Expand Up @@ -524,7 +525,7 @@ xfs_attrmulti_attr_set(
args.valuelen = len;
}

error = xfs_attr_set(&args);
error = xfs_attr_change(&args);
if (!error && (flags & XFS_IOC_ATTR_ROOT))
xfs_forget_acl(inode, name);
kfree(args.value);
Expand Down
3 changes: 2 additions & 1 deletion fs/xfs/xfs_iops.c
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
#include "xfs_iomap.h"
#include "xfs_error.h"
#include "xfs_ioctl.h"
#include "xfs_xattr.h"

#include <linux/posix_acl.h>
#include <linux/security.h>
Expand Down Expand Up @@ -61,7 +62,7 @@ xfs_initxattrs(
.value = xattr->value,
.valuelen = xattr->value_len,
};
error = xfs_attr_set(&args);
error = xfs_attr_change(&args);
if (error < 0)
break;
}
Expand Down
34 changes: 31 additions & 3 deletions fs/xfs/xfs_xattr.c
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@
* they must release the permission by calling xlog_drop_incompat_feat
* when they're done.
*/
int
static inline int
xfs_attr_grab_log_assist(
struct xfs_mount *mp)
{
Expand Down Expand Up @@ -61,13 +61,41 @@ xfs_attr_grab_log_assist(
return error;
}

void
static inline void
xfs_attr_rele_log_assist(
struct xfs_mount *mp)
{
xlog_drop_incompat_feat(mp->m_log);
}

/*
* Set or remove an xattr, having grabbed the appropriate logging resources
* prior to calling libxfs.
*/
int
xfs_attr_change(
struct xfs_da_args *args)
{
struct xfs_mount *mp = args->dp->i_mount;
bool use_logging = false;
int error;

if (xfs_has_larp(mp)) {
error = xfs_attr_grab_log_assist(mp);
if (error)
return error;

use_logging = true;
}

error = xfs_attr_set(args);

if (use_logging)
xfs_attr_rele_log_assist(mp);
return error;
}


static int
xfs_xattr_get(const struct xattr_handler *handler, struct dentry *unused,
struct inode *inode, const char *name, void *value, size_t size)
Expand Down Expand Up @@ -105,7 +133,7 @@ xfs_xattr_set(const struct xattr_handler *handler,
};
int error;

error = xfs_attr_set(&args);
error = xfs_attr_change(&args);
if (!error && (handler->flags & XFS_ATTR_ROOT))
xfs_forget_acl(inode, name);
return error;
Expand Down
3 changes: 1 addition & 2 deletions fs/xfs/xfs_xattr.h
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,7 @@
#ifndef __XFS_XATTR_H__
#define __XFS_XATTR_H__

int xfs_attr_grab_log_assist(struct xfs_mount *mp);
void xfs_attr_rele_log_assist(struct xfs_mount *mp);
int xfs_attr_change(struct xfs_da_args *args);

extern const struct xattr_handler *xfs_xattr_handlers[];

Expand Down

0 comments on commit efc2efe

Please sign in to comment.