PATCH: Arla 0.90 on Linux 2.6.27

Bo Brantén <[email protected]>
Newsgroups gmane.comp.file-systems.arla.general
Message-ID <[email protected]>
I produced a patch against Arla 0.90 also, it could be convenient for they 
who want to run it on later Linux kernels.

diff -uprN arla-0.90/nnpfs/linux/nnpfs_blocks.c arla-0.90-new/nnpfs/linux/nnpfs_blocks.c
--- arla-0.90/nnpfs/linux/nnpfs_blocks.c	2007-01-08 14:24:24.000000000 +0100
+++ arla-0.90-new/nnpfs/linux/nnpfs_blocks.c	2008-10-06 19:13:20.000000000 +0200
@@ -34,7 +34,7 @@
   * POSSIBILITY OF SUCH DAMAGE.
   */

-/* $Id: nnpfs_blocks.c,v 1.3 2007/01/08 13:24:24 tol Exp $ */
+/* $Id: nnpfs_blocks.c,v 1.4 2008/03/08 21:38:16 tol Exp $ */

  #include <nnpfs/nnpfs_locl.h>
  #include <nnpfs/nnpfs_fs.h>
@@ -302,6 +302,24 @@ nnpfs_block_extend(struct nnpfs_node *no
      return ret;
  }

+#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 23)
+/*
+ * Helper to emulate vfs_path_lookup() on linux < 2.6.23
+ */
+static int
+vfs_path_lookup(struct dentry *dentry, struct vfsmount *mnt,
+		const char *cachename, unsigned int flags,
+		struct nameidata *nd)
+{
+    nd->dentry = dget(dentry);
+    nd->mnt = mntget(mnt);
+    nd->last_type = LAST_ROOT;
+    nd->depth = 0;
+    nd->flags = flags;
+    return path_walk(cachename, nd);
+}
+#endif /* LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 23) */
+
  /*
   * open indicated cache block file. needs to be closed by caller.
   *
@@ -351,16 +369,10 @@ nnpfs_block_open(struct nnpfs_node *node
      current->fsuid = nnpfsp->uid;
      current->fsgid = nnpfsp->gid;

-    nd.dentry = dget(nnpfsp->cachedir);
-    nd.mnt = mntget(nnpfsp->cacheroot);
-    nd.last_type = LAST_NORM;
-    nd.depth = 0;
-    nd.flags = 0;
- 
-    if (flags & O_CREAT)
-	nd.flags = LOOKUP_PARENT;
- 
-    ret = path_walk(cachename, &nd);
+    ret = vfs_path_lookup(nnpfsp->cachedir, nnpfsp->cacheroot,
+			  cachename,
+			  flags & O_CREAT ? LOOKUP_PARENT : 0,
+			  &nd);
      if (ret) {
  	uint32_t nmasks = node->data.nmasks;
  	uint32_t mask;
@@ -391,12 +403,21 @@ nnpfs_block_open(struct nnpfs_node *node
  	if (IS_ERR(dentry)) {
  	    ret = PTR_ERR(dentry);
  	} else {
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,25)
  	    ret = vfs_create(nd.dentry->d_inode, dentry, S_IRUSR|S_IWUSR, &nd);
+#else
+	    ret = vfs_create(nd.path.dentry->d_inode, dentry, S_IRUSR|S_IWUSR, &nd);
+#endif
  	    dput(dentry);
  	}

+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,25)
  	mutex_unlock(&nd.dentry->d_inode->i_mutex);
  	path_release(&nd);
+#else
+	mutex_unlock(&nd.path.dentry->d_inode->i_mutex);
+	path_put(&nd.path);
+#endif

  	if (ret) {
  	    printk("nnpfs_block_open(%s) create failed: %d\n", cachename, -ret);
@@ -410,12 +431,20 @@ nnpfs_block_open(struct nnpfs_node *node
  	    ret = nnpfs_block_extend(node, offset);
  	}
      } else {
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,25)
  	struct file *f = dentry_open(nd.dentry, nd.mnt, flags);
+#else
+	struct file *f = dentry_open(nd.path.dentry, nd.path.mnt, flags);
+#endif
  	if (IS_ERR(f)) {
  	    ret = PTR_ERR(f);
  	    printk("nnpfs_block_open(%s) open failed: %d\n", cachename, -ret);
  	    nnpfs_debug_oops();
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,25)
  	    path_release(&nd);
+#else
+	    path_put(&nd.path);
+#endif
  	} else {
  	    *file = f;
  	}
diff -uprN arla-0.90/nnpfs/linux/nnpfs_inodeops.c arla-0.90-new/nnpfs/linux/nnpfs_inodeops.c
--- arla-0.90/nnpfs/linux/nnpfs_inodeops.c	2006-12-11 17:35:26.000000000 +0100
+++ arla-0.90-new/nnpfs/linux/nnpfs_inodeops.c	2008-10-27 17:58:25.000000000 +0100
@@ -48,7 +48,7 @@
  #include <asm/fcntl.h>

  #ifdef RCSID
-RCSID("$Id: nnpfs_inodeops.c,v 1.223 2006/12/11 16:35:26 tol Exp $");
+RCSID("$Id: nnpfs_inodeops.c,v 1.224 2008/03/08 21:40:10 tol Exp $");
  #endif

  static int
@@ -105,7 +105,11 @@ nnpfs_vma_close (struct vm_area_struct *
  }

  static struct vm_operations_struct nnpfs_file_vm_ops = {
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 23)
      .nopage	= filemap_nopage,
+#else
+    .fault      = filemap_fault,
+#endif
      .close	= nnpfs_vma_close,
  };

@@ -134,12 +138,14 @@ nnpfs_print_path(struct dentry *dentry)
   *
   */

