summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--fs/xfs/libxfs/xfs_ialloc.c16
-rw-r--r--fs/xfs/libxfs/xfs_ialloc.h2
-rw-r--r--fs/xfs/libxfs/xfs_imeta.c4
-rw-r--r--fs/xfs/scrub/repair.c2
-rw-r--r--fs/xfs/xfs_inode.c4
-rw-r--r--fs/xfs/xfs_symlink.c2
6 files changed, 16 insertions, 14 deletions
diff --git a/fs/xfs/libxfs/xfs_ialloc.c b/fs/xfs/libxfs/xfs_ialloc.c
index 3115122f86a6..b7c048b3b428 100644
--- a/fs/xfs/libxfs/xfs_ialloc.c
+++ b/fs/xfs/libxfs/xfs_ialloc.c
@@ -1765,26 +1765,28 @@ out_release:
int
xfs_dialloc(
struct xfs_trans **tpp,
- xfs_ino_t parent,
+ struct xfs_inode *pip,
umode_t mode,
xfs_ino_t *new_ino)
{
struct xfs_mount *mp = (*tpp)->t_mountp;
- xfs_agnumber_t agno;
- int error = 0;
- xfs_agnumber_t start_agno;
struct xfs_perag *pag;
struct xfs_ino_geometry *igeo = M_IGEO(mp);
+ xfs_ino_t ino;
+ xfs_ino_t parent = pip ? pip->i_ino : 0;
+ xfs_agnumber_t agno;
+ xfs_agnumber_t start_agno;
bool ok_alloc = true;
int flags;
- xfs_ino_t ino;
+ int error = 0;
/*
* Directories, symlinks, and regular files frequently allocate at least
* one block, so factor that potential expansion when we examine whether
- * an AG has enough space for file creation.
+ * an AG has enough space for file creation. Try to keep metadata
+ * files all in the same AG.
*/
- if (S_ISDIR(mode))
+ if (S_ISDIR(mode) && (!pip || !xfs_is_metadata_inode(pip)))
start_agno = xfs_ialloc_next_ag(mp);
else {
start_agno = XFS_INO_TO_AGNO(mp, parent);
diff --git a/fs/xfs/libxfs/xfs_ialloc.h b/fs/xfs/libxfs/xfs_ialloc.h
index d4191f133607..9ff7b98d827c 100644
--- a/fs/xfs/libxfs/xfs_ialloc.h
+++ b/fs/xfs/libxfs/xfs_ialloc.h
@@ -36,7 +36,7 @@ xfs_make_iptr(struct xfs_mount *mp, struct xfs_buf *b, int o)
* Allocate an inode on disk. Mode is used to tell whether the new inode will
* need space, and whether it is a directory.
*/
-int xfs_dialloc(struct xfs_trans **tpp, xfs_ino_t parent, umode_t mode,
+int xfs_dialloc(struct xfs_trans **tpp, struct xfs_inode *dp, umode_t mode,
xfs_ino_t *new_ino);
int xfs_difree(struct xfs_trans *tp, struct xfs_perag *pag,
diff --git a/fs/xfs/libxfs/xfs_imeta.c b/fs/xfs/libxfs/xfs_imeta.c
index 1bba953502b5..4b383bc7d7cd 100644
--- a/fs/xfs/libxfs/xfs_imeta.c
+++ b/fs/xfs/libxfs/xfs_imeta.c
@@ -211,7 +211,7 @@ xfs_imeta_sb_create(
return -EEXIST;
/* Create a new inode and set the sb pointer. */
- error = xfs_dialloc(tpp, 0, mode, &ino);
+ error = xfs_dialloc(tpp, NULL, mode, &ino);
if (error)
return error;
error = xfs_icreate(*tpp, ino, &args, ipp);
@@ -571,7 +571,7 @@ xfs_imeta_dir_create(
* entry pointing to them, but a directory also the "." entry
* pointing to itself.
*/
- error = xfs_dialloc(tpp, dp->i_ino, mode, &ino);
+ error = xfs_dialloc(tpp, dp, mode, &ino);
if (error)
goto out_ilock;
error = xfs_icreate(*tpp, ino, &args, ipp);
diff --git a/fs/xfs/scrub/repair.c b/fs/xfs/scrub/repair.c
index 6c530f6e60ee..5ea55a4f4c2b 100644
--- a/fs/xfs/scrub/repair.c
+++ b/fs/xfs/scrub/repair.c
@@ -1802,7 +1802,7 @@ xrep_setup_tempfile(
goto out_release_dquots;
/* Allocate inode, set up directory. */
- error = xfs_dialloc(&tp, dp->i_ino, mode, &ino);
+ error = xfs_dialloc(&tp, dp, mode, &ino);
if (error)
goto out_trans_cancel;
error = xfs_icreate(tp, ino, &args, &sc->tempip);
diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c
index 89cf08db7d3c..52025102482d 100644
--- a/fs/xfs/xfs_inode.c
+++ b/fs/xfs/xfs_inode.c
@@ -756,7 +756,7 @@ xfs_create(
* entry pointing to them, but a directory also the "." entry
* pointing to itself.
*/
- error = xfs_dialloc(&tp, dp->i_ino, args->mode, &ino);
+ error = xfs_dialloc(&tp, dp, args->mode, &ino);
if (!error)
error = xfs_icreate(tp, ino, args, &ip);
if (error)
@@ -862,7 +862,7 @@ xfs_create_tmpfile(
if (error)
goto out_release_dquots;
- error = xfs_dialloc(&tp, dp->i_ino, args->mode, &ino);
+ error = xfs_dialloc(&tp, dp, args->mode, &ino);
if (!error)
error = xfs_icreate(tp, ino, args, &ip);
if (error)
diff --git a/fs/xfs/xfs_symlink.c b/fs/xfs/xfs_symlink.c
index 8da0b103e650..177987c3716f 100644
--- a/fs/xfs/xfs_symlink.c
+++ b/fs/xfs/xfs_symlink.c
@@ -297,7 +297,7 @@ xfs_symlink(
/*
* Allocate an inode for the symlink.
*/
- error = xfs_dialloc(&tp, dp->i_ino, S_IFLNK, &ino);
+ error = xfs_dialloc(&tp, dp, S_IFLNK, &ino);
if (!error)
error = xfs_icreate(tp, ino, &args, &ip);
if (error)