Whamcloud - gitweb
create_inode: clean up return mess in do_write_internal
authorDarrick J. Wong <darrick.wong@oracle.com>
Wed, 12 Mar 2014 03:10:32 +0000 (23:10 -0400)
committerTheodore Ts'o <tytso@mit.edu>
Wed, 12 Mar 2014 03:24:12 +0000 (23:24 -0400)
do_write_internal returns errno when ext2 library calls fail; since
errno only reflects the outcome of the last C library call, this will
result in confused callers.  Eliminate the naked return since
this results in an undefined return value.

Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
misc/create_inode.c

index cf4a58f..fb6b800 100644 (file)
@@ -351,16 +351,15 @@ errcode_t do_write_internal(ext2_ino_t cwd, const char *src, const char *dest)
 
        retval = ext2fs_namei(current_fs, root, cwd, dest, &newfile);
        if (retval == 0) {
-               com_err(__func__, 0, "The file '%s' already exists\n", dest);
                close(fd);
-               return errno;
+               return EXT2_ET_FILE_EXISTS;
        }
 
        retval = ext2fs_new_inode(current_fs, cwd, 010755, 0, &newfile);
        if (retval) {
                com_err(__func__, retval, 0);
                close(fd);
-               return errno;
+               return retval;
        }
 #ifdef DEBUGFS
        printf("Allocated inode: %u\n", newfile);
@@ -372,7 +371,7 @@ errcode_t do_write_internal(ext2_ino_t cwd, const char *src, const char *dest)
                if (retval) {
                        com_err(__func__, retval, "while expanding directory");
                        close(fd);
-                       return errno;
+                       return retval;
                }
                retval = ext2fs_link(current_fs, cwd, dest, newfile,
                                        EXT2_FT_REG_FILE);
@@ -412,12 +411,15 @@ errcode_t do_write_internal(ext2_ino_t cwd, const char *src, const char *dest)
        if ((retval = ext2fs_write_new_inode(current_fs, newfile, &inode))) {
                com_err(__func__, retval, "while creating inode %u", newfile);
                close(fd);
-               return errno;
+               return retval;
        }
        if (inode.i_flags & EXT4_INLINE_DATA_FL) {
                retval = ext2fs_inline_data_init(current_fs, newfile);
-               if (retval)
-                       return;
+               if (retval) {
+                       com_err("copy_file", retval, 0);
+                       close(fd);
+                       return retval;
+               }
        }
        if (LINUX_S_ISREG(inode.i_mode)) {
                if (statbuf.st_blocks < statbuf.st_size / S_BLKSIZE) {
@@ -434,7 +436,7 @@ errcode_t do_write_internal(ext2_ino_t cwd, const char *src, const char *dest)
        }
        close(fd);
 
-       return 0;
+       return retval;
 }
 
 /* Copy files from source_dir to fs */