socsvn commit: r237289 - soc2012/oleksandr/udf-head/sys/fs/udf2

oleksandr at FreeBSD.org oleksandr at FreeBSD.org
Fri Jun 8 08:36:32 UTC 2012


Author: oleksandr
Date: Fri Jun  8 08:36:29 2012
New Revision: 237289
URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=237289

Log:
  Add some comments and debug section

Modified:
  soc2012/oleksandr/udf-head/sys/fs/udf2/udf.h
  soc2012/oleksandr/udf-head/sys/fs/udf2/udf_mount.h
  soc2012/oleksandr/udf-head/sys/fs/udf2/udf_subr.c
  soc2012/oleksandr/udf-head/sys/fs/udf2/udf_vfsops.c

Modified: soc2012/oleksandr/udf-head/sys/fs/udf2/udf.h
==============================================================================
--- soc2012/oleksandr/udf-head/sys/fs/udf2/udf.h	Fri Jun  8 07:44:42 2012	(r237288)
+++ soc2012/oleksandr/udf-head/sys/fs/udf2/udf.h	Fri Jun  8 08:36:29 2012	(r237289)
@@ -32,10 +32,57 @@
 /* lets see debug stuff for now */
 #define DEBUG
 
+/* debug section */
+extern int udf_verbose;
 
 /* undefine UDF_COMPLETE_DELETE to need `purge'; but purge is not implemented */
 #define UDF_COMPLETE_DELETE
 
+/* debug categories */
+#define UDF_DEBUG_VOLUMES	0x0000001
+#define UDF_DEBUG_LOCKING	0x0000002
+#define UDF_DEBUG_NODE		0x0000004
+#define UDF_DEBUG_LOOKUP	0x0000008
+#define UDF_DEBUG_READDIR	0x0000010
+#define UDF_DEBUG_FIDS		0x0000020
+#define UDF_DEBUG_DESCRIPTOR	0x0000040
+#define UDF_DEBUG_TRANSLATE	0x0000080
+#define UDF_DEBUG_STRATEGY	0x0000100
+#define UDF_DEBUG_READ		0x0000200
+#define UDF_DEBUG_WRITE		0x0000400
+#define UDF_DEBUG_CALL		0x0000800
+#define UDF_DEBUG_ATTR		0x0001000
+#define UDF_DEBUG_EXTATTR	0x0002000
+#define UDF_DEBUG_ALLOC		0x0004000
+#define UDF_DEBUG_ADWLK		0x0008000
+#define UDF_DEBUG_DIRHASH	0x0010000
+#define UDF_DEBUG_NOTIMPL	0x0020000
+#define UDF_DEBUG_SHEDULE	0x0040000
+#define UDF_DEBUG_ECCLINE	0x0080000
+#define UDF_DEBUG_SYNC		0x0100000
+#define UDF_DEBUG_PARANOIA	0x0200000
+#define UDF_DEBUG_PARANOIDADWLK	0x0400000
+#define UDF_DEBUG_NODEDUMP	0x0800000
+#define UDF_DEBUG_RESERVE	0x1000000
+
+/* initial value of udf_verbose */
+#define UDF_DEBUGGING		0
+
+#ifdef DEBUG
+#define DPRINTF(name, arg) { \
+		if (udf_verbose & UDF_DEBUG_##name) {\
+			printf arg;\
+		};\
+	}
+#define DPRINTFIF(name, cond, arg) { \
+		if (udf_verbose & UDF_DEBUG_##name) { \
+			if (cond) printf arg;\
+		};\
+	}
+#else
+#define DPRINTF(name, arg) {}
+#define DPRINTFIF(name, cond, arg) {}
+#endif
 
 /* constants to identify what kind of identifier we are dealing with */
 #define UDF_REGID_DOMAIN		 1

Modified: soc2012/oleksandr/udf-head/sys/fs/udf2/udf_mount.h
==============================================================================
--- soc2012/oleksandr/udf-head/sys/fs/udf2/udf_mount.h	Fri Jun  8 07:44:42 2012	(r237288)
+++ soc2012/oleksandr/udf-head/sys/fs/udf2/udf_mount.h	Fri Jun  8 08:36:29 2012	(r237289)
@@ -39,8 +39,7 @@
  * Arguments to mount UDF filingsystem.
  */
 
