Message ID | 20220605225426.8558-1-pc@cjr.nz (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | cifs: fix reconnect on smb3 mount types | expand |
added cc:stable and tested-by and put updated patch in cifs-2.6.git for-next On Sun, Jun 5, 2022 at 5:54 PM Paulo Alcantara <pc@cjr.nz> wrote: > > cifs.ko defines two file system types: cifs & smb3, and > __cifs_get_super() was not including smb3 file system type when > looking up superblocks, therefore failing to reconnect tcons in > cifs_tree_connect(). > > Fix this by calling iterate_supers_type() on both file system types. > > Link: https://lore.kernel.org/r/CAFrh3J9soC36+BVuwHB=g9z_KB5Og2+p2_W+BBoBOZveErz14w@mail.gmail.com > Reported-by: Satadru Pramanik <satadru@gmail.com> > Signed-off-by: Paulo Alcantara (SUSE) <pc@cjr.nz> > --- > fs/cifs/cifsfs.c | 2 +- > fs/cifs/cifsfs.h | 2 +- > fs/cifs/misc.c | 27 ++++++++++++++++----------- > 3 files changed, 18 insertions(+), 13 deletions(-) > > diff --git a/fs/cifs/cifsfs.c b/fs/cifs/cifsfs.c > index 12c872800326..325423180fd2 100644 > --- a/fs/cifs/cifsfs.c > +++ b/fs/cifs/cifsfs.c > @@ -1086,7 +1086,7 @@ struct file_system_type cifs_fs_type = { > }; > MODULE_ALIAS_FS("cifs"); > > -static struct file_system_type smb3_fs_type = { > +struct file_system_type smb3_fs_type = { > .owner = THIS_MODULE, > .name = "smb3", > .init_fs_context = smb3_init_fs_context, > diff --git a/fs/cifs/cifsfs.h b/fs/cifs/cifsfs.h > index dd7e070ca243..b17be47a8e59 100644 > --- a/fs/cifs/cifsfs.h > +++ b/fs/cifs/cifsfs.h > @@ -38,7 +38,7 @@ static inline unsigned long cifs_get_time(struct dentry *dentry) > return (unsigned long) dentry->d_fsdata; > } > > -extern struct file_system_type cifs_fs_type; > +extern struct file_system_type cifs_fs_type, smb3_fs_type; > extern const struct address_space_operations cifs_addr_ops; > extern const struct address_space_operations cifs_addr_ops_smallbuf; > > diff --git a/fs/cifs/misc.c b/fs/cifs/misc.c > index 35962a1a23b9..8e67a2d406ab 100644 > --- a/fs/cifs/misc.c > +++ b/fs/cifs/misc.c > @@ -1211,18 +1211,23 @@ static struct super_block *__cifs_get_super(void (*f)(struct super_block *, void > .data = data, > .sb = NULL, > }; > + struct file_system_type **fs_type = (struct file_system_type *[]) { > + &cifs_fs_type, &smb3_fs_type, NULL, > + }; > > - iterate_supers_type(&cifs_fs_type, f, &sd); > - > - if (!sd.sb) > - return ERR_PTR(-EINVAL); > - /* > - * Grab an active reference in order to prevent automounts (DFS links) > - * of expiring and then freeing up our cifs superblock pointer while > - * we're doing failover. > - */ > - cifs_sb_active(sd.sb); > - return sd.sb; > + for (; *fs_type; fs_type++) { > + iterate_supers_type(*fs_type, f, &sd); > + if (sd.sb) { > + /* > + * Grab an active reference in order to prevent automounts (DFS links) > + * of expiring and then freeing up our cifs superblock pointer while > + * we're doing failover. > + */ > + cifs_sb_active(sd.sb); > + return sd.sb; > + } > + } > + return ERR_PTR(-EINVAL); > } > > static void __cifs_put_super(struct super_block *sb) > -- > 2.36.1 >
diff --git a/fs/cifs/cifsfs.c b/fs/cifs/cifsfs.c index 12c872800326..325423180fd2 100644 --- a/fs/cifs/cifsfs.c +++ b/fs/cifs/cifsfs.c @@ -1086,7 +1086,7 @@ struct file_system_type cifs_fs_type = { }; MODULE_ALIAS_FS("cifs"); -static struct file_system_type smb3_fs_type = { +struct file_system_type smb3_fs_type = { .owner = THIS_MODULE, .name = "smb3", .init_fs_context = smb3_init_fs_context, diff --git a/fs/cifs/cifsfs.h b/fs/cifs/cifsfs.h index dd7e070ca243..b17be47a8e59 100644 --- a/fs/cifs/cifsfs.h +++ b/fs/cifs/cifsfs.h @@ -38,7 +38,7 @@ static inline unsigned long cifs_get_time(struct dentry *dentry) return (unsigned long) dentry->d_fsdata; } -extern struct file_system_type cifs_fs_type; +extern struct file_system_type cifs_fs_type, smb3_fs_type; extern const struct address_space_operations cifs_addr_ops; extern const struct address_space_operations cifs_addr_ops_smallbuf; diff --git a/fs/cifs/misc.c b/fs/cifs/misc.c index 35962a1a23b9..8e67a2d406ab 100644 --- a/fs/cifs/misc.c +++ b/fs/cifs/misc.c @@ -1211,18 +1211,23 @@ static struct super_block *__cifs_get_super(void (*f)(struct super_block *, void .data = data, .sb = NULL, }; + struct file_system_type **fs_type = (struct file_system_type *[]) { + &cifs_fs_type, &smb3_fs_type, NULL, + }; - iterate_supers_type(&cifs_fs_type, f, &sd); - - if (!sd.sb) - return ERR_PTR(-EINVAL); - /* - * Grab an active reference in order to prevent automounts (DFS links) - * of expiring and then freeing up our cifs superblock pointer while - * we're doing failover. - */ - cifs_sb_active(sd.sb); - return sd.sb; + for (; *fs_type; fs_type++) { + iterate_supers_type(*fs_type, f, &sd); + if (sd.sb) { + /* + * Grab an active reference in order to prevent automounts (DFS links) + * of expiring and then freeing up our cifs superblock pointer while + * we're doing failover. + */ + cifs_sb_active(sd.sb); + return sd.sb; + } + } + return ERR_PTR(-EINVAL); } static void __cifs_put_super(struct super_block *sb)
cifs.ko defines two file system types: cifs & smb3, and __cifs_get_super() was not including smb3 file system type when looking up superblocks, therefore failing to reconnect tcons in cifs_tree_connect(). Fix this by calling iterate_supers_type() on both file system types. Link: https://lore.kernel.org/r/CAFrh3J9soC36+BVuwHB=g9z_KB5Og2+p2_W+BBoBOZveErz14w@mail.gmail.com Reported-by: Satadru Pramanik <satadru@gmail.com> Signed-off-by: Paulo Alcantara (SUSE) <pc@cjr.nz> --- fs/cifs/cifsfs.c | 2 +- fs/cifs/cifsfs.h | 2 +- fs/cifs/misc.c | 27 ++++++++++++++++----------- 3 files changed, 18 insertions(+), 13 deletions(-)