mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-01-24 09:13:20 -05:00
Merge branch 'guilt/xfs-5.19-larp-cleanups' into xfs-5.19-for-next
This series contains a two key cleanups for the new LARP code. Most of it is refactoring and tweaking the code that creates kernel log messages about enabling and disabling features -- we should be warning about LARP being turned on once per mount, instead of once per insmod cycle; we shouldn't be spamming the logs so aggressively about turning *off* log incompat features. The second part of the series refactors the LARP code responsible for getting (and releasing) permission to use xattr log items. The implementation code doesn't belong in xfs_log.c, and calls to logging functions don't belong in libxfs -- they really should be done by the VFS implementation functions before they start calling into libraries. Signed-off-by: Darrick J. Wong <djwong@kernel.org> Signed-off-by: Dave Chinner <david@fromorbit.com>
This commit is contained in:
commit
7146bda743
14 changed files with 126 additions and 81 deletions
|
@ -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;
|
||||
|
||||
|
@ -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;
|
||||
|
@ -1027,12 +1026,6 @@ xfs_attr_set(
|
|||
rmt_blks = xfs_attr3_rmt_blocks(mp, XFS_XATTR_SIZE_MAX);
|
||||
}
|
||||
|
||||
if (use_logging) {
|
||||
error = xfs_attr_use_log_assist(mp);
|
||||
if (error)
|
||||
return error;
|
||||
}
|
||||
|
||||
/*
|
||||
* Root fork attributes can use reserved data blocks for this
|
||||
* operation if necessary
|
||||
|
@ -1040,7 +1033,7 @@ xfs_attr_set(
|
|||
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,
|
||||
|
@ -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)
|
||||
xlog_drop_incompat_feat(mp->m_log);
|
||||
return error;
|
||||
|
||||
out_trans_cancel:
|
||||
|
|
|
@ -340,20 +340,6 @@ static const struct xchk_meta_ops meta_scrub_ops[] = {
|
|||
},
|
||||
};
|
||||
|
||||
/* This isn't a stable feature, warn once per day. */
|
||||
static inline void
|
||||
xchk_experimental_warning(
|
||||
struct xfs_mount *mp)
|
||||
{
|
||||
static struct ratelimit_state scrub_warning = RATELIMIT_STATE_INIT(
|
||||
"xchk_warning", 86400 * HZ, 1);
|
||||
ratelimit_set_flags(&scrub_warning, RATELIMIT_MSG_ON_RELEASE);
|
||||
|
||||
if (__ratelimit(&scrub_warning))
|
||||
xfs_alert(mp,
|
||||
"EXPERIMENTAL online scrub feature in use. Use at your own risk!");
|
||||
}
|
||||
|
||||
static int
|
||||
xchk_validate_inputs(
|
||||
struct xfs_mount *mp,
|
||||
|
@ -478,7 +464,8 @@ xfs_scrub_metadata(
|
|||
if (error)
|
||||
goto out;
|
||||
|
||||
xchk_experimental_warning(mp);
|
||||
xfs_warn_mount(mp, XFS_OPSTATE_WARNED_SCRUB,
|
||||
"EXPERIMENTAL online scrub feature in use. Use at your own risk!");
|
||||
|
||||
sc = kmem_zalloc(sizeof(struct xfs_scrub), KM_NOFS | KM_MAYFAIL);
|
||||
if (!sc) {
|
||||
|
|
|
@ -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>
|
||||
|
||||
|
@ -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);
|
||||
|
||||
/*
|
||||
|
|
|
@ -149,12 +149,7 @@ xfs_growfs_data_private(
|
|||
error = xfs_resizefs_init_new_ags(tp, &id, oagcount, nagcount,
|
||||
delta, &lastag_extended);
|
||||
} else {
|
||||
static struct ratelimit_state shrink_warning = \
|
||||
RATELIMIT_STATE_INIT("shrink_warning", 86400 * HZ, 1);
|
||||
ratelimit_set_flags(&shrink_warning, RATELIMIT_MSG_ON_RELEASE);
|
||||
|
||||
if (__ratelimit(&shrink_warning))
|
||||
xfs_alert(mp,
|
||||
xfs_warn_mount(mp, XFS_OPSTATE_WARNED_SHRINK,
|
||||
"EXPERIMENTAL online shrink feature in use. Use at your own risk!");
|
||||
|
||||
error = xfs_ag_shrink_space(mp, &tp, nagcount - 1, -delta);
|
||||
|
|
|
@ -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>
|
||||
|
@ -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);
|
||||
|
|
|
@ -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>
|
||||
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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_once(mp,
|
||||
"EXPERIMENTAL logged extended attributes feature added. Use at your own risk!");
|
||||
|
||||
return 0;
|
||||
drop_incompat:
|
||||
xlog_drop_incompat_feat(mp->m_log);
|
||||
return error;
|
||||
}
|
||||
|
|
|
@ -75,6 +75,12 @@ do { \
|
|||
#define xfs_debug_ratelimited(dev, fmt, ...) \
|
||||
xfs_printk_ratelimited(xfs_debug, dev, fmt, ##__VA_ARGS__)
|
||||
|
||||
#define xfs_warn_mount(mp, warntag, fmt, ...) \
|
||||
do { \
|
||||
if (xfs_should_warn((mp), (warntag))) \
|
||||
xfs_warn((mp), (fmt), ##__VA_ARGS__); \
|
||||
} while (0)
|
||||
|
||||
#define xfs_warn_once(dev, fmt, ...) \
|
||||
xfs_printk_once(xfs_warn, dev, fmt, ##__VA_ARGS__)
|
||||
#define xfs_notice_once(dev, fmt, ...) \
|
||||
|
|
|
@ -1356,7 +1356,6 @@ xfs_clear_incompat_log_features(
|
|||
|
||||
if (xfs_sb_has_incompat_log_feature(&mp->m_sb,
|
||||
XFS_SB_FEAT_INCOMPAT_LOG_ALL)) {
|
||||
xfs_info(mp, "Clearing log incompat feature flags.");
|
||||
xfs_sb_remove_incompat_log_features(&mp->m_sb);
|
||||
ret = true;
|
||||
}
|
||||
|
|
|
@ -391,6 +391,13 @@ __XFS_HAS_FEAT(nouuid, NOUUID)
|
|||
*/
|
||||
#define XFS_OPSTATE_BLOCKGC_ENABLED 6
|
||||
|
||||
/* Kernel has logged a warning about online fsck being used on this fs. */
|
||||
#define XFS_OPSTATE_WARNED_SCRUB 7
|
||||
/* Kernel has logged a warning about shrink being used on this fs. */
|
||||
#define XFS_OPSTATE_WARNED_SHRINK 8
|
||||
/* Kernel has logged a warning about logged xattr updates being used. */
|
||||
#define XFS_OPSTATE_WARNED_LARP 9
|
||||
|
||||
#define __XFS_IS_OPSTATE(name, NAME) \
|
||||
static inline bool xfs_is_ ## name (struct xfs_mount *mp) \
|
||||
{ \
|
||||
|
@ -413,6 +420,12 @@ __XFS_IS_OPSTATE(readonly, READONLY)
|
|||
__XFS_IS_OPSTATE(inodegc_enabled, INODEGC_ENABLED)
|
||||
__XFS_IS_OPSTATE(blockgc_enabled, BLOCKGC_ENABLED)
|
||||
|
||||
static inline bool
|
||||
xfs_should_warn(struct xfs_mount *mp, long nr)
|
||||
{
|
||||
return !test_and_set_bit(nr, &mp->m_opstate);
|
||||
}
|
||||
|
||||
#define XFS_OPSTATE_STRINGS \
|
||||
{ (1UL << XFS_OPSTATE_UNMOUNTING), "unmounting" }, \
|
||||
{ (1UL << XFS_OPSTATE_CLEAN), "clean" }, \
|
||||
|
@ -420,7 +433,10 @@ __XFS_IS_OPSTATE(blockgc_enabled, BLOCKGC_ENABLED)
|
|||
{ (1UL << XFS_OPSTATE_INODE32), "inode32" }, \
|
||||
{ (1UL << XFS_OPSTATE_READONLY), "read_only" }, \
|
||||
{ (1UL << XFS_OPSTATE_INODEGC_ENABLED), "inodegc" }, \
|
||||
{ (1UL << XFS_OPSTATE_BLOCKGC_ENABLED), "blockgc" }
|
||||
{ (1UL << XFS_OPSTATE_BLOCKGC_ENABLED), "blockgc" }, \
|
||||
{ (1UL << XFS_OPSTATE_WARNED_SCRUB), "wscrub" }, \
|
||||
{ (1UL << XFS_OPSTATE_WARNED_SHRINK), "wshrink" }, \
|
||||
{ (1UL << XFS_OPSTATE_WARNED_LARP), "wlarp" }
|
||||
|
||||
/*
|
||||
* Max and min values for mount-option defined I/O
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -15,9 +15,86 @@
|
|||
#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.
|
||||
*/
|
||||
static inline 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;
|
||||
}
|
||||
|
||||
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,
|
||||
|
@ -56,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;
|
||||
|
|
13
fs/xfs/xfs_xattr.h
Normal file
13
fs/xfs/xfs_xattr.h
Normal file
|
@ -0,0 +1,13 @@
|
|||
// 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_change(struct xfs_da_args *args);
|
||||
|
||||
extern const struct xattr_handler *xfs_xattr_handlers[];
|
||||
|
||||
#endif /* __XFS_XATTR_H__ */
|
Loading…
Add table
Reference in a new issue