+#if 0
  void
  nnpfs_print_lock(char *s, struct semaphore *sem)
  {
      NNPFSDEB(XDEBLOCK, ("lock: %s sem: %p count: %d\n",
  		      s, sem, (int)atomic_read(&sem->count)));
  }
+#endif

  /*
   *
@@ -592,8 +598,13 @@ check_rights (nnpfs_rights rights, int m
   * We don't hold i_mutex.
   */

+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,27)
  static int
  nnpfs_permission(struct inode *inode, int mode, struct nameidata *nd)
+#else
+static int
+nnpfs_permission(struct inode *inode, int mode)
+#endif
  {
      int error = 0;
      nnpfs_pag_t pag = nnpfs_get_pag();
@@ -1545,6 +1556,8 @@ nnpfs_d_delete(struct dentry *dentry)
      return 0;
  }

+#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 23)
+
  static ssize_t
  nnpfs_sendfile(struct file *file, loff_t *ppos, size_t count,
  	       read_actor_t actor, void *target)
@@ -1568,6 +1581,33 @@ nnpfs_sendfile(struct file *file, loff_t
      return error;
  }

+#else
+
+static ssize_t
+nnpfs_splice_read(struct file *file, loff_t *ppos,
+		  struct pipe_inode_info *pipe, size_t count,
+		  unsigned int flags)
+{
+    int error = 0;
+    struct inode *inode = file->f_dentry->d_inode;
+    struct nnpfs_node *xn = VNODE_TO_XNODE(inode);
+ 
+    if (xn != NULL)
+	NNPFSDEB(XDEBVNOPS, ("nnpfs_sendfile: tokens: 0x%x\n", xn->tokens));
+
+    error = nnpfs_data_valid(inode, NNPFS_DATA_R, *ppos, *ppos + count);
+    if (error) {
+	NNPFSDEB(XDEBVNOPS, ("nnpfs_sendfile: data not valid %d\n", error));
+	return error;
+    }
+    error = file->f_op->splice_read(file, ppos, pipe, count, flags);
+
+    NNPFSDEB(XDEBVNOPS, ("nnpfs_sendfile: error = %d\n", error));
+    return error;
+}
+
+#endif /* LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 23) */
+
  /*
   *
   *
@@ -1924,7 +1964,11 @@ struct file_operations nnpfs_file_operat
      .flush	= nnpfs_flush,
      .release	= nnpfs_release_file,
      .fsync	= nnpfs_fsync,
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 23)
      .sendfile	= nnpfs_sendfile,
+#else
+    .splice_read = nnpfs_splice_read,
+#endif
  };

  struct file_operations nnpfs_dead_operations = {
diff -uprN arla-0.90/nnpfs/linux/nnpfs_message.c arla-0.90-new/nnpfs/linux/nnpfs_message.c
--- arla-0.90/nnpfs/linux/nnpfs_message.c	2007-01-09 17:33:31.000000000 +0100
+++ arla-0.90-new/nnpfs/linux/nnpfs_message.c	2008-10-06 19:51:49.000000000 +0200
@@ -45,7 +45,7 @@
  #include <linux/mount.h>

  #ifdef RCSID
-RCSID("$Id: nnpfs_message.c,v 1.143.2.1 2007/01/09 16:33:31 tol Exp $");
+RCSID("$Id: nnpfs_message.c,v 1.143 2006/12/11 16:40:24 tol Exp $");
  #endif

  static void
@@ -605,12 +605,10 @@ gc_block(struct nnpfs *nnpfsp,
      }

      if (!nnpfs_block_have_p(xn, offset)) {
-#if 0   /* happens when daemon sends several messages for same block */
  	printk(KERN_EMERG "NNPFS/gc_block: "
  	       "ENOENT (%d,%d,%d,%d) 0x%llx\n",
  	       xn->handle.a, xn->handle.b, xn->handle.c, xn->handle.d,
  	       (unsigned long long)offset);
