To: vim-dev@vim.org Subject: Patch 5.6a.021 Fcc: outbox From: Bram Moolenaar ------------ I only solved half the problem... Patch 5.6a.021 Problem: Recovering still may not work when the block size of the device where the swap file is located is larger than 4096. Solution: Read block 0 with the minimal block size. Files: src/memfile.c, src/memline.c, src/vim.h *** ../vim-5.6a.20/src/memfile.c Mon Jan 10 21:28:45 2000 --- src/memfile.c Tue Jan 11 16:19:43 2000 *************** *** 170,183 **** /* * Try to set the page size equal to the block size of the device. * Speeds up I/O a lot. ! * NOTE: minimal block size depends on size of block 0 data! It's not done ! * with a sizeof(), because block 0 is defined in memline.c (Sorry). ! * The maximal block size is arbitrary. */ if (mfp->mf_fd >= 0 && fstatfs(mfp->mf_fd, &stf, sizeof(struct statfs), 0) == 0 ! && stf.F_BSIZE >= 1048 ! && stf.F_BSIZE <= 50000) mfp->mf_page_size = stf.F_BSIZE; #endif --- 170,183 ---- /* * Try to set the page size equal to the block size of the device. * Speeds up I/O a lot. ! * When recovering, the actual block size will be retrieved from block 0 ! * in ml_recover(). The size used here may be wrong, therefore ! * mf_blocknr_max must be rounded up. */ if (mfp->mf_fd >= 0 && fstatfs(mfp->mf_fd, &stf, sizeof(struct statfs), 0) == 0 ! && stf.F_BSIZE >= MIN_SWAP_PAGE_SIZE ! && stf.F_BSIZE <= MAX_SWAP_PAGE_SIZE) mfp->mf_page_size = stf.F_BSIZE; #endif *** ../vim-5.6a.20/src/memline.c Mon Dec 20 09:59:15 1999 --- src/memline.c Tue Jan 11 16:15:36 2000 *************** *** 143,150 **** * NOTE: DEFINITION OF BLOCK 0 SHOULD NOT CHANGE! It would make all existing * swap files unusable! * ! * If size of block0 changes anyway, adjust minimal block size ! * in mf_open()!! * * This block is built up of single bytes, to make it portable accros * different machines. b0_magic_* is used to check the byte order and size of --- 143,149 ---- * NOTE: DEFINITION OF BLOCK 0 SHOULD NOT CHANGE! It would make all existing * swap files unusable! * ! * If size of block0 changes anyway, adjust MIN_SWAP_PAGE_SIZE in vim.h!! * * This block is built up of single bytes, to make it portable accros * different machines. b0_magic_* is used to check the byte order and size of *************** *** 801,806 **** --- 800,813 ---- } vim_free(p); buf->b_ml.ml_mfp = mfp; + + /* + * The page size set in mf_open() might be different from the page size + * used in the swap file, we must get it from block 0. But to read block + * 0 we need a page size. Use the minimal size for block 0 here, it will + * be set to the real value below. + */ + mfp->mf_page_size = MIN_SWAP_PAGE_SIZE; /* * try to read block 0 *** ../vim-5.6a.20/src/vim.h Mon Dec 20 09:59:07 1999 --- src/vim.h Tue Jan 11 16:20:58 2000 *************** *** 576,581 **** --- 576,590 ---- #define SEA_RECOVER 3 /* recover the file */ /* + * Minimal size for block 0 of a swap file. + * NOTE: This depends on size of struct block0! It's not done with a sizeof(), + * because struct block0 is defined in memline.c (Sorry). + * The maximal block size is arbitrary. + */ + #define MIN_SWAP_PAGE_SIZE 1048 + #define MAX_SWAP_PAGE_SIZE 50000 + + /* * Events for autocommands. */ enum auto_event *** ../vim-5.6a.20/src/version.c Tue Jan 11 16:54:05 2000 --- src/version.c Tue Jan 11 16:54:36 2000 *************** *** 420,421 **** --- 420,423 ---- { /* Add new patch number below this line */ + /**/ + 21, /**/ -- hundred-and-one symptoms of being an internet addict: 106. When told to "go to your room" you inform your parents that you can't...because you were kicked out and banned. --/-/---- Bram Moolenaar ---- Bram@moolenaar.net ---- Bram@vim.org ---\-\-- \ \ www.vim.org/iccf www.moolenaar.net www.vim.org / /