]> git.michaelhowe.org Git - packages/o/openafs.git/commitdiff
Linux 3.11: Convert from readdir to iterate file operation
authorMarc Dionne <marc.dionne@your-file-system.com>
Mon, 8 Jul 2013 14:53:00 +0000 (10:53 -0400)
committerStephan Wiesand <stephan.wiesand@desy.de>
Wed, 14 Aug 2013 14:39:52 +0000 (07:39 -0700)
Convert the readdir function so that it can be used as the new
"iterate" file operation.  This new operation is passed a context
that contains a pointer to the filldir function and the offset.
The context is passed into the new dir_emit function that will
call the function specified by the context.

The new dir_emit function returns true on success, so we must be
careful about how we check for failure since this is different
behaviour from what filldir currently does.

Reviewed-on: http://gerrit.openafs.org/10051
Tested-by: BuildBot <buildbot@rampaginggeek.com>
Reviewed-by: Derrick Brashear <shadow@your-file-system.com>
(cherry picked from commit 902b8809f03533ffa7731919930bb5178f77df6c)

Change-Id: I12dc2517af66b66b2de6b2cb01d39e3a0cbc5fe2
Reviewed-on: http://gerrit.openafs.org/10118
Tested-by: BuildBot <buildbot@rampaginggeek.com>
Reviewed-by: Andrew Deason <adeason@sinenomine.net>
Reviewed-by: Jeffrey Altman <jaltman@your-file-system.com>
Reviewed-by: Stephan Wiesand <stephan.wiesand@desy.de>
acinclude.m4
src/afs/LINUX/osi_vnodeops.c

index b548b9258b7c78b9724f5aa1a926746a08d8cbaa..1410066189bb9eb9fecc6e3c1231e26d55c35418 100644 (file)
@@ -826,6 +826,7 @@ case $AFS_SYSNAME in *_linux* | *_umlinux*)
                 AC_CHECK_LINUX_STRUCT([inode], [i_mutex], [fs.h])
                 AC_CHECK_LINUX_STRUCT([inode], [i_security], [fs.h])
                 AC_CHECK_LINUX_STRUCT([file_operations], [flock], [fs.h])
+                AC_CHECK_LINUX_STRUCT([file_operations], [iterate], [fs.h])
                 AC_CHECK_LINUX_STRUCT([file_operations], [sendfile], [fs.h])
                 AC_CHECK_LINUX_STRUCT([file_system_type], [mount], [fs.h])
                 AC_CHECK_LINUX_STRUCT([filename], [name], [fs.h])
index fa0ad91be0c287474145d70a93e060d1c4fa0fd6..b91250ed5104fc727fcb2c8474f56c5a311545b7 100644 (file)
@@ -269,7 +269,11 @@ extern int BlobScan(struct dcache * afile, afs_int32 ablob);
  * handling and use of bulkstats will need to be reflected here as well.
  */
 static int
+#if defined(STRUCT_FILE_OPERATIONS_HAS_ITERATE)
+afs_linux_readdir(struct file *fp, struct dir_context *ctx)
+#else
 afs_linux_readdir(struct file *fp, void *dirbuf, filldir_t filldir)
+#endif
 {
     struct vcache *avc = VTOAFS(FILE_INODE(fp));
     struct vrequest treq;
@@ -347,7 +351,11 @@ afs_linux_readdir(struct file *fp, void *dirbuf, filldir_t filldir)
      * takes an offset in units of blobs, rather than bytes.
      */
     code = 0;
+#if defined(STRUCT_FILE_OPERATIONS_HAS_ITERATE)
+    offset = ctx->pos;
+#else
     offset = (int) fp->f_pos;
+#endif
     while (1) {
        dirpos = BlobScan(tdc, offset);
        if (!dirpos)
@@ -404,7 +412,13 @@ afs_linux_readdir(struct file *fp, void *dirbuf, filldir_t filldir)
             * holding the GLOCK.
             */
            AFS_GUNLOCK();
+#if defined(STRUCT_FILE_OPERATIONS_HAS_ITERATE)
+           /* dir_emit returns a bool - true when it succeeds.
+            * Inverse the result to fit with how we check "code" */
+           code = !dir_emit(ctx, de->name, len, ino, type);
+#else
            code = (*filldir) (dirbuf, de->name, len, offset, ino, type);
+#endif
            AFS_GLOCK();
        }
        DRelease(de, 0);
@@ -415,7 +429,11 @@ afs_linux_readdir(struct file *fp, void *dirbuf, filldir_t filldir)
     /* If filldir didn't fill in the last one this is still pointing to that
      * last attempt.
      */
+#if defined(STRUCT_FILE_OPERATIONS_HAS_ITERATE)
+    ctx->pos = (loff_t) offset;
+#else
     fp->f_pos = (loff_t) offset;
+#endif
 
     ReleaseReadLock(&tdc->lock);
     afs_PutDCache(tdc);
@@ -734,7 +752,11 @@ out:
 
 struct file_operations afs_dir_fops = {
   .read =      generic_read_dir,
+#if defined(STRUCT_FILE_OPERATIONS_HAS_ITERATE)
+  .iterate =   afs_linux_readdir,
+#else
   .readdir =   afs_linux_readdir,
+#endif
 #ifdef HAVE_UNLOCKED_IOCTL
   .unlocked_ioctl = afs_unlocked_xioctl,
 #else