Re: [v2 4/4] CIFS: Migrate to shared superblock model

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



2011/5/25 Jeff Layton <jlayton@xxxxxxxxxx>:
> On Wed, 25 May 2011 23:10:33 +0400
> Pavel Shilovsky <piastry@xxxxxxxxxxx> wrote:
>
>> 2011/5/24 Jeff Layton <jlayton@xxxxxxxxxx>:
>> > On Thu,  5 May 2011 13:55:14 +0400
>> > Pavel Shilovsky <piastry@xxxxxxxxxxx> wrote:
>> >
>> >> Add cifs_match_super to use in sget to share superblock between mounts
>> >> that have the same //server/sharename, credentials and mount options.
>> >> It helps us to improve performance on work with future SMB2.1 leases.
>> >>
>> >> Signed-off-by: Pavel Shilovsky <piastry@xxxxxxxxxxx>
>> >> ---
>> >>  fs/cifs/cifsfs.c   |   18 ++++++++++-
>> >>  fs/cifs/cifsglob.h |    5 +++
>> >>  fs/cifs/connect.c  |   90 ++++++++++++++++++++++++++++++++++++++++++++++++++++
>> >>  3 files changed, 112 insertions(+), 1 deletions(-)
>> >>
>> >> diff --git a/fs/cifs/cifsfs.c b/fs/cifs/cifsfs.c
>> >> index 446b5c2..ba0b7ae 100644
>> >> --- a/fs/cifs/cifsfs.c
>> >> +++ b/fs/cifs/cifsfs.c
>> >> @@ -644,6 +644,7 @@ cifs_do_mount(struct file_system_type *fs_type,
>> >>       struct super_block *sb;
>> >>       struct cifs_sb_info *cifs_sb;
>> >>       struct smb_vol *volume_info;
>> >> +     struct cifs_mnt_data mnt_data;
>> >>       struct dentry *root;
>> >>       char *copied_data = NULL;
>> >>
>> >> @@ -661,13 +662,21 @@ cifs_do_mount(struct file_system_type *fs_type,
>> >>
>> >>       cifs_setup_cifs_sb(volume_info, cifs_sb);
>> >>
>> >> -     sb = sget(fs_type, NULL, set_anon_super, NULL);
>> >> +     mnt_data.vol = volume_info;
>> >> +     mnt_data.cifs_sb = cifs_sb;
>> >> +
>> >> +     sb = sget(fs_type, cifs_match_super, set_anon_super, &mnt_data);
>> >>       if (IS_ERR(sb)) {
>> >>               kfree(cifs_sb);
>> >>               root = ERR_CAST(sb);
>> >>               goto out;
>> >>       }
>> >>
>> >> +     if (sb->s_fs_info) {
>> >> +             cFYI(1, "Use existing superblock");
>> >> +             goto out_shared;
>> >> +     }
>> >> +
>> >>       sb->s_flags = flags;
>> >>
>> >>       /*
>> >> @@ -700,6 +709,13 @@ out:
>> >>       cifs_cleanup_volume_info(&volume_info);
>> >>       return root;
>> >>
>> >> +out_shared:
>> >> +     root = cifs_get_root(volume_info, sb);
>> >> +     if (root)
>> >> +             cFYI(1, "dentry root is: %p", root);
>> >> +     cifs_cleanup_volume_info(&volume_info);
>> >> +     return root;
>> >> +
>> >>  err_out:
>> >>       kfree(cifs_sb);
>> >>       deactivate_locked_super(sb);
>> >> diff --git a/fs/cifs/cifsglob.h b/fs/cifs/cifsglob.h
>> >> index 7ad7d69..55901b0 100644
>> >> --- a/fs/cifs/cifsglob.h
>> >> +++ b/fs/cifs/cifsglob.h
>> >> @@ -211,6 +211,11 @@ struct smb_vol {
>> >>       struct nls_table *local_nls;
>> >>  };
>> >>
>> >> +struct cifs_mnt_data {
>> >> +     struct cifs_sb_info *cifs_sb;
>> >> +     struct smb_vol *vol;
>> >> +};
>> >> +
>> >>  struct TCP_Server_Info {
>> >>       struct list_head tcp_ses_list;
>> >>       struct list_head smb_ses_list;
>> >> diff --git a/fs/cifs/connect.c b/fs/cifs/connect.c
>> >> index 1cacfaa..1d39dcf 100644
>> >> --- a/fs/cifs/connect.c
>> >> +++ b/fs/cifs/connect.c
>> >> @@ -2135,6 +2135,96 @@ cifs_put_tlink(struct tcon_link *tlink)
>> >>       return;
>> >>  }
>> >>
>> >> +static inline struct tcon_link *
>> >> +cifs_sb_master_tlink(struct cifs_sb_info *cifs_sb);
>> >> +
>> >> +static const u32 ACTUAL_MOUNT_FLAGS = CIFS_MOUNT_NO_PERM | CIFS_MOUNT_SET_UID |
>> >> +     CIFS_MOUNT_SERVER_INUM | CIFS_MOUNT_DIRECT_IO | CIFS_MOUNT_NO_XATTR |
>> >> +     CIFS_MOUNT_MAP_SPECIAL_CHR | CIFS_MOUNT_UNX_EMUL | CIFS_MOUNT_NO_BRL |
>> >> +     CIFS_MOUNT_CIFS_ACL | CIFS_MOUNT_OVERR_UID | CIFS_MOUNT_OVERR_GID |
>> >> +     CIFS_MOUNT_DYNPERM | CIFS_MOUNT_NOPOSIXBRL | CIFS_MOUNT_NOSSYNC |
>> >> +     CIFS_MOUNT_FSCACHE | CIFS_MOUNT_MF_SYMLINKS | CIFS_MOUNT_MULTIUSER |
>> >> +     CIFS_MOUNT_STRICT_IO;
>> >> +
>> >> +static int
>> >> +compare_mount_options(struct cifs_sb_info *old, struct cifs_sb_info *new)
>> >> +{
>> >> +     if ((old->mnt_cifs_flags & ACTUAL_MOUNT_FLAGS) !=
>> >> +         (new->mnt_cifs_flags & ACTUAL_MOUNT_FLAGS))
>> >> +             return 0;
>> >> +
>> >> +     if (old->rsize != new->rsize || old->wsize != new->wsize)
>> >> +             return 0;
>> >> +
>> >                ^^^^^^^^^^
>> > The rsize and wsize are negotiated -- you can't know what this is until
>> > you talk to the server. Doesn't this check always fail?
>>
>> If we don't specify wsize and rsize they are set to default values
>> (16384 and 57344) in both mounts, this check succeed.
>>
>
> Ahh then this will likely be broken if/when the wsize negotiation patch
> goes in. I suppose we'll have to see which patch (if any) Steve decides
> to commit first and then try to fix this up afterward.
>
> The brokenness shouldn't be too bad, you just won't be able to actually
> share superblocks until it's fixed.
>
> --
> Jeff Layton <jlayton@xxxxxxxxxx>
>

Updated patch 4/4 with wsize changes and posted to the list.

-- 
Best regards,
Pavel Shilovsky.
--
To unsubscribe from this list: send the line "unsubscribe linux-cifs" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux