Hi,

On 30/05/18 20:18, Bob Peterson wrote:
Hi,

Patch af21ca8ed5 is defective and needs to be reverted. The idea
was to only reserve single blocks for directories, with the thought
that they should be packed together. That's all well and good for
creating new directories, but directories have other reasons for
getting reservations: for example, when files are added to them
and they need their directory hash tables expanded. For
those purposes, one block may not be enough and the reservation
can run out of blocks, forcing us to do block allocations without
a reservation. We can also get into situations where we cannot
modify a directory when we should be able to.

This patch reverts the patch.

Signed-off-by: Bob Peterson <rpete...@redhat.com>
Doing allocation without a reservation is ok though, since the reservations are only hints and what really protects us against running out of blocks is the block counts on the rgrp. I forget now what the reason was that we couldn't add reservations for directories of more than one block, but I had a feeling there was a reason that we did that at the time.

That said, having reservations result in directories which are less fragments is definitely a good thing. One issue is whether it makes sense in case of deep directory trees which each directory itself contains only other directories, and indeed, not a huge number (so that the directories are still stuffed files). In that case we'll land up with a lot of fragmentation if we are not careful and simply apply a reservation without some knowledge of the directory size/layout.

It would be good if we could add a feature to the allocator to allocate contiguous extents even if it means searching a bit harder, and then to use that for directory hash tables so that we can at least keep those to a single extent where possible. The downside is that we then land up leaving holes where the old hash table was, which are then not easy to reuse...

Steve.

---
  fs/gfs2/rgrp.c | 9 ++-------
  1 file changed, 2 insertions(+), 7 deletions(-)

diff --git a/fs/gfs2/rgrp.c b/fs/gfs2/rgrp.c
index 8be47b81011a..d7a8ed8bb30c 100644
--- a/fs/gfs2/rgrp.c
+++ b/fs/gfs2/rgrp.c
@@ -1529,14 +1529,9 @@ static void rg_mblk_search(struct gfs2_rgrpd *rgd, 
struct gfs2_inode *ip,
        u32 extlen;
        u32 free_blocks = rgd_free(rgd, rs);
        int ret;
-       struct inode *inode = &ip->i_inode;
- if (S_ISDIR(inode->i_mode))
-               extlen = 1;
-       else {
-               extlen = max_t(u32, atomic_read(&rs->rs_sizehint), ap->target);
-               extlen = clamp(extlen, RGRP_RSRV_MINBLKS, free_blocks);
-       }
+       extlen = max_t(u32, atomic_read(&rs->rs_sizehint), ap->target);
+       extlen = clamp(extlen, RGRP_RSRV_MINBLKS, free_blocks);
        if ((rgd->rd_free_clone < rgd->rd_reserved) || (free_blocks < extlen))
                return;


Reply via email to