|
@@ -211,6 +211,23 @@ void fput(struct file *file)
|
|
|
|
|
|
EXPORT_SYMBOL(fput);
|
|
|
|
|
|
+/**
|
|
|
+ * drop_file_write_access - give up ability to write to a file
|
|
|
+ * @file: the file to which we will stop writing
|
|
|
+ *
|
|
|
+ * This is a central place which will give up the ability
|
|
|
+ * to write to @file, along with access to write through
|
|
|
+ * its vfsmount.
|
|
|
+ */
|
|
|
+void drop_file_write_access(struct file *file)
|
|
|
+{
|
|
|
+ struct dentry *dentry = file->f_path.dentry;
|
|
|
+ struct inode *inode = dentry->d_inode;
|
|
|
+
|
|
|
+ put_write_access(inode);
|
|
|
+}
|
|
|
+EXPORT_SYMBOL_GPL(drop_file_write_access);
|
|
|
+
|
|
|
/* __fput is called from task context when aio completion releases the last
|
|
|
* last use of a struct file *. Do not use otherwise.
|
|
|
*/
|
|
@@ -236,10 +253,10 @@ void __fput(struct file *file)
|
|
|
if (unlikely(S_ISCHR(inode->i_mode) && inode->i_cdev != NULL))
|
|
|
cdev_put(inode->i_cdev);
|
|
|
fops_put(file->f_op);
|
|
|
- if (file->f_mode & FMODE_WRITE)
|
|
|
- put_write_access(inode);
|
|
|
put_pid(file->f_owner.pid);
|
|
|
file_kill(file);
|
|
|
+ if (file->f_mode & FMODE_WRITE)
|
|
|
+ drop_file_write_access(file);
|
|
|
file->f_path.dentry = NULL;
|
|
|
file->f_path.mnt = NULL;
|
|
|
file_free(file);
|