diff --git a/fs/gfs2/dir.c b/fs/gfs2/dir.c index d5988aafaa74..b2e5ebfb4bb1 100644 --- a/fs/gfs2/dir.c +++ b/fs/gfs2/dir.c @@ -2035,7 +2035,9 @@ int gfs2_dir_exhash_dealloc(struct gfs2_inode *dip) int gfs2_diradd_alloc_required(struct inode *inode, const struct qstr *name, struct gfs2_diradd *da) { + struct gfs2_inode *ip = GFS2_I(inode); struct gfs2_sbd *sdp = GFS2_SB(inode); + const unsigned int extra = sizeof(struct gfs2_dinode) - sizeof(struct gfs2_leaf); struct gfs2_dirent *dent; struct buffer_head *bh; @@ -2046,6 +2048,9 @@ int gfs2_diradd_alloc_required(struct inode *inode, const struct qstr *name, dent = gfs2_dirent_search(inode, name, gfs2_dirent_find_space, &bh); if (!dent) { da->nr_blocks = sdp->sd_max_dirres; + if (!(ip->i_diskflags & GFS2_DIF_EXHASH) && + (GFS2_DIRENT_SIZE(name->len) < extra)) + da->nr_blocks = 1; return 0; } if (IS_ERR(dent))