depmod: return error when index is truncated due to ENOSPC
authorLucas De Marchi <lucas.demarchi@profusion.mobi>
Fri, 15 Jun 2012 23:13:31 +0000 (20:13 -0300)
committerLucas De Marchi <lucas.demarchi@profusion.mobi>
Sat, 16 Jun 2012 00:31:05 +0000 (21:31 -0300)
Before:
=======
[lucas@vader kmod]$ sudo depmod
[lucas@vader kmod]$ echo $?
0
[lucas@vader kmod]$ ls -l /lib/modules/$(uname -r)
total 12
drwxr-xr-x 8 root root   160 Jun 13 11:05 kernel
-rw-r--r-- 1 root root 12288 Jun 15 21:29 modules.alias
-rw-r--r-- 1 root root     0 Jun 15 21:29 modules.alias.bin
-rw-r--r-- 1 root root     0 Jun 15 21:29 modules.dep
-rw-r--r-- 1 root root     0 Jun 15 21:29 modules.dep.bin
-rw-r--r-- 1 root root     0 Jun 15 21:29 modules.devname
-rw-r--r-- 1 root root     0 Jun 15 21:29 modules.softdep
-rw-r--r-- 1 root root     0 Jun 15 21:29 modules.symbols
-rw-r--r-- 1 root root     0 Jun 15 21:29 modules.symbols.bin

Note that modules.alias is truncated and the other have size == 0

After:
======

[lucas@vader kmod]$ sudo ./tools/depmod
WARNING: could not open /lib/modules/3.5.0-rc2-demarchi-00028-g94fa83c/modules.order: No such file or directory
ERROR: Could not create index: output truncated: No space left on device
[lucas@vader kmod]$ echo $?
1

tools/depmod.c

index fc23d29..790cc76 100644 (file)
@@ -2237,6 +2237,7 @@ static int depmod_output(struct depmod *depmod, FILE *out)
                FILE *fp = out;
                char tmp[NAME_MAX] = "";
                int r;
+               long eof;
 
                if (fp == NULL) {
                        int flags = O_CREAT | O_TRUNC | O_WRONLY;
@@ -2262,6 +2263,7 @@ static int depmod_output(struct depmod *depmod, FILE *out)
                if (fp == out)
                        continue;
 
+               eof = ftell(fp);
                fclose(fp);
                if (r < 0) {
                        if (unlinkat(dfd, tmp, 0) != 0)
@@ -2280,6 +2282,13 @@ static int depmod_output(struct depmod *depmod, FILE *out)
                                        dname, tmp, dname, itr->name);
                        break;
                }
+
+               if (eof == EOF) {
+                       err = -ENOSPC;
+                       ERR("Could not create index: output truncated: %s\n",
+                                                               strerror(-err));
+                       break;
+               }
        }
 
        if (dfd >= 0)