Commit a26dc213 authored by Darrick J. Wong's avatar Darrick J. Wong

xfs: actually rebuild the parent pointer xattrs

Once we've assembled all the parent pointers for a file, we need to
commit the new dataset atomically to that file.  Parent pointer records
are embedded in the xattr structure, which means that we must write a
new extended attribute structure, again, atomically.  Therefore, we must
copy the non-parent-pointer attributes from the file being repaired into
the temporary file's extended attributes and then call the atomic extent
swap mechanism to exchange the blocks.
Signed-off-by: default avatarDarrick J. Wong <djwong@kernel.org>
Reviewed-by: default avatarChristoph Hellwig <hch@lst.de>
parent 6efbbdeb
...@@ -948,7 +948,7 @@ xfs_attr_lookup( ...@@ -948,7 +948,7 @@ xfs_attr_lookup(
return error; return error;
} }
STATIC int int
xfs_attr_add_fork( xfs_attr_add_fork(
struct xfs_inode *ip, /* incore inode pointer */ struct xfs_inode *ip, /* incore inode pointer */
int size, /* space new attribute needs */ int size, /* space new attribute needs */
......
...@@ -648,5 +648,6 @@ int __init xfs_attr_intent_init_cache(void); ...@@ -648,5 +648,6 @@ int __init xfs_attr_intent_init_cache(void);
void xfs_attr_intent_destroy_cache(void); void xfs_attr_intent_destroy_cache(void);
int xfs_attr_sf_totsize(struct xfs_inode *dp); int xfs_attr_sf_totsize(struct xfs_inode *dp);
int xfs_attr_add_fork(struct xfs_inode *ip, int size, int rsvd);
#endif /* __XFS_ATTR_H__ */ #endif /* __XFS_ATTR_H__ */
...@@ -1030,7 +1030,7 @@ xrep_xattr_reset_fork( ...@@ -1030,7 +1030,7 @@ xrep_xattr_reset_fork(
* fork. The caller must ILOCK the tempfile and join it to the transaction. * fork. The caller must ILOCK the tempfile and join it to the transaction.
* This function returns with the inode joined to a clean scrub transaction. * This function returns with the inode joined to a clean scrub transaction.
*/ */
STATIC int int
xrep_xattr_reset_tempfile_fork( xrep_xattr_reset_tempfile_fork(
struct xfs_scrub *sc) struct xfs_scrub *sc)
{ {
...@@ -1336,7 +1336,7 @@ xrep_xattr_swap_prep( ...@@ -1336,7 +1336,7 @@ xrep_xattr_swap_prep(
} }
/* Exchange the temporary file's attribute fork with the one being repaired. */ /* Exchange the temporary file's attribute fork with the one being repaired. */
STATIC int int
xrep_xattr_swap( xrep_xattr_swap(
struct xfs_scrub *sc, struct xfs_scrub *sc,
struct xrep_tempexch *tx) struct xrep_tempexch *tx)
......
...@@ -6,6 +6,10 @@ ...@@ -6,6 +6,10 @@
#ifndef __XFS_SCRUB_ATTR_REPAIR_H__ #ifndef __XFS_SCRUB_ATTR_REPAIR_H__
#define __XFS_SCRUB_ATTR_REPAIR_H__ #define __XFS_SCRUB_ATTR_REPAIR_H__
struct xrep_tempexch;
int xrep_xattr_swap(struct xfs_scrub *sc, struct xrep_tempexch *tx);
int xrep_xattr_reset_fork(struct xfs_scrub *sc); int xrep_xattr_reset_fork(struct xfs_scrub *sc);
int xrep_xattr_reset_tempfile_fork(struct xfs_scrub *sc);
#endif /* __XFS_SCRUB_ATTR_REPAIR_H__ */ #endif /* __XFS_SCRUB_ATTR_REPAIR_H__ */
...@@ -24,6 +24,7 @@ ...@@ -24,6 +24,7 @@
#include "xfs_trans_space.h" #include "xfs_trans_space.h"
#include "xfs_health.h" #include "xfs_health.h"
#include "xfs_exchmaps.h" #include "xfs_exchmaps.h"
#include "xfs_parent.h"
#include "scrub/xfs_scrub.h" #include "scrub/xfs_scrub.h"
#include "scrub/scrub.h" #include "scrub/scrub.h"
#include "scrub/common.h" #include "scrub/common.h"
...@@ -33,6 +34,7 @@ ...@@ -33,6 +34,7 @@
#include "scrub/findparent.h" #include "scrub/findparent.h"
#include "scrub/readdir.h" #include "scrub/readdir.h"
#include "scrub/tempfile.h" #include "scrub/tempfile.h"
#include "scrub/listxattr.h"
/* /*
* Finding the Parent of a Directory * Finding the Parent of a Directory
......
This diff is collapsed.
...@@ -2539,6 +2539,8 @@ DEFINE_EVENT(xrep_xattr_salvage_class, name, \ ...@@ -2539,6 +2539,8 @@ DEFINE_EVENT(xrep_xattr_salvage_class, name, \
TP_ARGS(ip, flags, name, namelen, valuelen)) TP_ARGS(ip, flags, name, namelen, valuelen))
DEFINE_XREP_XATTR_SALVAGE_EVENT(xrep_xattr_salvage_rec); DEFINE_XREP_XATTR_SALVAGE_EVENT(xrep_xattr_salvage_rec);
DEFINE_XREP_XATTR_SALVAGE_EVENT(xrep_xattr_insert_rec); DEFINE_XREP_XATTR_SALVAGE_EVENT(xrep_xattr_insert_rec);
DEFINE_XREP_XATTR_SALVAGE_EVENT(xrep_parent_stash_xattr);
DEFINE_XREP_XATTR_SALVAGE_EVENT(xrep_parent_insert_xattr);
DECLARE_EVENT_CLASS(xrep_pptr_salvage_class, DECLARE_EVENT_CLASS(xrep_pptr_salvage_class,
TP_PROTO(struct xfs_inode *ip, unsigned int flags, const void *name, TP_PROTO(struct xfs_inode *ip, unsigned int flags, const void *name,
......
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