Skip to contentSkip to conversation

fsetxattr(2) for ACL on nfs

DISCUSSION J. R. Okajima 3 participants 4 messages May 25, 2017 – May 31, 2017

Subsystems (3)
lore
Share & tools
lore
#0 lore raw

Since v4.12-rc1, I see an error on NFS3.

$ stat -f .
  File: "."
    ID: 0        Namelen: 255     Type: nfs
Block size: 32768      Fundamental block size: 32768
Blocks: Total: 248        Free: 247        Available: 234
Inodes: Total: 2048       Free: 2020
$ cp ../ro/f_src .
$ rm f_src
rm: remove regular file 'f_src'? y
$ cp -p ../ro/f_src .
cp: preserving permissions for './f_src': Permission denied

(from "cp --help")
-p same as --preserve=mode,ownership,timestamps
--preserve[=ATTR_LIST] preserve the specified attributes (default:
mode,ownership,timestamps), if possible additional attributes: context, links, xattr, all

By strace, I see fsetxattr(2) for ACL returned the error. Is this an intentional behaviour?

(from strace)
open("../ro/f_src", O_RDONLY) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=2, ...}) = 0
open("./f_src", O_WRONLY|O_CREAT|O_EXCL, 0600) = 4
fstat(4, {st_mode=S_IFREG|0600, st_size=0, ...}) = 0
fadvise64(3, 0, 0, POSIX_FADV_SEQUENTIAL) = 0
mmap(NULL, 139264, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fcb293f8000

read(3, "f\n", 131072)                  = 2
write(4, "f\n", 2)                      = 2
read(3, "", 131072)                     = 0

utimensat(4, NULL, {{1495750885, 0}, {1495750885, 0}}, 0) = 0
fgetxattr(3, "system.posix_acl_access", 0x7ffed40196d0, 132) = -1 ENODATA (No data available)
fstat(3, {st_mode=S_IFREG|0644, st_size=2, ...}) = 0
fsetxattr(4, "system.posix_acl_access", "\x02\x00\x00\x00\x01\x00\x06\x00\xff\xff\xff\xff\x04\x00\x04\x00\xff\xff\xff\xff \x00\x04\x00\xff\xff\xff\xff", 28, 0) = -1 EACCES (Permission denied)
fchmod(4, 0100644) = 0
open("/usr/lib/charset.alias", O_RDONLY|O_NOFOLLOW) = -1 ENOENT (No such file or directory)
write(2, "cp: ", 4) = 4
write(2, "preserving permissions for './f_"..., 36) = 36
write(2, ": Permission denied", 19) = 19
write(2, "\n", 1) = 1

Additonally, after this error, the shutdown process stops saying
nfs: server localhost not responding, still trying

Does anyone know which commit causes these problems?

J. R. Okajima

#1 lore raw
Quoted 32 lines · J. R. Okajima

Since v4.12-rc1, I see an error on NFS3.

$ stat -f .
 File: "."
   ID: 0        Namelen: 255     Type: nfs
Block size: 32768      Fundamental block size: 32768
Blocks: Total: 248        Free: 247        Available: 234
Inodes: Total: 2048       Free: 2020
$ cp ../ro/f_src .
$ rm f_src
rm: remove regular file 'f_src'? y
$ cp -p ../ro/f_src .
cp: preserving permissions for './f_src': Permission denied

(from "cp --help")
-p same as --preserve=mode,ownership,timestamps
--preserve[=ATTR_LIST] preserve the specified attributes (default:
mode,ownership,timestamps), if possible additional attributes: context, links, xattr, all

By strace, I see fsetxattr(2) for ACL returned the error. Is this an intentional behaviour?

(from strace)
open("../ro/f_src", O_RDONLY) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=2, ...}) = 0
open("./f_src", O_WRONLY|O_CREAT|O_EXCL, 0600) = 4
fstat(4, {st_mode=S_IFREG|0600, st_size=0, ...}) = 0
fadvise64(3, 0, 0, POSIX_FADV_SEQUENTIAL) = 0
mmap(NULL, 139264, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fcb293f8000

Quoted 7 lines
read(3, "f\n", 131072)                  = 2
write(4, "f\n", 2)                      = 2
read(3, "", 131072)                     = 0

utimensat(4, NULL, {{1495750885, 0}, {1495750885, 0}}, 0) = 0
fgetxattr(3, "system.posix_acl_access", 0x7ffed40196d0, 132) = -1 ENODATA (No data available)
fstat(3, {st_mode=S_IFREG|0644, st_size=2, ...}) = 0
fsetxattr(4, "system.posix_acl_access", "\x02\x00\x00\x00\x01\x00\x06\x00\xff\xff\xff\xff\x04\x00\x04\x00\xff\xff\xff\xff \x00\x04\x00\xff\xff\xff\xff", 28, 0) = -1 EACCES (Permission denied)

To me this looks like "cp" is broken. If it gets no POSIX ACL xattr from the kernel (ENODATA) for this file, why is it trying to save a POSIX ACL to the copy? That just adds needless overhead, either at the syscall level, or also on disk if it is storing ACLs on files that don't need them...

Cheers, Andreas

Quoted 7 lines

fchmod(4, 0100644) = 0
open("/usr/lib/charset.alias", O_RDONLY|O_NOFOLLOW) = -1 ENOENT (No such file or directory)
write(2, "cp: ", 4) = 4
write(2, "preserving permissions for './f_"..., 36) = 36
write(2, ": Permission denied", 19) = 19
write(2, "\n", 1) = 1

Quoted 7 lines

Additonally, after this error, the shutdown process stops saying
nfs: server localhost not responding, still trying

Does anyone know which commit causes these problems?

J. R. Okajima

Cheers, Andreas

#2 lore raw

Andreas Dilger:

Quoted 14 lines
Quoted 6 lines

open("../ro/f_src", O_RDONLY) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=2, ...}) = 0
open("./f_src", O_WRONLY|O_CREAT|O_EXCL, 0600) = 4
fstat(4, {st_mode=S_IFREG|0600, st_size=0, ...}) = 0
fadvise64(3, 0, 0, POSIX_FADV_SEQUENTIAL) = 0
mmap(NULL, 139264, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fcb293f8000

Quoted 7 lines
read(3, "f\n", 131072)                  = 2
write(4, "f\n", 2)                      = 2
read(3, "", 131072)                     = 0

utimensat(4, NULL, {{1495750885, 0}, {1495750885, 0}}, 0) = 0
fgetxattr(3, "system.posix_acl_access", 0x7ffed40196d0, 132) = -1 ENODATA (No data available)
fstat(3, {st_mode=S_IFREG|0644, st_size=2, ...}) = 0
fsetxattr(4, "system.posix_acl_access", "\x02\x00\x00\x00\x01\x00\x06\x00\xff\xff\xff\xff\x04\x00\x04\x00\xff\xff\xff\xff \x00\x04\x00\xff\xff\xff\xff", 28, 0) = -1 EACCES (Permission denied)

Quoted 4 lines

To me this looks like "cp" is broken. If it gets no POSIX ACL xattr from the kernel (ENODATA) for this file, why is it trying to save a POSIX ACL to the copy? That just adds needless overhead, either at the syscall level, or also on disk if it is storing ACLs on files that don't need them...

Maybe you are right.
But on v4.11, it succeeded.

open("../ro/f_src", O_RDONLY) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=2, ...}) = 0
open("./f_src", O_WRONLY|O_CREAT|O_EXCL, 0600) = 4
fstat(4, {st_mode=S_IFREG|0600, st_size=0, ...}) = 0
fadvise64(3, 0, 0, POSIX_FADV_SEQUENTIAL) = 0
mmap(NULL, 139264, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f3dcf031000

read(3, "f\n", 131072)                  = 2
write(4, "f\n", 2)                      = 2
read(3, "", 131072)                     = 0

utimensat(4, NULL, {{1495842847, 0}, {1495842847, 0}}, 0) = 0
fgetxattr(3, "system.posix_acl_access", 0x7fff63443360, 132) = -1 ENODATA (No data available)
fstat(3, {st_mode=S_IFREG|0644, st_size=2, ...}) = 0
fsetxattr(4, "system.posix_acl_access", "\x02\x00\x00\x00\x01\x00\x06\x00\xff\xff\xff\xff\x04\x00\x04\x00\xff\xff\xff\xff \x00\x04\x00\xff\xff\xff\xff", 28, 0) = 0

J. R. Okajima

#3 lore raw

It's a known bug, I've been slow to get it upstream, apologies, I'll try to get it in for -rc4.

--b.

Quoted 43 lines · J. R. Okajima

Andreas Dilger:

Quoted 14 lines
Quoted 6 lines

open("../ro/f_src", O_RDONLY) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=2, ...}) = 0
open("./f_src", O_WRONLY|O_CREAT|O_EXCL, 0600) = 4
fstat(4, {st_mode=S_IFREG|0600, st_size=0, ...}) = 0
fadvise64(3, 0, 0, POSIX_FADV_SEQUENTIAL) = 0
mmap(NULL, 139264, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fcb293f8000

Quoted 7 lines
read(3, "f\n", 131072)                  = 2
write(4, "f\n", 2)                      = 2
read(3, "", 131072)                     = 0

utimensat(4, NULL, {{1495750885, 0}, {1495750885, 0}}, 0) = 0
fgetxattr(3, "system.posix_acl_access", 0x7ffed40196d0, 132) = -1 ENODATA (No data available)
fstat(3, {st_mode=S_IFREG|0644, st_size=2, ...}) = 0
fsetxattr(4, "system.posix_acl_access", "\x02\x00\x00\x00\x01\x00\x06\x00\xff\xff\xff\xff\x04\x00\x04\x00\xff\xff\xff\xff \x00\x04\x00\xff\xff\xff\xff", 28, 0) = -1 EACCES (Permission denied)

Quoted 4 lines

To me this looks like "cp" is broken. If it gets no POSIX ACL xattr from the kernel (ENODATA) for this file, why is it trying to save a POSIX ACL to the copy? That just adds needless overhead, either at the syscall level, or also on disk if it is storing ACLs on files that don't need them...

Maybe you are right.
But on v4.11, it succeeded.

open("../ro/f_src", O_RDONLY) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=2, ...}) = 0
open("./f_src", O_WRONLY|O_CREAT|O_EXCL, 0600) = 4
fstat(4, {st_mode=S_IFREG|0600, st_size=0, ...}) = 0
fadvise64(3, 0, 0, POSIX_FADV_SEQUENTIAL) = 0
mmap(NULL, 139264, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f3dcf031000

read(3, "f\n", 131072)                  = 2
write(4, "f\n", 2)                      = 2
read(3, "", 131072)                     = 0

utimensat(4, NULL, {{1495842847, 0}, {1495842847, 0}}, 0) = 0
fgetxattr(3, "system.posix_acl_access", 0x7fff63443360, 132) = -1 ENODATA (No data available)
fstat(3, {st_mode=S_IFREG|0644, st_size=2, ...}) = 0
fsetxattr(4, "system.posix_acl_access", "\x02\x00\x00\x00\x01\x00\x06\x00\xff\xff\xff\xff\x04\x00\x04\x00\xff\xff\xff\xff \x00\x04\x00\xff\xff\xff\xff", 28, 0) = 0

J. R. Okajima
--
To unsubscribe from this list: send the line "unsubscribe linux-nfs" in the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html