]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
afs: Fix reinitialisation of the inode, in particular ->lock_work
authorDavid Howells <dhowells@redhat.com>
Mon, 22 Jun 2026 09:08:46 +0000 (10:08 +0100)
committerChristian Brauner <brauner@kernel.org>
Wed, 1 Jul 2026 13:26:20 +0000 (15:26 +0200)
It seems that initalising afs_vnode::lock_work a single time in the slab's
init function isn't sufficient for work_structs.  This results in the
DEBUG_OBJECTS debugging stuff producing a warning occasionally when running
the generic/131 xfstest:

 ODEBUG: activate not available (active state 0) object: 0000000016d8760f object type: work_struct hint: afs_lock_work+0x0/0x220
 WARNING: lib/debugobjects.c:629 at debug_print_object+0x4b/0x90, CPU#3: locktest/7695
 ...
 CPU: 3 UID: 0 PID: 7695 Comm: locktest Tainted: G S                  7.1.0-build3+ #2771 PREEMPT
 ...
 RIP: 0010:debug_print_object+0x65/0x90
 ...
 Call Trace:
  <TASK>
  ? __pfx_afs_lock_work+0x10/0x10
  debug_object_activate+0x122/0x170
  insert_work+0x25/0x60
  __queue_work+0x2e0/0x340
  queue_delayed_work_on+0x48/0x70
  afs_fl_release_private+0x57/0x70
  locks_release_private+0x5c/0xa0
  locks_free_lock+0xe/0x20
  posix_lock_inode+0x55f/0x5b0
  locks_lock_inode_wait+0x81/0x140
  ? file_write_and_wait_range+0x50/0x70
  afs_lock+0xcd/0x110
  fcntl_setlk+0x10d/0x260
  do_fcntl+0x24e/0x5b0
  __do_sys_fcntl+0x6a/0x90
  do_syscall_64+0x11e/0x310
  entry_SYSCALL_64_after_hwframe+0x71/0x79

Fix this by reinitialising ->lock_work after allocating an inode.

Also, flush ->lock_work when the inode is being evicted to make sure it's
not still running.

Fixes: e8d6c554126b ("AFS: implement file locking")
Signed-off-by: David Howells <dhowells@redhat.com>
Link: https://patch.msgid.link/20260622090856.2746629-13-dhowells@redhat.com
cc: Marc Dionne <marc.dionne@auristor.com>
cc: Thomas Gleixner <tglx@kernel.org>
cc: linux-afs@lists.infradead.org
Signed-off-by: Christian Brauner (Amutable) <brauner@kernel.org>
fs/afs/inode.c
fs/afs/super.c

index 51c28f14884549b468244f5446bf7a8e488d81e0..14f39a9bea6cfefd6f7da3c35fbbdaed7b350e7c 100644 (file)
@@ -680,6 +680,7 @@ void afs_evict_inode(struct inode *inode)
                inode->i_mapping->a_ops->writepages(inode->i_mapping, &wbc);
        }
 
+       flush_delayed_work(&vnode->lock_work);
        netfs_wait_for_outstanding_io(inode);
        truncate_inode_pages_final(&inode->i_data);
        netfs_free_folioq_buffer(vnode->directory);
index dec091e569c420721ca0071f7abd15f961ee4352..82bb713825a0d5e1e3ffd34c5bce80a4fdd15bf0 100644 (file)
@@ -660,7 +660,6 @@ static void afs_i_init_once(void *_vnode)
        INIT_LIST_HEAD(&vnode->wb_keys);
        INIT_LIST_HEAD(&vnode->pending_locks);
        INIT_LIST_HEAD(&vnode->granted_locks);
-       INIT_DELAYED_WORK(&vnode->lock_work, afs_lock_work);
        INIT_LIST_HEAD(&vnode->cb_mmap_link);
        seqlock_init(&vnode->cb_lock);
 }
@@ -694,6 +693,7 @@ static struct inode *afs_alloc_inode(struct super_block *sb)
 
        init_rwsem(&vnode->rmdir_lock);
        INIT_WORK(&vnode->cb_work, afs_invalidate_mmap_work);
+       INIT_DELAYED_WORK(&vnode->lock_work, afs_lock_work);
 
        _leave(" = %p", &vnode->netfs.inode);
        return &vnode->netfs.inode;