From 6585330779f88deedd9d215bd7c15b534f430d4a Mon Sep 17 00:00:00 2001 From: Corinna Vinschen Date: Mon, 26 Aug 2013 16:14:40 +0000 Subject: [PATCH] * mtinfo.h (class mtinfo_part): Change type of block numbers to int64_t. (mtinfo_part::initialize): Ditto for nblock parameter in declaration. (class mtinfo_drive): Change type of block number to int64_t. Change all parameters indicating a block number to int64_t in method declarations. * fhandler_tape.cc (mtinfo_part::initialize): Ditto in definition. (mtinfo_drive::get_pos): Ditto. Replace low and high with a ULARGE_INTEGER and use it's components in call to GetTapePosition. Store full value in block. (mtinfo_drive::_set_pos): Change type of count parameter to int64_t. Change call to SetTapePosition accordingly. (mtinfo_drive::set_pos): Change type of count parameter to int64_t. Change local variables holding block numbers accordingly. (mtinfo_drive::get_status): Don't bail out early if fetching media parameters fails. (mtinfo_drive::ioctl): Add explicit cast matching receiving type in MTTELL and MTIOCPOS calls. --- winsup/cygwin/ChangeLog | 20 ++++++++++++++++ winsup/cygwin/fhandler_tape.cc | 44 ++++++++++++++++++---------------- winsup/cygwin/mtinfo.h | 16 ++++++------- 3 files changed, 51 insertions(+), 29 deletions(-) diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog index 8dda31cca..5cd2a5366 100644 --- a/winsup/cygwin/ChangeLog +++ b/winsup/cygwin/ChangeLog @@ -1,3 +1,23 @@ +2013-08-26 Corinna Vinschen + + * mtinfo.h (class mtinfo_part): Change type of block numbers to int64_t. + (mtinfo_part::initialize): Ditto for nblock parameter in declaration. + (class mtinfo_drive): Change type of block number to int64_t. Change + all parameters indicating a block number to int64_t in method + declarations. + * fhandler_tape.cc (mtinfo_part::initialize): Ditto in definition. + (mtinfo_drive::get_pos): Ditto. Replace low and high with a + ULARGE_INTEGER and use it's components in call to GetTapePosition. + Store full value in block. + (mtinfo_drive::_set_pos): Change type of count parameter to int64_t. + Change call to SetTapePosition accordingly. + (mtinfo_drive::set_pos): Change type of count parameter to int64_t. + Change local variables holding block numbers accordingly. + (mtinfo_drive::get_status): Don't bail out early if fetching media + parameters fails. + (mtinfo_drive::ioctl): Add explicit cast matching receiving type in + MTTELL and MTIOCPOS calls. + 2013-08-23 Corinna Vinschen * flock.cc (lockf_t::from_obj_name): Fix test for valid pid. diff --git a/winsup/cygwin/fhandler_tape.cc b/winsup/cygwin/fhandler_tape.cc index 969ee7653..14f3e9d1b 100644 --- a/winsup/cygwin/fhandler_tape.cc +++ b/winsup/cygwin/fhandler_tape.cc @@ -53,7 +53,7 @@ details. */ /* mtinfo_part */ void -mtinfo_part::initialize (int32_t nblock) +mtinfo_part::initialize (int64_t nblock) { block = nblock; if (block == 0) @@ -353,18 +353,21 @@ mtinfo_drive::write (HANDLE mt, LPOVERLAPPED pov, const void *ptr, size_t &len) } int -mtinfo_drive::get_pos (HANDLE mt, int32_t *ppartition, int32_t *pblock) +mtinfo_drive::get_pos (HANDLE mt, int32_t *ppartition, int64_t *pblock) { - DWORD p, low, high; + DWORD p; + ULARGE_INTEGER b; - TAPE_FUNC (GetTapePosition (mt, TAPE_LOGICAL_POSITION, &p, &low, &high)); + TAPE_FUNC (GetTapePosition (mt, TAPE_LOGICAL_POSITION, &p, + &b.LowPart, &b.HighPart)); if (lasterr == ERROR_INVALID_FUNCTION) - TAPE_FUNC (GetTapePosition (mt, TAPE_ABSOLUTE_POSITION, &p, &low, &high)); + TAPE_FUNC (GetTapePosition (mt, TAPE_ABSOLUTE_POSITION, &p, + &b.LowPart, &b.HighPart)); if (!lasterr) { if (p > 0) partition = (int32_t) p - 1; - block = (int32_t) low; + block = (int64_t) b.QuadPart; if (ppartition) *ppartition= partition; if (pblock) @@ -379,23 +382,24 @@ mtinfo_drive::get_pos (HANDLE mt, int32_t *ppartition, int32_t *pblock) } int -mtinfo_drive::_set_pos (HANDLE mt, int mode, int32_t count, int partition, +mtinfo_drive::_set_pos (HANDLE mt, int mode, int64_t count, int partition, BOOL dont_wait) { /* If an async write is still pending, wait for completion. */ if (dirty == async_write_pending) lasterr = async_wait (mt, NULL); dirty = clean; - TAPE_FUNC (SetTapePosition (mt, mode, partition, count, count < 0 ? -1 : 0, + LARGE_INTEGER c = { QuadPart:count }; + TAPE_FUNC (SetTapePosition (mt, mode, partition, c.LowPart, c.HighPart, dont_wait)); return lasterr; } int -mtinfo_drive::set_pos (HANDLE mt, int mode, int32_t count, bool sfm_func) +mtinfo_drive::set_pos (HANDLE mt, int mode, int64_t count, bool sfm_func) { int err = 0; - int32_t undone = count; + int64_t undone = count; BOOL dont_wait = FALSE; switch (mode) @@ -589,12 +593,12 @@ mtinfo_drive::set_partition (HANDLE mt, int32_t count) lasterr = ERROR_IO_DEVICE; else { - int part_block = part (count)->block >= 0 ? part (count)->block : 0; + uint64_t part_block = part (count)->block >= 0 ? part (count)->block : 0; int err = _set_pos (mt, TAPE_LOGICAL_BLOCK, part_block, count + 1, FALSE); if (err) { - int sav_block = block; - int sav_partition = partition; + int64_t sav_block = block; + int32_t sav_partition = partition; get_pos (mt); if (sav_partition != partition) { @@ -649,8 +653,8 @@ mtinfo_drive::write_marks (HANDLE mt, int marktype, DWORD count) } else { - int sav_block = block; - int sav_partition = partition; + int64_t sav_block = block; + int32_t sav_partition = partition; get_pos (mt); if (sav_partition != partition) { @@ -758,12 +762,10 @@ mtinfo_drive::get_status (HANDLE mt, struct mtget *get) if (!get) return ERROR_INVALID_PARAMETER; - if ((tstat = GetTapeStatus (mt)) == ERROR_NO_MEDIA_IN_DRIVE) + if ((tstat = GetTapeStatus (mt)) == ERROR_NO_MEDIA_IN_DRIVE + || get_mp (mt) == ERROR_NO_MEDIA_IN_DRIVE) notape = 1; - if (get_mp (mt)) - return lasterr; - memset (get, 0, sizeof *get); get->mt_type = MT_ISUNKNOWN; @@ -1082,7 +1084,7 @@ mtinfo_drive::ioctl (HANDLE mt, unsigned int cmd, void *buf) break; case MTTELL: if (!get_pos (mt)) - op->mt_count = block; + op->mt_count = (int) block; break; case MTFSS: set_pos (mt, TAPE_SPACE_SETMARKS, op->mt_count, false); @@ -1123,7 +1125,7 @@ mtinfo_drive::ioctl (HANDLE mt, unsigned int cmd, void *buf) else if (cmd == MTIOCGET) get_status (mt, (struct mtget *) buf); else if (cmd == MTIOCPOS && !get_pos (mt)) - ((struct mtpos *) buf)->mt_blkno = block; + ((struct mtpos *) buf)->mt_blkno = (long) block; return lasterr; } diff --git a/winsup/cygwin/mtinfo.h b/winsup/cygwin/mtinfo.h index 157fe1bf9..e7624b704 100644 --- a/winsup/cygwin/mtinfo.h +++ b/winsup/cygwin/mtinfo.h @@ -1,6 +1,6 @@ /* mtinfo.h: Defininitions for the Cygwin tape driver class. - Copyright 2004, 2005, 2006, 2008, 2012 Red Hat, Inc. + Copyright 2004, 2005, 2006, 2008, 2012, 2013 Red Hat, Inc. This file is part of Cygwin. @@ -46,13 +46,13 @@ enum lock_state class mtinfo_part { public: - int32_t block; /* logical block no */ + int64_t block; /* logical block no */ + int64_t fblock; /* relative block no */ int32_t file; /* current file no */ - int32_t fblock; /* relative block no */ bool smark; /* At setmark? */ eom_val emark; /* "end-of"-mark */ - void initialize (int32_t nblock = -1); + void initialize (int64_t nblock = -1); }; class mtinfo_drive @@ -60,7 +60,7 @@ class mtinfo_drive int drive; int lasterr; int32_t partition; - int32_t block; + int64_t block; dirty_state dirty; lock_state lock; TAPE_GET_DRIVE_PARAMETERS _dp; @@ -94,8 +94,8 @@ class mtinfo_drive ? ((_dp.FeaturesHigh & parm) != 0) : ((_dp.FeaturesLow & parm) != 0)); } - int get_pos (HANDLE mt, int32_t *ppartition = NULL, int32_t *pblock = NULL); - int _set_pos (HANDLE mt, int mode, int32_t count, int partition, BOOL dont_wait); + int get_pos (HANDLE mt, int32_t *ppartition = NULL, int64_t *pblock = NULL); + int _set_pos (HANDLE mt, int mode, int64_t count, int partition, BOOL dont_wait); int create_partitions (HANDLE mt, int32_t count); int set_partition (HANDLE mt, int32_t count); int write_marks (HANDLE mt, int marktype, DWORD count); @@ -116,7 +116,7 @@ public: int read (HANDLE mt, LPOVERLAPPED pov, void *ptr, size_t &ulen); int write (HANDLE mt, LPOVERLAPPED pov, const void *ptr, size_t &len); int ioctl (HANDLE mt, unsigned int cmd, void *buf); - int set_pos (HANDLE mt, int mode, int32_t count, bool sfm_func); + int set_pos (HANDLE mt, int mode, int64_t count, bool sfm_func); IMPLEMENT_STATUS_FLAG (bool, buffer_writes) IMPLEMENT_STATUS_FLAG (bool, async_writes)