On Fri, Jan 16, 2015 at 11:30:10AM +, Suzuki K. Poulose wrote:
> From: "Suzuki K. Poulose"
>
> If an open at the 9p server(host) fails with EMFILE (Too many open files for
> the process), we should return ENFILE(too many open files in the system) to
> the guest to indicate the actual status within the guest.
>
> This was uncovered during LTP, where getdtablesize01 fails to open the maximum
> number-open-files.
>
> getdtablesize010 TINFO : Maximum number of files a process can have
> opened is 1024
> getdtablesize010 TINFO : Checking with the value returned by
> getrlimit...RLIMIT_NOFILE
> getdtablesize011 TPASS : got correct dtablesize, value is 1024
> getdtablesize010 TINFO : Checking Max num of files that can be opened
> by a process.Should be: RLIMIT_NOFILE - 1
> getdtablesize012 TFAIL : getdtablesize01.c:102: 974 != 1023
>
> For a more practial impact:
>
> # ./getdtablesize01 &
> [1] 1834
> getdtablesize010 TINFO : Maximum number of files a process can have
> opened is 1024
> getdtablesize010 TINFO : Checking with the value returned by
> getrlimit...RLIMIT_NOFILE
> getdtablesize011 TPASS : got correct dtablesize, value is 1024
> getdtablesize010 TINFO : Checking Max num of files that can be opened
> by a process.Should be: RLIMIT_NOFILE - 1
> getdtablesize012 TFAIL : getdtablesize01.c:102: 974 != 1023
> [--- Modified to sleep indefinitely, without closing the files --- ]
>
> # ls
> bash: /bin/ls: Too many open files
>
> That gives a wrong error message for the bash, when getdtablesize01 has
> exhausted the system
> wide limits, giving false indicators.
>
> With the fix, we get :
>
> # ls
> bash: /bin/ls: Too many open files in system
I doubt this is affecting anybody in practice, but:
Acked-by: Will Deacon
Will
> Signed-off-by: Suzuki K. Poulose
> ---
> tools/kvm/virtio/9p.c |4
> 1 file changed, 4 insertions(+)
>
> diff --git a/tools/kvm/virtio/9p.c b/tools/kvm/virtio/9p.c
> index 9073a1e..b24c0f2 100644
> --- a/tools/kvm/virtio/9p.c
> +++ b/tools/kvm/virtio/9p.c
> @@ -152,6 +152,10 @@ static void virtio_p9_error_reply(struct p9_dev *p9dev,
> {
> u16 tag;
>
> + /* EMFILE at server implies ENFILE for the VM */
> + if (err == EMFILE)
> + err = ENFILE;
> +
> pdu->write_offset = VIRTIO_9P_HDR_LEN;
> virtio_p9_pdu_writef(pdu, "d", err);
> *outlen = pdu->write_offset;
> --
> 1.7.9.5
>
--
To unsubscribe from this list: send the line "unsubscribe kvm" in
the body of a message to majord...@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html