From 4f468171adff3be4ad4c939b36d454afa3c7f5e9 Mon Sep 17 00:00:00 2001 From: Thomas Schmitt Date: Sat, 7 Mar 2009 08:28:35 +0100 Subject: [PATCH] Experiments about inode number generation for nodes out of the loaded image. --- libisofs/filesrc.c | 28 ++++++++++++++++++++ libisofs/fs_image.c | 64 ++++++++++++++++++++++++++++++++++++++++----- libisofs/libisofs.h | 19 ++++++++++++++ 3 files changed, 104 insertions(+), 7 deletions(-) diff --git a/libisofs/filesrc.c b/libisofs/filesrc.c index d7e79b7..55272a3 100644 --- a/libisofs/filesrc.c +++ b/libisofs/filesrc.c @@ -24,6 +24,12 @@ int iso_file_src_cmp(const void *n1, const void *n2) dev_t dev_id1, dev_id2; ino_t ino_id1, ino_id2; +#ifdef Libisofs_file_src_cmp_sizE + + off_t size1, size2; + +#endif /* Libisofs_file_src_cmp_sizE */ + f1 = (const IsoFileSrc *)n1; f2 = (const IsoFileSrc *)n2; @@ -40,9 +46,31 @@ int iso_file_src_cmp(const void *n1, const void *n2) return -1; } else if (dev_id1 < dev_id2) { return 1; + +#ifdef Libisofs_file_src_cmp_sizE + + } else if (ino_id1 > ino_id2) { + return -1; + } else if (ino_id1 < ino_id2) { + return 1; + } else { + size1 = iso_stream_get_size(f1->stream); + size2 = iso_stream_get_size(f2->stream); + if (size1 < size2) { + return -1; + } else if (size1 > size2) { + return 1; + } + return 0; + +#else /* Libisofs_file_src_cmp_sizE */ + } else { /* files belong to same device in same fs */ return (ino_id1 < ino_id2) ? -1 : (ino_id1 > ino_id2) ? 1 : 0; + +#endif /* ! Libisofs_file_src_cmp_sizE */ + } } } diff --git a/libisofs/fs_image.c b/libisofs/fs_image.c index ad5293f..cb392eb 100644 --- a/libisofs/fs_image.c +++ b/libisofs/fs_image.c @@ -241,6 +241,10 @@ typedef struct uint32_t imgblock; /**< Block for El-Torito boot image */ uint32_t catblock; /**< Block for El-Torito catalog */ + /* ts A90303 */ + /* Inode number generator counter */ + ino_t inode_counter; + } _ImageFsData; typedef struct image_fs_data ImageFileSourceData; @@ -1013,6 +1017,31 @@ char *get_name(_ImageFsData *fsdata, const char *str, size_t len) return name; } + +/* ts A90303 */ +/** + * A global counter for default inode numbers for the ISO image filesystem. + * @param fs The filesystem where the number shall be used + * @param flag bit0= reset count + */ +static +ino_t fs_give_ino_number(IsoImageFilesystem *fs, int flag) +{ + _ImageFsData *fsdata; + + fsdata = (_ImageFsData*)fs->data; + if (flag & 1) + fsdata->inode_counter = 0; + fsdata->inode_counter++; + if (fsdata->inode_counter == 0) { + + /* >>> raise alert because of inode rollover */; + + } + return fsdata->inode_counter; +} + + /** * * @param src @@ -1460,6 +1489,18 @@ int iso_file_source_new_ifs(IsoImageFilesystem *fs, IsoFileSource *parent, return ISO_SUCCESS; } + +#ifdef Libisofs_new_fs_image_inO + + if (fsdata->rr != RR_EXT_112) { + if (fsdata->rr == 0) { + atts.st_nlink = 1; + } + } + atts.st_ino = fs_give_ino_number(fs, 0); + +#else /* Libisofs_new_fs_image_inO */ + /* ts Nov 25 2008: TODO This seems not fully consistent with read_rr_PX() which decides by (px->len_sue[0] == 44) whether an inode number is present or not. @@ -1480,16 +1521,13 @@ int iso_file_source_new_ifs(IsoImageFilesystem *fs, IsoFileSource *parent, * It BREAKS POSIX SEMANTICS, but its suitable for our needs */ +#ifndef Libisofs_ino_from_lbA #define Libisofs_patch_ticket_144 yes +#endif #ifdef Libisofs_patch_ticket_144 - /* Trying to ensure unique inode numbers */ - { - static ino_t iso_global_inode= 0; - if(iso_global_inode <= 0) - iso_global_inode= 1; - atts.st_ino = iso_global_inode++; - } + atts.st_ino = fs_give_ino_number(fs, 0); + #else /* Ticket 144: This produces duplicate numbers with empty files. */ @@ -1500,6 +1538,8 @@ int iso_file_source_new_ifs(IsoImageFilesystem *fs, IsoFileSource *parent, } } +#endif /* ! Libisofs_new_fs_image_inO */ + /* * if we haven't RR extensions, or a needed TF time stamp is not present, * we use plain iso recording time @@ -2586,7 +2626,17 @@ int create_boot_img_filesrc(IsoImageFilesystem *fs, IsoFileSource **src) memset(&atts, 0, sizeof(struct stat)); atts.st_mode = S_IFREG; + +#ifdef Libisofs_new_fs_image_inO + + atts.st_ino = fs_give_ino_number(fs, 0); + +#else /* Libisofs_new_fs_image_inO */ + atts.st_ino = fsdata->imgblock; /* not the best solution, but... */ + +#endif /* ! Libisofs_new_fs_image_inO */ + atts.st_nlink = 1; /* diff --git a/libisofs/libisofs.h b/libisofs/libisofs.h index 2cc9903..ea0a2e7 100644 --- a/libisofs/libisofs.h +++ b/libisofs/libisofs.h @@ -4771,4 +4771,23 @@ struct burn_source { #endif /* LIBISOFS_WITHOUT_LIBBURN */ + +/* Attempt to fix several issues about inode numbers from ISO images */ + +/* Experiment: Ignore PX inode numbers, + have boot image inode number counted by fs_give_ino_number() +*/ +#define Libisofs_new_fs_image_inO yes + +/* Experiment: Trying to avoid the risk of losing file content by duplicate + inodes. iso_file_src_cmp() shall compare sizes too. +*/ +#define Libisofs_file_src_cmp_sizE yes + +/* Experiment: Revoke Ticket 144, use data file LBAs again. + (will work only if not Libisofs_new_fs_image_inO + and wll only be safe with Libisofs_file_src_cmp_sizE) + #define Libisofs_ino_from_lbA yes +*/ + #endif /*LIBISO_LIBISOFS_H_*/