Re: open a file in 0100444 mode in NFSv4 may fail

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hello,

when doing more tests with TCL, I found a more critical problem.

If I create a directory and just after I create a read only file (mode
0444) inside it, I got a permission denied error. See the attached C
source code. As the previous error, it is random but I always have it
fail before the 10th execution.

I attach the network traffic but it seems that the problem is again in
the client.

Olga, could you test this new testcase on the newest kernel ?

Regards.

Thomas.

On Thu, Jul 21, 2016 at 8:10 PM, Olga Kornievskaia <aglo@xxxxxxxxx> wrote:
> On Thu, Jul 21, 2016 at 1:14 PM, J. Bruce Fields <bfields@xxxxxxxxxxxx> wrote:
>> On Thu, Jul 21, 2016 at 04:54:36PM +0200, Thomas Gambier wrote:
>>> On Mon, Jul 18, 2016 at 4:09 PM, J. Bruce Fields <bfields@xxxxxxxxxxxx> wrote:
>>> > On Mon, Jul 18, 2016 at 03:44:48PM +0200, Thomas Gambier wrote:
>>> >> Hello,
>>> >>
>>> >> thanks for your answer. See my comments below.
>>> >>
>>> >> On Wed, Jul 13, 2016 at 3:26 PM, J. Bruce Fields <bfields@xxxxxxxxxxxx> wrote:
>>> >> > On Mon, Jul 11, 2016 at 07:40:11PM +0200, Thomas Gambier wrote:
>>> >> >> Hello,
>>> >> >>
>>> >> >> I just discovered a problem with NFSv4 file system. I was using TCL
>>> >> >> scripts that were doing some file manipulation (mkdir, copy, ...) on
>>> >> >> my NFSv4 file system and sometimes the scripts failed with "permission
>>> >> >> denied" error.
>>> >> >>
>>> >> >> I ran strace and I found that the system call returning the error was:
>>> >> >> open("d1/in.txt", O_WRONLY|O_CREAT|O_TRUNC, 0100444) = -1 EACCES
>>> >> >> (Permission denied)
>>> >> >
>>> >> > Is that even allowed?  The open(2) man page says posix leaves behavior
>>> >> > in that case unspecified, and doesn't say anything I can find about
>>> >> > Linux behavior in this case.
>>> >> >
>>> >> You're right. I will send a mail to TCL mailing list to know why they
>>> >> put this flag in the open call.
>>> >>
>>> >> > I guess it would be nicer for client or server to do something
>>> >> > predictable, though.  First steps might be to confirm what happens other
>>> >> > filesystems, then do a network trace (watch the traffic in wireshark) to
>>> >> > see if it's the client rejecting this open, or the client passing
>>> >> > through that bit in the mode and the server returning the error.
>>> >>
>>> >> I agree. For other filesystem, I only tested with ext4 which works
>>> >> fine. Let me know if you want me to test specific filesystems.
>>> >>
>>> >> I attach the wireshark capture of a test with 8 open call working fine
>>> >> and the 9th one failing. For me, it seems the activity on the network
>>> >> is exactly the same for the failing case (same call from client to
>>> >> server and same answer from server to client). It would mean that the
>>> >> client itself is messing things up...
>>> >
>>> > Agreed, sounds like the client's only deciding to fail the open after
>>> > the OPEN call to the server succeeds.
>>> >
>>> > Unfortunately, the client open logic is (necessarily) pretty
>>> > complicated--a few minutes digging around wasn't enough for me to figure
>>> > uot where the error's coming from.
>>> >
>>>
>>> I'm not sure if I can help... I don't know the NFS source code at all.
>>> I can do more tests if you need, though.
>>
>> It doesn't look like a high priority based just on what we know
>> (slightly odd behavior in an undefined case), so I think we'll just have
>> to leave it at that until somebody gets curious.  Thanks for the report.
>>
>
> Hi Thomas,
>
> I don't know exactly what was fixed or when but I thought I'd note
> that I don't see the problem on the upstream 4.7-rc7 but I can
> reproduce the problem on RHEL7.2 kernel.
#include <unistd.h>
#include <fcntl.h>
#include <stdio.h>
#include <sys/stat.h>


int main()
{
    int fd, i, result;
    char filename[100];
    char dirname[100];

    for (i=0; i<1000; i++)
    {
      sprintf(dirname, "d%d", i);
      sprintf(filename, "d%d/testfile.txt", i);

      result = mkdir(dirname, 0755);
      if (result < 0)
      {
        perror("Mkdir failed\n");
        fprintf(stderr, "Error creating %s\n", dirname);
        return 1;
      }
      //sleep(1);

      fd = open(filename, O_WRONLY|O_CREAT|O_TRUNC, 0444);
      if(fd < 0)
      {
        perror("Open failed\n");
        fprintf(stderr, "Error creating %s\n", filename);
        return 1;
      }
    }

    return 0;
}

Attachment: NFS_traffic2.pcapng
Description: Binary data


[Index of Archives]     [Linux Filesystem Development]     [Linux USB Development]     [Linux Media Development]     [Video for Linux]     [Linux NILFS]     [Linux Audio Users]     [Yosemite Info]     [Linux SCSI]

  Powered by Linux