patch-2.3.43 linux/fs/udf/inode.c
Next file: linux/fs/udf/namei.c
Previous file: linux/fs/udf/fsync.c
Back to the patch index
Back to the overall index
- Lines: 233
- Date:
Thu Feb 10 12:16:59 2000
- Orig file:
v2.3.42/linux/fs/udf/inode.c
- Orig date:
Fri Jan 28 15:09:09 2000
diff -u --recursive --new-file v2.3.42/linux/fs/udf/inode.c linux/fs/udf/inode.c
@@ -56,6 +56,7 @@
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 @@
{
inode->i_size = 0;
if (inode->i_blocks)
- inode->i_op->truncate(inode);
+ udf_truncate(inode);
udf_free_inode(inode);
}
@@ -117,6 +118,30 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
}
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;
}
@@ -1952,59 +1978,4 @@
ret = udf_locked_block_map(inode, 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;
}
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)