summaryrefslogtreecommitdiffstats
path: root/sys/fs/ext2fs/ext2_alloc.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/fs/ext2fs/ext2_alloc.c')
-rw-r--r--sys/fs/ext2fs/ext2_alloc.c12
1 files changed, 12 insertions, 0 deletions
diff --git a/sys/fs/ext2fs/ext2_alloc.c b/sys/fs/ext2fs/ext2_alloc.c
index 7867a87..a701087 100644
--- a/sys/fs/ext2fs/ext2_alloc.c
+++ b/sys/fs/ext2fs/ext2_alloc.c
@@ -197,6 +197,18 @@ ext2_reallocblks(ap)
panic("ext2_reallocblks: non-cluster");
#endif
/*
+ * If the cluster crosses the boundary for the first indirect
+ * block, leave space for the indirect block. Indirect blocks
+ * are initially laid out in a position after the last direct
+ * block. Block reallocation would usually destroy locality by
+ * moving the indirect block out of the way to make room for
+ * data blocks if we didn't compensate here. We should also do
+ * this for other indirect block boundaries, but it is only
+ * important for the first one.
+ */
+ if (start_lbn < NDADDR && end_lbn >= NDADDR)
+ return (ENOSPC);
+ /*
* If the latest allocation is in a new cylinder group, assume that
* the filesystem has decided to move and do not force it back to
* the previous cylinder group.
OpenPOWER on IntegriCloud