diff --git a/ChangeLog b/ChangeLog index 3d85c1da05..64e9c882c8 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,13 @@ +2013-04-03 Siddhesh Poyarekar + + [BZ #15305] + * sysdeps/unix/sysv/linux/kernel-features.h + [__LINUX_KERNEL_VERSION >= 0x02061d]: Define + __ASSUME_XFS_RESTRICTED_CHOWN. + * sysdeps/unix/sysv/linux/pathconf.c + (__statfs_chown_restricted) [!__ASSUME_XFS_RESTRICTED_CHOWN]: + Save and restore errno. + 2013-04-02 Joseph Myers [BZ #15327] diff --git a/NEWS b/NEWS index 56cdc56d9e..7718a0a14d 100644 --- a/NEWS +++ b/NEWS @@ -12,7 +12,8 @@ Version 2.18 10357, 11120, 11561, 12723, 13550, 13889, 13951, 14142, 14176, 14200, 14317, 14327, 14496, 14812, 14920, 14964, 14981, 14982, 14985, 14994, 14996, 15003, 15006, 15020, 15023, 15036, 15054, 15055, 15062, 15078, - 15160, 15214, 15232, 15234, 15283, 15285, 15287, 15304, 15307, 15327. + 15160, 15214, 15232, 15234, 15283, 15285, 15287, 15304, 15305, 15307, + 15327. * Add support for calling C++11 thread_local object destructors on thread and program exit. This needs compiler support for offloading C++11 diff --git a/sysdeps/unix/sysv/linux/kernel-features.h b/sysdeps/unix/sysv/linux/kernel-features.h index 8fdff7e381..ccd4c5918b 100644 --- a/sysdeps/unix/sysv/linux/kernel-features.h +++ b/sysdeps/unix/sysv/linux/kernel-features.h @@ -221,3 +221,9 @@ #if defined __x86_64__ && __LINUX_KERNEL_VERSION >= 0x030100 # define __ASSUME_GETCPU_SYSCALL 1 #endif + +/* 2.6.29 removed the XFS restricted_chown sysctl, so it is pointless looking + for it in newer kernels. */ +#if __LINUX_KERNEL_VERSION >= 0x02061d +# define __ASSUME_XFS_RESTRICTED_CHOWN 1 +#endif diff --git a/sysdeps/unix/sysv/linux/pathconf.c b/sysdeps/unix/sysv/linux/pathconf.c index de91a4541b..723d234538 100644 --- a/sysdeps/unix/sysv/linux/pathconf.c +++ b/sysdeps/unix/sysv/linux/pathconf.c @@ -289,11 +289,16 @@ __statfs_chown_restricted (int result, const struct statfs *fsbuf) return -1; } +#if __ASSUME_XFS_RESTRICTED_CHOWN + return 1; +#else int fd; + int save_errno; long int retval = 1; switch (fsbuf->f_type) { case XFS_SUPER_MAGIC: + save_errno = errno; /* Read the value from /proc/sys/fs/xfs/restrict_chown. If we cannot read it default to assume the restriction is in place. */ fd = open_not_cancel_2 ("/proc/sys/fs/xfs/restrict_chown", O_RDONLY); @@ -306,6 +311,7 @@ __statfs_chown_restricted (int result, const struct statfs *fsbuf) close_not_cancel_no_status (fd); } + __set_errno (save_errno); break; default: @@ -313,4 +319,5 @@ __statfs_chown_restricted (int result, const struct statfs *fsbuf) } return retval; +#endif }