From: "Darrick J. Wong" <darrick.wong@oracle.com>
To: Brian Foster <bfoster@redhat.com>
Cc: david@fromorbit.com, linux-fsdevel@vger.kernel.org,
vishal.l.verma@intel.com, xfs@oss.sgi.com
Subject: Re: [PATCH 041/119] xfs: create rmap update intent log items
Date: Sat, 16 Jul 2016 00:10:03 -0700 [thread overview]
Message-ID: <20160716071003.GB21529@birch.djwong.org> (raw)
In-Reply-To: <20160715183341.GA55338@bfoster.bfoster>
On Fri, Jul 15, 2016 at 02:33:41PM -0400, Brian Foster wrote:
> On Thu, Jun 16, 2016 at 06:22:14PM -0700, Darrick J. Wong wrote:
> > Create rmap update intent/done log items to record redo information in
> > the log. Because we need to roll transactions between updating the
> > bmbt mapping and updating the reverse mapping, we also have to track
> > the status of the metadata updates that will be recorded in the
> > post-roll transactions, just in case we crash before committing the
> > final transaction. This mechanism enables log recovery to finish what
> > was already started.
> >
> > Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
> > ---
>
> A couple nits below, otherwise looks good:
>
> Reviewed-by: Brian Foster <bfoster@redhat.com>
>
> > fs/xfs/Makefile | 1
> > fs/xfs/libxfs/xfs_log_format.h | 67 ++++++
> > fs/xfs/libxfs/xfs_rmap_btree.h | 19 ++
> > fs/xfs/xfs_rmap_item.c | 459 ++++++++++++++++++++++++++++++++++++++++
> > fs/xfs/xfs_rmap_item.h | 100 +++++++++
> > fs/xfs/xfs_super.c | 21 ++
> > 6 files changed, 665 insertions(+), 2 deletions(-)
> > create mode 100644 fs/xfs/xfs_rmap_item.c
> > create mode 100644 fs/xfs/xfs_rmap_item.h
> >
> >
> > diff --git a/fs/xfs/Makefile b/fs/xfs/Makefile
> > index 2de8c20..8ae0a10 100644
> > --- a/fs/xfs/Makefile
> > +++ b/fs/xfs/Makefile
> > @@ -104,6 +104,7 @@ xfs-y += xfs_log.o \
> > xfs_extfree_item.o \
> > xfs_icreate_item.o \
> > xfs_inode_item.o \
> > + xfs_rmap_item.o \
> > xfs_log_recover.o \
> > xfs_trans_ail.o \
> > xfs_trans_buf.o \
> > diff --git a/fs/xfs/libxfs/xfs_log_format.h b/fs/xfs/libxfs/xfs_log_format.h
> > index e5baba3..b9627b7 100644
> > --- a/fs/xfs/libxfs/xfs_log_format.h
> > +++ b/fs/xfs/libxfs/xfs_log_format.h
> > @@ -110,7 +110,9 @@ static inline uint xlog_get_cycle(char *ptr)
> > #define XLOG_REG_TYPE_COMMIT 18
> > #define XLOG_REG_TYPE_TRANSHDR 19
> > #define XLOG_REG_TYPE_ICREATE 20
> > -#define XLOG_REG_TYPE_MAX 20
> > +#define XLOG_REG_TYPE_RUI_FORMAT 21
> > +#define XLOG_REG_TYPE_RUD_FORMAT 22
> > +#define XLOG_REG_TYPE_MAX 22
> >
> > /*
> > * Flags to log operation header
> > @@ -227,6 +229,8 @@ typedef struct xfs_trans_header {
> > #define XFS_LI_DQUOT 0x123d
> > #define XFS_LI_QUOTAOFF 0x123e
> > #define XFS_LI_ICREATE 0x123f
> > +#define XFS_LI_RUI 0x1240 /* rmap update intent */
> > +#define XFS_LI_RUD 0x1241
> >
> > #define XFS_LI_TYPE_DESC \
> > { XFS_LI_EFI, "XFS_LI_EFI" }, \
> > @@ -236,7 +240,9 @@ typedef struct xfs_trans_header {
> > { XFS_LI_BUF, "XFS_LI_BUF" }, \
> > { XFS_LI_DQUOT, "XFS_LI_DQUOT" }, \
> > { XFS_LI_QUOTAOFF, "XFS_LI_QUOTAOFF" }, \
> > - { XFS_LI_ICREATE, "XFS_LI_ICREATE" }
> > + { XFS_LI_ICREATE, "XFS_LI_ICREATE" }, \
> > + { XFS_LI_RUI, "XFS_LI_RUI" }, \
> > + { XFS_LI_RUD, "XFS_LI_RUD" }
> >
> > /*
> > * Inode Log Item Format definitions.
> > @@ -604,6 +610,63 @@ typedef struct xfs_efd_log_format_64 {
> > } xfs_efd_log_format_64_t;
> >
> > /*
> > + * RUI/RUD (reverse mapping) log format definitions
> > + */
> > +struct xfs_map_extent {
> > + __uint64_t me_owner;
> > + __uint64_t me_startblock;
> > + __uint64_t me_startoff;
> > + __uint32_t me_len;
> > + __uint32_t me_flags;
> > +};
> > +
> > +/* rmap me_flags: upper bits are flags, lower byte is type code */
> > +#define XFS_RMAP_EXTENT_MAP 1
> > +#define XFS_RMAP_EXTENT_MAP_SHARED 2
> > +#define XFS_RMAP_EXTENT_UNMAP 3
> > +#define XFS_RMAP_EXTENT_UNMAP_SHARED 4
> > +#define XFS_RMAP_EXTENT_CONVERT 5
> > +#define XFS_RMAP_EXTENT_CONVERT_SHARED 6
> > +#define XFS_RMAP_EXTENT_ALLOC 7
> > +#define XFS_RMAP_EXTENT_FREE 8
> > +#define XFS_RMAP_EXTENT_TYPE_MASK 0xFF
>
> I assume all of the _SHARED stuff defined here and throughout is not
> used until reflink.. (not that big of a deal if it's a PITA to remove).
Yep, these are for reflink.
> > +
> > +#define XFS_RMAP_EXTENT_ATTR_FORK (1U << 31)
> > +#define XFS_RMAP_EXTENT_BMBT_BLOCK (1U << 30)
> > +#define XFS_RMAP_EXTENT_UNWRITTEN (1U << 29)
> > +
> > +#define XFS_RMAP_EXTENT_FLAGS (XFS_RMAP_EXTENT_TYPE_MASK | \
> > + XFS_RMAP_EXTENT_ATTR_FORK | \
> > + XFS_RMAP_EXTENT_BMBT_BLOCK | \
> > + XFS_RMAP_EXTENT_UNWRITTEN)
> > +
> > +/*
> > + * This is the structure used to lay out an rui log item in the
> > + * log. The rui_extents field is a variable size array whose
> > + * size is given by rui_nextents.
> > + */
> > +struct xfs_rui_log_format {
> > + __uint16_t rui_type; /* rui log item type */
> > + __uint16_t rui_size; /* size of this item */
> > + __uint32_t rui_nextents; /* # extents to free */
> > + __uint64_t rui_id; /* rui identifier */
> > + struct xfs_map_extent rui_extents[1]; /* array of extents to rmap */
> > +};
> > +
> > +/*
> > + * This is the structure used to lay out an rud log item in the
> > + * log. The rud_extents array is a variable size array whose
> > + * size is given by rud_nextents;
> > + */
> > +struct xfs_rud_log_format {
> > + __uint16_t rud_type; /* rud log item type */
> > + __uint16_t rud_size; /* size of this item */
> > + __uint32_t rud_nextents; /* # of extents freed */
> > + __uint64_t rud_rui_id; /* id of corresponding rui */
> > + struct xfs_map_extent rud_extents[1]; /* array of extents rmapped */
> > +};
> > +
> > +/*
> > * Dquot Log format definitions.
> > *
> > * The first two fields must be the type and size fitting into
> ...
> > diff --git a/fs/xfs/xfs_rmap_item.c b/fs/xfs/xfs_rmap_item.c
> > new file mode 100644
> > index 0000000..91a3b2c
> > --- /dev/null
> > +++ b/fs/xfs/xfs_rmap_item.c
> > @@ -0,0 +1,459 @@
> ...
> > +/*
> > + * Copy an RUI format buffer from the given buf, and into the destination
> > + * RUI format structure. The RUI/RUD items were designed not to need any
> > + * special alignment handling.
> > + */
> > +int
> > +xfs_rui_copy_format(
> > + struct xfs_log_iovec *buf,
> > + struct xfs_rui_log_format *dst_rui_fmt)
> > +{
> > + struct xfs_rui_log_format *src_rui_fmt;
> > + uint len;
> > +
> > + src_rui_fmt = buf->i_addr;
> > + len = sizeof(struct xfs_rui_log_format) +
> > + (src_rui_fmt->rui_nextents - 1) *
> > + sizeof(struct xfs_map_extent);
> > +
> > + if (buf->i_len == len) {
> > + memcpy((char *)dst_rui_fmt, (char *)src_rui_fmt, len);
> > + return 0;
> > + }
> > + return -EFSCORRUPTED;
>
> I'd switch this around since we don't have the mess that
> xfs_efi_copy_format() has to deal with. E.g.,
>
> if (buf->i_len != len)
> return -EFSCORRUPTED;
>
> memcpy(..);
> return 0;
Will do.
--D
>
> Brian
>
> > +}
> > +
> > +/*
> > + * Freeing the RUI requires that we remove it from the AIL if it has already
> > + * been placed there. However, the RUI may not yet have been placed in the AIL
> > + * when called by xfs_rui_release() from RUD processing due to the ordering of
> > + * committed vs unpin operations in bulk insert operations. Hence the reference
> > + * count to ensure only the last caller frees the RUI.
> > + */
> > +void
> > +xfs_rui_release(
> > + struct xfs_rui_log_item *ruip)
> > +{
> > + if (atomic_dec_and_test(&ruip->rui_refcount)) {
> > + xfs_trans_ail_remove(&ruip->rui_item, SHUTDOWN_LOG_IO_ERROR);
> > + xfs_rui_item_free(ruip);
> > + }
> > +}
> > +
> > +static inline struct xfs_rud_log_item *RUD_ITEM(struct xfs_log_item *lip)
> > +{
> > + return container_of(lip, struct xfs_rud_log_item, rud_item);
> > +}
> > +
> > +STATIC void
> > +xfs_rud_item_free(struct xfs_rud_log_item *rudp)
> > +{
> > + if (rudp->rud_format.rud_nextents > XFS_RUD_MAX_FAST_EXTENTS)
> > + kmem_free(rudp);
> > + else
> > + kmem_zone_free(xfs_rud_zone, rudp);
> > +}
> > +
> > +/*
> > + * This returns the number of iovecs needed to log the given rud item.
> > + * We only need 1 iovec for an rud item. It just logs the rud_log_format
> > + * structure.
> > + */
> > +static inline int
> > +xfs_rud_item_sizeof(
> > + struct xfs_rud_log_item *rudp)
> > +{
> > + return sizeof(struct xfs_rud_log_format) +
> > + (rudp->rud_format.rud_nextents - 1) *
> > + sizeof(struct xfs_map_extent);
> > +}
> > +
> > +STATIC void
> > +xfs_rud_item_size(
> > + struct xfs_log_item *lip,
> > + int *nvecs,
> > + int *nbytes)
> > +{
> > + *nvecs += 1;
> > + *nbytes += xfs_rud_item_sizeof(RUD_ITEM(lip));
> > +}
> > +
> > +/*
> > + * This is called to fill in the vector of log iovecs for the
> > + * given rud log item. We use only 1 iovec, and we point that
> > + * at the rud_log_format structure embedded in the rud item.
> > + * It is at this point that we assert that all of the extent
> > + * slots in the rud item have been filled.
> > + */
> > +STATIC void
> > +xfs_rud_item_format(
> > + struct xfs_log_item *lip,
> > + struct xfs_log_vec *lv)
> > +{
> > + struct xfs_rud_log_item *rudp = RUD_ITEM(lip);
> > + struct xfs_log_iovec *vecp = NULL;
> > +
> > + ASSERT(rudp->rud_next_extent == rudp->rud_format.rud_nextents);
> > +
> > + rudp->rud_format.rud_type = XFS_LI_RUD;
> > + rudp->rud_format.rud_size = 1;
> > +
> > + xlog_copy_iovec(lv, &vecp, XLOG_REG_TYPE_RUD_FORMAT, &rudp->rud_format,
> > + xfs_rud_item_sizeof(rudp));
> > +}
> > +
> > +/*
> > + * Pinning has no meaning for an rud item, so just return.
> > + */
> > +STATIC void
> > +xfs_rud_item_pin(
> > + struct xfs_log_item *lip)
> > +{
> > +}
> > +
> > +/*
> > + * Since pinning has no meaning for an rud item, unpinning does
> > + * not either.
> > + */
> > +STATIC void
> > +xfs_rud_item_unpin(
> > + struct xfs_log_item *lip,
> > + int remove)
> > +{
> > +}
> > +
> > +/*
> > + * There isn't much you can do to push on an rud item. It is simply stuck
> > + * waiting for the log to be flushed to disk.
> > + */
> > +STATIC uint
> > +xfs_rud_item_push(
> > + struct xfs_log_item *lip,
> > + struct list_head *buffer_list)
> > +{
> > + return XFS_ITEM_PINNED;
> > +}
> > +
> > +/*
> > + * The RUD is either committed or aborted if the transaction is cancelled. If
> > + * the transaction is cancelled, drop our reference to the RUI and free the
> > + * RUD.
> > + */
> > +STATIC void
> > +xfs_rud_item_unlock(
> > + struct xfs_log_item *lip)
> > +{
> > + struct xfs_rud_log_item *rudp = RUD_ITEM(lip);
> > +
> > + if (lip->li_flags & XFS_LI_ABORTED) {
> > + xfs_rui_release(rudp->rud_ruip);
> > + xfs_rud_item_free(rudp);
> > + }
> > +}
> > +
> > +/*
> > + * When the rud item is committed to disk, all we need to do is delete our
> > + * reference to our partner rui item and then free ourselves. Since we're
> > + * freeing ourselves we must return -1 to keep the transaction code from
> > + * further referencing this item.
> > + */
> > +STATIC xfs_lsn_t
> > +xfs_rud_item_committed(
> > + struct xfs_log_item *lip,
> > + xfs_lsn_t lsn)
> > +{
> > + struct xfs_rud_log_item *rudp = RUD_ITEM(lip);
> > +
> > + /*
> > + * Drop the RUI reference regardless of whether the RUD has been
> > + * aborted. Once the RUD transaction is constructed, it is the sole
> > + * responsibility of the RUD to release the RUI (even if the RUI is
> > + * aborted due to log I/O error).
> > + */
> > + xfs_rui_release(rudp->rud_ruip);
> > + xfs_rud_item_free(rudp);
> > +
> > + return (xfs_lsn_t)-1;
> > +}
> > +
> > +/*
> > + * The RUD dependency tracking op doesn't do squat. It can't because
> > + * it doesn't know where the free extent is coming from. The dependency
> > + * tracking has to be handled by the "enclosing" metadata object. For
> > + * example, for inodes, the inode is locked throughout the extent freeing
> > + * so the dependency should be recorded there.
> > + */
> > +STATIC void
> > +xfs_rud_item_committing(
> > + struct xfs_log_item *lip,
> > + xfs_lsn_t lsn)
> > +{
> > +}
> > +
> > +/*
> > + * This is the ops vector shared by all rud log items.
> > + */
> > +static const struct xfs_item_ops xfs_rud_item_ops = {
> > + .iop_size = xfs_rud_item_size,
> > + .iop_format = xfs_rud_item_format,
> > + .iop_pin = xfs_rud_item_pin,
> > + .iop_unpin = xfs_rud_item_unpin,
> > + .iop_unlock = xfs_rud_item_unlock,
> > + .iop_committed = xfs_rud_item_committed,
> > + .iop_push = xfs_rud_item_push,
> > + .iop_committing = xfs_rud_item_committing,
> > +};
> > +
> > +/*
> > + * Allocate and initialize an rud item with the given number of extents.
> > + */
> > +struct xfs_rud_log_item *
> > +xfs_rud_init(
> > + struct xfs_mount *mp,
> > + struct xfs_rui_log_item *ruip,
> > + uint nextents)
> > +
> > +{
> > + struct xfs_rud_log_item *rudp;
> > + uint size;
> > +
> > + ASSERT(nextents > 0);
> > + if (nextents > XFS_RUD_MAX_FAST_EXTENTS) {
> > + size = (uint)(sizeof(struct xfs_rud_log_item) +
> > + ((nextents - 1) * sizeof(struct xfs_map_extent)));
> > + rudp = kmem_zalloc(size, KM_SLEEP);
> > + } else {
> > + rudp = kmem_zone_zalloc(xfs_rud_zone, KM_SLEEP);
> > + }
> > +
> > + xfs_log_item_init(mp, &rudp->rud_item, XFS_LI_RUD, &xfs_rud_item_ops);
> > + rudp->rud_ruip = ruip;
> > + rudp->rud_format.rud_nextents = nextents;
> > + rudp->rud_format.rud_rui_id = ruip->rui_format.rui_id;
> > +
> > + return rudp;
> > +}
> > diff --git a/fs/xfs/xfs_rmap_item.h b/fs/xfs/xfs_rmap_item.h
> > new file mode 100644
> > index 0000000..bd36ab5
> > --- /dev/null
> > +++ b/fs/xfs/xfs_rmap_item.h
> > @@ -0,0 +1,100 @@
> > +/*
> > + * Copyright (C) 2016 Oracle. All Rights Reserved.
> > + *
> > + * Author: Darrick J. Wong <darrick.wong@oracle.com>
> > + *
> > + * This program is free software; you can redistribute it and/or
> > + * modify it under the terms of the GNU General Public License
> > + * as published by the Free Software Foundation; either version 2
> > + * of the License, or (at your option) any later version.
> > + *
> > + * This program is distributed in the hope that it would be useful,
> > + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> > + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
> > + * GNU General Public License for more details.
> > + *
> > + * You should have received a copy of the GNU General Public License
> > + * along with this program; if not, write the Free Software Foundation,
> > + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
> > + */
> > +#ifndef __XFS_RMAP_ITEM_H__
> > +#define __XFS_RMAP_ITEM_H__
> > +
> > +/*
> > + * There are (currently) three pairs of rmap btree redo item types: map, unmap,
> > + * and convert. The common abbreviations for these are RUI (rmap update
> > + * intent) and RUD (rmap update done). The redo item type is encoded in the
> > + * flags field of each xfs_map_extent.
> > + *
> > + * *I items should be recorded in the *first* of a series of rolled
> > + * transactions, and the *D items should be recorded in the same transaction
> > + * that records the associated rmapbt updates. Typically, the first
> > + * transaction will record a bmbt update, followed by some number of
> > + * transactions containing rmapbt updates, and finally transactions with any
> > + * bnobt/cntbt updates.
> > + *
> > + * Should the system crash after the commit of the first transaction but
> > + * before the commit of the final transaction in a series, log recovery will
> > + * use the redo information recorded by the intent items to replay the
> > + * (rmapbt/bnobt/cntbt) metadata updates in the non-first transaction.
> > + */
> > +
> > +/* kernel only RUI/RUD definitions */
> > +
> > +struct xfs_mount;
> > +struct kmem_zone;
> > +
> > +/*
> > + * Max number of extents in fast allocation path.
> > + */
> > +#define XFS_RUI_MAX_FAST_EXTENTS 16
> > +
> > +/*
> > + * Define RUI flag bits. Manipulated by set/clear/test_bit operators.
> > + */
> > +#define XFS_RUI_RECOVERED 1
> > +
> > +/*
> > + * This is the "rmap update intent" log item. It is used to log the fact that
> > + * some reverse mappings need to change. It is used in conjunction with the
> > + * "rmap update done" log item described below.
> > + *
> > + * These log items follow the same rules as struct xfs_efi_log_item; see the
> > + * comments about that structure (in xfs_extfree_item.h) for more details.
> > + */
> > +struct xfs_rui_log_item {
> > + struct xfs_log_item rui_item;
> > + atomic_t rui_refcount;
> > + atomic_t rui_next_extent;
> > + unsigned long rui_flags; /* misc flags */
> > + struct xfs_rui_log_format rui_format;
> > +};
> > +
> > +/*
> > + * This is the "rmap update done" log item. It is used to log the fact that
> > + * some rmapbt updates mentioned in an earlier rui item have been performed.
> > + */
> > +struct xfs_rud_log_item {
> > + struct xfs_log_item rud_item;
> > + struct xfs_rui_log_item *rud_ruip;
> > + uint rud_next_extent;
> > + struct xfs_rud_log_format rud_format;
> > +};
> > +
> > +/*
> > + * Max number of extents in fast allocation path.
> > + */
> > +#define XFS_RUD_MAX_FAST_EXTENTS 16
> > +
> > +extern struct kmem_zone *xfs_rui_zone;
> > +extern struct kmem_zone *xfs_rud_zone;
> > +
> > +struct xfs_rui_log_item *xfs_rui_init(struct xfs_mount *, uint);
> > +struct xfs_rud_log_item *xfs_rud_init(struct xfs_mount *,
> > + struct xfs_rui_log_item *, uint);
> > +int xfs_rui_copy_format(struct xfs_log_iovec *buf,
> > + struct xfs_rui_log_format *dst_rui_fmt);
> > +void xfs_rui_item_free(struct xfs_rui_log_item *);
> > +void xfs_rui_release(struct xfs_rui_log_item *);
> > +
> > +#endif /* __XFS_RMAP_ITEM_H__ */
> > diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c
> > index 1575849..a8300e4 100644
> > --- a/fs/xfs/xfs_super.c
> > +++ b/fs/xfs/xfs_super.c
> > @@ -47,6 +47,7 @@
> > #include "xfs_sysfs.h"
> > #include "xfs_ondisk.h"
> > #include "xfs_defer.h"
> > +#include "xfs_rmap_item.h"
> >
> > #include <linux/namei.h>
> > #include <linux/init.h>
> > @@ -1762,8 +1763,26 @@ xfs_init_zones(void)
> > if (!xfs_icreate_zone)
> > goto out_destroy_ili_zone;
> >
> > + xfs_rud_zone = kmem_zone_init((sizeof(struct xfs_rud_log_item) +
> > + ((XFS_RUD_MAX_FAST_EXTENTS - 1) *
> > + sizeof(struct xfs_map_extent))),
> > + "xfs_rud_item");
> > + if (!xfs_rud_zone)
> > + goto out_destroy_icreate_zone;
> > +
> > + xfs_rui_zone = kmem_zone_init((sizeof(struct xfs_rui_log_item) +
> > + ((XFS_RUI_MAX_FAST_EXTENTS - 1) *
> > + sizeof(struct xfs_map_extent))),
> > + "xfs_rui_item");
> > + if (!xfs_rui_zone)
> > + goto out_destroy_rud_zone;
> > +
> > return 0;
> >
> > + out_destroy_rud_zone:
> > + kmem_zone_destroy(xfs_rud_zone);
> > + out_destroy_icreate_zone:
> > + kmem_zone_destroy(xfs_icreate_zone);
> > out_destroy_ili_zone:
> > kmem_zone_destroy(xfs_ili_zone);
> > out_destroy_inode_zone:
> > @@ -1802,6 +1821,8 @@ xfs_destroy_zones(void)
> > * destroy caches.
> > */
> > rcu_barrier();
> > + kmem_zone_destroy(xfs_rui_zone);
> > + kmem_zone_destroy(xfs_rud_zone);
> > kmem_zone_destroy(xfs_icreate_zone);
> > kmem_zone_destroy(xfs_ili_zone);
> > kmem_zone_destroy(xfs_inode_zone);
> >
> > _______________________________________________
> > xfs mailing list
> > xfs@oss.sgi.com
> > http://oss.sgi.com/mailman/listinfo/xfs
next prev parent reply other threads:[~2016-07-16 7:10 UTC|newest]
Thread overview: 236+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-06-17 1:17 [PATCH v6 000/119] xfs: add reverse mapping, reflink, dedupe, and online scrub support Darrick J. Wong
2016-06-17 1:17 ` [PATCH 001/119] vfs: fix return type of ioctl_file_dedupe_range Darrick J. Wong
2016-06-17 11:32 ` Christoph Hellwig
2016-06-28 19:19 ` Darrick J. Wong
2016-06-17 1:18 ` [PATCH 002/119] vfs: support FS_XFLAG_REFLINK and FS_XFLAG_COWEXTSIZE Darrick J. Wong
2016-06-17 11:41 ` Christoph Hellwig
2016-06-17 12:16 ` Brian Foster
2016-06-17 15:06 ` Christoph Hellwig
2016-06-17 16:54 ` Darrick J. Wong
2016-06-17 17:38 ` Brian Foster
2016-06-17 1:18 ` [PATCH 003/119] xfs: check offsets of variable length structures Darrick J. Wong
2016-06-17 11:33 ` Christoph Hellwig
2016-06-17 17:34 ` Brian Foster
2016-06-18 18:01 ` Darrick J. Wong
2016-06-20 12:38 ` Brian Foster
2016-06-17 1:18 ` [PATCH 004/119] xfs: enable buffer deadlock postmortem diagnosis via ftrace Darrick J. Wong
2016-06-17 11:34 ` Christoph Hellwig
2016-06-21 0:47 ` Dave Chinner
2016-06-17 1:18 ` [PATCH 005/119] xfs: check for a valid error_tag in errortag_add Darrick J. Wong
2016-06-17 11:34 ` Christoph Hellwig
2016-06-17 1:18 ` [PATCH 006/119] xfs: port differences from xfsprogs libxfs Darrick J. Wong
2016-06-17 15:06 ` Christoph Hellwig
2016-06-20 0:21 ` Dave Chinner
2016-07-13 23:39 ` Darrick J. Wong
2016-06-17 1:18 ` [PATCH 007/119] xfs: rearrange xfs_bmap_add_free parameters Darrick J. Wong
2016-06-17 11:39 ` Christoph Hellwig
2016-06-17 1:18 ` [PATCH 008/119] xfs: separate freelist fixing into a separate helper Darrick J. Wong
2016-06-17 11:52 ` Christoph Hellwig
2016-06-21 0:48 ` Dave Chinner
2016-06-21 1:40 ` Dave Chinner
2016-06-17 1:18 ` [PATCH 009/119] xfs: convert list of extents to free into a regular list Darrick J. Wong
2016-06-17 11:59 ` Christoph Hellwig
2016-06-18 20:15 ` Darrick J. Wong
2016-06-21 0:57 ` Dave Chinner
2016-06-17 1:18 ` [PATCH 010/119] xfs: create a standard btree size calculator code Darrick J. Wong
2016-06-20 14:31 ` Brian Foster
2016-06-20 19:34 ` Darrick J. Wong
2016-06-17 1:19 ` [PATCH 011/119] xfs: refactor btree maxlevels computation Darrick J. Wong
2016-06-20 14:31 ` Brian Foster
2016-06-20 18:23 ` Darrick J. Wong
2016-06-17 1:19 ` [PATCH 012/119] xfs: during btree split, save new block key & ptr for future insertion Darrick J. Wong
2016-06-21 13:00 ` Brian Foster
2016-06-27 22:30 ` Darrick J. Wong
2016-06-28 12:31 ` Brian Foster
2016-06-17 1:19 ` [PATCH 013/119] xfs: support btrees with overlapping intervals for keys Darrick J. Wong
2016-06-22 15:17 ` Brian Foster
2016-06-28 3:26 ` Darrick J. Wong
2016-06-28 12:32 ` Brian Foster
2016-06-28 17:36 ` Darrick J. Wong
2016-07-06 4:59 ` Dave Chinner
2016-07-06 8:09 ` Darrick J. Wong
2016-06-17 1:19 ` [PATCH 014/119] xfs: introduce interval queries on btrees Darrick J. Wong
2016-06-22 15:18 ` Brian Foster
2016-06-27 21:07 ` Darrick J. Wong
2016-06-28 12:32 ` Brian Foster
2016-06-28 16:29 ` Darrick J. Wong
2016-06-17 1:19 ` [PATCH 015/119] xfs: refactor btree owner change into a separate visit-blocks function Darrick J. Wong
2016-06-23 17:19 ` Brian Foster
2016-06-17 1:19 ` [PATCH 016/119] xfs: move deferred operations into a separate file Darrick J. Wong
2016-06-27 13:14 ` Brian Foster
2016-06-27 19:14 ` Darrick J. Wong
2016-06-28 12:32 ` Brian Foster
2016-06-28 18:51 ` Darrick J. Wong
2016-06-17 1:19 ` [PATCH 017/119] xfs: add tracepoints for the deferred ops mechanism Darrick J. Wong
2016-06-27 13:15 ` Brian Foster
2016-06-17 1:19 ` [PATCH 018/119] xfs: enable the xfs_defer mechanism to process extents to free Darrick J. Wong
2016-06-27 13:15 ` Brian Foster
2016-06-27 21:41 ` Darrick J. Wong
2016-06-27 22:00 ` Darrick J. Wong
2016-06-28 12:32 ` Brian Foster
2016-06-28 16:33 ` Darrick J. Wong
2016-06-17 1:19 ` [PATCH 019/119] xfs: rework xfs_bmap_free callers to use xfs_defer_ops Darrick J. Wong
2016-06-17 1:20 ` [PATCH 020/119] xfs: change xfs_bmap_{finish, cancel, init, free} -> xfs_defer_* Darrick J. Wong
2016-06-30 0:11 ` Darrick J. Wong
2016-06-17 1:20 ` [PATCH 021/119] xfs: rename flist/free_list to dfops Darrick J. Wong
2016-06-17 1:20 ` [PATCH 022/119] xfs: add tracepoints and error injection for deferred extent freeing Darrick J. Wong
2016-06-17 1:20 ` [PATCH 023/119] xfs: introduce rmap btree definitions Darrick J. Wong
2016-06-30 17:32 ` Brian Foster
2016-06-17 1:20 ` [PATCH 024/119] xfs: add rmap btree stats infrastructure Darrick J. Wong
2016-06-30 17:32 ` Brian Foster
2016-06-17 1:20 ` [PATCH 025/119] xfs: rmap btree add more reserved blocks Darrick J. Wong
2016-06-30 17:32 ` Brian Foster
2016-06-17 1:20 ` [PATCH 026/119] xfs: add owner field to extent allocation and freeing Darrick J. Wong
2016-07-06 4:01 ` Dave Chinner
2016-07-06 6:44 ` Darrick J. Wong
2016-07-07 15:12 ` Brian Foster
2016-07-07 19:09 ` Darrick J. Wong
2016-07-07 22:55 ` Dave Chinner
2016-07-08 11:37 ` Brian Foster
2016-06-17 1:20 ` [PATCH 027/119] xfs: introduce rmap extent operation stubs Darrick J. Wong
2016-06-17 1:20 ` [PATCH 028/119] xfs: define the on-disk rmap btree format Darrick J. Wong
2016-07-06 4:05 ` Dave Chinner
2016-07-06 6:44 ` Darrick J. Wong
2016-07-07 18:41 ` Brian Foster
2016-07-07 19:18 ` Darrick J. Wong
2016-07-07 23:14 ` Dave Chinner
2016-07-07 23:58 ` Darrick J. Wong
2016-06-17 1:20 ` [PATCH 029/119] xfs: add rmap btree growfs support Darrick J. Wong
2016-06-17 1:21 ` [PATCH 030/119] xfs: rmap btree transaction reservations Darrick J. Wong
2016-07-08 13:21 ` Brian Foster
2016-06-17 1:21 ` [PATCH 031/119] xfs: rmap btree requires more reserved free space Darrick J. Wong
2016-07-08 13:21 ` Brian Foster
2016-07-13 16:50 ` Darrick J. Wong
2016-07-13 18:32 ` Brian Foster
2016-07-13 23:50 ` Dave Chinner
2016-06-17 1:21 ` [PATCH 032/119] xfs: add rmap btree operations Darrick J. Wong
2016-07-08 18:33 ` Brian Foster
2016-07-08 23:53 ` Darrick J. Wong
2016-06-17 1:21 ` [PATCH 033/119] xfs: support overlapping intervals in the rmap btree Darrick J. Wong
2016-07-08 18:33 ` Brian Foster
2016-07-09 0:14 ` Darrick J. Wong
2016-07-09 13:25 ` Brian Foster
2016-06-17 1:21 ` [PATCH 034/119] xfs: teach rmapbt to support interval queries Darrick J. Wong
2016-07-08 18:34 ` Brian Foster
2016-07-09 0:16 ` Darrick J. Wong
2016-07-09 13:25 ` Brian Foster
2016-06-17 1:21 ` [PATCH 035/119] xfs: add tracepoints for the rmap functions Darrick J. Wong
2016-07-08 18:34 ` Brian Foster
2016-06-17 1:21 ` [PATCH 036/119] xfs: add an extent to the rmap btree Darrick J. Wong
2016-07-11 18:49 ` Brian Foster
2016-07-11 23:01 ` Darrick J. Wong
2016-06-17 1:21 ` [PATCH 037/119] xfs: remove an extent from " Darrick J. Wong
2016-07-11 18:49 ` Brian Foster
2016-06-17 1:21 ` [PATCH 038/119] xfs: convert unwritten status of reverse mappings Darrick J. Wong
2016-06-30 0:15 ` Darrick J. Wong
2016-07-13 18:27 ` Brian Foster
2016-07-13 20:43 ` Darrick J. Wong
2016-06-17 1:22 ` [PATCH 039/119] xfs: add rmap btree insert and delete helpers Darrick J. Wong
2016-07-13 18:28 ` Brian Foster
2016-07-13 18:37 ` Darrick J. Wong
2016-07-13 18:42 ` Brian Foster
2016-06-17 1:22 ` [PATCH 040/119] xfs: create helpers for mapping, unmapping, and converting file fork extents Darrick J. Wong
2016-07-13 18:28 ` Brian Foster
2016-07-13 18:47 ` Darrick J. Wong
2016-07-13 23:54 ` Dave Chinner
2016-07-13 23:55 ` Darrick J. Wong
2016-06-17 1:22 ` [PATCH 041/119] xfs: create rmap update intent log items Darrick J. Wong
2016-07-15 18:33 ` Brian Foster
2016-07-16 7:10 ` Darrick J. Wong [this message]
2016-06-17 1:22 ` [PATCH 042/119] xfs: log rmap intent items Darrick J. Wong
2016-07-15 18:33 ` Brian Foster
2016-07-16 7:34 ` Darrick J. Wong
2016-07-18 12:55 ` Brian Foster
2016-07-19 17:10 ` Darrick J. Wong
2016-06-17 1:22 ` [PATCH 043/119] xfs: enable the xfs_defer mechanism to process rmaps to update Darrick J. Wong
2016-07-15 18:33 ` Brian Foster
2016-06-17 1:22 ` [PATCH 044/119] xfs: propagate bmap updates to rmapbt Darrick J. Wong
2016-07-15 18:33 ` Brian Foster
2016-07-16 7:26 ` Darrick J. Wong
2016-07-18 1:21 ` Dave Chinner
2016-07-18 12:56 ` Brian Foster
2016-07-18 12:55 ` Brian Foster
2016-07-19 1:53 ` Darrick J. Wong
2016-07-19 11:37 ` Brian Foster
2016-06-17 1:22 ` [PATCH 045/119] xfs: add rmap btree geometry feature flag Darrick J. Wong
2016-07-18 13:34 ` Brian Foster
2016-06-17 1:22 ` [PATCH 046/119] xfs: add rmap btree block detection to log recovery Darrick J. Wong
2016-07-18 13:34 ` Brian Foster
2016-06-17 1:22 ` [PATCH 047/119] xfs: disable XFS_IOC_SWAPEXT when rmap btree is enabled Darrick J. Wong
2016-07-18 13:34 ` Brian Foster
2016-07-18 16:18 ` Darrick J. Wong
2016-06-17 1:22 ` [PATCH 048/119] xfs: don't update rmapbt when fixing agfl Darrick J. Wong
2016-07-18 13:34 ` Brian Foster
2016-07-18 15:53 ` Darrick J. Wong
2016-06-17 1:23 ` [PATCH 049/119] xfs: enable the rmap btree functionality Darrick J. Wong
2016-07-18 13:34 ` Brian Foster
2016-06-17 1:23 ` [PATCH 050/119] xfs: count the blocks in a btree Darrick J. Wong
2016-06-17 1:23 ` [PATCH 051/119] xfs: introduce tracepoints for AG reservation code Darrick J. Wong
2016-06-17 1:23 ` [PATCH 052/119] xfs: set up per-AG free space reservations Darrick J. Wong
2016-06-17 1:23 ` [PATCH 053/119] xfs: define tracepoints for refcount btree activities Darrick J. Wong
2016-06-17 1:23 ` [PATCH 054/119] xfs: introduce refcount btree definitions Darrick J. Wong
2016-06-17 1:23 ` [PATCH 055/119] xfs: add refcount btree stats infrastructure Darrick J. Wong
2016-06-17 1:23 ` [PATCH 056/119] xfs: refcount btree add more reserved blocks Darrick J. Wong
2016-06-17 1:23 ` [PATCH 057/119] xfs: define the on-disk refcount btree format Darrick J. Wong
2016-06-17 1:24 ` [PATCH 058/119] xfs: add refcount btree support to growfs Darrick J. Wong
2016-06-17 1:24 ` [PATCH 059/119] xfs: account for the refcount btree in the alloc/free log reservation Darrick J. Wong
2016-06-17 1:24 ` [PATCH 060/119] xfs: add refcount btree operations Darrick J. Wong
2016-06-17 1:24 ` [PATCH 061/119] xfs: create refcount update intent log items Darrick J. Wong
2016-06-17 1:24 ` [PATCH 062/119] xfs: log refcount intent items Darrick J. Wong
2016-06-17 1:24 ` [PATCH 063/119] xfs: adjust refcount of an extent of blocks in refcount btree Darrick J. Wong
2016-06-17 1:24 ` [PATCH 064/119] xfs: connect refcount adjust functions to upper layers Darrick J. Wong
2016-06-17 1:24 ` [PATCH 065/119] xfs: adjust refcount when unmapping file blocks Darrick J. Wong
2016-06-17 1:24 ` [PATCH 066/119] xfs: add refcount btree block detection to log recovery Darrick J. Wong
2016-06-17 1:25 ` [PATCH 067/119] xfs: refcount btree requires more reserved space Darrick J. Wong
2016-06-17 1:25 ` [PATCH 068/119] xfs: introduce reflink utility functions Darrick J. Wong
2016-06-17 1:25 ` [PATCH 069/119] xfs: create bmbt update intent log items Darrick J. Wong
2016-06-17 1:25 ` [PATCH 070/119] xfs: log bmap intent items Darrick J. Wong
2016-06-17 1:25 ` [PATCH 071/119] xfs: map an inode's offset to an exact physical block Darrick J. Wong
2016-06-17 1:25 ` [PATCH 072/119] xfs: implement deferred bmbt map/unmap operations Darrick J. Wong
2016-06-17 1:25 ` [PATCH 073/119] xfs: return work remaining at the end of a bunmapi operation Darrick J. Wong
2016-06-17 1:25 ` [PATCH 074/119] xfs: define tracepoints for reflink activities Darrick J. Wong
2016-06-17 1:25 ` [PATCH 075/119] xfs: add reflink feature flag to geometry Darrick J. Wong
2016-06-17 1:25 ` [PATCH 076/119] xfs: don't allow reflinked dir/dev/fifo/socket/pipe files Darrick J. Wong
2016-06-17 1:26 ` [PATCH 077/119] xfs: introduce the CoW fork Darrick J. Wong
2016-06-17 1:26 ` [PATCH 078/119] xfs: support bmapping delalloc extents in " Darrick J. Wong
2016-06-17 1:26 ` [PATCH 079/119] xfs: create delalloc extents in " Darrick J. Wong
2016-06-17 1:26 ` [PATCH 080/119] xfs: support allocating delayed " Darrick J. Wong
2016-06-17 1:26 ` [PATCH 081/119] xfs: allocate " Darrick J. Wong
2016-06-17 1:26 ` [PATCH 082/119] xfs: support removing extents from " Darrick J. Wong
2016-06-17 1:26 ` [PATCH 083/119] xfs: move mappings from cow fork to data fork after copy-write Darrick J. Wong
2016-06-17 1:26 ` [PATCH 084/119] xfs: implement CoW for directio writes Darrick J. Wong
2016-06-17 1:26 ` [PATCH 085/119] xfs: copy-on-write reflinked blocks when zeroing ranges of blocks Darrick J. Wong
2016-06-17 1:27 ` [PATCH 086/119] xfs: cancel CoW reservations and clear inode reflink flag when freeing blocks Darrick J. Wong
2016-06-17 1:27 ` [PATCH 087/119] xfs: cancel pending CoW reservations when destroying inodes Darrick J. Wong
2016-06-17 1:27 ` [PATCH 088/119] xfs: store in-progress CoW allocations in the refcount btree Darrick J. Wong
2016-06-17 1:27 ` [PATCH 089/119] xfs: reflink extents from one file to another Darrick J. Wong
2016-06-17 1:27 ` [PATCH 090/119] xfs: add clone file and clone range vfs functions Darrick J. Wong
2016-06-17 1:27 ` [PATCH 091/119] xfs: add dedupe range vfs function Darrick J. Wong
2016-06-17 1:27 ` [PATCH 092/119] xfs: teach get_bmapx and fiemap about shared extents and the CoW fork Darrick J. Wong
2016-06-17 1:27 ` [PATCH 093/119] xfs: swap inode reflink flags when swapping inode extents Darrick J. Wong
2016-06-17 1:27 ` [PATCH 094/119] xfs: unshare a range of blocks via fallocate Darrick J. Wong
2016-06-17 1:28 ` [PATCH 095/119] xfs: CoW shared EOF block when truncating file Darrick J. Wong
2016-06-17 1:28 ` [PATCH 096/119] xfs: support FS_XFLAG_REFLINK on reflink filesystems Darrick J. Wong
2016-06-17 1:28 ` [PATCH 097/119] xfs: create a separate cow extent size hint for the allocator Darrick J. Wong
2016-06-17 1:28 ` [PATCH 098/119] xfs: preallocate blocks for worst-case btree expansion Darrick J. Wong
2016-06-17 1:28 ` [PATCH 099/119] xfs: don't allow reflink when the AG is low on space Darrick J. Wong
2016-06-17 1:28 ` [PATCH 100/119] xfs: try other AGs to allocate a BMBT block Darrick J. Wong
2016-06-17 1:28 ` [PATCH 101/119] xfs: promote buffered writes to CoW when cowextsz is set Darrick J. Wong
2016-06-17 1:28 ` [PATCH 102/119] xfs: garbage collect old cowextsz reservations Darrick J. Wong
2016-06-17 1:28 ` [PATCH 103/119] xfs: provide switch to force filesystem to copy-on-write all the time Darrick J. Wong
2016-06-17 1:29 ` [PATCH 104/119] xfs: increase log reservations for reflink Darrick J. Wong
2016-06-17 1:29 ` [PATCH 105/119] xfs: use interval query for rmap alloc operations on shared files Darrick J. Wong
2016-06-17 1:29 ` [PATCH 106/119] xfs: convert unwritten status of reverse mappings for " Darrick J. Wong
2016-06-17 1:29 ` [PATCH 107/119] xfs: set a default CoW extent size of 32 blocks Darrick J. Wong
2016-06-17 1:29 ` [PATCH 108/119] xfs: don't allow realtime and reflinked files to mix Darrick J. Wong
2016-06-17 1:29 ` [PATCH 109/119] xfs: don't mix reflink and DAX mode for now Darrick J. Wong
2016-06-17 1:29 ` [PATCH 110/119] xfs: fail ->bmap for reflink inodes Darrick J. Wong
2016-06-17 1:29 ` [PATCH 111/119] xfs: recognize the reflink feature bit Darrick J. Wong
2016-06-17 1:29 ` [PATCH 112/119] xfs: introduce the XFS_IOC_GETFSMAPX ioctl Darrick J. Wong
2016-06-17 1:30 ` [PATCH 113/119] xfs: scrub btree records and pointers while querying Darrick J. Wong
2016-06-17 1:30 ` [PATCH 114/119] xfs: create sysfs hooks to scrub various files Darrick J. Wong
2016-06-17 1:30 ` [PATCH 115/119] xfs: support scrubbing free space btrees Darrick J. Wong
2016-06-17 1:30 ` [PATCH 116/119] xfs: support scrubbing inode btrees Darrick J. Wong
2016-06-17 1:30 ` [PATCH 117/119] xfs: support scrubbing rmap btree Darrick J. Wong
2016-06-17 1:30 ` [PATCH 118/119] xfs: support scrubbing refcount btree Darrick J. Wong
2016-06-17 1:30 ` [PATCH 119/119] xfs: add btree scrub tracepoints Darrick J. Wong
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20160716071003.GB21529@birch.djwong.org \
--to=darrick.wong@oracle.com \
--cc=bfoster@redhat.com \
--cc=david@fromorbit.com \
--cc=linux-fsdevel@vger.kernel.org \
--cc=vishal.l.verma@intel.com \
--cc=xfs@oss.sgi.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).