eCryptfs: Make truncate path killable
[firefly-linux-kernel-4.4.55.git] / fs / ecryptfs / read_write.c
index 3745f7c2b9c214756b778ab40a00af325c0e9e99..54eb14caad7b293cbf039cac3fe2529a5e11c1ab 100644 (file)
@@ -132,6 +132,11 @@ int ecryptfs_write(struct inode *ecryptfs_inode, char *data, loff_t offset,
                size_t num_bytes = (PAGE_CACHE_SIZE - start_offset_in_page);
                size_t total_remaining_bytes = ((offset + size) - pos);
 
+               if (fatal_signal_pending(current)) {
+                       rc = -EINTR;
+                       break;
+               }
+
                if (num_bytes > total_remaining_bytes)
                        num_bytes = total_remaining_bytes;
                if (pos < offset) {
@@ -193,15 +198,19 @@ int ecryptfs_write(struct inode *ecryptfs_inode, char *data, loff_t offset,
                }
                pos += num_bytes;
        }
-       if ((offset + size) > ecryptfs_file_size) {
-               i_size_write(ecryptfs_inode, (offset + size));
+       if (pos > ecryptfs_file_size) {
+               i_size_write(ecryptfs_inode, pos);
                if (crypt_stat->flags & ECRYPTFS_ENCRYPTED) {
-                       rc = ecryptfs_write_inode_size_to_metadata(
+                       int rc2;
+
+                       rc2 = ecryptfs_write_inode_size_to_metadata(
                                                                ecryptfs_inode);
-                       if (rc) {
+                       if (rc2) {
                                printk(KERN_ERR "Problem with "
                                       "ecryptfs_write_inode_size_to_metadata; "
-                                      "rc = [%d]\n", rc);
+                                      "rc = [%d]\n", rc2);
+                               if (!rc)
+                                       rc = rc2;
                                goto out;
                        }
                }