]> git.michaelhowe.org Git - packages/o/openafs.git/commitdiff
linux: 2.6.38: New d_op handling
authorMarc Dionne <marc.c.dionne@gmail.com>
Tue, 25 Jan 2011 22:17:21 +0000 (17:17 -0500)
committerRuss Allbery <rra@debian.org>
Tue, 1 Mar 2011 00:02:14 +0000 (16:02 -0800)
In 2.6.38, the super block structure has a new field to hold the
default dentry ops.  The vfs will automatically set it for new
dentries in most cases.

Set s_d_op to our set of operations, and omit setting the dentry
ops where the vfs will already do it (and where new locking rules
prohibit it).

Reviewed-on: http://gerrit.openafs.org/3758
Tested-by: BuildBot <buildbot@rampaginggeek.com>
Reviewed-by: Derrick Brashear <shadow@dementia.org>
(cherry picked from commit 08bb83d95027bb3ac68834d12b72bdc647fa24a9)

Change-Id: I15affd47c02653b3b46a0c97e64d06ba4ecbac1c
Signed-off-by: Anders Kaseorg <andersk@mit.edu>
Reviewed-on: http://gerrit.openafs.org/3994
Reviewed-by: Simon Wilkinson <sxw@inf.ed.ac.uk>
Tested-by: BuildBot <buildbot@rampaginggeek.com>
Reviewed-by: Marc Dionne <marc.c.dionne@gmail.com>
Reviewed-by: Russ Allbery <rra@stanford.edu>
(cherry picked from commit 0d95e6b800044f9cfa6dd4057477394c3a9cc44d)

acinclude.m4
src/afs/LINUX/osi_vfsops.c
src/afs/LINUX/osi_vnodeops.c

index de82283503944e35f50604096fe66826d3bda5f0..7904e209204fc09337aa0702fc2d3ed92abe0c96 100644 (file)
@@ -749,6 +749,7 @@ case $AFS_SYSNAME in *_linux* | *_umlinux*)
                 LINUX_FS_STRUCT_SUPER_HAS_ALLOC_INODE
                 LINUX_FS_STRUCT_SUPER_HAS_EVICT_INODE
                 LINUX_FS_STRUCT_SUPER_BLOCK_HAS_S_BDI
+                AC_CHECK_LINUX_STRUCT([super_block], [s_d_op], [fs.h])
                 LINUX_STRUCT_BDI_HAS_NAME
                 LINUX_FS_STRUCT_ADDRESS_SPACE_HAS_PAGE_LOCK
                 LINUX_FS_STRUCT_ADDRESS_SPACE_HAS_GFP_MASK
index fb69d39c83c58c3ec51a61540203f0b0a272b946..ae807810089575ed64dcc25191203fa283095239 100644 (file)
@@ -140,16 +140,22 @@ afs_read_super(struct super_block *sb, void *data, int silent)
     sb->s_blocksize_bits = 10;
     sb->s_magic = AFS_VFSMAGIC;
     sb->s_op = &afs_sops;      /* Super block (vfs) ops */
+
+#if defined(STRUCT_SUPER_BLOCK_HAS_S_D_OP)
+    sb->s_d_op = &afs_dentry_operations;
+#endif
+
+#if defined(AFS_LINUX26_ENV)
     /* used for inodes backing_dev_info field, also */
     afs_backing_dev_info = osi_Alloc(sizeof(struct backing_dev_info));
-#if defined(HAVE_BDI_INIT)
+# if defined(HAVE_BDI_INIT)
     bdi_init(afs_backing_dev_info);
-#endif
-#if defined(STRUCT_BDI_HAS_NAME)
+# endif
+# if defined(STRUCT_BDI_HAS_NAME)
     afs_backing_dev_info->name = "openafs";
-#endif
+# endif
     afs_backing_dev_info->ra_pages = 0;
-#if defined (STRUCT_SUPER_BLOCK_HAS_S_BDI)
+# if defined (STRUCT_SUPER_BLOCK_HAS_S_BDI)
     sb->s_bdi = afs_backing_dev_info;
     /* The name specified here will appear in the flushing thread name - flush-afs */
     bdi_register(afs_backing_dev_info, NULL, "afs");
@@ -227,7 +233,9 @@ afs_root(struct super_block *afsp)
 #else
                afsp->s_root = d_alloc_root(ip, NULL);
 #endif
+#if !defined(STRUCT_SUPER_BLOCK_HAS_S_D_OP)
                afsp->s_root->d_op = &afs_dentry_operations;
+#endif
            } else
                code = ENOENT;
        }
index 835276968f15eb78fda5aa8f369588c8bf9b6180..03294b2e9d87e2310f2bb253c6bbb03cb949ec79 100644 (file)
@@ -1067,7 +1067,9 @@ afs_linux_create(struct inode *dip, struct dentry *dp, int mode)
        afs_getattr(vcp, &vattr, credp);
        afs_fill_inode(ip, &vattr);
        insert_inode_hash(ip);
+#if !defined(STRUCT_SUPER_BLOCK_HAS_S_D_OP)
        dp->d_op = &afs_dentry_operations;
+#endif
        dp->d_time = hgetlo(VTOAFS(dip)->m.DataVersion);
        d_instantiate(dp, ip);
     }
@@ -1123,7 +1125,9 @@ afs_linux_lookup(struct inode *dip, struct dentry *dp)
            )
            insert_inode_hash(ip);
     }
+#if !defined(STRUCT_SUPER_BLOCK_HAS_S_D_OP)
     dp->d_op = &afs_dentry_operations;
+#endif
     dp->d_time = hgetlo(VTOAFS(dip)->m.DataVersion);
     AFS_GUNLOCK();
 
@@ -1315,7 +1319,9 @@ afs_linux_mkdir(struct inode *dip, struct dentry *dp, int mode)
        afs_getattr(tvcp, &vattr, credp);
        afs_fill_inode(ip, &vattr);
 
+#if !defined(STRUCT_SUPER_BLOCK_HAS_S_D_OP)
        dp->d_op = &afs_dentry_operations;
+#endif
        dp->d_time = hgetlo(VTOAFS(dip)->m.DataVersion);
        d_instantiate(dp, ip);
     }