Skip to content

Commit 0965549

Browse files
committed
Merge tag 'vfs-6.17-rc1.super' of git://git.kernel.org/pub/scm/linux/kernel/git/vfs/vfs
Pull superblock callback update from Christian Brauner: "Currently all filesystems which implement super_operations::shutdown() can not afford losing a device. Thus fs_bdev_mark_dead() will just call the ->shutdown() callback for the involved filesystem. But it will no longer be the case, as multi-device filesystems like btrfs can handle certain device loss without the need to shutdown the whole filesystem. To allow those multi-device filesystems to be integrated to use fs_holder_ops: - Add a new super_operations::remove_bdev() callback - Try ->remove_bdev() callback first inside fs_bdev_mark_dead(). If the callback returned 0, meaning the fs can handling the device loss, then exit without doing anything else. If there is no such callback or the callback returned non-zero value, continue to shutdown the filesystem as usual. This means the new remove_bdev() should only do the check on whether the operation can continue, and if so do the fs specific handlings. The shutdown handling should still be handled by the existing ->shutdown() callback. For all existing filesystems with shutdown callback, there is no change to the code nor behavior. Btrfs is going to implement both the ->remove_bdev() and ->shutdown() callbacks soon" * tag 'vfs-6.17-rc1.super' of git://git.kernel.org/pub/scm/linux/kernel/git/vfs/vfs: fs: add a new remove_bdev() callback
2 parents 57fcb7d + d9c37a4 commit 0965549

File tree

2 files changed

+20
-0
lines changed

2 files changed

+20
-0
lines changed

fs/super.c

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1459,6 +1459,17 @@ static void fs_bdev_mark_dead(struct block_device *bdev, bool surprise)
14591459
if (!sb)
14601460
return;
14611461

1462+
if (sb->s_op->remove_bdev) {
1463+
int ret;
1464+
1465+
ret = sb->s_op->remove_bdev(sb, bdev);
1466+
if (!ret) {
1467+
super_unlock_shared(sb);
1468+
return;
1469+
}
1470+
/* Fallback to shutdown. */
1471+
}
1472+
14621473
if (!surprise)
14631474
sync_filesystem(sb);
14641475
shrink_dcache_sb(sb);

include/linux/fs.h

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2367,6 +2367,15 @@ struct super_operations {
23672367
struct shrink_control *);
23682368
long (*free_cached_objects)(struct super_block *,
23692369
struct shrink_control *);
2370+
/*
2371+
* If a filesystem can support graceful removal of a device and
2372+
* continue read-write operations, implement this callback.
2373+
*
2374+
* Return 0 if the filesystem can continue read-write.
2375+
* Non-zero return value or no such callback means the fs will be shutdown
2376+
* as usual.
2377+
*/
2378+
int (*remove_bdev)(struct super_block *sb, struct block_device *bdev);
23702379
void (*shutdown)(struct super_block *sb);
23712380
};
23722381

0 commit comments

Comments
 (0)