diff options
author | Christoph Hellwig <hch@lst.de> | 2005-01-04 05:35:33 -0800 |
---|---|---|
committer | Linus Torvalds <torvalds@ppc970.osdl.org> | 2005-01-04 05:35:33 -0800 |
commit | f9346132da60953c5d861d9667684c436eb151a4 (patch) | |
tree | da366d2fe1bc097f2ef78144ed7cb63b62aef11b /fs | |
parent | 55521f5093f9ee5fe20b69f73fed4d4ba153918a (diff) | |
download | history-f9346132da60953c5d861d9667684c436eb151a4.tar.gz |
[PATCH] udf: fix reservation discarding
UDF discards file preallocations on every ->put_inode which is totally
bogus. It already discards them in ->release which makes sense for normal
writes, so the only additional discard is in ->clear_inode so we make sure
we don't leak any reservations for shared writeable mappings.
This follows similar changes to ext2 and ext3.
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'fs')
-rw-r--r-- | fs/udf/inode.c | 30 | ||||
-rw-r--r-- | fs/udf/super.c | 1 | ||||
-rw-r--r-- | fs/udf/udfdecl.h | 1 |
3 files changed, 6 insertions, 26 deletions
diff --git a/fs/udf/inode.c b/fs/udf/inode.c index a77b41ad72b121..0506e117378450 100644 --- a/fs/udf/inode.c +++ b/fs/udf/inode.c @@ -70,30 +70,6 @@ static void udf_update_extents(struct inode *, static int udf_get_block(struct inode *, sector_t, struct buffer_head *, int); /* - * udf_put_inode - * - * PURPOSE - * - * DESCRIPTION - * This routine is called whenever the kernel no longer needs the inode. - * - * HISTORY - * July 1, 1997 - Andrew E. Mileski - * Written, tested, and released. - * - * Called at each iput() - */ -void udf_put_inode(struct inode * inode) -{ - if (!(inode->i_sb->s_flags & MS_RDONLY)) - { - lock_kernel(); - udf_discard_prealloc(inode); - unlock_kernel(); - } -} - -/* * udf_delete_inode * * PURPOSE @@ -129,6 +105,12 @@ no_delete: void udf_clear_inode(struct inode *inode) { + if (!(inode->i_sb->s_flags & MS_RDONLY)) { + lock_kernel(); + udf_discard_prealloc(inode); + unlock_kernel(); + } + kfree(UDF_I_DATA(inode)); UDF_I_DATA(inode) = NULL; } diff --git a/fs/udf/super.c b/fs/udf/super.c index 2681bca58cc710..e2fdb47ce82e1e 100644 --- a/fs/udf/super.c +++ b/fs/udf/super.c @@ -163,7 +163,6 @@ static struct super_operations udf_sb_ops = { .alloc_inode = udf_alloc_inode, .destroy_inode = udf_destroy_inode, .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, diff --git a/fs/udf/udfdecl.h b/fs/udf/udfdecl.h index 87a9331bafbf8f..1d5800e0cbe7a7 100644 --- a/fs/udf/udfdecl.h +++ b/fs/udf/udfdecl.h @@ -96,7 +96,6 @@ extern struct buffer_head * udf_expand_dir_adinicb(struct inode *, int *, int *) extern struct buffer_head * udf_bread(struct inode *, int, int, int *); extern void udf_truncate(struct inode *); 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 int udf_write_inode(struct inode *, int); |