00001
00002
00003
00004
00005
00006
00007
00008
00009 #include "ad_pfs.h"
00010 #ifdef PROFILE
00011 #include "mpe.h"
00012 #endif
00013
00014 void ADIOI_PFS_Open(ADIO_File fd, int *error_code)
00015 {
00016 int perm, amode, old_mask, np_comm, np_total, err, flag;
00017 char *value;
00018 struct sattr attr;
00019 #ifndef PRINT_ERR_MSG
00020 static char myname[] = "ADIOI_PFS_OPEN";
00021 #endif
00022
00023 if (fd->perm == ADIO_PERM_NULL) {
00024 old_mask = umask(022);
00025 umask(old_mask);
00026 perm = old_mask ^ 0666;
00027 }
00028 else perm = fd->perm;
00029
00030 amode = 0;
00031 if (fd->access_mode & ADIO_CREATE)
00032 amode = amode | O_CREAT;
00033 if (fd->access_mode & ADIO_RDONLY)
00034 amode = amode | O_RDONLY;
00035 if (fd->access_mode & ADIO_WRONLY)
00036 amode = amode | O_WRONLY;
00037 if (fd->access_mode & ADIO_RDWR)
00038 amode = amode | O_RDWR;
00039 if (fd->access_mode & ADIO_EXCL)
00040 amode = amode | O_EXCL;
00041
00042 MPI_Comm_size(MPI_COMM_WORLD, &np_total);
00043 MPI_Comm_size(fd->comm, &np_comm);
00044
00045 #ifdef PROFILE
00046 MPE_Log_event(1, 0, "start open");
00047 #endif
00048 if (np_total == np_comm)
00049 fd->fd_sys = _gopen(fd->filename,amode,fd->iomode,perm);
00050 else fd->fd_sys = open(fd->filename, amode, perm);
00051 #ifdef PROFILE
00052 MPE_Log_event(2, 0, "end open");
00053 #endif
00054
00055 if (fd->fd_sys != -1) {
00056 value = (char *) ADIOI_Malloc((MPI_MAX_INFO_VAL+1)*sizeof(char));
00057
00058
00059
00060
00061
00062
00063 MPI_Info_get(fd->info, "pfs_svr_buf", MPI_MAX_INFO_VAL,
00064 value, &flag);
00065 if (flag && (!strcmp(value, "true"))) {
00066 err = fcntl(fd->fd_sys, F_PFS_SVR_BUF, TRUE);
00067 if (err) MPI_Info_set(fd->info, "pfs_svr_buf", "false");
00068 }
00069
00070
00071 err = fcntl(fd->fd_sys, F_GETSATTR, &attr);
00072
00073 if (!err) {
00074 sprintf(value, "%d", attr.s_sunitsize);
00075 MPI_Info_set(fd->info, "striping_unit", value);
00076
00077 sprintf(value, "%d", attr.s_sfactor);
00078 MPI_Info_set(fd->info, "striping_factor", value);
00079
00080 sprintf(value, "%d", attr.s_start_sdir);
00081 MPI_Info_set(fd->info, "start_iodevice", value);
00082 }
00083 ADIOI_Free(value);
00084
00085 if (fd->access_mode & ADIO_APPEND)
00086 fd->fp_ind = fd->fp_sys_posn = lseek(fd->fd_sys, 0, SEEK_END);
00087 }
00088
00089 #ifdef PRINT_ERR_MSG
00090 *error_code = (fd->fd_sys == -1) ? MPI_ERR_UNKNOWN : MPI_SUCCESS;
00091 #else
00092 if (fd->fd_sys == -1) {
00093 *error_code = MPIR_Err_setmsg(MPI_ERR_IO, MPIR_ADIO_ERROR,
00094 myname, "I/O Error", "%s", strerror(errno));
00095 ADIOI_Error(ADIO_FILE_NULL, *error_code, myname);
00096 }
00097 else *error_code = MPI_SUCCESS;
00098 #endif
00099 }