Comment # 11 on bug 1124481 from
This is not lvm bug.

lvm code analysis:
```c
main
 lvm2_main
  _close_stray_fds    // tools/lvmcmdline.c
   _close_descriptor


//this func will close fd start from 3.
_close_stray_fds(const char *command, struct custom_fds *custom_fds)
{
    static const char _fd_dir[] = DEFAULT_PROC_DIR "/self/fd"; 

    if (!(d = opendir(_fd_dir))) {
        if (errno != ENOENT) {
            log_sys_error("opendir", _fd_dir);
            return 0; /* broken system */
        }

        /* Path does not exist, use the old way */
        if (getrlimit(RLIMIT_NOFILE, &rlim) < 0) {
            log_sys_error("getrlimit", "RLIMIT_NOFILE");
            return 1;
        }

        for (fd = 3; fd < (int)rlim.rlim_cur; fd++) {
            if ((fd != custom_fds->out) &&
                (fd != custom_fds->err) &&
                (fd != custom_fds->report)) {
                _close_descriptor(fd, suppress_warnings, command, ppid,
                          parent_cmdline);
            }
        }
        return 1;
    }


    while ((dirent = readdir(d))) {
        fd = atoi(dirent->d_name);
        if ((fd > 2) &&
            (fd != dirfd(d)) &&
            (fd != custom_fds->out) &&
            (fd != custom_fds->err) &&
            (fd != custom_fds->report)) {
            _close_descriptor(fd, suppress_warnings,
                      command, ppid, parent_cmdline);
        }
    }

    ... ...
}

//this function show lvm print message after close leaked fd.
static void _close_descriptor(int fd, unsigned suppress_warnings,
                  const char *command, pid_t ppid,
                  const char *parent_cmdline)
{
    int r;
    const char *filename;

    /* Ignore bad file descriptors */
    if (!is_valid_fd(fd))
        return;

    if (!suppress_warnings)
        filename = _get_filename(fd);

    r = close(fd);
    if (suppress_warnings)
        return;

    if (!r) //<=== r is 0, close(fd) returns on success. 
        fprintf(stderr, "File descriptor %d (%s) leaked on "
            "%s invocation.", fd, filename, command);
    else if (errno == EBADF)
        return;
    else
        fprintf(stderr, "Close failed on stray file descriptor "
            "%d (%s): %s", fd, filename, strerror(errno));

    fprintf(stderr, " Parent PID %" PRIpid_t ": %s\n", ppid, parent_cmdline);
}
```

in linux, a process do fork who child will share its opened fd(s).
lvm is child process, who parent open the fd (~/.bash_history).
It looks a secret shell script open ~/.bash_history, and this shell script
execute lvm after open ~/.bash_history. 

As Martin Loviska said in comment #2, setting the environment variable
LVM_SUPPRESS_FD_WARNINGS to suppress it.


You are receiving this mail because: