00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014 #include "ad_ntfs.h"
00015
00016 #include "adio_extern.h"
00017 #ifdef PROFILE
00018 #include "mpe.h"
00019 #endif
00020
00021 ADIO_Offset ADIOI_NTFS_SeekIndividual(ADIO_File fd, ADIO_Offset offset,
00022 int whence, int *error_code)
00023 {
00024
00025
00026
00027
00028
00029
00030
00031 #ifndef PRINT_ERR_MSG
00032 static char myname[] = "ADIOI_GEN_SEEKINDIVIDUAL";
00033 #endif
00034 ADIO_Offset off, err;
00035 ADIOI_Flatlist_node *flat_file;
00036
00037 int i, n_etypes_in_filetype, n_filetypes, etype_in_filetype;
00038 ADIO_Offset abs_off_in_filetype=0;
00039 int size_in_filetype, sum;
00040 int filetype_size, etype_size, filetype_is_contig;
00041 MPI_Aint filetype_extent;
00042
00043 ADIOI_Datatype_iscontig(fd->filetype, &filetype_is_contig);
00044 etype_size = fd->etype_size;
00045
00046 if (filetype_is_contig) off = fd->disp + etype_size * offset;
00047 else {
00048 flat_file = ADIOI_Flatlist;
00049 while (flat_file->type != fd->filetype) flat_file = flat_file->next;
00050
00051 MPI_Type_extent(fd->filetype, &filetype_extent);
00052 MPI_Type_size(fd->filetype, &filetype_size);
00053 if ( ! filetype_size ) {
00054
00055
00056
00057 *error_code = MPI_SUCCESS;
00058 return 0;
00059 }
00060
00061 n_etypes_in_filetype = filetype_size/etype_size;
00062 n_filetypes = (int) (offset / n_etypes_in_filetype);
00063 etype_in_filetype = (int) (offset % n_etypes_in_filetype);
00064 size_in_filetype = etype_in_filetype * etype_size;
00065
00066 sum = 0;
00067 for (i=0; i<flat_file->count; i++) {
00068 sum += flat_file->blocklens[i];
00069 if (sum > size_in_filetype) {
00070 abs_off_in_filetype = flat_file->indices[i] +
00071 size_in_filetype - (sum - flat_file->blocklens[i]);
00072 break;
00073 }
00074 }
00075
00076
00077 off = fd->disp + (ADIO_Offset) n_filetypes * filetype_extent +
00078 abs_off_in_filetype;
00079 }
00080
00081 #ifdef PROFILE
00082 MPE_Log_event(11, 0, "start seek");
00083 #endif
00084 #ifdef ROMIO_NTFS
00085 {
00086 #ifdef HAVE_INT64
00087 DWORD dwTemp;
00088 dwTemp = ( (DWORD) ( (off >> 32) & (__int64) 0xFFFFFFFF ) );
00089 err = SetFilePointer(fd->fd_sys,
00090 ( (DWORD) ( off & (__int64) 0xFFFFFFFF ) ), &dwTemp,
00091 FILE_BEGIN);
00092 #else
00093 err = SetFilePointer(fd->fd_sys, off, NULL, FILE_BEGIN);
00094 #endif
00095 }
00096 #else
00097 err = lseek(fd->fd_sys, off, SEEK_SET);
00098 #endif
00099 #ifdef PROFILE
00100 MPE_Log_event(12, 0, "end seek");
00101 #endif
00102 fd->fp_ind = off;
00103 fd->fp_sys_posn = off;
00104
00105 #ifdef PRINT_ERR_MSG
00106 *error_code = (err == -1) ? MPI_ERR_UNKNOWN : MPI_SUCCESS;
00107 #else
00108 if (err == -1) {
00109 *error_code = MPIR_Err_setmsg(MPI_ERR_IO, MPIR_ADIO_ERROR,
00110 myname, "I/O Error", "%s", strerror(errno));
00111 ADIOI_Error(MPI_FILE_NULL, *error_code, myname);
00112 }
00113 else *error_code = MPI_SUCCESS;
00114 #endif
00115
00116 return off;
00117 }