NFSv4 open(O_CREAT|O_EXCL) creates file with bad mode
Affects | Status | Importance | Assigned to | Milestone | |
---|---|---|---|---|---|
linux (Ubuntu) |
Fix Released
|
Medium
|
Unassigned | ||
Xenial |
Fix Released
|
Medium
|
Unassigned | ||
Yakkety |
Won't Fix
|
Medium
|
Unassigned |
Bug Description
After upgrading my machine to Ubuntu 16.04, I noticed that 'git clone'
started creating files with wrong mode (0700 instead of 0644
typically) on NFSv4 partitions mounted from our NetApp servers.
I've first tracked this down to the fact that git uses
open(name, O_RDWR|
to create files. If O_EXCL is not present, the files are created
normally.
I've tried various kernels from Ubuntu and the problems appeared
between their 4.2.0-42-generic kernel-image (as found on willy) and
the 4.4.0 kernels found on xenial. I tried building 4.9 from
kernel.org and the problem is also there.
I've then bisected the kernel to figure out that this is caused by the
following commit:
ie NFS: Send attributes in OPEN request for NFS4_CREATE_
Our NetApp filers are running:
NetApp Release 8.2.3P3 7-Mode: Tue Apr 28 14:48:22 PDT 2015
tags: | added: patch |
affects: | linux-meta-lts-xenial (Ubuntu) → linux (Ubuntu) |
Changed in linux (Ubuntu): | |
importance: | Undecided → Medium |
status: | New → Triaged |
tags: | added: kernel-da-key |
Changed in linux (Ubuntu Xenial): | |
status: | New → In Progress |
Changed in linux (Ubuntu): | |
status: | Triaged → In Progress |
Changed in linux (Ubuntu Xenial): | |
importance: | Undecided → Medium |
Changed in linux (Ubuntu Yakkety): | |
status: | New → In Progress |
importance: | Undecided → Medium |
Changed in linux (Ubuntu): | |
assignee: | nobody → Joseph Salisbury (jsalisbury) |
Changed in linux (Ubuntu Xenial): | |
assignee: | nobody → Joseph Salisbury (jsalisbury) |
Changed in linux (Ubuntu Yakkety): | |
assignee: | nobody → Joseph Salisbury (jsalisbury) |
Changed in linux (Ubuntu Xenial): | |
status: | In Progress → Fix Released |
Changed in linux (Ubuntu): | |
status: | In Progress → Fix Released |
Changed in linux (Ubuntu Yakkety): | |
status: | In Progress → Incomplete |
Appended is a small program to reproduce the issue:
#include <sys/types.h>
#include <sys/stat.h>
#include <err.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
/*
* Demonstrate file creation bug on NFS v4 and linux kernel 4.4+
*
* mktemp() is used on purpose.
*/
int
main(int argc, char *argv[])
{
const char *name = argv[1];
char tmp[] = "./tmpXXXXXXXXXX";
struct stat buf;
mode_t expected;
int fd, i, n = 40;
umask(S_IWGRP | S_IWOTH); O_CREAT| O_EXCL, 0666); S_IRWXG| S_IRWXO) ) != expected)
(int)buf. st_mode & (S_IRWXU| S_IRWXG| S_IRWXO) );
expected = 0666 & ~(S_IWGRP | S_IWOTH);
if (argv[1] == NULL)
name = mktemp(tmp);
for (i = 0; i < n; i++) {
fd = open(name, O_RDWR|
if (fd < 0)
err(1, "open %s", name);
memset(&buf, 0, sizeof(buf));
if (stat(name, &buf) < 0)
err(1, "stat %s", name);
if ((buf.st_mode & (S_IRWXU|
printf("%s: %o\n", name,
else
printf("%s: ok\n", name);
unlink(name);
}
exit(0);
}