-//#define UDFMNT_VERSION	1
-#if 0
+#define UDFMNT_VERSION	1
 struct udf_args {
 	uint32_t	 version;	/* version of this structure         */
 	char		*fspec;		/* mount specifier                   */
@@ -58,13 +57,12 @@
 	/* extendable */
 	uint8_t	 reserved[32];
 };
-#endif
 
 
 /* udf mount options */
 
-//#define UDFMNT_CLOSESESSION	0x00000001	/* close session on dismount */
-//#define UDFMNT_BITS "\20\1CLOSESESSION"
+#define UDFMNT_CLOSESESSION	0x00000001	/* close session on dismount */
+#define UDFMNT_BITS "\20\1CLOSESESSION"
 #define UDFMNT_KICONV 100
 
 #endif /* !_FS_UDF_UDF_MOUNT_H_ */

Modified: soc2012/oleksandr/udf-head/sys/fs/udf2/udf_subr.c
==============================================================================
--- soc2012/oleksandr/udf-head/sys/fs/udf2/udf_subr.c	Fri Jun  8 07:44:42 2012	(r237288)
+++ soc2012/oleksandr/udf-head/sys/fs/udf2/udf_subr.c	Fri Jun  8 08:36:29 2012	(r237289)
@@ -34,7 +34,6 @@
 #include <sys/stat.h>
 #include <sys/mount.h> /* We shouldn't be, but are dependent on this header. */
 #include <sys/iconv.h>
-
 #include "ecma167-udf.h"
 #include "udf.h"
 #include "udf_subr.h"
@@ -3276,6 +3275,7 @@
 	dscr  = NULL;
 	error = 0;
 	while (fsd_len || error) {
+		DPRINTF(VOLUMES, ("fsd_len = %d\n", fsd_len));
 		/* translate fsd_loc to lb_num */
 		error = udf_translate_vtop(ump, &fsd_loc, &lb_num, &dummy);
 		if (error)
@@ -3313,6 +3313,7 @@
 
 		/* follow up to fsd->next_ex (long_ad) if its not null */
 		if (le32toh(ump->fileset_desc->next_ex.len)) {
+			DPRINTF(VOLUMES, ("follow up FSD extent\n"));
 			fsd_loc = ump->fileset_desc->next_ex;
 			fsd_len = le32toh(ump->fileset_desc->next_ex.len);
 		}
@@ -3324,6 +3325,8 @@
 	if (ump->fileset_desc == NULL)
 		return ENOENT;
 
+	DPRINTF(VOLUMES, ("FSD read in fine\n"));
+	DPRINTF(VOLUMES, ("Updating fsd logical volume id\n"));
 	udf_update_logvolname(ump, ump->logical_vol->logvol_id);
 
 	/*
@@ -3508,7 +3511,7 @@
 
 	/* add node to the rb tree */
 	mutex_enter(&ump->ihash_lock);
-		rb_tree_insert_node(&ump->udf_node_tree, &udf_node->rbnode);
+	rb_tree_insert_node(&ump->udf_node_tree, &udf_node->rbnode);
 	mutex_exit(&ump->ihash_lock);
 }
 
@@ -3520,7 +3523,7 @@
 
 	/* remove node from the rb tree */
 	mutex_enter(&ump->ihash_lock);
-		rb_tree_remove_node(&ump->udf_node_tree, &udf_node->rbnode);
+	rb_tree_remove_node(&ump->udf_node_tree, &udf_node->rbnode);
 	mutex_exit(&ump->ihash_lock);
 }
 
