@@ -, +, @@ Linux 3.17: No more typedef for ctl_table The typedef has been removed so we need to use the structure directly. Note that the API for register_sysctl_table has also changed with 3.17, but it reverted back to a form that existed before and the configure tests handle it correctly. Reviewed-on: http://gerrit.openafs.org/11455 Reviewed-by: Benjamin Kaduk Tested-by: BuildBot Reviewed-by: Perry Ruiter Reviewed-by: Andrew Deason Reviewed-by: D Brashear (cherry picked from commit 6a23ca5b6e8bcaf881be7a4c50bfba72d001e6cd) Change-Id: Ifb8fc0b9b01d2578c65407608f0e1b3f3b254459 --- a/src/afs/LINUX/osi_sysctl.c +++ a/src/afs/LINUX/osi_sysctl.c @@ -34,7 +34,7 @@ extern afs_int32 afs_pct2; #ifdef CONFIG_SYSCTL static struct ctl_table_header *afs_sysctl = NULL; -static ctl_table afs_sysctl_table[] = { +static struct ctl_table afs_sysctl_table[] = { { #if defined(STRUCT_CTL_TABLE_HAS_CTL_NAME) #if defined(CTL_UNNUMBERED) @@ -234,7 +234,7 @@ static ctl_table afs_sysctl_table[] = { {0} }; -static ctl_table fs_sysctl_table[] = { +static struct ctl_table fs_sysctl_table[] = { { #if defined(STRUCT_CTL_TABLE_HAS_CTL_NAME) #if defined(CTL_UNNUMBERED) --- a/src/cf/linux-test4.m4 +++ a/src/cf/linux-test4.m4 @@ -395,7 +395,7 @@ AC_DEFUN([LINUX_REGISTER_SYSCTL_TABLE_NOFLAG], [ AC_CHECK_LINUX_BUILD([whether register_sysctl_table has an insert_at_head argument], [ac_cv_linux_register_sysctl_table_noflag], [#include ], - [ctl_table *t; register_sysctl_table (t);], + [struct ctl_table *t; register_sysctl_table (t);], [REGISTER_SYSCTL_TABLE_NOFLAG], [define if register_sysctl_table has no insert_at head flag], []) Linux 3.17: Deal with d_splice_alias errors In 3.17 the logic in d_splice_alias has changed. Of interest to us is the fact that it will now return an EIO error if it finds an existing connected directory for the dentry, where it would previously have added a new alias for it. As a result the end user can get EIO errors when accessing any file in a volume if the volume was first accessed through a different path (ex: RO path vs RW path). This commit just restores the old behaviour, adding the directory alias manually in the error case, which is what older versions of d_splice_alias used to do. Reviewed-on: http://gerrit.openafs.org/11492 Tested-by: BuildBot Reviewed-by: Perry Ruiter Reviewed-by: Andrew Deason Reviewed-by: D Brashear (cherry picked from commit 5815ee92a41cdcf105741d834042a5617dc4c219) Change-Id: Ie86009ede93255c85fcf640af14c598fe1e42ca9 --- a/src/afs/LINUX/osi_vnodeops.c +++ a/src/afs/LINUX/osi_vnodeops.c @@ -1529,9 +1529,18 @@ afs_linux_lookup(struct inode *dip, struct dentry *dp) /* It's ok for the file to not be found. That's noted by the caller by * seeing that the dp->d_inode field is NULL. */ - if (!code || code == ENOENT) - return newdp; - else + if (!code || code == ENOENT) { + /* + * d_splice_alias can return an error (EIO) if there is an existing + * connected directory alias for this dentry. + */ + if (!IS_ERR(newdp)) + return newdp; + else { + d_add(dp, ip); + return NULL; + } + } else return ERR_PTR(afs_convert_code(code)); }