summaryrefslogtreecommitdiffstats
path: root/fs/afs/inode.c
diff options
context:
space:
mode:
authorDavid Howells2018-01-02 11:02:19 +0100
committerDavid Howells2018-01-02 11:02:19 +0100
commit440fbc3a8a694467ba641234cedb96c28ab2d5fb (patch)
tree51975eb82d8cb8c4cb53755eb2a7740a0be48433 /fs/afs/inode.c
parentafs: Potential uninitialized variable in afs_extract_data() (diff)
downloadkernel-qcow2-linux-440fbc3a8a694467ba641234cedb96c28ab2d5fb.tar.gz
kernel-qcow2-linux-440fbc3a8a694467ba641234cedb96c28ab2d5fb.tar.xz
kernel-qcow2-linux-440fbc3a8a694467ba641234cedb96c28ab2d5fb.zip
afs: Fix unlink
Repeating creation and deletion of a file on an afs mount will run the box out of memory, e.g.: dd if=/dev/zero of=/afs/scratch/m0 bs=$((1024*1024)) count=512 rm /afs/scratch/m0 The problem seems to be that it's not properly decrementing the nlink count so that the inode can be scrapped. Note that this doesn't fix local creation followed by remote deletion. That's harder to handle and will require a separate patch as we're not told that the file has been deleted - only that the directory has changed. Reported-by: Marc Dionne <marc.dionne@auristor.com> Signed-off-by: David Howells <dhowells@redhat.com>
Diffstat (limited to 'fs/afs/inode.c')
-rw-r--r--fs/afs/inode.c4
1 files changed, 4 insertions, 0 deletions
diff --git a/fs/afs/inode.c b/fs/afs/inode.c
index 3415eb7484f6..1e81864ef0b2 100644
--- a/fs/afs/inode.c
+++ b/fs/afs/inode.c
@@ -377,6 +377,10 @@ int afs_validate(struct afs_vnode *vnode, struct key *key)
}
read_sequnlock_excl(&vnode->cb_lock);
+
+ if (test_bit(AFS_VNODE_DELETED, &vnode->flags))
+ clear_nlink(&vnode->vfs_inode);
+
if (valid)
goto valid;