Changeset 2153


Ignore:
Timestamp:
Aug 23, 2012, 3:30:49 PM (7 years ago)
Author:
matthijs
Message:

mountd: Improve error handling.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/fon/mountd/src/lib/mount.c

    r2152 r2153  
    232232                if(q->status & MS_MOUNTED)
    233233                        mounted++;
    234                 if(!(q->status & MS_IGNORED) && q->size && q->sector_size)
     234                if(!(q->status & MS_IGNORED) && !(q->status & MS_ERROR) && q->size && q->sector_size)
    235235                        size = size + (((unsigned long long int)atoi(q->size)) * ((unsigned long long int)atoi(q->sector_size)));
    236236        }
     
    470470        {
    471471                log_printf("new mount : %s -> %s (%s)\n", name, dev, fs_names[mount->fs]);
     472                if (mount_new("/tmp/run/mountd/", dev) < 0) {
     473                        return;
     474                }
    472475                snprintf(tmp, 64, "%s%s", uci_path, name);
    473476                snprintf(tmp2, 64, "/tmp/run/mountd/%s", dev);
    474477                symlink(tmp2, tmp);
    475                 mount_new("/tmp/run/mountd/", dev);
    476478                scan_uploadd_disc(dev);
    477479                if(!autofs_safe_fork())
     
    518520int mount_wait_for_disc(char *disc)
    519521{
    520         int i = 10;
     522        #define DISC_WAIT_MAX 1000
     523        #define DISC_WAIT_STEP 100
     524        int i = (DISC_WAIT_MAX / DISC_WAIT_STEP);
    521525        while(i--)
    522526        {
     
    524528                if(!ret)
    525529                        return ret;
    526                 poll(0, 0, 100);
    527         }
     530                poll(0, 0, DISC_WAIT_STEP);
     531        }
     532        log_printf("Mount did not show up after %d ms, giving up", DISC_WAIT_MAX);
    528533        return -1;
    529534}
     
    582587                exit(WEXITSTATUS(ret));
    583588        }
    584         pid = waitpid(pid, &ret, 0);
    585         ret = WEXITSTATUS(ret);
    586         log_printf("----------> mount ret = %d\n", ret);
    587         if(ret && (ret != 0xff))
    588                 return -1;
     589        while(true) {
     590                int err = waitpid(pid, &ret, 0);
     591                if (err == -1 && errno == EINTR)
     592                        continue;
     593                if (err < 0)
     594                        goto err;
     595                if (WIFEXITED(ret) || WIFSIGNALED(ret))
     596                        break;
     597        }
     598
     599        if (WIFEXITED(ret)) {
     600                log_printf("----------> mount ret = %d\n", WEXITSTATUS(ret));
     601                if (WEXITSTATUS(ret) != 0)
     602                        goto err;
     603        } else {
     604                log_printf("----------> mount signal = %d\n", WIFSIGNALED(ret));
     605                goto err;
     606        }
     607
    589608        if(mount_wait_for_disc(mount->dev) == 0)
    590609        {
     
    600619                mount->status |= MS_MOUNTED;
    601620                mount_dump_uci_state();
    602         } else return -1;
     621        } else {
     622                goto err;
     623        }
    603624        return 0;
     625
     626err:
     627        log_printf("mount failed\n");
     628        /* Just in case it did get mounted somehow */
     629        system_printf("/bin/umount %s", tmp);
     630        rmdir(tmp);
     631        mount->status |= MS_ERROR;
     632        return -1;
    604633}
    605634
Note: See TracChangeset for help on using the changeset viewer.