From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([140.186.70.92]:46252) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1QHHPD-0007ZT-EE for qemu-devel@nongnu.org; Tue, 03 May 2011 11:20:56 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1QHHP8-00071B-WB for qemu-devel@nongnu.org; Tue, 03 May 2011 11:20:55 -0400 Received: from mail-fx0-f45.google.com ([209.85.161.45]:44390) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1QHHP8-000713-Lp for qemu-devel@nongnu.org; Tue, 03 May 2011 11:20:50 -0400 Received: by fxm2 with SMTP id 2so192277fxm.4 for ; Tue, 03 May 2011 08:20:49 -0700 (PDT) MIME-Version: 1.0 Sender: ico2ico2@gmail.com In-Reply-To: <4DBED206.6020809@linux.vnet.ibm.com> References: <4DBED206.6020809@linux.vnet.ibm.com> Date: Tue, 3 May 2011 16:20:49 +0100 Message-ID: From: Sassan Panahinejad Content-Type: multipart/alternative; boundary=0022158dfae3570d6a04a260af0e Subject: Re: [Qemu-devel] Bug in virtio-9p when fstatting an fd referring to a file that no longer exists List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Venkateswararao Jujjuri Cc: Eric Van Hensbergen , v9fs-developer@lists.sourceforge.net, qemu-devel@nongnu.org --0022158dfae3570d6a04a260af0e Content-Type: text/plain; charset=ISO-8859-1 On 2 May 2011 16:47, Venkateswararao Jujjuri wrote: > On 04/28/2011 09:51 AM, Sassan Panahinejad wrote: > > This thread seems relevant: > http://www.mail-archive.com/linux-fsdevel@vger.kernel.org/msg09159.html > Unless things have changed, it looks like the problem is in the client > kernel (although note that there isn't support in qemu, even if the client > did send an fid associated with an open file!). > Any thoughts on a workaround for this? > > > Hrm, I don't see any workaround for this. May be we should add TFSTAT for > dotl? or add a flag to > TSTAT? > It's definitely a tricky problem. I can't think of how to go about dealing with it. Probably worth looking into how nfs deals with it (and also looking into what happens when communicating between two native plan9 systems). I'll start reading. Thanks Sassan > > Copying the v9fs. > > Thanks, > JV > > > > > > Thanks > Sassan > > On 28 April 2011 17:13, Sassan Panahinejad wrote: > >> It should be possible for guest applications to fstat a file for which >> they have a valid file descriptor, even if the file has been removed. >> Demonstrated by the code sample below (fstat reports no such file or >> directory). >> Strangely it seems that reading from a file in this state works fine (and >> when both are run, the server receives a different fid for each). >> On any other filesystem, the code runs correctly. On our 9p filesystem it >> fails. >> Many applications (including bash) depend on this working correctly. >> I will continue investigating, but any thoughts anyone has on the subject >> would be appreciated. >> >> >> Thanks >> Sassan >> >> >> #include >> #include >> #include >> #include >> #include >> >> >> int main(void) >> { >> int ret; >> struct stat statbuf; >> int fd = open("test.txt", O_RDWR | O_CREAT, 0666); >> if (fd < 0) { >> printf("open failed: %m\n"); >> return 1; >> } >> ret = write(fd, "test1\n", 6); >> if (ret < 0) { >> printf("write1 failed: %m\n"); >> return 1; >> } >> ret = unlink("test.txt"); >> if (ret < 0) { >> printf("unlink failed: %m\n"); >> return 1; >> } >> ret = fstat(fd, &statbuf); >> if (ret < 0) { >> printf("fstat failed: %m\n"); >> return 1; >> } >> return 0; >> } >> > > > --0022158dfae3570d6a04a260af0e Content-Type: text/html; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable
On 2 May 2011 16:47, Venkateswararao Jujjuri <jvrao@linux.= vnet.ibm.com> wrote:
=20 =20 =20 =20
On 04/28/2011 09:51 AM, Sassan Panahinejad wrote:
This thread seems relevant: http://www.mail-archive.com/linux-fsdevel@vger.kernel.org/msg09= 159.html
Unless things have changed, it looks like the problem is in the client kernel (although note that there isn't support in qemu, even if the client did send an fid associated with an open file!). Any thoughts on a workaround for this?

Hrm, I don't see any workaround for this. May be we should add TFSTAT for dotl? or add a flag to
TSTAT?

It's definitely a tricky prob= lem. I can't think of how to go about dealing with it.
Probably wort= h looking into how nfs deals with it (and also looking into what happens wh= en communicating between two native plan9 systems). I'll start reading.=

Thanks
Sassan
=A0

Copying the v9fs.

Thanks,
JV





Thanks
Sassan

On 28 April 2011 17:13, Sassan Panahinejad <sassan@sassan.me.uk> wrote:
It should be po= ssible for guest applications to fstat a file for which they have a valid file descriptor, even if the file has been removed.
Demonstrated by the code sample below (fstat reports no such file or directory).
Strangely it seems that reading from a file in this state works fine (and when both are run, the server receives a different fid for each).
On any other filesystem, the code runs correctly. On our 9p filesystem it fails.
Many applications (including bash) depend on this working correctly.
I will continue investigating, but any thoughts anyone has on the subject would be appreciated.


Thanks
Sassan


#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>


int main(void)
{
=A0=A0=A0=A0=A0=A0=A0 int ret;
=A0=A0=A0=A0=A0=A0=A0 struct stat statbuf;
=A0=A0=A0=A0=A0=A0=A0 int fd =3D open("test.txt", O_RDW= R | O_CREAT, 0666);
=A0=A0=A0=A0=A0=A0=A0 if (fd < 0) {
=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 printf("open f= ailed: %m\n");
=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 return 1;
=A0=A0=A0=A0=A0=A0=A0 }
=A0=A0=A0=A0=A0=A0=A0 ret =3D write(fd, "test1\n", 6);<= br> =A0=A0=A0=A0=A0=A0=A0 if (ret < 0) {
=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 printf("write1= failed: %m\n");
=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 return 1;
=A0=A0=A0=A0=A0=A0=A0 }
=A0=A0=A0=A0=A0=A0=A0 ret =3D unlink("test.txt");
=A0=A0=A0=A0=A0=A0=A0 if (ret < 0) {
=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 printf("unlink= failed: %m\n");
=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 return 1;
=A0=A0=A0=A0=A0=A0=A0 }
=A0=A0=A0=A0=A0=A0=A0 ret =3D fstat(fd, &statbuf);
=A0=A0=A0=A0=A0=A0=A0 if (ret < 0) {
=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 printf("fstat = failed: %m\n");
=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 return 1;
=A0=A0=A0=A0=A0=A0=A0 }
=A0=A0=A0=A0=A0=A0=A0 return 0;
}



--0022158dfae3570d6a04a260af0e--