summaryrefslogtreecommitdiff
path: root/src/libostree/ostree-linuxfsutil.c
diff options
context:
space:
mode:
authorColin Walters <walters@verbum.org>2014-06-04 18:21:32 -0400
committerColin Walters <walters@verbum.org>2014-06-09 14:44:17 -0400
commite31daf448afdaec9e692612ae522c7d89bf8be28 (patch)
tree6c5fd8b269bbcb5f8a51b85796d6d2548886e777 /src/libostree/ostree-linuxfsutil.c
parent24c64d6b4fea57040f4711ea0377e99482356915 (diff)
downloadostree-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.c17
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
{