diff -rup linux-5.11.3-orig/fs/afs/dir.c linux-5.11.3/fs/afs/dir.c --- linux-5.11.3-orig/fs/afs/dir.c 2021-03-04 12:15:45.000000000 +0100 +++ linux-5.11.3/fs/afs/dir.c 2021-03-07 11:40:00.988061983 +0100 @@ -72,6 +72,21 @@ const struct inode_operations afs_dir_in .listxattr = afs_listxattr, }; +const struct inode_operations yfs_dir_inode_operations = { + .create = afs_create, + .lookup = afs_lookup, + .link = afs_link, + .unlink = afs_unlink, + .symlink = afs_symlink, + .mkdir = afs_mkdir, + .rmdir = afs_rmdir, + .rename = afs_rename, + .permission = afs_permission, + .getattr = afs_getattr, + .setattr = afs_setattr, + .listxattr = yfs_listxattr, +}; + const struct address_space_operations afs_dir_aops = { .set_page_dirty = afs_dir_set_page_dirty, .releasepage = afs_dir_releasepage, diff -rup linux-5.11.3-orig/fs/afs/file.c linux-5.11.3/fs/afs/file.c --- linux-5.11.3-orig/fs/afs/file.c 2021-03-04 12:15:45.000000000 +0100 +++ linux-5.11.3/fs/afs/file.c 2021-03-07 11:42:18.467628838 +0100 @@ -46,6 +46,13 @@ const struct inode_operations afs_file_i .listxattr = afs_listxattr, }; +const struct inode_operations yfs_file_inode_operations = { + .getattr = afs_getattr, + .setattr = afs_setattr, + .permission = afs_permission, + .listxattr = yfs_listxattr, +}; + const struct address_space_operations afs_fs_aops = { .readpage = afs_readpage, .readpages = afs_readpages, diff -rup linux-5.11.3-orig/fs/afs/inode.c linux-5.11.3/fs/afs/inode.c --- linux-5.11.3-orig/fs/afs/inode.c 2021-03-04 12:15:45.000000000 +0100 +++ linux-5.11.3/fs/afs/inode.c 2021-03-07 14:26:47.490041385 +0100 @@ -30,6 +30,11 @@ static const struct inode_operations afs .listxattr = afs_listxattr, }; +static const struct inode_operations yfs_symlink_inode_operations = { + .get_link = page_get_link, + .listxattr = yfs_listxattr, +}; + static noinline void dump_vnode(struct afs_vnode *vnode, struct afs_vnode *parent_vnode) { static unsigned long once_only; @@ -104,13 +109,19 @@ static int afs_inode_init_from_status(st switch (status->type) { case AFS_FTYPE_FILE: inode->i_mode = S_IFREG | status->mode; - inode->i_op = &afs_file_inode_operations; + if (test_bit(AFS_SERVER_FL_IS_YFS, &op->server->flags)) + inode->i_op = &yfs_file_inode_operations; + else + inode->i_op = &afs_file_inode_operations; inode->i_fop = &afs_file_operations; inode->i_mapping->a_ops = &afs_fs_aops; break; case AFS_FTYPE_DIR: inode->i_mode = S_IFDIR | status->mode; - inode->i_op = &afs_dir_inode_operations; + if (test_bit(AFS_SERVER_FL_IS_YFS, &op->server->flags)) + inode->i_op = &yfs_dir_inode_operations; + else + inode->i_op = &afs_dir_inode_operations; inode->i_fop = &afs_dir_file_operations; inode->i_mapping->a_ops = &afs_dir_aops; break; @@ -122,12 +133,18 @@ static int afs_inode_init_from_status(st set_bit(AFS_VNODE_MOUNTPOINT, &vnode->flags); inode->i_mode = S_IFDIR | 0555; - inode->i_op = &afs_mntpt_inode_operations; + if (test_bit(AFS_SERVER_FL_IS_YFS, &op->server->flags)) + inode->i_op = &yfs_mntpt_inode_operations; + else + inode->i_op = &afs_mntpt_inode_operations; inode->i_fop = &afs_mntpt_file_operations; inode->i_mapping->a_ops = &afs_fs_aops; } else { inode->i_mode = S_IFLNK | status->mode; - inode->i_op = &afs_symlink_inode_operations; + if (test_bit(AFS_SERVER_FL_IS_YFS, &op->server->flags)) + inode->i_op = &yfs_symlink_inode_operations; + else + inode->i_op = &afs_symlink_inode_operations; inode->i_mapping->a_ops = &afs_fs_aops; } inode_nohighmem(inode); diff -rup linux-5.11.3-orig/fs/afs/internal.h linux-5.11.3/fs/afs/internal.h --- linux-5.11.3-orig/fs/afs/internal.h 2021-03-04 12:15:45.000000000 +0100 +++ linux-5.11.3/fs/afs/internal.h 2021-03-07 12:02:58.073762241 +0100 @@ -1002,6 +1002,7 @@ extern bool afs_cm_incoming_call(struct */ extern const struct file_operations afs_dir_file_operations; extern const struct inode_operations afs_dir_inode_operations; +extern const struct inode_operations yfs_dir_inode_operations; extern const struct address_space_operations afs_dir_aops; extern const struct dentry_operations afs_fs_dentry_operations; @@ -1039,6 +1040,7 @@ extern void afs_dynroot_depopulate(struc */ extern const struct address_space_operations afs_fs_aops; extern const struct inode_operations afs_file_inode_operations; +extern const struct inode_operations yfs_file_inode_operations; extern const struct file_operations afs_file_operations; extern int afs_cache_wb_key(struct afs_vnode *, struct afs_file *); @@ -1207,6 +1209,7 @@ extern void afs_prioritise_error(struct * mntpt.c */ extern const struct inode_operations afs_mntpt_inode_operations; +extern const struct inode_operations yfs_mntpt_inode_operations; extern const struct inode_operations afs_autocell_inode_operations; extern const struct file_operations afs_mntpt_file_operations; @@ -1509,6 +1512,7 @@ extern int afs_launder_page(struct page */ extern const struct xattr_handler *afs_xattr_handlers[]; extern ssize_t afs_listxattr(struct dentry *, char *, size_t); +extern ssize_t yfs_listxattr(struct dentry *, char *, size_t); /* * yfsclient.c diff -rup linux-5.11.3-orig/fs/afs/mntpt.c linux-5.11.3/fs/afs/mntpt.c --- linux-5.11.3-orig/fs/afs/mntpt.c 2021-03-04 12:15:45.000000000 +0100 +++ linux-5.11.3/fs/afs/mntpt.c 2021-03-07 11:47:02.850004165 +0100 @@ -35,6 +35,13 @@ const struct inode_operations afs_mntpt_ .listxattr = afs_listxattr, }; +const struct inode_operations yfs_mntpt_inode_operations = { + .lookup = afs_mntpt_lookup, + .readlink = page_readlink, + .getattr = afs_getattr, + .listxattr = yfs_listxattr, +}; + const struct inode_operations afs_autocell_inode_operations = { .getattr = afs_getattr, }; diff -rup linux-5.11.3-orig/fs/afs/xattr.c linux-5.11.3/fs/afs/xattr.c --- linux-5.11.3-orig/fs/afs/xattr.c 2021-03-07 18:29:21.655539516 +0100 +++ linux-5.11.3/fs/afs/xattr.c 2021-03-07 11:55:41.209587047 +0100 @@ -15,6 +15,12 @@ static const char afs_xattr_list[] = "afs.acl\0" "afs.cell\0" "afs.fid\0" + "afs.volume"; + +static const char yfs_xattr_list[] = + "afs.acl\0" + "afs.cell\0" + "afs.fid\0" "afs.volume\0" "afs.yfs.acl\0" "afs.yfs.acl_inherited\0" @@ -22,7 +28,7 @@ static const char afs_xattr_list[] = "afs.yfs.vol_acl"; /* - * Retrieve a list of the supported xattrs. + * Retrieve a list of the supported xattrs for afs. */ ssize_t afs_listxattr(struct dentry *dentry, char *buffer, size_t size) { @@ -35,6 +41,19 @@ ssize_t afs_listxattr(struct dentry *den } /* + * Retrieve a list of the supported xattrs for yfs. + */ +ssize_t yfs_listxattr(struct dentry *dentry, char *buffer, size_t size) +{ + if (size == 0) + return sizeof(yfs_xattr_list); + if (size < sizeof(yfs_xattr_list)) + return -ERANGE; + memcpy(buffer, yfs_xattr_list, sizeof(yfs_xattr_list)); + return sizeof(yfs_xattr_list); +} + +/* * Deal with the result of a successful fetch ACL operation. */ static void afs_acl_success(struct afs_operation *op)