aboutsummaryrefslogtreecommitdiffstats
path: root/fs/udf/file.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/udf/file.c')
-rw-r--r--fs/udf/file.c29
1 files changed, 27 insertions, 2 deletions
diff --git a/fs/udf/file.c b/fs/udf/file.c
index b80cbd78833c..4b6a46ccbf46 100644
--- a/fs/udf/file.c
+++ b/fs/udf/file.c
@@ -34,6 +34,7 @@
34#include <linux/errno.h> 34#include <linux/errno.h>
35#include <linux/smp_lock.h> 35#include <linux/smp_lock.h>
36#include <linux/pagemap.h> 36#include <linux/pagemap.h>
37#include <linux/quotaops.h>
37#include <linux/buffer_head.h> 38#include <linux/buffer_head.h>
38#include <linux/aio.h> 39#include <linux/aio.h>
39 40
@@ -196,6 +197,7 @@ static int udf_release_file(struct inode *inode, struct file *filp)
196 mutex_lock(&inode->i_mutex); 197 mutex_lock(&inode->i_mutex);
197 lock_kernel(); 198 lock_kernel();
198 udf_discard_prealloc(inode); 199 udf_discard_prealloc(inode);
200 udf_truncate_tail_extent(inode);
199 unlock_kernel(); 201 unlock_kernel();
200 mutex_unlock(&inode->i_mutex); 202 mutex_unlock(&inode->i_mutex);
201 } 203 }
@@ -206,7 +208,7 @@ const struct file_operations udf_file_operations = {
206 .read = do_sync_read, 208 .read = do_sync_read,
207 .aio_read = generic_file_aio_read, 209 .aio_read = generic_file_aio_read,
208 .ioctl = udf_ioctl, 210 .ioctl = udf_ioctl,
209 .open = generic_file_open, 211 .open = dquot_file_open,
210 .mmap = generic_file_mmap, 212 .mmap = generic_file_mmap,
211 .write = do_sync_write, 213 .write = do_sync_write,
212 .aio_write = udf_file_aio_write, 214 .aio_write = udf_file_aio_write,
@@ -216,6 +218,29 @@ const struct file_operations udf_file_operations = {
216 .llseek = generic_file_llseek, 218 .llseek = generic_file_llseek,
217}; 219};
218 220
221int udf_setattr(struct dentry *dentry, struct iattr *iattr)
222{
223 struct inode *inode = dentry->d_inode;
224 int error;
225
226 error = inode_change_ok(inode, iattr);
227 if (error)
228 return error;
229
230 if (iattr->ia_valid & ATTR_SIZE)
231 dquot_initialize(inode);
232
233 if ((iattr->ia_valid & ATTR_UID && iattr->ia_uid != inode->i_uid) ||
234 (iattr->ia_valid & ATTR_GID && iattr->ia_gid != inode->i_gid)) {
235 error = dquot_transfer(inode, iattr);
236 if (error)
237 return error;
238 }
239
240 return inode_setattr(inode, iattr);
241}
242
219const struct inode_operations udf_file_inode_operations = { 243const struct inode_operations udf_file_inode_operations = {
220 .truncate = udf_truncate, 244 .truncate = udf_truncate,
245 .setattr = udf_setattr,
221}; 246};