From: Richard W.M. Jones Date: Thu, 25 Nov 2010 17:37:35 +0000 (+0000) Subject: ext2: Fix "ext2fs_mkdir .. No free space in directory". X-Git-Tag: 2.11~1 X-Git-Url: http://git.annexia.org/?p=febootstrap.git;a=commitdiff_plain;h=cf29103041581a1d71444f978ad4f6ad69b63033 ext2: Fix "ext2fs_mkdir .. No free space in directory". We weren't expanding ext2 directories and as a result we could hit a limit when the directory grows larger than one block. Note that this fix only applies for creating subdirectories. For creating files (ie. ext2fs_link) we were already doing the right thing. --- diff --git a/helper/ext2.c b/helper/ext2.c index 7ad120b..2fc8036 100644 --- a/helper/ext2.c +++ b/helper/ext2.c @@ -135,10 +135,20 @@ ext2_mkdir (ext2_ino_t dir_ino, const char *dirname, const char *basename, if (err != 0) error (EXIT_FAILURE, 0, "ext2fs_new_inode: %s", error_message (err)); + try_again: err = ext2fs_mkdir (fs, dir_ino, ino, basename); - if (err != 0) - error (EXIT_FAILURE, 0, "ext2fs_mkdir: %s/%s: %s", - dirname, basename, error_message (err)); + if (err != 0) { + /* See: http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=217892 */ + if (err == EXT2_ET_DIR_NO_SPACE) { + err = ext2fs_expand_dir (fs, dir_ino); + if (err) + error (EXIT_FAILURE, 0, "ext2fs_expand_dir: %s/%s: %s", + dirname, basename, error_message (err)); + goto try_again; + } else + error (EXIT_FAILURE, 0, "ext2fs_mkdir: %s/%s: %s", + dirname, basename, error_message (err)); + } /* Copy the final permissions, UID etc. to the inode. */ struct ext2_inode inode;