summaryrefslogtreecommitdiffstats
path: root/fs/udf
diff options
context:
space:
mode:
authorRalf Baechle <ralf@linux-mips.org>2000-02-23 00:40:54 +0000
committerRalf Baechle <ralf@linux-mips.org>2000-02-23 00:40:54 +0000
commit529c593ece216e4aaffd36bd940cb94f1fa63129 (patch)
tree78f1c0b805f5656aa7b0417a043c5346f700a2cf /fs/udf
parent0bd079751d25808d1972baee5c4eaa1db2227257 (diff)
Merge with 2.3.43. I did ignore all modifications to the qlogicisp.c
driver due to the Origin A64 hacks.
Diffstat (limited to 'fs/udf')
-rw-r--r--fs/udf/dir.c24
-rw-r--r--fs/udf/file.c229
-rw-r--r--fs/udf/fsync.c8
-rw-r--r--fs/udf/inode.c155
-rw-r--r--fs/udf/namei.c6
-rw-r--r--fs/udf/symlink.c21
-rw-r--r--fs/udf/truncate.c19
-rw-r--r--fs/udf/udfdecl.h9
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 *);