X-Git-Url: https://err.no/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=fs%2Fext2%2Ffile.c;h=c051798459a1c9faf33fa9b1c89508145c646c00;hb=852e1f2a2627274102a3c2dc70a6547aeab99cb6;hp=04afeecaaef31acde466b50f48ea6057ac3f98a9;hpb=64b853aa328f34dd58e4e617cded91e2ddbcac13;p=linux-2.6 diff --git a/fs/ext2/file.c b/fs/ext2/file.c index 04afeecaae..c051798459 100644 --- a/fs/ext2/file.c +++ b/fs/ext2/file.c @@ -24,14 +24,17 @@ #include "acl.h" /* - * Called when an inode is released. Note that this is different - * from ext2_open_file: open gets called at every open, but release - * gets called only when /all/ the files are closed. + * Called when filp is released. This happens when all file descriptors + * for a single struct file are closed. Note that different open() calls + * for the same file yield different struct file structures. */ static int ext2_release_file (struct inode * inode, struct file * filp) { - if (filp->f_mode & FMODE_WRITE) - ext2_discard_prealloc (inode); + if (filp->f_mode & FMODE_WRITE) { + mutex_lock(&EXT2_I(inode)->truncate_mutex); + ext2_discard_reservation(inode); + mutex_unlock(&EXT2_I(inode)->truncate_mutex); + } return 0; }