~ubuntu-branches/ubuntu/saucy/lvm2/saucy

« back to all changes in this revision

Viewing changes to daemons/clvmd/clvmd.c

  • Committer: Package Import Robot
  • Author(s): Dmitrijs Ledkovs
  • Date: 2013-05-30 11:02:10 UTC
  • mfrom: (3.1.28 sid)
  • Revision ID: package-import@ubuntu.com-20130530110210-q8bou4f333ruwhn0
Tags: 2.02.98-1ubuntu1
* Merge from Debian unstable, remaining changes:
  - debian/patches/avoid-dev-block.patch: Prefer any other device name over
    names in /dev/block/ since lvm.conf won't handle this.
  - debian/rules:
    - copy .po file to .pot file for Rosetta (Ubuntu specific).
  - debian/{dmsetup,lvm2}-udeb.install:
    - install initramfs and udev hooks in udebs (Debian bug 504341).
  - auto-start VGs as their PVs are discovered (Ubuntu specific):
    - add debian/tree/lvm2/lib/udev/rules.d/85-lvm2.rules: use watershed plus
      the sledgehammer of vgscan/vgchange to turn on VGs as they come online.
    - debian/tree/lvm2/usr/share/initramfs-tools/scripts/hooks/lvm2:
      - add 85-lvm2.rules to the list of udev rules to copy.
      - depend on udev.
    - debian/control:
      - add versioned Depend on watershed in lvm2 for udev rules.
      - add Depends on watershed-udeb in lvm2-udeb for udev rules.
      - add versioned Depend/Breaks on udev in dmsetup for udev rules.
      - add Depend on initramfs-tools in dmsetup so system is not potentially
        rendered unbootable by out-of-order dpkg configuration.
      - In libdevmapper-event1.02.1 add Breaks: dmeventd
        (<< 2.02.95-4ubuntu1) due to debian symbol rename
    - debian/rules:
      - do not install local-top scripts since Ubuntu mounts root using udev.
      - do not install init scripts for lvm2, since udev starts LVM.
      - continue to build clvm support.
    - debian/lvm2.postinst: handle missing lvm2 init script.
    - debian/tree/dmsetup/lib/udev/rules.d/60-persistent-storage-dm.rules:
      watch dm devices for changes with inotify
  - add mountroot failure hooks to help fix bad boots (Debian bug 468115):
    - debian/tree/lvm2/usr/share/initramfs-tools/scripts/init-premount/lvm2
  - remaining changes to upstream event manager packages (Debian bug 514706):
    - debian/rules:
      - enable dmeventd during configure.
    - debian/dmeventd.{8,manpages}: install dmeventd files.
  - rename debian/clvm.defaults to debian/clvm.default so it is installed
    correctly.
  - debian/control: add dmsetup-udeb to libdevmapper1.02.1-udeb recommends.
  - debian/rules: make sure dmsetup and lvm2 initramfs-tools scripts are
    executable.  When the Ubuntu-specific ones are added with a patch,
    they may lose their executable bit.
  - Add and install clvmd resource agent
  - Add dependency on libudev-dev to libdevmapper-dev so that the .pc file
    works.
  - debian/{clvmd.ra,clvm.init}:
    - create /run/lvm if it doesn't exist.
  - debian/clvm.init:
    - exit 3 if not running on status action.
  - Call dh_installman so that our dmeventd manpage actually gets installed
  - Install the missing fsadm manpage.
  - Complete libdevmapper-dev multiarch:
    - move .so symlinks and pkgconfig files to multiarched locations.
    - mark libdevmapper-dev M-A: same

* Dropped changes, applied upstream:
  - Update Micron PCIe SSD and other device-types to latest available.
  - Cherry pick from upstream, remove unsupported udev_get_dev_path() call.
  - Move thin check to global section.

Show diffs side-by-side

added added

removed removed

Lines of Context:
371
371
 
372
372
                case 'R':
373
373
                        check_permissions();
374
 
                        return refresh_clvmd(1)==1?0:1;
 
374
                        ret = (refresh_clvmd(1) == 1) ? 0 : 1;
 
375
                        goto out;
375
376
 
376
377
                case 'S':
377
378
                        check_permissions();
