[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: Remove cdfs-src from testing [SOLVED]



El mié, 26-11-2008 a las 01:16 +0100, mariodebian escribió:
> El mar, 25-11-2008 a las 18:28 +0100, Adeodato Simó escribió:
> > * Ben Hutchings [Tue, 25 Nov 2008 02:21:21 +0000]:
> > 
> > > Based on Eduard Bloch's comments to #482075 it does not appear that
> > > cdfs-src can be fixed for lenny.
> > 
> > Thanks for the notice. Will do, but let's CC Mario Izquierdo first.
> > Apparently TCOS uses this, so maybe they've found some solution, or
> > they've moved on to cddfs, or else.
> > 
> > Cheers,
> > 
> 
> 
> Hi again.
> 
> 
> I send a mail to kernel commit author:
> http://git.kernel.org/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=12debc4248a4a7f1873e47cda2cdd7faca80b099
> 
> when iget and super_operations->read_inode was removed, I hope He can
> help us to make CDFS work again.
> 
> 
> Please wait until David answer us for CDFS patch.
> 
> 
> Greetings


Very good news !!!!


David Howells send me some suggestions and code to make work CDFS again,
and it works like a charm in 2.6.26-1-686 kernel.

I'm very newie patching kernel stuff and he explain me some code bugs
like a excelent teacher.

David Howells is my personal hero for today. Many thanks David.



** FOR DEBIAN PEOPLE **
I will prepare new tcos-extra-modules package with CDFS patch:

http://www.tcosproject.org/pool/main/t/tcos-extra-modules/

Please, don't remove cdfs from lenny.


Cheers
-- 
http://soleup.eup.uva.es/mariodebian
Sólo en cdfs.working/2.6: modules.order
diff -ur cdfs/2.6/root.c cdfs.working/2.6/root.c
--- cdfs/2.6/root.c	2006-10-24 21:41:12.000000000 +0200
+++ cdfs.working/2.6/root.c	2008-11-26 15:27:07.000000000 +0100
@@ -42,7 +42,9 @@
 extern struct seq_operations cdfs_operations;
 extern struct _track_info *dummy_track_p;
 
-
+#if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,24) 
+struct inode *cdfs_iget(struct super_block *sp, unsigned long ino); 
+#endif
 /*============================================================================*
  *  cdfs_open()                                                               *
  *	Description:                                                          *
@@ -125,6 +127,7 @@
   struct cdrom_tocentry   entry;   
   int no_audio=0, no_data=0;
   cd * this_cd;
+  struct inode *retinode;
 
   PRINT("cdfs_mount\n");
 
@@ -361,8 +364,19 @@
   sb->s_magic  = CDFS_MAGIC;
   sb->s_flags |= MS_RDONLY;
   sb->s_op     = &cdfs_ops;
-  sb->s_root   = d_alloc_root(iget(sb, 0));
-  
+  /* always get inode status */
+#if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,24)
+  retinode=cdfs_iget(sb, 0);
+#else
+  retinode=iget(sb, 0);
+#endif
+  if ( IS_ERR(retinode) )
+    return PTR_ERR(retinode);
+
+  PRINT("retinode = %ld\n", retinode->i_ino);
+
+  sb->s_root   = d_alloc_root(retinode);
+
   cdfs_proc_cd = this_cd;
 
 #ifdef OLD_KERNEL
@@ -455,18 +469,28 @@
   int i;
   cd * this_cd = cdfs_info(dir->i_sb);
 
-  PRINT("cdfs_lookup %s ino=%ld -> ", dentry->d_name.name, dir->i_ino);
+  PRINT("cdfs_lookup %s ino=%ld \n", dentry->d_name.name, dir->i_ino);
 
   for(i=0; i<T2I(this_cd->tracks); i++)
     if (!(strcmp(this_cd->track[i].name, dentry->d_name.name))) {
-      if ((inode=iget(dir->i_sb, i))==NULL) {
-        return ERR_PTR(-EACCES);
-      } else {
-        d_add(dentry, inode);
-        return ERR_PTR(0);
-      }
+        goto found;
     }
   return ERR_PTR(-ENOENT);
+
+/* Use goto and read inode with iget()/cdfs_iget() */
+/* Thanks to David Howells for patch and Master class in his mail */
+found:
+#if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,24)
+inode = cdfs_iget(dir->i_sb, i);
+if (IS_ERR(inode))
+  return ERR_CAST(inode);
+#else
+  inode = iget(dir->i_sb, i)
+  if (!inode)
+    return ERR_PTR(-ENOMEM);
+#endif
+d_add(dentry, inode);
+return NULL;
 }
 
 
@@ -483,10 +507,11 @@
 
 /**************************************************************************/
 
+
 static void cdfs_read_inode(struct inode *i) {
   cd * this_cd = cdfs_info(i->i_sb);
 
-  //printk("this_cd = 0x%x\n\n\n", (unsigned)this_cd);
+  PRINT("this_cd = 0x%x\n", (unsigned)this_cd);
 
   PRINT("read inode %ld\n", i->i_ino);
   
@@ -538,10 +563,33 @@
   }
 }
 
+
+struct inode *cdfs_iget(struct super_block *sp, unsigned long ino) {
+  /* info from http://git.kernel.org/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=12debc4248a4a7f1873e47cda2cdd7faca80b099 */ 
+  struct inode *i; 
+  i = iget_locked(sp, ino); 
+  if (!i) {
+    PRINT("cdfs_iget NOT inode\n");
+    return ERR_PTR(-ENOMEM); 
+  }
+  if (!(i->i_state & I_NEW)) {
+    PRINT("cdfs_iget NOT I_NEW\n");
+    return i;
+  }
+
+  PRINT("cdfs_iget BEFORE inode %ld\n", i->i_ino);
+  cdfs_read_inode(i);
+  PRINT("cdfs_iget AFTER inode %ld\n", i->i_ino);
+  return i;
+}
+
+
 /******************************************************************/
 
 static struct super_operations cdfs_ops = {
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,25)
   .read_inode = cdfs_read_inode,
+#endif
   .put_super  = cdfs_umount,
   .statfs     = cdfs_statfs
 };

Attachment: signature.asc
Description: Esta parte del mensaje =?ISO-8859-1?Q?est=E1?= firmada digitalmente


Reply to: