-       if (res != FR_OK) LEAVE_FF(dj.fs, res);
-
-       INITBUF(dj, sfn, lfn);
-       res = follow_path(&dj, path);                   /* Follow the file path */
-       if (res == FR_OK) res = FR_EXIST;               /* Any file or directory is already existing */
-       if (_FS_RPATH && res == FR_NO_FILE && (dj.fn[NS] & NS_DOT))
-               res = FR_INVALID_NAME;
-       if (res != FR_NO_FILE)                                  /* Any error occured */
-               LEAVE_FF(dj.fs, res);
-
-       dclst = create_chain(dj.fs, 0);                 /* Allocate a new cluster for new directory table */
-       res = FR_OK;
-       if (dclst == 0) res = FR_DENIED;
-       if (dclst == 1) res = FR_INT_ERR;
-       if (dclst == 0xFFFFFFFF) res = FR_DISK_ERR;
-       if (res == FR_OK)
-               res = move_window(dj.fs, 0);
-       if (res != FR_OK) LEAVE_FF(dj.fs, res);
-       dsect = clust2sect(dj.fs, dclst);
-
-       dir = dj.fs->win;                                               /* Initialize the new directory table */
-       mem_set(dir, 0, SS(dj.fs));
-       mem_set(dir+DIR_Name, ' ', 8+3);                /* Create "." entry */
-       dir[DIR_Name] = '.';
-       dir[DIR_Attr] = AM_DIR;
-       tim = get_fattime();
-       ST_DWORD(dir+DIR_WrtTime, tim);
-       ST_WORD(dir+DIR_FstClusLO, dclst);
-       ST_WORD(dir+DIR_FstClusHI, dclst >> 16);
-       mem_cpy(dir+32, dir, 32);                       /* Create ".." entry */
-       dir[33] = '.';
-       pclst = dj.sclust;
-       if (dj.fs->fs_type == FS_FAT32 && pclst == dj.fs->dirbase)
-               pclst = 0;
-       ST_WORD(dir+32+DIR_FstClusLO, pclst);
-       ST_WORD(dir+32+DIR_FstClusHI, pclst >> 16);
-       for (n = 0; n < dj.fs->csize; n++) {    /* Write dot entries and clear left sectors */
-               dj.fs->winsect = dsect++;
-               dj.fs->wflag = 1;
-               res = move_window(dj.fs, 0);
-               if (res) LEAVE_FF(dj.fs, res);
-               mem_set(dir, 0, SS(dj.fs));
-       }
-
-       res = dir_register(&dj);
-       if (res != FR_OK) {
-               remove_chain(dj.fs, dclst);
-       } else {
-               dir = dj.dir;
-               dir[DIR_Attr] = AM_DIR;                                 /* Attribute */
-               ST_DWORD(dir+DIR_WrtTime, tim);                 /* Crated time */
-               ST_WORD(dir+DIR_FstClusLO, dclst);              /* Table start cluster */
-               ST_WORD(dir+DIR_FstClusHI, dclst >> 16);
-               dj.fs->wflag = 1;
-               res = sync(dj.fs);
+       if (res == FR_OK) {
+               INIT_BUF(dj);
+               res = follow_path(&dj, path);                   /* Follow the file path */
+               if (res == FR_OK) res = FR_EXIST;               /* Any object with same name is already existing */
+               if (_FS_RPATH && res == FR_NO_FILE && (dj.fn[NS] & NS_DOT))
+                       res = FR_INVALID_NAME;
+               if (res == FR_NO_FILE) {                                /* Can create a new directory */
+                       dcl = create_chain(dj.fs, 0);           /* Allocate a cluster for the new directory table */
+                       res = FR_OK;
+                       if (dcl == 0) res = FR_DENIED;          /* No space to allocate a new cluster */
+                       if (dcl == 1) res = FR_INT_ERR;
+                       if (dcl == 0xFFFFFFFF) res = FR_DISK_ERR;
+                       if (res == FR_OK)                                       /* Flush FAT */
+                               res = move_window(dj.fs, 0);
+                       if (res == FR_OK) {                                     /* Initialize the new directory table */
+                               dsc = clust2sect(dj.fs, dcl);
+                               dir = dj.fs->win;
+                               mem_set(dir, 0, SS(dj.fs));
+                               mem_set(dir+DIR_Name, ' ', 8+3);        /* Create "." entry */
+                               dir[DIR_Name] = '.';
+                               dir[DIR_Attr] = AM_DIR;
+                               ST_DWORD(dir+DIR_WrtTime, tim);
+                               ST_WORD(dir+DIR_FstClusLO, dcl);
+                               ST_WORD(dir+DIR_FstClusHI, dcl >> 16);
+                               mem_cpy(dir+32, dir, 32);                       /* Create ".." entry */
+                               dir[33] = '.'; pcl = dj.sclust;
+                               if (dj.fs->fs_type == FS_FAT32 && pcl == dj.fs->dirbase)
+                                       pcl = 0;
+                               ST_WORD(dir+32+DIR_FstClusLO, pcl);
+                               ST_WORD(dir+32+DIR_FstClusHI, pcl >> 16);
+                               for (n = dj.fs->csize; n; n--) {        /* Write dot entries and clear following sectors */
+                                       dj.fs->winsect = dsc++;
+                                       dj.fs->wflag = 1;
+                                       res = move_window(dj.fs, 0);
+                                       if (res != FR_OK) break;
+                                       mem_set(dir, 0, SS(dj.fs));
+                               }
+                       }
+                       if (res == FR_OK) res = dir_register(&dj);      /* Register the object to the directory */
+                       if (res != FR_OK) {
+                               remove_chain(dj.fs, dcl);                               /* Could not register, remove cluster chain */
+                       } else {
+                               dir = dj.dir;
+                               dir[DIR_Attr] = AM_DIR;                                 /* Attribute */
+                               ST_DWORD(dir+DIR_WrtTime, tim);                 /* Created time */
+                               ST_WORD(dir+DIR_FstClusLO, dcl);                /* Table start cluster */
+                               ST_WORD(dir+DIR_FstClusHI, dcl >> 16);
+                               dj.fs->wflag = 1;
+                               res = sync(dj.fs);
+                       }
+               }
+               FREE_BUF();