77 *
88 *
99 * IDENTIFICATION
10- * $Header: /cvsroot/pgsql/src/backend/storage/smgr/md.c,v 1.55 1999/09/28 11:41:07 vadim Exp $
10+ * $Header: /cvsroot/pgsql/src/backend/storage/smgr/md.c,v 1.56 1999/10/06 06:38:04 inoue Exp $
1111 *
1212 *-------------------------------------------------------------------------
1313 */
@@ -233,7 +233,7 @@ mdunlink(Relation reln)
233233int
234234mdextend (Relation reln ,char * buffer )
235235{
236- long pos ;
236+ long pos , nbytes ;
237237int nblocks ;
238238MdfdVec * v ;
239239
@@ -243,8 +243,22 @@ mdextend(Relation reln, char *buffer)
243243if ((pos = FileSeek (v -> mdfd_vfd ,0L ,SEEK_END ))< 0 )
244244return SM_FAIL ;
245245
246- if (FileWrite (v -> mdfd_vfd ,buffer ,BLCKSZ )!= BLCKSZ )
246+ if (pos %BLCKSZ != 0 )/* the last block is incomplete */
247+ {
248+ pos -= pos %BLCKSZ ;
249+ if (FileSeek (v -> mdfd_vfd ,pos ,SEEK_SET )< 0 )
250+ return SM_FAIL ;
251+ }
252+
253+ if ((nbytes = FileWrite (v -> mdfd_vfd ,buffer ,BLCKSZ ))!= BLCKSZ )
254+ {
255+ if (nbytes > 0 )
256+ {
257+ FileTruncate (v -> mdfd_vfd ,pos );
258+ FileSeek (v -> mdfd_vfd ,pos ,SEEK_SET );
259+ }
247260return SM_FAIL ;
261+ }
248262
249263/* remember that we did a write, so we can sync at xact commit */
250264v -> mdfd_flags |=MDFD_DIRTY ;
@@ -432,6 +446,8 @@ mdread(Relation reln, BlockNumber blocknum, char *buffer)
432446{
433447if (nbytes == 0 )
434448MemSet (buffer ,0 ,BLCKSZ );
449+ else if (blocknum == 0 && nbytes > 0 && mdnblocks (reln )== 0 )
450+ MemSet (buffer ,0 ,BLCKSZ );
435451else
436452status = SM_FAIL ;
437453}
@@ -1067,6 +1083,7 @@ _mdnblocks(File file, Size blcksz)
10671083{
10681084long len ;
10691085
1070- len = FileSeek (file ,0L ,SEEK_END )- 1 ;
1071- return (BlockNumber ) ((len < 0 ) ?0 :1 + len /blcksz );
1086+ len = FileSeek (file ,0L ,SEEK_END );
1087+ if (len < 0 )return 0 ;/* on failure, assume file is empty */
1088+ return (BlockNumber ) (len /blcksz );
10721089}