ext2: Fix "ext2fs_mkdir .. No free space in directory".
authorRichard W.M. Jones <rjones@redhat.com>
Thu, 25 Nov 2010 17:37:35 +0000 (17:37 +0000)
committerRichard W.M. Jones <rjones@redhat.com>
Thu, 25 Nov 2010 17:39:08 +0000 (17:39 +0000)
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.

helper/ext2.c

index 7ad120b..2fc8036 100644 (file)
@@ -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;