diff options
Diffstat (limited to 'fs/udf')
-rw-r--r-- | fs/udf/dir.c | 24 | ||||
-rw-r--r-- | fs/udf/file.c | 229 | ||||
-rw-r--r-- | fs/udf/fsync.c | 8 | ||||
-rw-r--r-- | fs/udf/inode.c | 155 | ||||
-rw-r--r-- | fs/udf/namei.c | 6 | ||||
-rw-r--r-- | fs/udf/symlink.c | 21 | ||||
-rw-r--r-- | fs/udf/truncate.c | 19 | ||||
-rw-r--r-- | fs/udf/udfdecl.h | 9 |
8 files changed, 168 insertions, 303 deletions
diff --git a/fs/udf/dir.c b/fs/udf/dir.c index 916683186..963d20344 100644 --- a/fs/udf/dir.c +++ b/fs/udf/dir.c @@ -50,19 +50,9 @@ static int do_udf_readdir(struct inode *, struct file *, filldir_t, void *); /* readdir and lookup functions */ static struct file_operations udf_dir_operations = { - NULL, /* lllseek */ - NULL, /* read */ - NULL, /* write */ - udf_readdir, /* readdir */ - NULL, /* poll */ - udf_ioctl, /* ioctl */ - NULL, /* mmap */ - NULL, /* open */ - NULL, /* flush */ - NULL, /* release */ - udf_sync_file, /* fsync */ - NULL, /* fasync */ - NULL /* lock */ + readdir: udf_readdir, + ioctl: udf_ioctl, + fsync: udf_sync_file, }; struct inode_operations udf_dir_inode_operations = { @@ -90,14 +80,6 @@ struct inode_operations udf_dir_inode_operations = { NULL, /* mknod */ NULL, /* rename */ #endif - NULL, /* readlink */ - NULL, /* follow_link */ - NULL, /* get_block */ - NULL, /* readpage */ - NULL, /* writepage */ - NULL, /* truncate */ - NULL, /* permission */ - NULL /* revalidate */ }; /* diff --git a/fs/udf/file.c b/fs/udf/file.c index 8ea44d2a8..5cf51cd0e 100644 --- a/fs/udf/file.c +++ b/fs/udf/file.c @@ -72,110 +72,119 @@ static loff_t udf_file_llseek(struct file * file, loff_t offset, int origin) return offset; } -static inline void remove_suid(struct inode * inode) +static int udf_adinicb_readpage(struct dentry *dentry, struct page * page) { - unsigned int mode; + struct inode *inode = dentry->d_inode; - /* set S_IGID if S_IXGRP is set, and always set S_ISUID */ - mode = (inode->i_mode & S_IXGRP)*(S_ISGID/S_IXGRP) | S_ISUID; - - /* was any of the uid bits set? */ - mode &= inode->i_mode; - if (mode && !capable(CAP_FSETID)) - { - inode->i_mode &= ~mode; - mark_inode_dirty(inode); - } -} - -static ssize_t udf_file_write(struct file * file, const char * buf, - size_t count, loff_t *ppos) -{ - ssize_t retval; - struct inode *inode = file->f_dentry->d_inode; + struct buffer_head *bh; + unsigned long kaddr = 0; - retval = generic_file_write(file, buf, count, ppos, block_write_partial_page); + if (!PageLocked(page)) + PAGE_BUG(page); - if (retval > 0) - { - remove_suid(inode); - inode->i_ctime = inode->i_mtime = CURRENT_TIME; - UDF_I_UCTIME(inode) = UDF_I_UMTIME(inode) = CURRENT_UTIME; - mark_inode_dirty(inode); - } - return retval; + kaddr = kmap(page); + memset((char *)kaddr, 0, PAGE_CACHE_SIZE); + bh = getblk (inode->i_dev, inode->i_ino, inode->i_sb->s_blocksize); + ll_rw_block (READ, 1, &bh); + wait_on_buffer(bh); + memcpy((char *)kaddr, bh->b_data + udf_ext0_offset(inode), + inode->i_size); + brelse(bh); + SetPageUptodate(page); + kunmap(page); + UnlockPage(page); + return 0; } -int udf_write_partial_page_adinicb(struct file *file, struct page *page, unsigned long offset, unsigned long bytes, const char * buf) +static int udf_adinicb_writepage(struct dentry *dentry, struct page *page) { - struct inode *inode = file->f_dentry->d_inode; - int err = 0, block; + struct inode *inode = dentry->d_inode; + struct buffer_head *bh; unsigned long kaddr = 0; if (!PageLocked(page)) BUG(); - if (offset < 0 || offset >= (inode->i_sb->s_blocksize - udf_file_entry_alloc_offset(inode))) - BUG(); - if (bytes+offset < 0 || bytes+offset > (inode->i_sb->s_blocksize - udf_file_entry_alloc_offset(inode))) - BUG(); kaddr = kmap(page); - block = udf_get_lb_pblock(inode->i_sb, UDF_I_LOCATION(inode), 0); - bh = getblk (inode->i_dev, block, inode->i_sb->s_blocksize); + bh = getblk (inode->i_dev, inode->i_ino, inode->i_sb->s_blocksize); if (!buffer_uptodate(bh)) { ll_rw_block (READ, 1, &bh); wait_on_buffer(bh); } - err = copy_from_user((char *)kaddr + offset, buf, bytes); + memcpy(bh->b_data + udf_ext0_offset(inode), (char *)kaddr, + inode->i_size); + ll_rw_block (WRITE, 1, &bh); + wait_on_buffer(bh); + brelse(bh); + SetPageUptodate(page); + kunmap(page); + return 0; +} + +static int udf_adinicb_prepare_write(struct page *page, unsigned offset, unsigned to) +{ + kmap(page); + return 0; +} + +static int udf_adinicb_commit_write(struct file *file, struct page *page, unsigned offset, unsigned to) +{ + struct inode *inode = file->f_dentry->d_inode; + struct buffer_head *bh; + char *kaddr = (char*)page_address(page); + bh = bread (inode->i_dev, inode->i_ino, inode->i_sb->s_blocksize); + if (!buffer_uptodate(bh)) { + ll_rw_block (READ, 1, &bh); + wait_on_buffer(bh); + } memcpy(bh->b_data + udf_file_entry_alloc_offset(inode) + offset, - (char *)kaddr + offset, bytes); + kaddr + offset, to-offset); mark_buffer_dirty(bh, 0); brelse(bh); kunmap(page); SetPageUptodate(page); - return bytes; + return 0; } -static ssize_t udf_file_write_adinicb(struct file * file, const char * buf, +struct address_space_operations udf_adinicb_aops = { + readpage: udf_adinicb_readpage, + writepage: udf_adinicb_writepage, + prepare_write: udf_adinicb_prepare_write, + commit_write: udf_adinicb_commit_write +}; + +static ssize_t udf_file_write(struct file * file, const char * buf, size_t count, loff_t *ppos) { ssize_t retval; struct inode *inode = file->f_dentry->d_inode; int err, pos; - if (file->f_flags & O_APPEND) - pos = inode->i_size; - else - pos = *ppos; - - if (inode->i_sb->s_blocksize < (udf_file_entry_alloc_offset(inode) + - pos + count)) - { - udf_expand_file_adinicb(file, pos + count, &err); - if (UDF_I_ALLOCTYPE(inode) == ICB_FLAG_AD_IN_ICB) - { - udf_debug("udf_expand_adinicb: err=%d\n", err); - return err; - } - else - return udf_file_write(file, buf, count, ppos); - } - else - { - if (pos + count > inode->i_size) - UDF_I_LENALLOC(inode) = pos + count; + if (UDF_I_ALLOCTYPE(inode) == ICB_FLAG_AD_IN_ICB) { + if (file->f_flags & O_APPEND) + pos = inode->i_size; else - UDF_I_LENALLOC(inode) = inode->i_size; + pos = *ppos; + + if (inode->i_sb->s_blocksize < + (udf_file_entry_alloc_offset(inode) + pos + count)) { + udf_expand_file_adinicb(file, pos + count, &err); + if (UDF_I_ALLOCTYPE(inode) == ICB_FLAG_AD_IN_ICB) { + udf_debug("udf_expand_adinicb: err=%d\n", err); + return err; + } + } else { + if (pos + count > inode->i_size) + UDF_I_LENALLOC(inode) = pos + count; + else + UDF_I_LENALLOC(inode) = inode->i_size; + } } - retval = generic_file_write(file, buf, count, ppos, udf_write_partial_page_adinicb); - - if (retval > 0) - { - remove_suid(inode); - inode->i_ctime = inode->i_mtime = CURRENT_TIME; + retval = generic_file_write(file, buf, count, ppos); + if (retval > 0) { UDF_I_UCTIME(inode) = UDF_I_UMTIME(inode) = CURRENT_UTIME; mark_inode_dirty(inode); } @@ -338,83 +347,19 @@ static int udf_open_file(struct inode * inode, struct file * filp) } static struct file_operations udf_file_operations = { - udf_file_llseek, /* llseek */ - generic_file_read, /* read */ - udf_file_write, /* write */ - NULL, /* readdir */ - NULL, /* poll */ - udf_ioctl, /* ioctl */ - generic_file_mmap, /* mmap */ - udf_open_file, /* open */ - NULL, /* flush */ - udf_release_file, /* release */ - udf_sync_file, /* fsync */ - NULL, /* fasync */ - NULL /* lock */ + llseek: udf_file_llseek, + read: generic_file_read, + write: udf_file_write, + ioctl: udf_ioctl, + mmap: generic_file_mmap, + open: udf_open_file, + release: udf_release_file, + fsync: udf_sync_file, }; struct inode_operations udf_file_inode_operations = { &udf_file_operations, - NULL, /* create */ - NULL, /* lookup */ - NULL, /* link */ - NULL, /* unlink */ - NULL, /* symlink */ - NULL, /* mkdir */ - NULL, /* rmdir */ - NULL, /* mknod */ - NULL, /* rename */ - NULL, /* readlink */ - NULL, /* follow_link */ - udf_get_block, /* get_block */ - block_read_full_page, /* readpage */ - block_write_full_page, /* writepage */ -#if CONFIG_UDF_RW == 1 - udf_truncate, /* truncate */ -#else - NULL, /* truncate */ -#endif - NULL, /* permission */ - NULL /* revalidate */ -}; - -static struct file_operations udf_file_operations_adinicb = { - udf_file_llseek, /* llseek */ - generic_file_read, /* read */ - udf_file_write_adinicb, /* write */ - NULL, /* readdir */ - NULL, /* poll */ - udf_ioctl, /* ioctl */ - NULL, /* mmap */ - NULL, /* open */ - NULL, /* flush */ - udf_release_file, /* release */ - udf_sync_file_adinicb, /* fsync */ - NULL, /* fasync */ - NULL /* lock */ -}; - -struct inode_operations udf_file_inode_operations_adinicb = { - &udf_file_operations_adinicb, - NULL, /* create */ - NULL, /* lookup */ - NULL, /* link */ - NULL, /* unlink */ - NULL, /* symlink */ - NULL, /* mkdir */ - NULL, /* rmdir */ - NULL, /* mknod */ - NULL, /* rename */ - NULL, /* readlink */ - NULL, /* follow_link */ - udf_get_block, /* get_block */ - udf_readpage_adinicb, /* readpage */ - udf_writepage_adinicb, /* writepage */ #if CONFIG_UDF_RW == 1 - udf_truncate_adinicb, /* truncate */ -#else - NULL, /* truncate */ + truncate: udf_truncate, #endif - NULL, /* permission */ - NULL /* revalidate */ }; diff --git a/fs/udf/fsync.c b/fs/udf/fsync.c index b5c10c91b..e7d067e62 100644 --- a/fs/udf/fsync.c +++ b/fs/udf/fsync.c @@ -27,6 +27,7 @@ #include <linux/fs.h> #include <linux/locks.h> +#include <linux/smp_lock.h> #include <linux/udf_fs.h> #include "udf_i.h" @@ -100,6 +101,7 @@ int udf_sync_file(struct file * file, struct dentry *dentry) int wait, err = 0; struct inode *inode = dentry->d_inode; + lock_kernel(); if (S_ISLNK(inode->i_mode) && !(inode->i_blocks)) { /* @@ -116,10 +118,6 @@ int udf_sync_file(struct file * file, struct dentry *dentry) } skip: err |= udf_sync_inode (inode); + unlock_kernel(); return err ? -EIO : 0; } - -int udf_sync_file_adinicb(struct file * file, struct dentry *dentry) -{ - return udf_sync_inode(dentry->d_inode) ? -EIO : 0; -} diff --git a/fs/udf/inode.c b/fs/udf/inode.c index 2ea1f980b..752a00339 100644 --- a/fs/udf/inode.c +++ b/fs/udf/inode.c @@ -56,6 +56,7 @@ static void udf_merge_extents(struct inode *, static void udf_update_extents(struct inode *, long_ad [EXTENT_MERGE_SIZE], int, int, lb_addr, Uint32, struct buffer_head **); +static int udf_get_block(struct inode *, long, struct buffer_head *, int); /* * udf_put_inode @@ -96,7 +97,7 @@ void udf_delete_inode(struct inode * inode) { inode->i_size = 0; if (inode->i_blocks) - inode->i_op->truncate(inode); + udf_truncate(inode); udf_free_inode(inode); } @@ -117,6 +118,30 @@ static int udf_alloc_block(struct inode *inode, Uint16 partition, return result; } +static int udf_writepage(struct dentry *dentry, struct page *page) +{ + return block_write_full_page(page,udf_get_block); +} +static int udf_readpage(struct dentry *dentry, struct page *page) +{ + return block_read_full_page(page,udf_get_block); +} +static int udf_prepare_write(struct page *page, unsigned from, unsigned to) +{ + return block_prepare_write(page,from,to,udf_get_block); +} +static int udf_bmap(struct address_space *mapping, long block) +{ + return generic_block_bmap(mapping,block,udf_get_block); +} +static struct address_space_operations udf_aops = { + readpage: udf_readpage, + writepage: udf_writepage, + prepare_write: udf_prepare_write, + commit_write: generic_commit_write, + bmap: udf_bmap +}; + void udf_expand_file_adinicb(struct file * filp, int newsize, int * err) { struct inode * inode = filp->f_dentry->d_inode; @@ -124,12 +149,13 @@ void udf_expand_file_adinicb(struct file * filp, int newsize, int * err) struct page *page; unsigned long kaddr = 0; + /* from now on we have normal address_space methods */ + inode->i_data.a_ops = &udf_aops; + if (!UDF_I_LENALLOC(inode)) { UDF_I_ALLOCTYPE(inode) = ICB_FLAG_AD_LONG; mark_inode_dirty(inode); - inode->i_op = &udf_file_inode_operations; - filp->f_op = inode->i_op->default_file_ops; return; } @@ -156,14 +182,12 @@ void udf_expand_file_adinicb(struct file * filp, int newsize, int * err) mark_buffer_dirty(bh, 1); udf_release_data(bh); - block_write_full_page(filp->f_dentry, page); + inode->i_data.a_ops->writepage(filp->f_dentry, page); UnlockPage(page); page_cache_release(page); mark_inode_dirty(inode); inode->i_version ++; - inode->i_op = &udf_file_inode_operations; - filp->f_op = inode->i_op->default_file_ops; } struct buffer_head * udf_expand_dir_adinicb(struct inode *inode, int *block, int *err) @@ -251,34 +275,7 @@ struct buffer_head * udf_expand_dir_adinicb(struct inode *inode, int *block, int return dbh; } -struct buffer_head * udf_getblk(struct inode * inode, long block, - int create, int * err) -{ - struct buffer_head dummy; - int error; - - dummy.b_state = 0; - dummy.b_blocknr = -1000; - error = udf_get_block(inode, block, &dummy, create); - *err = error; - if (!error & buffer_mapped(&dummy)) - { - struct buffer_head *bh; - bh = getblk(dummy.b_dev, dummy.b_blocknr, inode->i_sb->s_blocksize); - if (buffer_new(&dummy)) - { - if (!buffer_uptodate(bh)) - wait_on_buffer(bh); - memset(bh->b_data, 0x00, inode->i_sb->s_blocksize); - mark_buffer_uptodate(bh, 1); - mark_buffer_dirty(bh, 1); - } - return bh; - } - return NULL; -} - -int udf_get_block(struct inode *inode, long block, struct buffer_head *bh_result, int create) +static int udf_get_block(struct inode *inode, long block, struct buffer_head *bh_result, int create) { int err, new; struct buffer_head *bh; @@ -335,6 +332,33 @@ abort_negative: goto abort; } +struct buffer_head * udf_getblk(struct inode * inode, long block, + int create, int * err) +{ + struct buffer_head dummy; + int error; + + dummy.b_state = 0; + dummy.b_blocknr = -1000; + error = udf_get_block(inode, block, &dummy, create); + *err = error; + if (!error & buffer_mapped(&dummy)) + { + struct buffer_head *bh; + bh = getblk(dummy.b_dev, dummy.b_blocknr, inode->i_sb->s_blocksize); + if (buffer_new(&dummy)) + { + if (!buffer_uptodate(bh)) + wait_on_buffer(bh); + memset(bh->b_data, 0x00, inode->i_sb->s_blocksize); + mark_buffer_uptodate(bh, 1); + mark_buffer_dirty(bh, 1); + } + return bh; + } + return NULL; +} + static struct buffer_head * inode_getblk(struct inode * inode, long block, int *err, long *phys, int *new) { @@ -1061,9 +1085,10 @@ static void udf_fill_inode(struct inode *inode, struct buffer_head *bh) case FILE_TYPE_NONE: { if (UDF_I_ALLOCTYPE(inode) == ICB_FLAG_AD_IN_ICB) - inode->i_op = &udf_file_inode_operations_adinicb; + inode->i_data.a_ops = &udf_adinicb_aops; else - inode->i_op = &udf_file_inode_operations; + inode->i_data.a_ops = &udf_aops; + inode->i_op = &udf_file_inode_operations; inode->i_mode |= S_IFREG; break; } @@ -1084,7 +1109,8 @@ static void udf_fill_inode(struct inode *inode, struct buffer_head *bh) } case FILE_TYPE_SYMLINK: { - inode->i_op = &udf_symlink_inode_operations; + inode->i_data.a_ops = &udf_symlink_aops; + inode->i_op = &page_symlink_inode_operations; inode->i_mode = S_IFLNK|S_IRWXUGO; break; } @@ -1953,58 +1979,3 @@ long udf_block_map(struct inode *inode, long block) unlock_kernel(); return ret; } - -int udf_readpage_adinicb (struct dentry *dentry, struct page * page) -{ - struct inode *inode = dentry->d_inode; - - struct buffer_head *bh; - int block; - unsigned long kaddr = 0; - - if (!PageLocked(page)) - PAGE_BUG(page); - - kaddr = kmap(page); - memset((char *)kaddr, 0, PAGE_CACHE_SIZE); - block = udf_get_lb_pblock(inode->i_sb, UDF_I_LOCATION(inode), 0); - bh = getblk (inode->i_dev, block, inode->i_sb->s_blocksize); - ll_rw_block (READ, 1, &bh); - wait_on_buffer(bh); - memcpy((char *)kaddr, bh->b_data + udf_ext0_offset(inode), - inode->i_size); - brelse(bh); - SetPageUptodate(page); - kunmap(page); - UnlockPage(page); - return 0; -} - -int udf_writepage_adinicb (struct dentry *dentry, struct page *page) -{ - struct inode *inode = dentry->d_inode; - - struct buffer_head *bh; - int block; - unsigned long kaddr = 0; - - if (!PageLocked(page)) - BUG(); - - kaddr = kmap(page); - block = udf_get_lb_pblock(inode->i_sb, UDF_I_LOCATION(inode), 0); - bh = getblk (inode->i_dev, block, inode->i_sb->s_blocksize); - if (!buffer_uptodate(bh)) - { - ll_rw_block (READ, 1, &bh); - wait_on_buffer(bh); - } - memcpy(bh->b_data + udf_ext0_offset(inode), (char *)kaddr, - inode->i_size); - ll_rw_block (WRITE, 1, &bh); - wait_on_buffer(bh); - brelse(bh); - SetPageUptodate(page); - kunmap(page); - return 0; -} diff --git a/fs/udf/namei.c b/fs/udf/namei.c index 1f54833e4..aff491ef5 100644 --- a/fs/udf/namei.c +++ b/fs/udf/namei.c @@ -642,7 +642,8 @@ int udf_create(struct inode *dir, struct dentry *dentry, int mode) if (!inode) return err; - inode->i_op = &udf_file_inode_operations_adinicb; + inode->i_data.a_ops = &udf_adinicb_aops; + inode->i_op = &udf_file_inode_operations; inode->i_mode = mode; mark_inode_dirty(inode); @@ -970,7 +971,8 @@ int udf_symlink(struct inode * dir, struct dentry * dentry, const char * symname goto out; inode->i_mode = S_IFLNK | S_IRWXUGO; - inode->i_op = &udf_symlink_inode_operations; + inode->i_data.a_ops = &udf_symlink_aops; + inode->i_op = &page_symlink_inode_operations; bh = udf_tread(inode->i_sb, inode->i_ino, inode->i_sb->s_blocksize); ea = bh->b_data + udf_file_entry_alloc_offset(inode); diff --git a/fs/udf/symlink.c b/fs/udf/symlink.c index 6e5dd233a..5a286ce84 100644 --- a/fs/udf/symlink.c +++ b/fs/udf/symlink.c @@ -121,23 +121,6 @@ out: /* * symlinks can't do much... */ -struct inode_operations udf_symlink_inode_operations = { - NULL, /* no file-operations */ - NULL, /* create */ - NULL, /* lookup */ - NULL, /* link */ - NULL, /* unlink */ - NULL, /* symlink */ - NULL, /* mkdir */ - NULL, /* rmdir */ - NULL, /* mknod */ - NULL, /* rename */ - page_readlink, /* readlink */ - page_follow_link, /* follow_link */ - NULL, /* get_block */ - udf_symlink_filler, /* readpage */ - NULL, /* writepage */ - NULL, /* truncate */ - NULL, /* permission */ - NULL /* revalidate */ +struct address_space_operations udf_symlink_aops = { + readpage: udf_symlink_filler, }; diff --git a/fs/udf/truncate.c b/fs/udf/truncate.c index 4054da721..f5602dc0e 100644 --- a/fs/udf/truncate.c +++ b/fs/udf/truncate.c @@ -188,21 +188,10 @@ void udf_truncate(struct inode * inode) if (IS_APPEND(inode) || IS_IMMUTABLE(inode)) return; - udf_trunc(inode); - - inode->i_mtime = inode->i_ctime = CURRENT_TIME; - mark_inode_dirty(inode); -} - -void udf_truncate_adinicb(struct inode * inode) -{ - if (!(S_ISREG(inode->i_mode) || S_ISDIR(inode->i_mode) || - S_ISLNK(inode->i_mode))) - return; - if (IS_APPEND(inode) || IS_IMMUTABLE(inode)) - return; - - UDF_I_LENALLOC(inode) = inode->i_size; + if (UDF_I_ALLOCTYPE(inode) == ICB_FLAG_AD_IN_ICB) + UDF_I_LENALLOC(inode) = inode->i_size; + else + udf_trunc(inode); inode->i_mtime = inode->i_ctime = CURRENT_TIME; mark_inode_dirty(inode); diff --git a/fs/udf/udfdecl.h b/fs/udf/udfdecl.h index 171cd0d75..39418f730 100644 --- a/fs/udf/udfdecl.h +++ b/fs/udf/udfdecl.h @@ -63,8 +63,8 @@ struct super_block; extern struct inode_operations udf_dir_inode_operations; extern struct inode_operations udf_file_inode_operations; -extern struct inode_operations udf_file_inode_operations_adinicb; -extern struct inode_operations udf_symlink_inode_operations; +extern struct address_space_operations udf_adinicb_aops; +extern struct address_space_operations udf_symlink_aops; struct udf_fileident_bh { @@ -137,9 +137,6 @@ extern int udf_sync_inode(struct inode *); extern void udf_expand_file_adinicb(struct file *, int, int *); extern struct buffer_head * udf_expand_dir_adinicb(struct inode *, int *, int *); extern struct buffer_head * udf_getblk(struct inode *, long, int, int *); -extern int udf_get_block(struct inode *, long, struct buffer_head *, int); -extern int udf_readpage_adinicb (struct dentry *, struct page *); -extern int udf_writepage_adinicb (struct dentry *, struct page *); extern struct buffer_head * udf_bread(struct inode *, int, int, int *); extern void udf_read_inode(struct inode *); extern void udf_put_inode(struct inode *); @@ -187,14 +184,12 @@ extern struct inode * udf_new_inode (const struct inode *, int, int *); /* truncate.c */ extern void udf_trunc(struct inode *); extern void udf_truncate(struct inode *); -extern void udf_truncate_adinicb(struct inode *); /* balloc.c */ extern void udf_free_blocks(const struct inode *, lb_addr, Uint32, Uint32); extern int udf_alloc_blocks(const struct inode *, Uint16, Uint32, Uint32); extern int udf_new_block(const struct inode *, Uint16, Uint32, int *); extern int udf_sync_file(struct file *, struct dentry *); -extern int udf_sync_file_adinicb(struct file *, struct dentry *); /* directory.c */ extern Uint8 * udf_filead_read(struct inode *, Uint8 *, Uint8, lb_addr, int *, int *, struct buffer_head **, int *); |