]> git.michaelhowe.org Git - packages/o/openafs.git/commitdiff
Linux: 2.6.38: Adjust for permission inode operation changes
authorMarc Dionne <marc.c.dionne@gmail.com>
Sat, 29 Jan 2011 00:41:32 +0000 (19:41 -0500)
committerRuss Allbery <rra@debian.org>
Mon, 28 Feb 2011 23:58:44 +0000 (15:58 -0800)
The permission i_op has a new signature with a flags argument, and
must now deal with RCU path walking.
- Fix existing configure test for this i_op, it succeeds when it
shouldn't
- Add a new configure test for the new signature
- Make our permission i_op "RCU-walk aware" - return ECHILD if
called in that mode

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

Change-Id: Iebfab65b3442ea286873e6af96f1c05c98e5d126
Signed-off-by: Anders Kaseorg <andersk@mit.edu>
Reviewed-on: http://gerrit.openafs.org/3997
Reviewed-by: Simon Wilkinson <sxw@inf.ed.ac.uk>
Tested-by: BuildBot <buildbot@rampaginggeek.com>
Reviewed-by: Russ Allbery <rra@stanford.edu>
(cherry picked from commit 29855d9dc5d117ba106bdb0dd9a9bc6e0592c19c)

acinclude.m4
src/afs/LINUX/osi_vnodeops.c
src/cf/linux-test4.m4

index 60c47d19458b83c821b35de8120d17450997d6df..de82283503944e35f50604096fe66826d3bda5f0 100644 (file)
@@ -768,6 +768,7 @@ case $AFS_SYSNAME in *_linux* | *_umlinux*)
                 LINUX_WRITE_INODE_RETURN_TYPE
                 LINUX_IOP_I_CREATE_TAKES_NAMEIDATA
                 LINUX_IOP_I_LOOKUP_TAKES_NAMEIDATA
+                LINUX_IOP_I_PERMISSION_TAKES_FLAGS
                 LINUX_IOP_I_PERMISSION_TAKES_NAMEIDATA
                 LINUX_IOP_I_PUT_LINK_TAKES_COOKIE
                 LINUX_DOP_D_REVALIDATE_TAKES_NAMEIDATA
index 2389389c8e624281a0fa69abfc64c2a1213d33ce..835276968f15eb78fda5aa8f369588c8bf9b6180 100644 (file)
@@ -1786,16 +1786,25 @@ afs_linux_updatepage(struct file *fp, struct page *pp, unsigned long offset,
  * Check access rights - returns error if can't check or permission denied.
  */
 static int
-#ifdef IOP_PERMISSION_TAKES_NAMEIDATA
+#if defined(IOP_PERMISSION_TAKES_FLAGS)
+afs_linux_permission(struct inode *ip, int mode, unsigned int flags)
+#elif defined(IOP_PERMISSION_TAKES_NAMEIDATA)
 afs_linux_permission(struct inode *ip, int mode, struct nameidata *nd)
 #else
 afs_linux_permission(struct inode *ip, int mode)
 #endif
 {
     int code;
-    cred_t *credp = crref();
+    cred_t *credp;
     int tmp = 0;
 
+#if defined(IOP_PERMISSION_TAKES_FLAGS)
+    /* We don't support RCU path walking */
+    if (flags & IPERM_FLAG_RCU)
+       return -ECHILD;
+#endif
+
+    credp = crref();
     AFS_GLOCK();
     if (mode & MAY_EXEC)
        tmp |= VEXEC;
index 67ddf913fcc33214139b837d6352187e89e1a018..88e48636a0da2c7cbb050cf937a903969b1b8dca 100644 (file)
@@ -680,12 +680,24 @@ AC_DEFUN([LINUX_IOP_I_PERMISSION_TAKES_NAMEIDATA], [
 [#include <linux/fs.h>
 #include <linux/namei.h>],
 [struct inode _inode;
-struct dentry _dentry;
 struct nameidata _nameidata;
 (void)_inode.i_op->permission(&_inode, 0, &_nameidata);],
                       [IOP_PERMISSION_TAKES_NAMEIDATA],
                       [define if your iops.permission takes a nameidata argument],
-                      [])
+                      [-Werror])
+])
+
+
+AC_DEFUN([LINUX_IOP_I_PERMISSION_TAKES_FLAGS], [
+  AC_CHECK_LINUX_BUILD([whether inode_operations.permission takes flags],
+                       [ac_cv_linux_func_i_permission_takes_flags],
+                       [#include <linux/fs.h>],
+                       [struct inode _inode;
+                       unsigned int flags = 0;
+                       (void)_inode.i_op->permission(&_inode, 0, flags);],
+                      [IOP_PERMISSION_TAKES_FLAGS],
+                      [define if your iops.permission takes a flags argument],
+                      [-Werror])
 ])