-#endif
  	return -ENOENT;
      }

@@ -737,9 +735,15 @@ nnpfs_message_version(struct nnpfs *nnpf
  		   "nnpfs_message_version failed path_lookup, "
  		   "errno: %d\n", error);
  	} else {
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,25)
  	    nnpfsp->cacheroot = mntget(nd.mnt);
  	    nnpfsp->cachedir = dget(nd.dentry);
  	    path_release(&nd);
+#else
+	    nnpfsp->cacheroot = mntget(nd.path.mnt);
+	    nnpfsp->cachedir = dget(nd.path.dentry);
+	    path_put(&nd.path);
+#endif

  	    nnpfsp->uid = current->fsuid;
  	    nnpfsp->gid = current->fsgid;
diff -uprN arla-0.90/nnpfs/linux/nnpfs_syscalls.c arla-0.90-new/nnpfs/linux/nnpfs_syscalls.c
--- arla-0.90/nnpfs/linux/nnpfs_syscalls.c	2007-01-03 15:26:27.000000000 +0100
+++ arla-0.90-new/nnpfs/linux/nnpfs_syscalls.c	2008-10-28 23:33:30.000000000 +0100
@@ -147,6 +147,8 @@ static int nnpfs_sec_registered = 0;
  #define SEC2PAG(s) (nnpfs_pag_t)(unsigned long)(s)
  #define PAG2SEC(p) (void *)(unsigned long)(p)

+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24)
+
  static int
  nnpfs_sec_task_alloc(struct task_struct *p)
  {
@@ -164,6 +166,8 @@ nnpfs_sec_task_free(struct task_struct *
  	p->security = NULL;
  }

+#endif
+
  static nnpfs_pag_t
  nnpfs_get_pag_sec(void)
  {
@@ -188,11 +192,13 @@ nnpfs_set_pag_sec(void)
      return 0;
  }

+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24)
  static struct security_operations nnpfs_sec_ops = {
      .task_alloc_security = nnpfs_sec_task_alloc,
      .task_free_security = nnpfs_sec_task_free,
  //    .task_reparent_to_init = nnpfs_sec_reparent_to_init,
  };
+#endif

  #endif /* CONFIG_SECURITY */

@@ -244,7 +250,11 @@ store_pag(nnpfs_pag_t pagnum)
  {
      struct group_info *old_gi = current->group_info;
      struct group_info *new_gi;
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,25)
      int nblocks, count;
+#else
+    unsigned int nblocks, count;
+#endif
      int found = 0;
      int i, k;

@@ -528,7 +538,11 @@ user_path2dentry (struct nameidata *nd,
      putname(kname);
      if (error)
  	return ERR_PTR(error);
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,25)
      return nd->dentry;
+#else
+    return nd->path.dentry;
+#endif
  }

  asmlinkage long
@@ -675,7 +689,11 @@ sys_afs_int (int operation,

   unlock:
      if (dentry)
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,25)
  	path_release(&nd);
+#else
+	path_put(&nd.path);
+#endif

      NNPFSDEB(XDEBSYS, ("nnpfs_syscall returns error: %ld\n", error));

@@ -780,7 +798,11 @@ static int nnpfs_init_procfs(void)
  {
      struct proc_dir_entry *entry;

+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,26)
      nnpfs_procfs_dir = proc_mkdir(NNPFS_PROC_DIR, proc_root_fs);
+#else
+    nnpfs_procfs_dir = proc_mkdir("fs/" NNPFS_PROC_DIR, NULL);
+#endif
      if (nnpfs_procfs_dir == NULL)
  	return -ENOMEM;

@@ -789,7 +811,11 @@ static int nnpfs_init_procfs(void)
      entry = create_proc_entry(NNPFS_PROC_NODE, 0666, nnpfs_procfs_dir);
      if (entry == NULL) {
  	NNPFSDEB(XDEBSYS, ("nnpfs_init_procfs: no node\n"));
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,26)
  	remove_proc_entry(NNPFS_PROC_DIR, proc_root_fs);
+#else
+	remove_proc_entry("fs/" NNPFS_PROC_DIR, NULL);
+#endif
  	return -ENOMEM;
      }

@@ -815,7 +841,11 @@ static void nnpfs_exit_procfs(void)
      }
  #endif /* SYSCALLCOMPAT */
      remove_proc_entry(NNPFS_PROC_NODE, nnpfs_procfs_dir);
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,26)
      remove_proc_entry(NNPFS_PROC_DIR, proc_root_fs);
+#else
+    remove_proc_entry("fs/" NNPFS_PROC_DIR, NULL);
+#endif
  }

  #ifdef GROUPPAGS
