Experiments about inode number generation for nodes out of the loaded
image.
This commit is contained in:
parent
32dc6dd041
commit
4f468171ad
@ -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 */
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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;
|
||||
|
||||
/*
|
||||
|
@ -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_*/
|
||||
|
Loading…
Reference in New Issue
Block a user