@@ -5573,15 +5576,40 @@
 int
 udf_dispose_node(struct udf_node *udf_node)
 {
+	//struct vnode *vp;
 	int extnr;
 
-	if (!udf_node)
+	DPRINTF(NODE, ("udf_dispose_node called on node %p\n", udf_node));
+	if (!udf_node) {
+		DPRINTF(NODE, ("UDF: Dispose node on node NULL, ignoring\n"));
 		return 0;
-
-/*	udf_cleanup_reservation(udf_node); */
+	}
+#if 0
+	vp  = udf_node->vnode;
+#ifdef DIAGNOSTIC
+	if (vp->v_numoutput)
+		panic("disposing UDF node with pending I/O's, udf_node = %p, "
+				"v_numoutput = %d", udf_node, vp->v_numoutput);
+#endif
+	udf_cleanup_reservation(udf_node); 
 
 	/* TODO extended attributes and streamdir */
 
+	/* remove dirhash if present */
+	dirhash_purge(&udf_node->dir_hash);
+
+	/* remove from our hash lookup table */
+	udf_deregister_node(udf_node);
+
+	/* destroy our lock */
+	mutex_destroy(&udf_node->node_mutex);
+	cv_destroy(&udf_node->node_lock);
+
+	/* dissociate our udf_node from the vnode */
+	genfs_node_destroy(udf_node->vnode);
+	vp->v_data = NULL;
+#endif	
+
 	/* free associated memory and the node itself */
 	for (extnr = 0; extnr < udf_node->num_extensions; extnr++) {
 		/*udf_free_logvol_dscr(udf_node->ump, &udf_node->ext_loc[extnr],

Modified: soc2012/oleksandr/udf-head/sys/fs/udf2/udf_vfsops.c
==============================================================================
--- soc2012/oleksandr/udf-head/sys/fs/udf2/udf_vfsops.c	Fri Jun  8 07:44:42 2012	(r237288)
+++ soc2012/oleksandr/udf-head/sys/fs/udf2/udf_vfsops.c	Fri Jun  8 08:36:29 2012	(r237289)
@@ -187,11 +187,15 @@
 	char *fspec;
 	
 	td = curthread;
-
+	DPRINTF(CALL, ("udf_mount called\n"));
+	/*
+	 * Unconditionally mount as read-only.
+	 */
 	MNT_ILOCK(mp);
 	mp->mnt_flag |= MNT_RDONLY;
 	MNT_IUNLOCK(mp);
 
+	/* No root filesystem support */
 	if (mp->mnt_flag & MNT_ROOTFS)
 		return (ENOTSUP);
 
@@ -204,6 +208,8 @@
 	error = vfs_getopt(mp->mnt_optnew, "from", (void **)&fspec, &len);
 	if (!error && fspec[len - 1] != '\0')
 		return (EINVAL);
+
+	/* Check that the mount device exists */ 
 	if (fspec == NULL)
 		return (EINVAL);
 
@@ -218,6 +224,7 @@
 		return (error);
 	}
 
+	/* Check the access rights on the mount device */
 	error = VOP_ACCESS(devvp, VREAD, td->td_ucred, td);
 	if (error)
 		error = priv_check(td, PRIV_VFS_MOUNT_PERM);
@@ -236,7 +243,7 @@
 	}
 
 	/* successfully mounted */
-
+	DPRINTF(VOLUMES, ("udf_mount() successfull\n"));
 #if 0 
 	/* If we're not opened read-only, open its logical volume */
 	if ((mp->mnt_flag & MNT_RDONLY) == 0) {
@@ -281,9 +288,10 @@
 udf_unmount(struct mount *mp, int mntflags)
 {
 	struct udf_mount *ump;
-	int error, flags;
+	int error, flags = 0;
 
 	ump = VFSTOUDF(mp);
+
 	if (!ump)
 		panic("UDF unmount: empty ump\n");
 
@@ -400,6 +408,7 @@
 
 
 	/* setup basic mount information */
+	mp->mnt_data = NULL;
 	mp->mnt_stat.f_fsid.val[0] = dev2udev(devvp->v_rdev);
 	mp->mnt_stat.f_fsid.val[1] = mp->mnt_vfc->vfc_typenum;
 	mp->mnt_stat.f_namemax = UDF_MAX_NAMELEN;
@@ -413,6 +422,7 @@
 		MNTK_EXTENDED_SHARED;
 	MNT_IUNLOCK(mp);
 
+	/* allocate udf part of mount structure; malloc always succeeds */
 	ump = malloc(sizeof(struct udf_mount), M_UDFTEMP, M_WAITOK | M_ZERO);
 
 #if 0
@@ -422,6 +432,9 @@
 	mutex_init(&ump->get_node_lock, MUTEX_DEFAULT, IPL_NONE);
 	mutex_init(&ump->allocate_mutex, MUTEX_DEFAULT, IPL_NONE);
 	cv_init(&ump->dirtynodes_cv, "udfsync2");
+
+	/* init rbtree for nodes, ordered by their icb address (long_ad) */
+	udf_init_nodes_tree(ump);
 #endif
 
 	/* set up linkage */
@@ -549,6 +562,9 @@
 		error = EINVAL;
 		goto fail;
 	}
+	
+	/*DPRINTF(VOLUMES, ("Read %d anchors on this disc, session %d\n",
+	    num_anchors, args->sessionnr));*/
 
 	/* read in volume descriptor sequence */
 	if ((error = udf_read_vds_space(ump))) {


More information about the svn-soc-all mailing list