@@ -840,12 +870,14 @@ void
  install_afs_syscall(void)
  {
  #ifdef CONFIG_SECURITY
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24)
      if (register_security(&nnpfs_sec_ops))
  	NNPFSDEB(XDEBSYS,
  		 ("install_afs_syscall: nnpfs_init_sec failed\n"));
      else
  	nnpfs_sec_registered = 1;
  #endif
+#endif

      nnpfs_init_procfs();

@@ -888,9 +920,11 @@ restore_afs_syscall (void)
  #endif /* SYSCALLHACK */

  #ifdef CONFIG_SECURITY
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24)
      if (nnpfs_sec_registered)
  	if (unregister_security(&nnpfs_sec_ops))
  	    printk(KERN_EMERG "nnpfs_exit_sec: couldn't unregister\n");
+#endif
  #endif /* !CONFIG_SECURITY */

  #ifdef GROUPPAGS
diff -uprN arla-0.90/nnpfs/linux/nnpfs_syscalls-lossage.c arla-0.90-new/nnpfs/linux/nnpfs_syscalls-lossage.c
--- arla-0.90/nnpfs/linux/nnpfs_syscalls-lossage.c	2006-12-11 17:31:45.000000000 +0100
+++ arla-0.90-new/nnpfs/linux/nnpfs_syscalls-lossage.c	2008-10-06 19:17:03.000000000 +0200
@@ -63,6 +63,11 @@ const char * __attribute__((weak))
  		    unsigned long *offset,
  		    char **modname, char *namebuf);

+#if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,18)
+#ifdef __x86_64__
+extern rwlock_t tasklist_lock __attribute__((weak));
+#endif
+#endif
  static void **
  get_start_addr(void) {
  #ifdef __x86_64__
diff -uprN arla-0.90/nnpfs/linux/nnpfs_vfsops.c arla-0.90-new/nnpfs/linux/nnpfs_vfsops.c
--- arla-0.90/nnpfs/linux/nnpfs_vfsops.c	2006-12-11 17:43:35.000000000 +0100
+++ arla-0.90-new/nnpfs/linux/nnpfs_vfsops.c	2008-10-06 20:50:41.000000000 +0200
@@ -49,9 +49,13 @@ RCSID("$Id: nnpfs_vfsops.c,v 1.109 2006/

  struct nnpfs nnpfs[NNNPFS];

+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,25)
  static void nnpfs_read_inode(struct inode *inode);
+#endif
  static void nnpfs_put_super(struct super_block *sb);
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,25)
  static void nnpfs_put_inode(struct inode *inode);
+#endif
  static void nnpfs_write_super(struct super_block * sb);

  #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,18)
@@ -61,8 +65,10 @@ static int nnpfs_statfs(struct super_blo
  #endif

  static struct super_operations nnpfs_sops = { 
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,25)
      read_inode		: nnpfs_read_inode,
      put_inode		: nnpfs_put_inode,
+#endif
      alloc_inode		: nnpfs_node_alloc,
      destroy_inode	: nnpfs_node_free,
      drop_inode		: generic_delete_inode,
@@ -189,7 +195,11 @@ nnpfs_read_super (struct super_block * s
  	if (error)
  	    ddev = ERR_PTR(error);
  	else
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,25)
  	    ddev = nd.dentry;
+#else
+	    ddev = nd.path.dentry;
+#endif

  	if (!IS_ERR(ddev)) {
  	    minordevice = MINOR(ddev->d_inode->i_rdev);
@@ -273,6 +283,7 @@ nnpfs_put_super(struct super_block *sb)
      NNPFSDEB(XDEBVFOPS, ("nnpfs_put_super exiting\n"));
  }

+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,25)
  static void
  nnpfs_read_inode(struct inode *inode)
  {
@@ -339,6 +350,7 @@ nnpfs_put_inode(struct inode *inode)

      up(&nnpfsp->inactive_sem);
  }
+#endif // LINUX_VERSION_CODE < KERNEL_VERSION(2,6,25)

  static int
  nnpfs_statfs_int(struct super_block *sb, struct kstatfs *buf)
@@ -352,7 +364,15 @@ nnpfs_statfs_int(struct super_block *sb,
      tmp.f_bavail  = 1024*1024*2-50;
      tmp.f_files   = 1024*1024;
      tmp.f_ffree   = 1024*1024-100;
+    tmp.f_fsid.val[0] = 0;
+    tmp.f_fsid.val[1] = 0;
      tmp.f_namelen = NAME_MAX;
+    tmp.f_frsize  = 0;
+    tmp.f_spare[0] = 0;
+    tmp.f_spare[1] = 0;
+    tmp.f_spare[2] = 0;
+    tmp.f_spare[3] = 0;
+    tmp.f_spare[4] = 0;
      *buf = tmp;
      return 0;
  }
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.