PATCH: Arla 0.90 on Linux 2.6.27

Bo Brantén bosse at acc.umu.se
Wed Oct 29 00:37:40 CET 2008


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;
  }


More information about the Arla-drinkers mailing list