From: Wang Lei <wang840925@xxxxxxxxx> Handle pathless pioctls aimed at the AFS client in general, rather than at specific files, volumes or cells. We also check pathed ioctls for command matches to pathless pioctls. Signed-off-by: Wang Lei <wang840925@xxxxxxxxx> Signed-off-by: David Howells <dhowells@xxxxxxxxxx> --- fs/afs/internal.h | 3 +++ fs/afs/pioctl.c | 28 ++++++++++++++++++++++++++-- fs/afs/super.c | 17 +++++++++++++++++ 3 files changed, 46 insertions(+), 2 deletions(-) diff --git a/fs/afs/internal.h b/fs/afs/internal.h index 0aaa324..9a8e8a2 100644 --- a/fs/afs/internal.h +++ b/fs/afs/internal.h @@ -13,6 +13,7 @@ #include <linux/kernel.h> #include <linux/fs.h> #include <linux/pagemap.h> +#include <linux/pioctl.h> #include <linux/skbuff.h> #include <linux/rxrpc.h> #include <linux/key.h> @@ -588,6 +589,8 @@ extern void afs_mntpt_kill_timer(void); */ extern long afs_pioctl(struct dentry *, int, struct vice_ioctl *); +extern long afs_pathless_pioctl(int, struct vice_ioctl *); + /* * proc.c */ diff --git a/fs/afs/pioctl.c b/fs/afs/pioctl.c index 63a6211..63d2fe1 100644 --- a/fs/afs/pioctl.c +++ b/fs/afs/pioctl.c @@ -33,8 +33,8 @@ long afs_pioctl(struct dentry *dentry, int cmd, struct vice_ioctl *arg) switch (cmd) { default: - printk(KERN_DEBUG "AFS: Unsupported pioctl command %x\n", cmd); - ret = -EOPNOTSUPP; + _debug("fallback to pathless: %x", cmd); + ret = afs_pathless_pioctl(cmd, arg); break; } @@ -42,3 +42,27 @@ long afs_pioctl(struct dentry *dentry, int cmd, struct vice_ioctl *arg) _leave(" = %ld", ret); return ret; } + +/* + * The AFS pathless pioctl handler + */ +long afs_pathless_pioctl(int cmd, struct vice_ioctl *arg) +{ + long ret; + + _enter(",%x(%d),{%d,%d}", + cmd, _IOC_NR(cmd), arg->in_size, arg->out_size); + +#define VIOC_COMMAND(nr) (_VICEIOCTL(nr) & ~IOCSIZE_MASK) + + switch (cmd & ~IOCSIZE_MASK) { + default: + printk(KERN_DEBUG + "AFS: Unsupported pioctl command %x\n", cmd); + ret = -EOPNOTSUPP; + break; + } + + _leave(" = %ld", ret); + return ret; +} diff --git a/fs/afs/super.c b/fs/afs/super.c index ad0514d..62a43ea 100644 --- a/fs/afs/super.c +++ b/fs/afs/super.c @@ -71,6 +71,11 @@ static const match_table_t afs_options_list = { { afs_no_opt, NULL }, }; +struct pathless_pioctl_handler afs_pathless_pioctl_handler = { + .owner = THIS_MODULE, + .pioctl = afs_pathless_pioctl, +}; + /* * initialise the filesystem */ @@ -94,9 +99,20 @@ int __init afs_fs_init(void) return ret; } + /* register our pathless pioctl handler to pathless pioctl list */ + ret = pathless_pioctl_register(&afs_pathless_pioctl_handler); + if (ret < 0) { + printk(KERN_NOTICE + "kAFS: Failed to register pathless pioctl handler\n"); + kmem_cache_destroy(afs_inode_cachep); + _leave(" = %d", ret); + return ret; + } + /* now export our filesystem to lesser mortals */ ret = register_filesystem(&afs_fs_type); if (ret < 0) { + pathless_pioctl_unregister(&afs_pathless_pioctl_handler); kmem_cache_destroy(afs_inode_cachep); _leave(" = %d", ret); return ret; @@ -114,6 +130,7 @@ void __exit afs_fs_exit(void) _enter(""); afs_mntpt_kill_timer(); + pathless_pioctl_unregister(&afs_pathless_pioctl_handler); unregister_filesystem(&afs_fs_type); if (atomic_read(&afs_count_active_inodes) != 0) { -- To unsubscribe from this list: send the line "unsubscribe linux-fsdevel" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html