On Fri, 19 Jul 2002, Peter Osterlund wrote:
On Fri, 19 Jul 2002, Ben Fennema wrote:
On Fri, Jul 19, 2002 at 01:33:13PM +0200, Peter Osterlund wrote:
On Thu, 18 Jul 2002, Ben Fennema wrote:
On Thu, Jul 18, 2002 at 11:31:21PM +0200, Peter Osterlund wrote:
I still think that's true, but I have some more information on the udf filesystem behavior. If I create a new udf filesystem and start adding lots of small files to it, at first (before dirty data writeback starts) the speed at which files are added is limited by how fast data can be *read* from the CD. I haven't looked at the udf code yet, but I would guess the udf filesystem reads a disk block for each file being added.
Hmm, it could be an issue with data being embedded in the inode. The data would go through the page cache, but the inode would go through the buffer cache, and this could force a read or something funky like that.
Ok, here's a patch which should fix the problem.
Let me know if it shows a noticeable improvement (or if you can't get it to apply nicely to whatever kernel version your using) =]
Yes it works perfectly. I applied it to the 2.4 cvs tree then copied it into the 2.4.19-rc2 tree.
I needed this patch for 2.5.29 too so I made a forward port. It appears to work fine and gives a big performance increase also in 2.5. Can you please have a look at the patch and maybe submit it to Linus if you think it's OK? Thanks. diff -u -r -N ../../linus/main/linux/fs/udf/balloc.c linux/fs/udf/balloc.c --- ../../linus/main/linux/fs/udf/balloc.c Sat Jul 27 19:30:32 2002 +++ linux/fs/udf/balloc.c Sun Jul 28 15:14:36 2002 @@ -592,7 +592,7 @@ sptr = (obh)->b_data + nextoffset; nextoffset = sizeof(struct allocExtDesc); - if (memcmp(&UDF_I_LOCATION(table), &obloc, sizeof(lb_addr))) + if (obh != UDF_I_BH(inode)) { aed = (struct allocExtDesc *)(obh)->b_data; aed->lengthAllocDescs = @@ -639,7 +639,7 @@ { udf_write_aext(table, nbloc, &nextoffset, eloc, elen, nbh, 1); - if (!memcmp(&UDF_I_LOCATION(table), &nbloc, sizeof(lb_addr))) + if (nbh == UDF_I_BH(table)) { UDF_I_LENALLOC(table) += adsize; mark_inode_dirty(table); diff -u -r -N ../../linus/main/linux/fs/udf/file.c linux/fs/udf/file.c --- ../../linus/main/linux/fs/udf/file.c Sat Jul 27 19:30:33 2002 +++ linux/fs/udf/file.c Sun Jul 28 15:14:36 2002 @@ -48,8 +48,6 @@ { struct inode *inode = page->mapping->host; - struct buffer_head *bh; - int block; char *kaddr; int err = 0; @@ -58,19 +56,9 @@ kaddr = kmap(page); memset(kaddr, 0, PAGE_CACHE_SIZE); - block = udf_get_lb_pblock(inode->i_sb, UDF_I_LOCATION(inode), 0); - bh = sb_bread(inode->i_sb, block); - if (!bh) - { - SetPageError(page); - err = -EIO; - goto out; - } - memcpy(kaddr, bh->b_data + udf_ext0_offset(inode), inode->i_size); - brelse(bh); + memcpy(kaddr, UDF_I_BH(inode)->b_data + udf_ext0_offset(inode), inode->i_size); flush_dcache_page(page); SetPageUptodate(page); -out: kunmap(page); unlock_page(page); return err; @@ -80,8 +68,6 @@ { struct inode *inode = page->mapping->host; - struct buffer_head *bh; - int block; char *kaddr; int err = 0; @@ -89,19 +75,9 @@ PAGE_BUG(page); kaddr = kmap(page); - block = udf_get_lb_pblock(inode->i_sb, UDF_I_LOCATION(inode), 0); - bh = sb_bread(inode->i_sb, block); - if (!bh) - { - SetPageError(page); - err = -EIO; - goto out; - } - memcpy(bh->b_data + udf_ext0_offset(inode), kaddr, inode->i_size); - mark_buffer_dirty(bh); - brelse(bh); + memcpy(UDF_I_BH(inode)->b_data + udf_ext0_offset(inode), kaddr, inode->i_size); + mark_buffer_dirty(UDF_I_BH(inode)); SetPageUptodate(page); -out: kunmap(page); unlock_page(page); return err; @@ -117,25 +93,13 @@ { struct inode *inode = page->mapping->host; - struct buffer_head *bh; - int block; char *kaddr = page_address(page); int err = 0; - block = udf_get_lb_pblock(inode->i_sb, UDF_I_LOCATION(inode), 0); - bh = sb_bread(inode->i_sb, block); - if (!bh) - { - SetPageError(page); - err = -EIO; - goto out; - } - memcpy(bh->b_data + udf_file_entry_alloc_offset(inode) + offset, + memcpy(UDF_I_BH(inode)->b_data + udf_file_entry_alloc_offset(inode) + offset, kaddr + offset, to - offset); - mark_buffer_dirty(bh); - brelse(bh); + mark_buffer_dirty(UDF_I_BH(inode)); SetPageUptodate(page); -out: kunmap(page); /* only one page here */ if (to > inode->i_size) @@ -232,7 +196,6 @@ unsigned long arg) { int result = -EINVAL; - struct buffer_head *bh = NULL; long_ad eaicb; uint8_t *ea = NULL; @@ -270,20 +233,11 @@ } /* ok, we need to read the inode */ - bh = udf_tread(inode->i_sb, - udf_get_lb_pblock(inode->i_sb, UDF_I_LOCATION(inode), 0)); - - if (!bh) - { - udf_debug("bread failed (inode=%ld)\n", inode->i_ino); - return -EIO; - } - if (UDF_I_EXTENDED_FE(inode) == 0) { struct fileEntry *fe; - fe = (struct fileEntry *)bh->b_data; + fe = (struct fileEntry *)UDF_I_BH(inode)->b_data; eaicb = lela_to_cpu(fe->extendedAttrICB); if (UDF_I_LENEATTR(inode)) ea = fe->extendedAttr; @@ -292,7 +246,7 @@ { struct extendedFileEntry *efe; - efe = (struct extendedFileEntry *)bh->b_data; + efe = (struct extendedFileEntry *)UDF_I_BH(inode)->b_data; eaicb = lela_to_cpu(efe->extendedAttrICB); if (UDF_I_LENEATTR(inode)) ea = efe->extendedAttr; @@ -310,7 +264,6 @@ break; } - udf_release_data(bh); return result; } diff -u -r -N ../../linus/main/linux/fs/udf/ialloc.c linux/fs/udf/ialloc.c --- ../../linus/main/linux/fs/udf/ialloc.c Sat Jul 27 19:30:33 2002 +++ linux/fs/udf/ialloc.c Sun Jul 28 15:14:36 2002 @@ -152,7 +152,12 @@ UDF_I_CRTIME(inode) = CURRENT_TIME; UDF_I_UMTIME(inode) = UDF_I_UCTIME(inode) = UDF_I_UCRTIME(inode) = CURRENT_UTIME; - UDF_I_NEW_INODE(inode) = 1; + UDF_I_BH(inode) = udf_tgetblk(sb, inode->i_ino); + lock_buffer(UDF_I_BH(inode)); + memset(UDF_I_BH(inode)->b_data, 0x00, sb->s_blocksize); + set_buffer_uptodate(UDF_I_BH(inode)); + unlock_buffer(UDF_I_BH(inode)); + udf_write_inode(inode, 0); insert_inode_hash(inode); mark_inode_dirty(inode); diff -u -r -N ../../linus/main/linux/fs/udf/inode.c linux/fs/udf/inode.c --- ../../linus/main/linux/fs/udf/inode.c Sat Jul 27 19:30:33 2002 +++ linux/fs/udf/inode.c Sun Jul 28 15:14:36 2002 @@ -122,6 +122,11 @@ clear_inode(inode); } +void udf_clear_inode(struct inode *inode) +{ + udf_release_data(UDF_I_BH(inode)); +} + void udf_discard_prealloc(struct inode * inode) { if (inode->i_size && inode->i_size != UDF_I_LENEXTENTS(inode) && @@ -162,10 +167,8 @@ void udf_expand_file_adinicb(struct inode * inode, int newsize, int * err) { - struct buffer_head *bh = NULL; struct page *page; char *kaddr; - int block; /* from now on we have normal address_space methods */ inode->i_data.a_ops = &udf_aops; @@ -180,10 +183,6 @@ return; } - block = udf_get_lb_pblock(inode->i_sb, UDF_I_LOCATION(inode), 0); - bh = udf_tread(inode->i_sb, block); - if (!bh) - return; page = grab_cache_page(inode->i_mapping, 0); if (!PageLocked(page)) PAGE_BUG(page); @@ -192,21 +191,20 @@ kaddr = kmap(page); memset(kaddr + UDF_I_LENALLOC(inode), 0x00, PAGE_CACHE_SIZE - UDF_I_LENALLOC(inode)); - memcpy(kaddr, bh->b_data + udf_file_entry_alloc_offset(inode), + memcpy(kaddr, UDF_I_BH(inode)->b_data + udf_file_entry_alloc_offset(inode), UDF_I_LENALLOC(inode)); flush_dcache_page(page); SetPageUptodate(page); kunmap(page); } - memset(bh->b_data + udf_file_entry_alloc_offset(inode), + memset(UDF_I_BH(inode)->b_data + udf_file_entry_alloc_offset(inode), 0, UDF_I_LENALLOC(inode)); UDF_I_LENALLOC(inode) = 0; if (UDF_QUERY_FLAG(inode->i_sb, UDF_FLAG_USE_SHORT_AD)) UDF_I_ALLOCTYPE(inode) = ICBTAG_FLAG_AD_SHORT; else UDF_I_ALLOCTYPE(inode) = ICBTAG_FLAG_AD_LONG; - mark_buffer_dirty_inode(bh, inode); - udf_release_data(bh); + mark_buffer_dirty_inode(UDF_I_BH(inode), inode); inode->i_data.a_ops->writepage(page); page_cache_release(page); @@ -217,7 +215,7 @@ struct buffer_head * udf_expand_dir_adinicb(struct inode *inode, int *block, int *err) { int newblock; - struct buffer_head *sbh = NULL, *dbh = NULL; + struct buffer_head *dbh = NULL; lb_addr bloc, eloc; uint32_t elen, extoffset; @@ -247,9 +245,6 @@ UDF_I_LOCATION(inode).partitionReferenceNum, 0); if (!newblock) return NULL; - sbh = udf_tread(inode->i_sb, inode->i_ino); - if (!sbh) - return NULL; dbh = udf_tgetblk(inode->i_sb, newblock); if (!dbh) return NULL; @@ -260,7 +255,7 @@ mark_buffer_dirty_inode(dbh, inode); sfibh.soffset = sfibh.eoffset = (f_pos & ((inode->i_sb->s_blocksize - 1) >> 2)) << 2; - sfibh.sbh = sfibh.ebh = sbh; + sfibh.sbh = sfibh.ebh = UDF_I_BH(inode); dfibh.soffset = dfibh.eoffset = 0; dfibh.sbh = dfibh.ebh = dbh; while ( (f_pos < size) ) @@ -268,7 +263,6 @@ sfi = udf_fileident_read(inode, &f_pos, &sfibh, &cfi, NULL, NULL, NULL, NULL, NULL, NULL); if (!sfi) { - udf_release_data(sbh); udf_release_data(dbh); return NULL; } @@ -279,14 +273,13 @@ if (udf_write_fi(inode, sfi, dfi, &dfibh, sfi->impUse, sfi->fileIdent + sfi->lengthOfImpUse)) { - udf_release_data(sbh); udf_release_data(dbh); return NULL; } } mark_buffer_dirty_inode(dbh, inode); - memset(sbh->b_data + udf_file_entry_alloc_offset(inode), + memset(UDF_I_BH(inode)->b_data + udf_file_entry_alloc_offset(inode), 0, UDF_I_LENALLOC(inode)); UDF_I_LENALLOC(inode) = 0; @@ -300,11 +293,10 @@ elen = inode->i_size; UDF_I_LENEXTENTS(inode) = elen; extoffset = udf_file_entry_alloc_offset(inode); - udf_add_aext(inode, &bloc, &extoffset, eloc, elen, &sbh, 0); + udf_add_aext(inode, &bloc, &extoffset, eloc, elen, &UDF_I_BH(inode), 0); /* UniqueID stuff */ - mark_buffer_dirty(sbh); - udf_release_data(sbh); + mark_buffer_dirty(UDF_I_BH(inode)); mark_inode_dirty(inode); return dbh; } @@ -724,7 +716,7 @@ if (elen > numalloc) { - laarr[c].extLength -= + laarr[i].extLength -= (numalloc << inode->i_sb->s_blocksize_bits); numalloc = 0; } @@ -876,13 +868,8 @@ offset = (inode->i_size & (inode->i_sb->s_blocksize - 1)) + udf_file_entry_alloc_offset(inode); - if ((bh = udf_tread(inode->i_sb, - udf_get_lb_pblock(inode->i_sb, UDF_I_LOCATION(inode), 0)))) - { - memset(bh->b_data + offset, 0x00, inode->i_sb->s_blocksize - offset); - mark_buffer_dirty(bh); - udf_release_data(bh); - } + memset(UDF_I_BH(inode)->b_data + offset, 0x00, inode->i_sb->s_blocksize - offset); + mark_buffer_dirty(UDF_I_BH(inode)); UDF_I_LENALLOC(inode) = inode->i_size; } } @@ -1019,7 +1006,6 @@ return; } udf_fill_inode(inode, bh); - udf_release_data(bh); } static void udf_fill_inode(struct inode *inode, struct buffer_head *bh) @@ -1030,8 +1016,6 @@ long convtime_usec; int offset, alen; - UDF_I_NEW_INODE(inode) = 0; - fe = (struct fileEntry *)bh->b_data; efe = (struct extendedFileEntry *)bh->b_data; @@ -1040,6 +1024,7 @@ else /* if (le16_to_cpu(fe->icbTag.strategyType) == 4096) */ UDF_I_STRAT4096(inode) = 1; + UDF_I_BH(inode) = bh; UDF_I_ALLOCTYPE(inode) = le16_to_cpu(fe->icbTag.flags) & ICBTAG_FLAG_AD_MASK; UDF_I_UMTIME(inode) = 0; UDF_I_UCTIME(inode) = 0; @@ -1307,7 +1292,7 @@ static int udf_update_inode(struct inode *inode, int do_sync) { - struct buffer_head *bh = NULL; + struct buffer_head *bh; struct fileEntry *fe; struct extendedFileEntry *efe; uint32_t udfperms; @@ -1317,8 +1302,7 @@ timestamp cpu_time; int err = 0; - bh = udf_tread(inode->i_sb, - udf_get_lb_pblock(inode->i_sb, UDF_I_LOCATION(inode), 0)); + bh = UDF_I_BH(inode); if (!bh) { @@ -1327,17 +1311,6 @@ } fe = (struct fileEntry *)bh->b_data; efe = (struct extendedFileEntry *)bh->b_data; - if (UDF_I_NEW_INODE(inode) == 1) - { - if (UDF_I_EXTENDED_FE(inode) == 0) - memset(bh->b_data, 0x00, sizeof(struct fileEntry)); - else - memset(bh->b_data, 0x00, sizeof(struct extendedFileEntry)); - memset(bh->b_data + udf_file_entry_alloc_offset(inode) + - UDF_I_LENALLOC(inode), 0x0, inode->i_sb->s_blocksize - - udf_file_entry_alloc_offset(inode) - UDF_I_LENALLOC(inode)); - UDF_I_NEW_INODE(inode) = 0; - } if (le16_to_cpu(fe->descTag.tagIdent) == TAG_IDENT_USE) { @@ -1357,7 +1330,6 @@ use->descTag.tagChecksum += ((uint8_t *)&(use->descTag))[i]; mark_buffer_dirty(bh); - udf_release_data(bh); return err; } @@ -1545,7 +1517,6 @@ err = -EIO; } } - udf_release_data(bh); return err; } @@ -1680,7 +1651,7 @@ sptr = (*bh)->b_data + *extoffset; *extoffset = sizeof(struct allocExtDesc); - if (memcmp(&UDF_I_LOCATION(inode), &obloc, sizeof(lb_addr))) + if (*bh != UDF_I_BH(inode)) { aed = (struct allocExtDesc *)(*bh)->b_data; aed->lengthAllocDescs = @@ -1731,7 +1702,7 @@ etype = udf_write_aext(inode, *bloc, extoffset, eloc, elen, *bh, inc); - if (!memcmp(&UDF_I_LOCATION(inode), bloc, sizeof(lb_addr))) + if (*bh == UDF_I_BH(inode)) { UDF_I_LENALLOC(inode) += adsize; mark_inode_dirty(inode); @@ -1797,7 +1768,7 @@ } } - if (memcmp(&UDF_I_LOCATION(inode), &bloc, sizeof(lb_addr))) + if (bh != UDF_I_BH(inode)) { if (!UDF_QUERY_FLAG(inode->i_sb, UDF_FLAG_STRICT) || UDF_SB_UDFREV(inode->i_sb) >= 0x0201) { @@ -1839,10 +1810,9 @@ tagIdent = le16_to_cpu(((tag *)(*bh)->b_data)->tagIdent); - if (!memcmp(&UDF_I_LOCATION(inode), bloc, sizeof(lb_addr))) + if (*bh == UDF_I_BH(inode)) { - if (tagIdent == TAG_IDENT_FE || tagIdent == TAG_IDENT_EFE || - UDF_I_NEW_INODE(inode)) + if (tagIdent == TAG_IDENT_FE || tagIdent == TAG_IDENT_EFE) { pos = udf_file_entry_alloc_offset(inode); alen = UDF_I_LENALLOC(inode) + pos; @@ -1959,7 +1929,7 @@ } } - if (!memcmp(&UDF_I_LOCATION(inode), bloc, sizeof(lb_addr))) + if (*bh == UDF_I_BH(inode)) { if (!(UDF_I_EXTENDED_FE(inode))) pos = sizeof(struct fileEntry) + UDF_I_LENEATTR(inode); @@ -2111,7 +2081,7 @@ udf_free_blocks(inode->i_sb, inode, nbloc, 0, 1); udf_write_aext(inode, obloc, &oextoffset, eloc, elen, obh, 1); udf_write_aext(inode, obloc, &oextoffset, eloc, elen, obh, 1); - if (!memcmp(&UDF_I_LOCATION(inode), &obloc, sizeof(lb_addr))) + if (obh == UDF_I_BH(inode)) { UDF_I_LENALLOC(inode) -= (adsize * 2); mark_inode_dirty(inode); @@ -2131,7 +2101,7 @@ else { udf_write_aext(inode, obloc, &oextoffset, eloc, elen, obh, 1); - if (!memcmp(&UDF_I_LOCATION(inode), &obloc, sizeof(lb_addr))) + if (obh == UDF_I_BH(inode)) { UDF_I_LENALLOC(inode) -= adsize; mark_inode_dirty(inode); diff -u -r -N ../../linus/main/linux/fs/udf/namei.c linux/fs/udf/namei.c --- ../../linus/main/linux/fs/udf/namei.c Sat Jul 27 19:30:33 2002 +++ linux/fs/udf/namei.c Sun Jul 28 15:14:36 2002 @@ -818,7 +818,10 @@ } if (!(fibh.sbh = fibh.ebh = udf_tread(dir->i_sb, block))) + { + udf_release_data(bh); return 0; + } while ( (f_pos < size) ) { @@ -835,6 +838,9 @@ if (cfi.lengthFileIdent && (cfi.fileCharacteristics & FID_FILE_CHAR_DELETED) == 0) { + if (fibh.sbh != fibh.ebh) + udf_release_data(fibh.ebh); + udf_release_data(fibh.sbh); udf_release_data(bh); return 0; } diff -u -r -N ../../linus/main/linux/fs/udf/super.c linux/fs/udf/super.c --- ../../linus/main/linux/fs/udf/super.c Sat Jul 27 19:30:34 2002 +++ linux/fs/udf/super.c Sun Jul 28 15:14:36 2002 @@ -161,6 +161,7 @@ write_inode: udf_write_inode, put_inode: udf_put_inode, delete_inode: udf_delete_inode, + clear_inode: udf_clear_inode, put_super: udf_put_super, write_super: udf_write_super, statfs: udf_statfs, @@ -383,10 +384,6 @@ UDF_SB(sb)->s_gid = uopt.gid; UDF_SB(sb)->s_umask = uopt.umask; -#if UDFFS_RW != 1 - *flags |= MS_RDONLY; -#endif - if ((*flags & MS_RDONLY) == (sb->s_flags & MS_RDONLY)) return 0; if (*flags & MS_RDONLY) @@ -1428,10 +1425,6 @@ sb->u.generic_sbp = sbi; memset(UDF_SB(sb), 0x00, sizeof(struct udf_sb_info)); -#if UDFFS_RW != 1 - sb->s_flags |= MS_RDONLY; -#endif - if (!udf_parse_options((char *)options, &uopt)) goto error_out; @@ -1543,8 +1536,8 @@ { timestamp ts; udf_time_to_stamp(&ts, UDF_SB_RECORDTIME(sb), 0); - udf_info("UDF %s-%s (%s) Mounting volume '%s', timestamp %04u/%02u/%02u %02u:%02u (%x)\n", - UDFFS_VERSION, UDFFS_RW ? "rw" : "ro", UDFFS_DATE, + udf_info("UDF %s (%s) Mounting volume '%s', timestamp %04u/%02u/%02u %02u:%02u (%x)\n", + UDFFS_VERSION, UDFFS_DATE, UDF_SB_VOLIDENT(sb), ts.year, ts.month, ts.day, ts.hour, ts.minute, ts.typeAndTimezone); } diff -u -r -N ../../linus/main/linux/fs/udf/truncate.c linux/fs/udf/truncate.c --- ../../linus/main/linux/fs/udf/truncate.c Sat Jul 27 19:30:34 2002 +++ linux/fs/udf/truncate.c Sun Jul 28 15:14:36 2002 @@ -95,7 +95,7 @@ else lenalloc = extoffset - adsize; - if (!memcmp(&UDF_I_LOCATION(inode), &bloc, sizeof(lb_addr))) + if (bh == UDF_I_BH(inode)) lenalloc -= udf_file_entry_alloc_offset(inode); else lenalloc -= sizeof(struct allocExtDesc); @@ -108,7 +108,7 @@ extoffset = 0; if (lelen) { - if (!memcmp(&UDF_I_LOCATION(inode), &bloc, sizeof(lb_addr))) + if (bh == UDF_I_BH(inode)) memset(bh->b_data, 0x00, udf_file_entry_alloc_offset(inode)); else memset(bh->b_data, 0x00, sizeof(struct allocExtDesc)); @@ -116,7 +116,7 @@ } else { - if (!memcmp(&UDF_I_LOCATION(inode), &bloc, sizeof(lb_addr))) + if (bh == UDF_I_BH(inode)) { UDF_I_LENALLOC(inode) = lenalloc; mark_inode_dirty(inode); @@ -153,7 +153,7 @@ if (lelen) { - if (!memcmp(&UDF_I_LOCATION(inode), &bloc, sizeof(lb_addr))) + if (bh == UDF_I_BH(inode)) memset(bh->b_data, 0x00, udf_file_entry_alloc_offset(inode)); else memset(bh->b_data, 0x00, sizeof(struct allocExtDesc)); @@ -161,7 +161,7 @@ } else { - if (!memcmp(&UDF_I_LOCATION(inode), &bloc, sizeof(lb_addr))) + if (bh == UDF_I_BH(inode)) { UDF_I_LENALLOC(inode) = lenalloc; mark_inode_dirty(inode); diff -u -r -N ../../linus/main/linux/fs/udf/udf_i.h linux/fs/udf/udf_i.h --- ../../linus/main/linux/fs/udf/udf_i.h Sat Jul 27 19:30:34 2002 +++ linux/fs/udf/udf_i.h Sun Jul 28 15:14:36 2002 @@ -15,12 +15,12 @@ #define UDF_I_ALLOCTYPE(X) ( UDF_I(X)->i_alloc_type ) #define UDF_I_EXTENDED_FE(X) ( UDF_I(X)->i_extended_fe ) #define UDF_I_STRAT4096(X) ( UDF_I(X)->i_strat_4096 ) -#define UDF_I_NEW_INODE(X) ( UDF_I(X)->i_new_inode ) #define UDF_I_NEXT_ALLOC_BLOCK(X) ( UDF_I(X)->i_next_alloc_block ) #define UDF_I_NEXT_ALLOC_GOAL(X) ( UDF_I(X)->i_next_alloc_goal ) #define UDF_I_UMTIME(X) ( UDF_I(X)->i_umtime ) #define UDF_I_UCTIME(X) ( UDF_I(X)->i_uctime ) #define UDF_I_CRTIME(X) ( UDF_I(X)->i_crtime ) #define UDF_I_UCRTIME(X) ( UDF_I(X)->i_ucrtime ) +#define UDF_I_BH(X) ( UDF_I(X)->i_bh ) #endif /* !defined(_LINUX_UDF_I_H) */ diff -u -r -N ../../linus/main/linux/fs/udf/udfdecl.h linux/fs/udf/udfdecl.h --- ../../linus/main/linux/fs/udf/udfdecl.h Sat Jul 27 19:30:34 2002 +++ linux/fs/udf/udfdecl.h Sun Jul 28 15:14:36 2002 @@ -114,6 +114,7 @@ extern void udf_read_inode(struct inode *); extern void udf_put_inode(struct inode *); extern void udf_delete_inode(struct inode *); +extern void udf_clear_inode(struct inode *); extern void udf_write_inode(struct inode *, int); extern long udf_block_map(struct inode *, long); extern int8_t inode_bmap(struct inode *, int, lb_addr *, uint32_t *, lb_addr *, uint32_t *, uint32_t *, struct buffer_head **); diff -u -r -N ../../linus/main/linux/include/linux/udf_fs_i.h linux/include/linux/udf_fs_i.h --- ../../linus/main/linux/include/linux/udf_fs_i.h Sat Jul 27 19:31:55 2002 +++ linux/include/linux/udf_fs_i.h Sun Jul 28 15:14:36 2002 @@ -30,6 +30,7 @@ struct udf_inode_info { + struct buffer_head *i_bh; long i_umtime; long i_uctime; long i_crtime; @@ -45,8 +46,7 @@ unsigned i_alloc_type : 3; unsigned i_extended_fe : 1; unsigned i_strat_4096 : 1; - unsigned i_new_inode : 1; - unsigned reserved : 26; + unsigned reserved : 27; struct inode vfs_inode; }; -- Peter Osterlund - petero2@telia.com http://w1.894.telia.com/~u89404340