| [2659] | 1 | From 2c9bc3ec349ae550bf60d0c46f15bdabe2b0fd9e Mon Sep 17 00:00:00 2001 | 
|---|
|  | 2 | From: Marc Dionne <marc.dionne@your-file-system.com> | 
|---|
|  | 3 | Date: Thu, 18 Dec 2014 06:57:22 -0500 | 
|---|
|  | 4 | Subject: [PATCH 1/2] Linux: Move code to reset the root to afs/LINUX | 
|---|
|  | 5 |  | 
|---|
|  | 6 | Move the Linux specific bit of code to reset the root to | 
|---|
|  | 7 | afs/LINUX platform specific files.  Things that play with | 
|---|
|  | 8 | the Linux vfs internals should not be exposed here. | 
|---|
|  | 9 |  | 
|---|
|  | 10 | No functional change, but this helps cleanup some ifdef | 
|---|
|  | 11 | mess. | 
|---|
|  | 12 |  | 
|---|
|  | 13 | Change-Id: Ia27fca3d8052ead45783cb2332c04fe6e99e5d9f | 
|---|
|  | 14 | --- | 
|---|
|  | 15 | src/afs/LINUX/osi_prototypes.h   |  3 ++ | 
|---|
|  | 16 | src/afs/LINUX/osi_vcache.c       | 61 ++++++++++++++++++++++++++++++++++++ | 
|---|
|  | 17 | src/afs/LINUX24/osi_prototypes.h |  3 ++ | 
|---|
|  | 18 | src/afs/LINUX24/osi_vcache.c     | 36 +++++++++++++++++++++ | 
|---|
|  | 19 | src/afs/afs_daemons.c            | 67 +++------------------------------------- | 
|---|
|  | 20 | 5 files changed, 108 insertions(+), 62 deletions(-) | 
|---|
|  | 21 |  | 
|---|
|  | 22 | diff --git a/src/afs/LINUX/osi_prototypes.h b/src/afs/LINUX/osi_prototypes.h | 
|---|
|  | 23 | index 277b50a..5002af1 100644 | 
|---|
|  | 24 | --- a/src/afs/LINUX/osi_prototypes.h | 
|---|
|  | 25 | +++ b/src/afs/LINUX/osi_prototypes.h | 
|---|
|  | 26 | @@ -82,6 +82,9 @@ extern void osi_VM_FlushPages(struct vcache *avc, afs_ucred_t *credp); | 
|---|
|  | 27 | extern void osi_VM_Truncate(struct vcache *avc, int alen, | 
|---|
|  | 28 | afs_ucred_t *acred); | 
|---|
|  | 29 |  | 
|---|
|  | 30 | +/* osi_vcache.c */ | 
|---|
|  | 31 | +extern void osi_ResetRootVCache(afs_uint32 volid); | 
|---|
|  | 32 | + | 
|---|
|  | 33 | /* osi_vfsops.c */ | 
|---|
|  | 34 | extern void vattr2inode(struct inode *ip, struct vattr *vp); | 
|---|
|  | 35 | extern int afs_init_inodecache(void); | 
|---|
|  | 36 | diff --git a/src/afs/LINUX/osi_vcache.c b/src/afs/LINUX/osi_vcache.c | 
|---|
|  | 37 | index 1d0db82..391e7d4 100644 | 
|---|
|  | 38 | --- a/src/afs/LINUX/osi_vcache.c | 
|---|
|  | 39 | +++ b/src/afs/LINUX/osi_vcache.c | 
|---|
|  | 40 | @@ -143,3 +143,64 @@ osi_PostPopulateVCache(struct vcache *avc) { | 
|---|
|  | 41 | vSetType(avc, VREG); | 
|---|
|  | 42 | } | 
|---|
|  | 43 |  | 
|---|
|  | 44 | +/** | 
|---|
|  | 45 | + * osi_ResetRootVCache - Reset the root vcache | 
|---|
|  | 46 | + * Reset the dentry associated with the afs root. | 
|---|
|  | 47 | + * Called from afs_CheckRootVolume when we notice that | 
|---|
|  | 48 | + * the root volume ID has changed. | 
|---|
|  | 49 | + * | 
|---|
|  | 50 | + * @volid: volume ID for the afs root | 
|---|
|  | 51 | + */ | 
|---|
|  | 52 | +void | 
|---|
|  | 53 | +osi_ResetRootVCache(afs_uint32 volid) | 
|---|
|  | 54 | +{ | 
|---|
|  | 55 | +    struct vrequest *treq = NULL; | 
|---|
|  | 56 | +    struct vattr vattr; | 
|---|
|  | 57 | +    cred_t *credp; | 
|---|
|  | 58 | +    struct dentry *dp; | 
|---|
|  | 59 | +    struct vcache *vcp; | 
|---|
|  | 60 | +    struct inode *root = AFSTOV(afs_globalVp); | 
|---|
|  | 61 | + | 
|---|
|  | 62 | +    afs_rootFid.Fid.Volume = volid; | 
|---|
|  | 63 | +    afs_rootFid.Fid.Vnode = 1; | 
|---|
|  | 64 | +    afs_rootFid.Fid.Unique = 1; | 
|---|
|  | 65 | + | 
|---|
|  | 66 | +    credp = crref(); | 
|---|
|  | 67 | +    if (afs_CreateReq(&treq, credp)) | 
|---|
|  | 68 | +       goto out; | 
|---|
|  | 69 | +    vcp = afs_GetVCache(&afs_rootFid, treq, NULL, NULL); | 
|---|
|  | 70 | +    if (!vcp) | 
|---|
|  | 71 | +       goto out; | 
|---|
|  | 72 | +    afs_getattr(vcp, &vattr, credp); | 
|---|
|  | 73 | +    afs_fill_inode(AFSTOV(vcp), &vattr); | 
|---|
|  | 74 | + | 
|---|
|  | 75 | +    dp = d_find_alias(root); | 
|---|
|  | 76 | + | 
|---|
|  | 77 | +#if defined(HAVE_DCACHE_LOCK) | 
|---|
|  | 78 | +    spin_lock(&dcache_lock); | 
|---|
|  | 79 | +#else | 
|---|
|  | 80 | +    spin_lock(&AFSTOV(vcp)->i_lock); | 
|---|
|  | 81 | +#endif | 
|---|
|  | 82 | +    spin_lock(&dp->d_lock); | 
|---|
|  | 83 | +#if defined(D_ALIAS_IS_HLIST) | 
|---|
|  | 84 | +    hlist_del_init(&dp->d_alias); | 
|---|
|  | 85 | +    hlist_add_head(&dp->d_alias, &(AFSTOV(vcp)->i_dentry)); | 
|---|
|  | 86 | +#else | 
|---|
|  | 87 | +    list_del_init(&dp->d_alias); | 
|---|
|  | 88 | +    list_add(&dp->d_alias, &(AFSTOV(vcp)->i_dentry)); | 
|---|
|  | 89 | +#endif | 
|---|
|  | 90 | +    dp->d_inode = AFSTOV(vcp); | 
|---|
|  | 91 | +    spin_unlock(&dp->d_lock); | 
|---|
|  | 92 | +#if defined(HAVE_DCACHE_LOCK) | 
|---|
|  | 93 | +    spin_unlock(&dcache_lock); | 
|---|
|  | 94 | +#else | 
|---|
|  | 95 | +    spin_unlock(&AFSTOV(vcp)->i_lock); | 
|---|
|  | 96 | +#endif | 
|---|
|  | 97 | +    dput(dp); | 
|---|
|  | 98 | + | 
|---|
|  | 99 | +    AFS_RELE(root); | 
|---|
|  | 100 | +    afs_globalVp = vcp; | 
|---|
|  | 101 | +out: | 
|---|
|  | 102 | +    crfree(credp); | 
|---|
|  | 103 | +    afs_DestroyReq(treq); | 
|---|
|  | 104 | +} | 
|---|
|  | 105 | diff --git a/src/afs/LINUX24/osi_prototypes.h b/src/afs/LINUX24/osi_prototypes.h | 
|---|
|  | 106 | index cb4bee1..cd748f1 100644 | 
|---|
|  | 107 | --- a/src/afs/LINUX24/osi_prototypes.h | 
|---|
|  | 108 | +++ b/src/afs/LINUX24/osi_prototypes.h | 
|---|
|  | 109 | @@ -69,6 +69,9 @@ extern void osi_syscall_clean(void); | 
|---|
|  | 110 | extern int osi_sysctl_init(void); | 
|---|
|  | 111 | extern void osi_sysctl_clean(void); | 
|---|
|  | 112 |  | 
|---|
|  | 113 | +/* osi_vcache.c */ | 
|---|
|  | 114 | +extern void osi_ResetRootVCache(afs_uint32 volid); | 
|---|
|  | 115 | + | 
|---|
|  | 116 | /* osi_vm.c */ | 
|---|
|  | 117 | extern int osi_VM_FlushVCache(struct vcache *avc); | 
|---|
|  | 118 | extern void osi_VM_TryToSmush(struct vcache *avc, afs_ucred_t *acred, | 
|---|
|  | 119 | diff --git a/src/afs/LINUX24/osi_vcache.c b/src/afs/LINUX24/osi_vcache.c | 
|---|
|  | 120 | index bbaf5ce..853a357 100644 | 
|---|
|  | 121 | --- a/src/afs/LINUX24/osi_vcache.c | 
|---|
|  | 122 | +++ b/src/afs/LINUX24/osi_vcache.c | 
|---|
|  | 123 | @@ -119,3 +119,39 @@ osi_PostPopulateVCache(struct vcache *avc) { | 
|---|
|  | 124 | vSetType(avc, VREG); | 
|---|
|  | 125 | } | 
|---|
|  | 126 |  | 
|---|
|  | 127 | +void | 
|---|
|  | 128 | +osi_ResetRootVCache(afs_uint32 volid) | 
|---|
|  | 129 | +{ | 
|---|
|  | 130 | +    struct vrequest *treq = NULL; | 
|---|
|  | 131 | +    struct vattr vattr; | 
|---|
|  | 132 | +    cred_t *credp; | 
|---|
|  | 133 | +    struct dentry *dp; | 
|---|
|  | 134 | +    struct vcache *vcp; | 
|---|
|  | 135 | + | 
|---|
|  | 136 | +    afs_rootFid.Fid.Volume = volid; | 
|---|
|  | 137 | +    afs_rootFid.Fid.Vnode = 1; | 
|---|
|  | 138 | +    afs_rootFid.Fid.Unique = 1; | 
|---|
|  | 139 | + | 
|---|
|  | 140 | +    credp = crref(); | 
|---|
|  | 141 | +    if (afs_CreateReq(&treq, credp)) | 
|---|
|  | 142 | +       goto out; | 
|---|
|  | 143 | +    vcp = afs_GetVCache(&afs_rootFid, treq, NULL, NULL); | 
|---|
|  | 144 | +    if (!vcp) | 
|---|
|  | 145 | +       goto out; | 
|---|
|  | 146 | +    afs_getattr(vcp, &vattr, credp); | 
|---|
|  | 147 | +    afs_fill_inode(AFSTOV(vcp), &vattr); | 
|---|
|  | 148 | + | 
|---|
|  | 149 | +    dp = d_find_alias(AFSTOV(afs_globalVp)); | 
|---|
|  | 150 | +    spin_lock(&dcache_lock); | 
|---|
|  | 151 | +    list_del_init(&dp->d_alias); | 
|---|
|  | 152 | +    list_add(&dp->d_alias, &(AFSTOV(vcp)->i_dentry)); | 
|---|
|  | 153 | +    dp->d_inode = AFSTOV(vcp); | 
|---|
|  | 154 | +    spin_unlock(&dcache_lock); | 
|---|
|  | 155 | +    dput(dp); | 
|---|
|  | 156 | + | 
|---|
|  | 157 | +    AFS_FAST_RELE(afs_globalVp); | 
|---|
|  | 158 | +    afs_globalVp = vcp; | 
|---|
|  | 159 | +out: | 
|---|
|  | 160 | +    crfree(credp); | 
|---|
|  | 161 | +    afs_DestroyReq(treq); | 
|---|
|  | 162 | +} | 
|---|
|  | 163 | diff --git a/src/afs/afs_daemons.c b/src/afs/afs_daemons.c | 
|---|
|  | 164 | index a78aaaa..dd943a7 100644 | 
|---|
|  | 165 | --- a/src/afs/afs_daemons.c | 
|---|
|  | 166 | +++ b/src/afs/afs_daemons.c | 
|---|
|  | 167 | @@ -351,71 +351,14 @@ afs_CheckRootVolume(void) | 
|---|
|  | 168 | * count to zero and fs checkv is executed when the current | 
|---|
|  | 169 | * directory is /afs. | 
|---|
|  | 170 | */ | 
|---|
|  | 171 | -#ifdef AFS_LINUX20_ENV | 
|---|
|  | 172 | -               { | 
|---|
|  | 173 | -                   struct vrequest *treq = NULL; | 
|---|
|  | 174 | -                   struct vattr vattr; | 
|---|
|  | 175 | -                   cred_t *credp; | 
|---|
|  | 176 | -                   struct dentry *dp; | 
|---|
|  | 177 | -                   struct vcache *vcp; | 
|---|
|  | 178 | - | 
|---|
|  | 179 | -                   afs_rootFid.Fid.Volume = volid; | 
|---|
|  | 180 | -                   afs_rootFid.Fid.Vnode = 1; | 
|---|
|  | 181 | -                   afs_rootFid.Fid.Unique = 1; | 
|---|
|  | 182 | - | 
|---|
|  | 183 | -                   credp = crref(); | 
|---|
|  | 184 | -                   if (afs_CreateReq(&treq, credp)) | 
|---|
|  | 185 | -                       goto out; | 
|---|
|  | 186 | -                   vcp = afs_GetVCache(&afs_rootFid, treq, NULL, NULL); | 
|---|
|  | 187 | -                   if (!vcp) | 
|---|
|  | 188 | -                       goto out; | 
|---|
|  | 189 | -                   afs_getattr(vcp, &vattr, credp); | 
|---|
|  | 190 | -                   afs_fill_inode(AFSTOV(vcp), &vattr); | 
|---|
|  | 191 | - | 
|---|
|  | 192 | -                   dp = d_find_alias(AFSTOV(afs_globalVp)); | 
|---|
|  | 193 | - | 
|---|
|  | 194 | -#if defined(AFS_LINUX24_ENV) | 
|---|
|  | 195 | -#if defined(HAVE_DCACHE_LOCK) | 
|---|
|  | 196 | -                   spin_lock(&dcache_lock); | 
|---|
|  | 197 | -#else | 
|---|
|  | 198 | -                   spin_lock(&AFSTOV(vcp)->i_lock); | 
|---|
|  | 199 | -#endif | 
|---|
|  | 200 | -#if defined(AFS_LINUX26_ENV) | 
|---|
|  | 201 | -                   spin_lock(&dp->d_lock); | 
|---|
|  | 202 | -#endif | 
|---|
|  | 203 | -#endif | 
|---|
|  | 204 | -#if defined(D_ALIAS_IS_HLIST) | 
|---|
|  | 205 | -                   hlist_del_init(&dp->d_alias); | 
|---|
|  | 206 | -                   hlist_add_head(&dp->d_alias, &(AFSTOV(vcp)->i_dentry)); | 
|---|
|  | 207 | -#else | 
|---|
|  | 208 | -                   list_del_init(&dp->d_alias); | 
|---|
|  | 209 | -                   list_add(&dp->d_alias, &(AFSTOV(vcp)->i_dentry)); | 
|---|
|  | 210 | -#endif | 
|---|
|  | 211 | -                   dp->d_inode = AFSTOV(vcp); | 
|---|
|  | 212 | -#if defined(AFS_LINUX24_ENV) | 
|---|
|  | 213 | -#if defined(AFS_LINUX26_ENV) | 
|---|
|  | 214 | -                   spin_unlock(&dp->d_lock); | 
|---|
|  | 215 | -#endif | 
|---|
|  | 216 | -#if defined(HAVE_DCACHE_LOCK) | 
|---|
|  | 217 | -                   spin_unlock(&dcache_lock); | 
|---|
|  | 218 | -#else | 
|---|
|  | 219 | -                   spin_unlock(&AFSTOV(vcp)->i_lock); | 
|---|
|  | 220 | -#endif | 
|---|
|  | 221 | -#endif | 
|---|
|  | 222 | -                   dput(dp); | 
|---|
|  | 223 | - | 
|---|
|  | 224 | -                   AFS_FAST_RELE(afs_globalVp); | 
|---|
|  | 225 | -                   afs_globalVp = vcp; | 
|---|
|  | 226 | -               out: | 
|---|
|  | 227 | -                   crfree(credp); | 
|---|
|  | 228 | -                   afs_DestroyReq(treq); | 
|---|
|  | 229 | -               } | 
|---|
|  | 230 | +#ifdef AFS_LINUX22_ENV | 
|---|
|  | 231 | +               osi_ResetRootVCache(volid); | 
|---|
|  | 232 | #else | 
|---|
|  | 233 | -#ifdef AFS_DARWIN80_ENV | 
|---|
|  | 234 | +# ifdef AFS_DARWIN80_ENV | 
|---|
|  | 235 | afs_PutVCache(afs_globalVp); | 
|---|
|  | 236 | -#else | 
|---|
|  | 237 | +# else | 
|---|
|  | 238 | AFS_FAST_RELE(afs_globalVp); | 
|---|
|  | 239 | -#endif | 
|---|
|  | 240 | +# endif | 
|---|
|  | 241 | afs_globalVp = 0; | 
|---|
|  | 242 | #endif | 
|---|
|  | 243 | } | 
|---|
|  | 244 | -- | 
|---|
|  | 245 | 2.2.1 | 
|---|
|  | 246 |  | 
|---|
|  | 247 |  | 
|---|
|  | 248 | From 4ba5cbd90e96edd63bd0178df8ce615c1efe1b2c Mon Sep 17 00:00:00 2001 | 
|---|
|  | 249 | From: Marc Dionne <marc.dionne@your-file-system.com> | 
|---|
|  | 250 | Date: Thu, 18 Dec 2014 07:13:46 -0500 | 
|---|
|  | 251 | Subject: [PATCH 2/2] Linux: d_alias becomes d_u.d_alias | 
|---|
|  | 252 |  | 
|---|
|  | 253 | The fields in struct dentry are re-arranged so that d_alias | 
|---|
|  | 254 | shares space wth d_rcu inside the d_u union.  Some references | 
|---|
|  | 255 | need to change from d_alias to d_u.d_alias. | 
|---|
|  | 256 |  | 
|---|
|  | 257 | The kernel change was introduced for 3.19 but was also backported | 
|---|
|  | 258 | to the 3.18 stable series in 3.18.1, so this commit is required | 
|---|
|  | 259 | for 3.19 and current 3.18 kernels. | 
|---|
|  | 260 |  | 
|---|
|  | 261 | Change-Id: I711a5a3a89af6e0055381dfd4474ddca2868bb9c | 
|---|
|  | 262 | --- | 
|---|
|  | 263 | acinclude.m4               | 1 + | 
|---|
|  | 264 | src/afs/LINUX/osi_compat.h | 4 ++++ | 
|---|
|  | 265 | src/cf/linux-test4.m4      | 9 ++++++++- | 
|---|
|  | 266 | 3 files changed, 13 insertions(+), 1 deletion(-) | 
|---|
|  | 267 |  | 
|---|
|  | 268 | diff --git a/acinclude.m4 b/acinclude.m4 | 
|---|
|  | 269 | index 96adde0..e8e238b 100644 | 
|---|
|  | 270 | --- a/acinclude.m4 | 
|---|
|  | 271 | +++ b/acinclude.m4 | 
|---|
|  | 272 | @@ -899,6 +899,7 @@ case $AFS_SYSNAME in *_linux* | *_umlinux*) | 
|---|
|  | 273 | [backing-dev.h]) | 
|---|
|  | 274 | AC_CHECK_LINUX_STRUCT([cred], [session_keyring], [cred.h]) | 
|---|
|  | 275 | AC_CHECK_LINUX_STRUCT([ctl_table], [ctl_name], [sysctl.h]) | 
|---|
|  | 276 | +                AC_CHECK_LINUX_STRUCT([dentry], [d_u.d_alias], [dcache.h]) | 
|---|
|  | 277 | AC_CHECK_LINUX_STRUCT([dentry_operations], [d_automount], [dcache.h]) | 
|---|
|  | 278 | AC_CHECK_LINUX_STRUCT([inode], [i_alloc_sem], [fs.h]) | 
|---|
|  | 279 | AC_CHECK_LINUX_STRUCT([inode], [i_blkbits], [fs.h]) | 
|---|
|  | 280 | diff --git a/src/afs/LINUX/osi_compat.h b/src/afs/LINUX/osi_compat.h | 
|---|
|  | 281 | index 57f6ea7..497b1ef 100644 | 
|---|
|  | 282 | --- a/src/afs/LINUX/osi_compat.h | 
|---|
|  | 283 | +++ b/src/afs/LINUX/osi_compat.h | 
|---|
|  | 284 | @@ -37,6 +37,10 @@ typedef struct vfs_path afs_linux_path_t; | 
|---|
|  | 285 | typedef struct path afs_linux_path_t; | 
|---|
|  | 286 | #endif | 
|---|
|  | 287 |  | 
|---|
|  | 288 | +#if defined(STRUCT_DENTRY_HAS_D_U_D_ALIAS) | 
|---|
|  | 289 | +# define d_alias d_u.d_alias | 
|---|
|  | 290 | +#endif | 
|---|
|  | 291 | + | 
|---|
|  | 292 | #ifndef HAVE_LINUX_DO_SYNC_READ | 
|---|
|  | 293 | static inline int | 
|---|
|  | 294 | do_sync_read(struct file *fp, char *buf, size_t count, loff_t *offp) { | 
|---|
|  | 295 | diff --git a/src/cf/linux-test4.m4 b/src/cf/linux-test4.m4 | 
|---|
|  | 296 | index f0269b3..9dd55b3 100644 | 
|---|
|  | 297 | --- a/src/cf/linux-test4.m4 | 
|---|
|  | 298 | +++ b/src/cf/linux-test4.m4 | 
|---|
|  | 299 | @@ -713,7 +713,11 @@ AC_DEFUN([LINUX_D_ALIAS_IS_HLIST], [ | 
|---|
|  | 300 | [#include <linux/fs.h>], | 
|---|
|  | 301 | [struct dentry *d = NULL; | 
|---|
|  | 302 | struct hlist_node *hn = NULL; | 
|---|
|  | 303 | -                       d->d_alias = *hn;], | 
|---|
|  | 304 | +                       #if defined(STRUCT_DENTRY_HAS_D_U_D_ALIAS) | 
|---|
|  | 305 | +                       d->d_u.d_alias = *hn; | 
|---|
|  | 306 | +                       #else | 
|---|
|  | 307 | +                       d->d_alias = *hn; | 
|---|
|  | 308 | +                       #endif], | 
|---|
|  | 309 | [D_ALIAS_IS_HLIST], | 
|---|
|  | 310 | [define if dentry->d_alias is an hlist], | 
|---|
|  | 311 | []) | 
|---|
|  | 312 | @@ -727,6 +731,9 @@ AC_DEFUN([LINUX_HLIST_ITERATOR_NO_NODE], [ | 
|---|
|  | 313 | #include <linux/fs.h>], | 
|---|
|  | 314 | [struct dentry *d = NULL, *cur; | 
|---|
|  | 315 | struct inode *ip; | 
|---|
|  | 316 | +                       #if defined(STRUCT_DENTRY_HAS_D_U_D_ALIAS) | 
|---|
|  | 317 | +                       # define d_alias d_u.d_alias | 
|---|
|  | 318 | +                       #endif | 
|---|
|  | 319 | hlist_for_each_entry(cur, &ip->i_dentry, d_alias) { } | 
|---|
|  | 320 | ], | 
|---|
|  | 321 | [HLIST_ITERATOR_NO_NODE], | 
|---|
|  | 322 | -- | 
|---|
|  | 323 | 2.2.1 | 
|---|
|  | 324 |  | 
|---|