Skip to content

Commit

Permalink
xfs: move xfs_attr_use_log_assist out of xfs_log.c
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 enables logged xattr updates out of "lib"xlog and into
xfs_xattr.c so that it no longer has to know about xlog_* functions.

While we're at it, give xfs_xattr.c its own header file.

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 202865c commit d9c61cc
Show file tree
Hide file tree
Showing 6 changed files with 67 additions and 45 deletions.
6 changes: 3 additions & 3 deletions fs/xfs/libxfs/xfs_attr.c
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@
#include "xfs_trans_space.h"
#include "xfs_trace.h"
#include "xfs_attr_item.h"
#include "xfs_log.h"
#include "xfs_xattr.h"

struct kmem_cache *xfs_attr_intent_cache;

Expand Down Expand Up @@ -1028,7 +1028,7 @@ xfs_attr_set(
}

if (use_logging) {
error = xfs_attr_use_log_assist(mp);
error = xfs_attr_grab_log_assist(mp);
if (error)
return error;
}
Expand Down Expand Up @@ -1102,7 +1102,7 @@ xfs_attr_set(
xfs_iunlock(dp, XFS_ILOCK_EXCL);
drop_incompat:
if (use_logging)
xlog_drop_incompat_feat(mp->m_log);
xfs_attr_rele_log_assist(mp);
return error;

out_trans_cancel:
Expand Down
41 changes: 0 additions & 41 deletions fs/xfs/xfs_log.c
Original file line number Diff line number Diff line change
Expand Up @@ -3877,44 +3877,3 @@ xlog_drop_incompat_feat(
{
up_read(&log->l_incompat_users);
}

/*
* Get permission to use log-assisted atomic exchange of file extents.
*
* Callers must not be running any transactions or hold any inode locks, and
* they must release the permission by calling xlog_drop_incompat_feat
* when they're done.
*/
int
xfs_attr_use_log_assist(
struct xfs_mount *mp)
{
int error = 0;

/*
* Protect ourselves from an idle log clearing the logged xattrs log
* incompat feature bit.
*/
xlog_use_incompat_feat(mp->m_log);

/*
* If log-assisted xattrs are already enabled, the caller can use the
* log assisted swap functions with the log-incompat reference we got.
*/
if (xfs_sb_version_haslogxattrs(&mp->m_sb))
return 0;

/* Enable log-assisted xattrs. */
error = xfs_add_incompat_log_feature(mp,
XFS_SB_FEAT_INCOMPAT_LOG_XATTRS);
if (error)
goto drop_incompat;

xfs_warn_mount(mp, XFS_OPSTATE_WARNED_LARP,
"EXPERIMENTAL logged extended attributes feature in use. Use at your own risk!");

return 0;
drop_incompat:
xlog_drop_incompat_feat(mp->m_log);
return error;
}
1 change: 1 addition & 0 deletions fs/xfs/xfs_super.c
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@
#include "xfs_ag.h"
#include "xfs_defer.h"
#include "xfs_attr_item.h"
#include "xfs_xattr.h"

#include <linux/magic.h>
#include <linux/fs_context.h>
Expand Down
1 change: 0 additions & 1 deletion fs/xfs/xfs_super.h
Original file line number Diff line number Diff line change
Expand Up @@ -91,7 +91,6 @@ extern xfs_agnumber_t xfs_set_inode_alloc(struct xfs_mount *,
xfs_agnumber_t agcount);

extern const struct export_operations xfs_export_operations;
extern const struct xattr_handler *xfs_xattr_handlers[];
extern const struct quotactl_ops xfs_quotactl_operations;

extern void xfs_reinit_percpu_counters(struct xfs_mount *mp);
Expand Down
49 changes: 49 additions & 0 deletions fs/xfs/xfs_xattr.c
Original file line number Diff line number Diff line change
Expand Up @@ -15,9 +15,58 @@
#include "xfs_da_btree.h"
#include "xfs_attr.h"
#include "xfs_acl.h"
#include "xfs_log.h"
#include "xfs_xattr.h"

#include <linux/posix_acl_xattr.h>

/*
* Get permission to use log-assisted atomic exchange of file extents.
*
* Callers must not be running any transactions or hold any inode locks, and
* they must release the permission by calling xlog_drop_incompat_feat
* when they're done.
*/
int
xfs_attr_grab_log_assist(
struct xfs_mount *mp)
{
int error = 0;

/*
* Protect ourselves from an idle log clearing the logged xattrs log
* incompat feature bit.
*/
xlog_use_incompat_feat(mp->m_log);

/*
* If log-assisted xattrs are already enabled, the caller can use the
* log assisted swap functions with the log-incompat reference we got.
*/
if (xfs_sb_version_haslogxattrs(&mp->m_sb))
return 0;

/* Enable log-assisted xattrs. */
error = xfs_add_incompat_log_feature(mp,
XFS_SB_FEAT_INCOMPAT_LOG_XATTRS);
if (error)
goto drop_incompat;

xfs_warn_mount(mp, XFS_OPSTATE_WARNED_LARP,
"EXPERIMENTAL logged extended attributes feature in use. Use at your own risk!");

return 0;
drop_incompat:
xlog_drop_incompat_feat(mp->m_log);
return error;
}

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

static int
xfs_xattr_get(const struct xattr_handler *handler, struct dentry *unused,
Expand Down
14 changes: 14 additions & 0 deletions fs/xfs/xfs_xattr.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
// SPDX-License-Identifier: GPL-2.0
/*
* Copyright (c) 2000-2005 Silicon Graphics, Inc.
* All Rights Reserved.
*/
#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);

extern const struct xattr_handler *xfs_xattr_handlers[];

#endif /* __XFS_XATTR_H__ */

0 comments on commit d9c61cc

Please sign in to comment.