Commit 5681ca40 authored by Dave Chinner's avatar Dave Chinner Committed by Dave Chinner

xfs: Remove icsb infrastructure

Now that the in-core superblock infrastructure has been replaced with
generic per-cpu counters, we don't need it anymore. Nuke it from
orbit so we are sure that it won't haunt us again...
Signed-off-by: default avatarDave Chinner <dchinner@redhat.com>
Reviewed-by: default avatarBrian Foster <bfoster@redhat.com>
Signed-off-by: default avatarDave Chinner <david@fromorbit.com>
parent 0d485ada
...@@ -743,17 +743,15 @@ xfs_initialize_perag_data( ...@@ -743,17 +743,15 @@ xfs_initialize_perag_data(
btree += pag->pagf_btreeblks; btree += pag->pagf_btreeblks;
xfs_perag_put(pag); xfs_perag_put(pag);
} }
/*
* Overwrite incore superblock counters with just-read data /* Overwrite incore superblock counters with just-read data */
*/
spin_lock(&mp->m_sb_lock); spin_lock(&mp->m_sb_lock);
sbp->sb_ifree = ifree; sbp->sb_ifree = ifree;
sbp->sb_icount = ialloc; sbp->sb_icount = ialloc;
sbp->sb_fdblocks = bfree + bfreelst + btree; sbp->sb_fdblocks = bfree + bfreelst + btree;
spin_unlock(&mp->m_sb_lock); spin_unlock(&mp->m_sb_lock);
/* Fixup the per-cpu counters as well. */ xfs_reinit_percpu_counters(mp);
xfs_icsb_reinit_counters(mp);
return 0; return 0;
} }
......
...@@ -637,7 +637,6 @@ xfs_fs_counts( ...@@ -637,7 +637,6 @@ xfs_fs_counts(
xfs_mount_t *mp, xfs_mount_t *mp,
xfs_fsop_counts_t *cnt) xfs_fsop_counts_t *cnt)
{ {
xfs_icsb_sync_counters(mp, XFS_ICSB_LAZY_COUNT);
cnt->allocino = percpu_counter_read_positive(&mp->m_icount); cnt->allocino = percpu_counter_read_positive(&mp->m_icount);
cnt->freeino = percpu_counter_read_positive(&mp->m_ifree); cnt->freeino = percpu_counter_read_positive(&mp->m_ifree);
cnt->freedata = percpu_counter_read_positive(&mp->m_fdblocks) - cnt->freedata = percpu_counter_read_positive(&mp->m_fdblocks) -
...@@ -701,7 +700,6 @@ xfs_reserve_blocks( ...@@ -701,7 +700,6 @@ xfs_reserve_blocks(
*/ */
retry: retry:
spin_lock(&mp->m_sb_lock); spin_lock(&mp->m_sb_lock);
xfs_icsb_sync_counters_locked(mp, 0);
/* /*
* If our previous reservation was larger than the current value, * If our previous reservation was larger than the current value,
......
...@@ -460,7 +460,6 @@ xfs_iomap_prealloc_size( ...@@ -460,7 +460,6 @@ xfs_iomap_prealloc_size(
alloc_blocks = XFS_FILEOFF_MIN(roundup_pow_of_two(MAXEXTLEN), alloc_blocks = XFS_FILEOFF_MIN(roundup_pow_of_two(MAXEXTLEN),
alloc_blocks); alloc_blocks);
xfs_icsb_sync_counters(mp, XFS_ICSB_LAZY_COUNT);
freesp = percpu_counter_read_positive(&mp->m_fdblocks); freesp = percpu_counter_read_positive(&mp->m_fdblocks);
if (freesp < mp->m_low_space[XFS_LOWSP_5_PCNT]) { if (freesp < mp->m_low_space[XFS_LOWSP_5_PCNT]) {
shift = 2; shift = 2;
......
...@@ -116,15 +116,6 @@ typedef __uint64_t __psunsigned_t; ...@@ -116,15 +116,6 @@ typedef __uint64_t __psunsigned_t;
#undef XFS_NATIVE_HOST #undef XFS_NATIVE_HOST
#endif #endif
/*
* Feature macros (disable/enable)
*/
#ifdef CONFIG_SMP
#define HAVE_PERCPU_SB /* per cpu superblock counters are a 2.6 feature */
#else
#undef HAVE_PERCPU_SB /* per cpu superblock counters are a 2.6 feature */
#endif
#define irix_sgid_inherit xfs_params.sgid_inherit.val #define irix_sgid_inherit xfs_params.sgid_inherit.val
#define irix_symlink_mode xfs_params.symlink_mode.val #define irix_symlink_mode xfs_params.symlink_mode.val
#define xfs_panic_mask xfs_params.panic_mask.val #define xfs_panic_mask xfs_params.panic_mask.val
......
...@@ -4463,10 +4463,10 @@ xlog_do_recover( ...@@ -4463,10 +4463,10 @@ xlog_do_recover(
xfs_sb_from_disk(sbp, XFS_BUF_TO_SBP(bp)); xfs_sb_from_disk(sbp, XFS_BUF_TO_SBP(bp));
ASSERT(sbp->sb_magicnum == XFS_SB_MAGIC); ASSERT(sbp->sb_magicnum == XFS_SB_MAGIC);
ASSERT(xfs_sb_good_version(sbp)); ASSERT(xfs_sb_good_version(sbp));
xfs_reinit_percpu_counters(log->l_mp);
xfs_buf_relse(bp); xfs_buf_relse(bp);
/* We've re-read the superblock so re-initialize per-cpu counters */
xfs_icsb_reinit_counters(log->l_mp);
xlog_recover_check_summary(log); xlog_recover_check_summary(log);
......
This diff is collapsed.
...@@ -18,8 +18,6 @@ ...@@ -18,8 +18,6 @@
#ifndef __XFS_MOUNT_H__ #ifndef __XFS_MOUNT_H__
#define __XFS_MOUNT_H__ #define __XFS_MOUNT_H__
#ifdef __KERNEL__
struct xlog; struct xlog;
struct xfs_inode; struct xfs_inode;
struct xfs_mru_cache; struct xfs_mru_cache;
...@@ -29,43 +27,6 @@ struct xfs_quotainfo; ...@@ -29,43 +27,6 @@ struct xfs_quotainfo;
struct xfs_dir_ops; struct xfs_dir_ops;
struct xfs_da_geometry; struct xfs_da_geometry;
#ifdef HAVE_PERCPU_SB
/*
* Valid per-cpu incore superblock counters. Note that if you add new counters,
* you may need to define new counter disabled bit field descriptors as there
* are more possible fields in the superblock that can fit in a bitfield on a
* 32 bit platform. The XFS_SBS_* values for the current current counters just
* fit.
*/
typedef struct xfs_icsb_cnts {
uint64_t icsb_fdblocks;
uint64_t icsb_ifree;
unsigned long icsb_flags;
} xfs_icsb_cnts_t;
#define XFS_ICSB_FLAG_LOCK (1 << 0) /* counter lock bit */
#define XFS_ICSB_LAZY_COUNT (1 << 1) /* accuracy not needed */
extern int xfs_icsb_init_counters(struct xfs_mount *);
extern void xfs_icsb_reinit_counters(struct xfs_mount *);
extern void xfs_icsb_destroy_counters(struct xfs_mount *);
extern void xfs_icsb_sync_counters(struct xfs_mount *, int);
extern void xfs_icsb_sync_counters_locked(struct xfs_mount *, int);
extern int xfs_icsb_modify_counters(struct xfs_mount *, xfs_sb_field_t,
int64_t, int);
#else
#define xfs_icsb_init_counters(mp) (0)
#define xfs_icsb_destroy_counters(mp) do { } while (0)
#define xfs_icsb_reinit_counters(mp) do { } while (0)
#define xfs_icsb_sync_counters(mp, flags) do { } while (0)
#define xfs_icsb_sync_counters_locked(mp, flags) do { } while (0)
#define xfs_icsb_modify_counters(mp, field, delta, rsvd) \
xfs_mod_incore_sb(mp, field, delta, rsvd)
#endif
/* dynamic preallocation free space thresholds, 5% down to 1% */ /* dynamic preallocation free space thresholds, 5% down to 1% */
enum { enum {
XFS_LOWSP_1_PCNT = 0, XFS_LOWSP_1_PCNT = 0,
...@@ -156,12 +117,6 @@ typedef struct xfs_mount { ...@@ -156,12 +117,6 @@ typedef struct xfs_mount {
const struct xfs_dir_ops *m_nondir_inode_ops; /* !dir inode ops */ const struct xfs_dir_ops *m_nondir_inode_ops; /* !dir inode ops */
uint m_chsize; /* size of next field */ uint m_chsize; /* size of next field */
atomic_t m_active_trans; /* number trans frozen */ atomic_t m_active_trans; /* number trans frozen */
#ifdef HAVE_PERCPU_SB
xfs_icsb_cnts_t __percpu *m_sb_cnts; /* per-cpu superblock counters */
unsigned long m_icsb_counters; /* disabled per-cpu counters */
struct notifier_block m_icsb_notifier; /* hotplug cpu notifier */
struct mutex m_icsb_mutex; /* balancer sync lock */
#endif
struct xfs_mru_cache *m_filestream; /* per-mount filestream data */ struct xfs_mru_cache *m_filestream; /* per-mount filestream data */
struct delayed_work m_reclaim_work; /* background inode reclaim */ struct delayed_work m_reclaim_work; /* background inode reclaim */
struct delayed_work m_eofblocks_work; /* background eof blocks struct delayed_work m_eofblocks_work; /* background eof blocks
...@@ -304,26 +259,6 @@ xfs_daddr_to_agbno(struct xfs_mount *mp, xfs_daddr_t d) ...@@ -304,26 +259,6 @@ xfs_daddr_to_agbno(struct xfs_mount *mp, xfs_daddr_t d)
return (xfs_agblock_t) do_div(ld, mp->m_sb.sb_agblocks); return (xfs_agblock_t) do_div(ld, mp->m_sb.sb_agblocks);
} }
/*
* Per-cpu superblock locking functions
*/
#ifdef HAVE_PERCPU_SB
static inline void
xfs_icsb_lock(xfs_mount_t *mp)
{
mutex_lock(&mp->m_icsb_mutex);
}
static inline void
xfs_icsb_unlock(xfs_mount_t *mp)
{
mutex_unlock(&mp->m_icsb_mutex);
}
#else
#define xfs_icsb_lock(mp)
#define xfs_icsb_unlock(mp)
#endif
/* /*
* This structure is for use by the xfs_mod_incore_sb_batch() routine. * This structure is for use by the xfs_mod_incore_sb_batch() routine.
* xfs_growfs can specify a few fields which are more than int limit * xfs_growfs can specify a few fields which are more than int limit
...@@ -407,6 +342,4 @@ extern int xfs_dev_is_read_only(struct xfs_mount *, char *); ...@@ -407,6 +342,4 @@ extern int xfs_dev_is_read_only(struct xfs_mount *, char *);
extern void xfs_set_low_space_thresholds(struct xfs_mount *); extern void xfs_set_low_space_thresholds(struct xfs_mount *);
#endif /* __KERNEL__ */
#endif /* __XFS_MOUNT_H__ */ #endif /* __XFS_MOUNT_H__ */
...@@ -1033,23 +1033,6 @@ xfs_free_fsname( ...@@ -1033,23 +1033,6 @@ xfs_free_fsname(
kfree(mp->m_logname); kfree(mp->m_logname);
} }
STATIC void
xfs_fs_put_super(
struct super_block *sb)
{
struct xfs_mount *mp = XFS_M(sb);
xfs_filestream_unmount(mp);
xfs_unmountfs(mp);
xfs_freesb(mp);
xfs_icsb_destroy_counters(mp);
xfs_destroy_mount_workqueues(mp);
xfs_close_devices(mp);
xfs_free_fsname(mp);
kfree(mp);
}
STATIC int STATIC int
xfs_fs_sync_fs( xfs_fs_sync_fs(
struct super_block *sb, struct super_block *sb,
...@@ -1098,7 +1081,6 @@ xfs_fs_statfs( ...@@ -1098,7 +1081,6 @@ xfs_fs_statfs(
statp->f_fsid.val[0] = (u32)id; statp->f_fsid.val[0] = (u32)id;
statp->f_fsid.val[1] = (u32)(id >> 32); statp->f_fsid.val[1] = (u32)(id >> 32);
xfs_icsb_sync_counters(mp, XFS_ICSB_LAZY_COUNT);
icount = percpu_counter_sum(&mp->m_icount); icount = percpu_counter_sum(&mp->m_icount);
ifree = percpu_counter_sum(&mp->m_ifree); ifree = percpu_counter_sum(&mp->m_ifree);
fdblocks = percpu_counter_sum(&mp->m_fdblocks); fdblocks = percpu_counter_sum(&mp->m_fdblocks);
...@@ -1408,6 +1390,51 @@ xfs_finish_flags( ...@@ -1408,6 +1390,51 @@ xfs_finish_flags(
return 0; return 0;
} }
static int
xfs_init_percpu_counters(
struct xfs_mount *mp)
{
int error;
error = percpu_counter_init(&mp->m_icount, 0, GFP_KERNEL);
if (error)
return ENOMEM;
error = percpu_counter_init(&mp->m_ifree, 0, GFP_KERNEL);
if (error)
goto free_icount;
error = percpu_counter_init(&mp->m_fdblocks, 0, GFP_KERNEL);
if (error)
goto free_ifree;
return 0;
free_ifree:
percpu_counter_destroy(&mp->m_ifree);
free_icount:
percpu_counter_destroy(&mp->m_icount);
return -ENOMEM;
}
void
xfs_reinit_percpu_counters(
struct xfs_mount *mp)
{
percpu_counter_set(&mp->m_icount, mp->m_sb.sb_icount);
percpu_counter_set(&mp->m_ifree, mp->m_sb.sb_ifree);
percpu_counter_set(&mp->m_fdblocks, mp->m_sb.sb_fdblocks);
}
static void
xfs_destroy_percpu_counters(
struct xfs_mount *mp)
{
percpu_counter_destroy(&mp->m_icount);
percpu_counter_destroy(&mp->m_ifree);
percpu_counter_destroy(&mp->m_fdblocks);
}
STATIC int STATIC int
xfs_fs_fill_super( xfs_fs_fill_super(
struct super_block *sb, struct super_block *sb,
...@@ -1456,7 +1483,7 @@ xfs_fs_fill_super( ...@@ -1456,7 +1483,7 @@ xfs_fs_fill_super(
if (error) if (error)
goto out_close_devices; goto out_close_devices;
error = xfs_icsb_init_counters(mp); error = xfs_init_percpu_counters(mp);
if (error) if (error)
goto out_destroy_workqueues; goto out_destroy_workqueues;
...@@ -1514,7 +1541,7 @@ xfs_fs_fill_super( ...@@ -1514,7 +1541,7 @@ xfs_fs_fill_super(
out_free_sb: out_free_sb:
xfs_freesb(mp); xfs_freesb(mp);
out_destroy_counters: out_destroy_counters:
xfs_icsb_destroy_counters(mp); xfs_destroy_percpu_counters(mp);
out_destroy_workqueues: out_destroy_workqueues:
xfs_destroy_mount_workqueues(mp); xfs_destroy_mount_workqueues(mp);
out_close_devices: out_close_devices:
...@@ -1531,6 +1558,23 @@ xfs_fs_fill_super( ...@@ -1531,6 +1558,23 @@ xfs_fs_fill_super(
goto out_free_sb; goto out_free_sb;
} }
STATIC void
xfs_fs_put_super(
struct super_block *sb)
{
struct xfs_mount *mp = XFS_M(sb);
xfs_filestream_unmount(mp);
xfs_unmountfs(mp);
xfs_freesb(mp);
xfs_destroy_percpu_counters(mp);
xfs_destroy_mount_workqueues(mp);
xfs_close_devices(mp);
xfs_free_fsname(mp);
kfree(mp);
}
STATIC struct dentry * STATIC struct dentry *
xfs_fs_mount( xfs_fs_mount(
struct file_system_type *fs_type, struct file_system_type *fs_type,
......
...@@ -72,6 +72,8 @@ extern const struct export_operations xfs_export_operations; ...@@ -72,6 +72,8 @@ extern const struct export_operations xfs_export_operations;
extern const struct xattr_handler *xfs_xattr_handlers[]; extern const struct xattr_handler *xfs_xattr_handlers[];
extern const struct quotactl_ops xfs_quotactl_operations; extern const struct quotactl_ops xfs_quotactl_operations;
extern void xfs_reinit_percpu_counters(struct xfs_mount *mp);
#define XFS_M(sb) ((struct xfs_mount *)((sb)->s_fs_info)) #define XFS_M(sb) ((struct xfs_mount *)((sb)->s_fs_info))
#endif /* __XFS_SUPER_H__ */ #endif /* __XFS_SUPER_H__ */
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment