|
@@ -451,14 +451,21 @@ xfs_attr_rmtval_set(
|
|
|
|
|
|
/*
|
|
/*
|
|
* Allocate a single extent, up to the size of the value.
|
|
* Allocate a single extent, up to the size of the value.
|
|
|
|
+ *
|
|
|
|
+ * Note that we have to consider this a data allocation as we
|
|
|
|
+ * write the remote attribute without logging the contents.
|
|
|
|
+ * Hence we must ensure that we aren't using blocks that are on
|
|
|
|
+ * the busy list so that we don't overwrite blocks which have
|
|
|
|
+ * recently been freed but their transactions are not yet
|
|
|
|
+ * committed to disk. If we overwrite the contents of a busy
|
|
|
|
+ * extent and then crash then the block may not contain the
|
|
|
|
+ * correct metadata after log recovery occurs.
|
|
*/
|
|
*/
|
|
xfs_bmap_init(args->flist, args->firstblock);
|
|
xfs_bmap_init(args->flist, args->firstblock);
|
|
nmap = 1;
|
|
nmap = 1;
|
|
error = xfs_bmapi_write(args->trans, dp, (xfs_fileoff_t)lblkno,
|
|
error = xfs_bmapi_write(args->trans, dp, (xfs_fileoff_t)lblkno,
|
|
- blkcnt,
|
|
|
|
- XFS_BMAPI_ATTRFORK | XFS_BMAPI_METADATA,
|
|
|
|
- args->firstblock, args->total, &map, &nmap,
|
|
|
|
- args->flist);
|
|
|
|
|
|
+ blkcnt, XFS_BMAPI_ATTRFORK, args->firstblock,
|
|
|
|
+ args->total, &map, &nmap, args->flist);
|
|
if (!error) {
|
|
if (!error) {
|
|
error = xfs_bmap_finish(&args->trans, args->flist,
|
|
error = xfs_bmap_finish(&args->trans, args->flist,
|
|
&committed);
|
|
&committed);
|