2017-05-25 22:48:00

by J. R. Okajima

[permalink] [raw]
Subject: fsetxattr(2) for ACL on nfs

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


2017-05-26 19:58:40

by Andreas Dilger

[permalink] [raw]
Subject: Re: fsetxattr(2) for ACL on nfs

On May 25, 2017, at 4:37 PM, J. R. Okajima <[email protected]> wrote:
>
> 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)

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

> 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


Cheers, Andreas






Attachments:
signature.asc (195.00 B)
Message signed with OpenPGP

2017-05-26 23:59:58

by J. R. Okajima

[permalink] [raw]
Subject: Re: fsetxattr(2) for ACL on nfs

Andreas Dilger:
> > 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)
>
> 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

2017-05-31 20:32:12

by J. Bruce Fields

[permalink] [raw]
Subject: Re: fsetxattr(2) for ACL on nfs

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

--b.

On Sat, May 27, 2017 at 08:59:56AM +0900, J. R. Okajima wrote:
> Andreas Dilger:
> > > 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)
> >
> > 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