We do need O_TRUNC on a non-exclusive create even if we think the file doesn’t exist
because someone else might open it and write data to it. Of course that’s a bit
dangerous…
We should not be saving O_TRUNC in the open flags for the fd though… That would be the
best fix, to remove it from the open flags and only store the mode opened, then the flag
isn’t there for status2 to return.
Frank
From: Sachin Punadikar [mailto:punadikar.sachin@gmail.com]
Sent: Tuesday, October 23, 2018 3:43 AM
To: Daniel Gryniewicz <dang(a)redhat.com>
Cc: devel(a)lists.nfs-ganesha.org
Subject: [NFS-Ganesha-Devel] Re: read-only open causing file to be truncated with
NFSv4/ganesha.
I have uploaded a patch to fix this
(
https://review.gerrithub.io/c/ffilz/nfs-ganesha/+/430435)
But I have a question on this.
As per the code, the O_TRUNC gets applied (via open_flags) only when it is file create. If
the file pre-exists, O_TRUNC is not applied to open_flags.
Was wondering, why we need O_TRUNC while creating new file, anyway it will be of size 0 ?
As per my little understanding the O_TRUNC should be applicable if we are opening a
pre-existing file. Correct me if I am wrong.
On Mon, Oct 15, 2018 at 6:32 PM Daniel Gryniewicz <dang(a)redhat.com
<mailto:dang@redhat.com> > wrote:
This seems like a bug. My guess is that either status2() shouldn't
return O_TRUNC, or it shouldn't be saved in the fd to begin with.
O_TRUNC is a transitory flag, only useful at the time of the open itself.
Fixing the common status2() is simplest; otherwise we need to fix all
the FSALs.
Daniel
On 10/12/2018 08:12 PM, Pradeep wrote:
Hello,
I'm seeing an issue with a specific application flow and with ganesha
server (2.6.5). Here is what the application does:
- fd1 = open (file1, O_WRONLY|O_CREAT|O_TRUNC)
Ganesha creates a state and stores the flags in fd->openflags (see
vfs_open2())
- write (fd1, ....)
- fd2 = open(file1, O_RDONLY)
Ganesha finds the state for the first open, finds the flags and calls
fsal_reopen2() with old and new flags OR'd together. This causes the
file to be truncated because the original open was done with O_TRUNC.
I don't see this behavior with kernel NFS or a local filesystem. Any
suggestions on fixing this? Here is a quick and dirty program to
reproduce it - you can see that the second stat prints zero as size with
a mount from Ganesha server.
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <unistd.h>
int main(int argc, char **argv)
{
char *fn = argv[1];
int fd;
char buf[1024];
struct stat stbuf;
int rc;
fd = open(fn, O_WRONLY|O_CREAT|O_TRUNC, 0666);
printf("open(%s) = %d\n", fn, fd);
ssize_t ret;
ret = write(fd, buf, sizeof(buf));
printf("write returned %ld\n", ret);
rc = stat(fn, &stbuf);
printf("size: %ld\n", stbuf.st_size);
int fd1;
fd1 = open(fn, O_RDONLY);
printf("open(%s) = %d\n", fn, fd1);
rc = stat(fn, &stbuf);
printf("size: %ld\n", stbuf.st_size);
}
Thanks,
Pradeep
_______________________________________________
Devel mailing list -- devel(a)lists.nfs-ganesha.org
<mailto:devel@lists.nfs-ganesha.org>
To unsubscribe send an email to devel-leave(a)lists.nfs-ganesha.org
<mailto:devel-leave@lists.nfs-ganesha.org>
_______________________________________________
Devel mailing list -- devel(a)lists.nfs-ganesha.org
<mailto:devel@lists.nfs-ganesha.org>
To unsubscribe send an email to devel-leave(a)lists.nfs-ganesha.org
<mailto:devel-leave@lists.nfs-ganesha.org>
--
with regards,
Sachin Punadikar