diff options
author | Colin Walters <walters@verbum.org> | 2014-06-04 18:21:32 -0400 |
---|---|---|
committer | Colin Walters <walters@verbum.org> | 2014-06-09 14:44:17 -0400 |
commit | e31daf448afdaec9e692612ae522c7d89bf8be28 (patch) | |
tree | 6c5fd8b269bbcb5f8a51b85796d6d2548886e777 /src/libostree/ostree-linuxfsutil.c | |
parent | 24c64d6b4fea57040f4711ea0377e99482356915 (diff) | |
download | ostree-e31daf448afdaec9e692612ae522c7d89bf8be28.tar.gz |
libostree: Silently ignore EPERM when setting EXT2_IMMUTABLE_FL
In the case of running ostree as non-root on a regular filesystem (not
tmpfs which doesn't support immutable), we should just silently do
nothing if we encounter EPERM. Cache the result to avoid spam in
strace.
https://bugzilla.gnome.org/show_bug.cgi?id=728006
Diffstat (limited to 'src/libostree/ostree-linuxfsutil.c')
-rw-r--r-- | src/libostree/ostree-linuxfsutil.c | 17 |
1 files changed, 13 insertions, 4 deletions
diff --git a/src/libostree/ostree-linuxfsutil.c b/src/libostree/ostree-linuxfsutil.c index 8e11d2cf..2bfc92f2 100644 --- a/src/libostree/ostree-linuxfsutil.c +++ b/src/libostree/ostree-linuxfsutil.c @@ -38,8 +38,9 @@ * Alter the immutable flag of object referred to by @fd; may be a * regular file or a directory. * - * If the operation is not supported by the underlying filesystem, - * this function will silently do nothing. + * If the operation is not supported by the underlying filesystem, or + * we are running without sufficient privileges, this function will + * silently do nothing. */ gboolean _ostree_linuxfs_fd_alter_immutable_flag (int fd, @@ -50,12 +51,18 @@ _ostree_linuxfs_fd_alter_immutable_flag (int fd, gboolean ret = FALSE; unsigned long flags; int r; + static gint no_alter_immutable = 0; + + if (g_atomic_int_get (&no_alter_immutable)) + return TRUE; r = ioctl (fd, EXT2_IOC_GETFLAGS, &flags); if (r == -1) { int errsv = errno; - if (errsv == EOPNOTSUPP || errsv == ENOTTY) + if (errsv == EPERM) + g_atomic_int_set (&no_alter_immutable, 1); + else if (errsv == EOPNOTSUPP || errsv == ENOTTY) ; else { @@ -75,7 +82,9 @@ _ostree_linuxfs_fd_alter_immutable_flag (int fd, if (r == -1) { int errsv = errno; - if (errsv == EOPNOTSUPP || errsv == ENOTTY) + if (errsv == EPERM) + g_atomic_int_set (&no_alter_immutable, 1); + else if (errsv == EOPNOTSUPP || errsv == ENOTTY) ; else { |