619
620
        for (newfd = local_client_head.next; newfd != NULL;) {
620
621
                delfd = newfd;
621
622
                newfd = newfd->next;
 
623
                if (delfd->fd == local_sock)
 
624
                        delfd->fd = -1;
622
625
                /*
623
626
                 * FIXME:
624
627
                 * needs cleanup code from read_from_local_sock() for now
2090
2093
static int check_local_clvmd(void)
2091
2094
{
2092
2095
        int local_socket;
2093
 
        struct sockaddr_un sockaddr;
2094
2096
        int ret = 0;
 
2097
        struct sockaddr_un sockaddr = { .sun_family = AF_UNIX };
 
2098
 
 
2099
        if (!dm_strncpy(sockaddr.sun_path, CLVMD_SOCKNAME, sizeof(sockaddr.sun_path))) {
 
2100
                log_error("%s: clvmd socket name too long.", CLVMD_SOCKNAME);
 
2101
                return -1;
 
2102
        }
2095
2103
 
2096
2104
        /* Open local socket */
2097
2105
        if ((local_socket = socket(PF_UNIX, SOCK_STREAM, 0)) < 0) {
 
2106
                log_sys_error("socket", "local socket");
2098
2107
                return -1;
2099
2108
        }
2100
2109
 
2101
 
        memset(&sockaddr, 0, sizeof(sockaddr));
2102
 
        memcpy(sockaddr.sun_path, CLVMD_SOCKNAME, sizeof(CLVMD_SOCKNAME));
2103
 
        sockaddr.sun_family = AF_UNIX;
2104
 
 
2105
2110
        if (connect(local_socket,(struct sockaddr *) &sockaddr,
2106
2111
                    sizeof(sockaddr))) {
 
2112
                log_sys_error("connect", "local socket");
2107
2113
                ret = -1;
2108
2114
        }
2109
2115
 
2125
2131
/* Open the local socket, that's the one we talk to libclvm down */
2126
2132
static int open_local_sock(void)
2127
2133
{
 
2134
        mode_t old_mask;
2128
2135
        int local_socket = -1;
2129
 
        struct sockaddr_un sockaddr;
2130
 
        mode_t old_mask;
 
2136
        struct sockaddr_un sockaddr = { .sun_family = AF_UNIX };
 
2137
 
 
2138
        if (!dm_strncpy(sockaddr.sun_path, CLVMD_SOCKNAME, sizeof(sockaddr.sun_path))) {
 
2139
                log_error("%s: clvmd socket name too long.", CLVMD_SOCKNAME);
 
2140
                return -1;
 
2141
        }
2131
2142
 
2132
2143
        close_local_sock(local_socket);
2133
2144
 
2144
2155
        /* Set Close-on-exec & non-blocking */
2145
2156
        if (fcntl(local_socket, F_SETFD, 1))
2146
2157
                DEBUGLOG("setting CLOEXEC on local_socket failed: %s\n", strerror(errno));
2147
 
        fcntl(local_socket, F_SETFL, fcntl(local_socket, F_GETFL, 0) | O_NONBLOCK);
 
2158
        if (fcntl(local_socket, F_SETFL, fcntl(local_socket, F_GETFL, 0) | O_NONBLOCK))
 
2159
                DEBUGLOG("setting O_NONBLOCK on local_socket failed: %s\n", strerror(errno));
2148
2160
 
2149
 
        memset(&sockaddr, 0, sizeof(sockaddr));
2150
 
        memcpy(sockaddr.sun_path, CLVMD_SOCKNAME, sizeof(CLVMD_SOCKNAME));
2151
 
        sockaddr.sun_family = AF_UNIX;
2152
2161
 
2153
2162
        if (bind(local_socket, (struct sockaddr *) &sockaddr, sizeof(sockaddr))) {
2154
2163
                log_error("can't bind local socket: %m");
2323
2332
        if (result != CS_OK)
2324
2333
                goto out;
2325
2334
 
 
2335
        if (namelen >= sizeof(buf))
 
2336
                namelen = sizeof(buf) - 1;
 
2337
 
2326
2338
        buf[namelen] = '\0';
2327
2339
        type = parse_cluster_interface(buf);
2328
2340
        DEBUGLOG("got interface type '%s' from confdb\n", buf);