For isofs ino_t needn't be enough to identify an inode on 32-bit platforms. Implement isofs variant of fsnotify inode mark connector so that we can reliably match the connector to the inode. Signed-off-by: Jan Kara --- fs/isofs/inode.c | 41 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/fs/isofs/inode.c b/fs/isofs/inode.c index 6f0e6b19383c..73ae9adf4161 100644 --- a/fs/isofs/inode.c +++ b/fs/isofs/inode.c @@ -27,6 +27,7 @@ #include #include #include +#include #include "isofs.h" #include "zisofs.h" @@ -288,6 +289,45 @@ isofs_dentry_cmpi_ms(const struct dentry *dentry, } #endif +/* Structure for connecting fsnotify marks to isofs inodes */ +struct isofs_inode_fsnotify_connector { + struct fsnotify_mark_connector common; + struct rhash_head hash_list; + u32 block; + u32 offset; +}; + +static struct fsnotify_mark_connector *isofs_alloc_inode_connector( + struct inode *inode) +{ + struct isofs_inode_fsnotify_connector *iconn; + struct iso_inode_info *ei = ISOFS_I(inode); + + iconn = kmalloc(sizeof(*iconn), GFP_KERNEL); + if (!iconn) + return NULL; + + iconn->block = ei->i_iget5_block; + iconn->offset = ei->i_iget5_offset; + if (fsnotify_init_inode_connector(&iconn->common, inode)) { + kfree(iconn); + return NULL; + } + + return &iconn->common; +} + +static const struct rhashtable_params isofs_inode_conn_hash_params = { + .key_len = 8, + .key_offset = offsetof(struct isofs_inode_fsnotify_connector, block), + .head_offset = offsetof(struct isofs_inode_fsnotify_connector, hash_list), +}; + +static const struct fsnotify_sb_operations isofs_fsnotify_ops = { + .alloc_inode_connector = isofs_alloc_inode_connector, + .inode_conn_hash_params = isofs_inode_conn_hash_params, +}; + enum { Opt_block, Opt_check, Opt_cruft, Opt_gid, Opt_ignore, Opt_iocharset, Opt_map, Opt_mode, Opt_nojoliet, Opt_norock, Opt_sb, Opt_session, @@ -830,6 +870,7 @@ static int isofs_fill_super(struct super_block *s, struct fs_context *fc) #endif s->s_op = &isofs_sops; s->s_export_op = &isofs_export_ops; + s->s_fsnotify_op = &isofs_fsnotify_ops; sbi->s_mapping = opt->map; sbi->s_rock = (opt->rock ? 2 : 0); sbi->s_rock_offset = -1; /* initial offset, will guess until SP is found*/ -- 2.51.0