Message ID | 20201130180257.31787-8-scabrero@suse.de (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | Witness protocol support for transparent failover | expand |
tentatively merged into cifs-2.6.git for-next, let me know if any changes needed to be made to it. On Mon, Nov 30, 2020 at 12:05 PM Samuel Cabrero <scabrero@suse.de> wrote: > > + Indicate if witness feature is supported > + Indicate if witness is used when dumping tcons > + Dumps witness registrations. Example: > Witness registrations: > Id: 1 Refs: 1 Network name: 'fs.fover.ad'(y) Share name: 'share1'(y) \ > Ip address: 192.168.103.200(n) > > Signed-off-by: Samuel Cabrero <scabrero@suse.de> > --- > fs/cifs/cifs_debug.c | 13 +++++++++++++ > fs/cifs/cifs_swn.c | 35 +++++++++++++++++++++++++++++++++++ > fs/cifs/cifs_swn.h | 2 ++ > 3 files changed, 50 insertions(+) > > diff --git a/fs/cifs/cifs_debug.c b/fs/cifs/cifs_debug.c > index 53588d7517b4..b231dcf1d1f9 100644 > --- a/fs/cifs/cifs_debug.c > +++ b/fs/cifs/cifs_debug.c > @@ -23,6 +23,9 @@ > #ifdef CONFIG_CIFS_SMB_DIRECT > #include "smbdirect.h" > #endif > +#ifdef CONFIG_CIFS_SWN_UPCALL > +#include "cifs_swn.h" > +#endif > > void > cifs_dump_mem(char *label, void *data, int length) > @@ -115,6 +118,10 @@ static void cifs_debug_tcon(struct seq_file *m, struct cifs_tcon *tcon) > seq_printf(m, " POSIX Extensions"); > if (tcon->ses->server->ops->dump_share_caps) > tcon->ses->server->ops->dump_share_caps(m, tcon); > +#ifdef CONFIG_CIFS_SWN_UPCALL > + if (tcon->use_witness) > + seq_puts(m, " Witness"); > +#endif > > if (tcon->need_reconnect) > seq_puts(m, "\tDISCONNECTED "); > @@ -262,6 +269,9 @@ static int cifs_debug_data_proc_show(struct seq_file *m, void *v) > seq_printf(m, ",XATTR"); > #endif > seq_printf(m, ",ACL"); > +#ifdef CONFIG_CIFS_SWN_UPCALL > + seq_puts(m, ",WITNESS"); > +#endif > seq_putc(m, '\n'); > seq_printf(m, "CIFSMaxBufSize: %d\n", CIFSMaxBufSize); > seq_printf(m, "Active VFS Requests: %d\n", GlobalTotalActiveXid); > @@ -462,6 +472,9 @@ static int cifs_debug_data_proc_show(struct seq_file *m, void *v) > spin_unlock(&cifs_tcp_ses_lock); > seq_putc(m, '\n'); > > +#ifdef CONFIG_CIFS_SWN_UPCALL > + cifs_swn_dump(m); > +#endif > /* BB add code to dump additional info such as TCP session info now */ > return 0; > } > diff --git a/fs/cifs/cifs_swn.c b/fs/cifs/cifs_swn.c > index 63b0764af5d5..140a53a19aa0 100644 > --- a/fs/cifs/cifs_swn.c > +++ b/fs/cifs/cifs_swn.c > @@ -505,3 +505,38 @@ int cifs_swn_unregister(struct cifs_tcon *tcon) > > return 0; > } > + > +void cifs_swn_dump(struct seq_file *m) > +{ > + struct cifs_swn_reg *swnreg; > + struct sockaddr_in *sa; > + struct sockaddr_in6 *sa6; > + int id; > + > + seq_puts(m, "Witness registrations:"); > + > + mutex_lock(&cifs_swnreg_idr_mutex); > + idr_for_each_entry(&cifs_swnreg_idr, swnreg, id) { > + seq_printf(m, "\nId: %u Refs: %u Network name: '%s'%s Share name: '%s'%s Ip address: ", > + id, kref_read(&swnreg->ref_count), > + swnreg->net_name, swnreg->net_name_notify ? "(y)" : "(n)", > + swnreg->share_name, swnreg->share_name_notify ? "(y)" : "(n)"); > + switch (swnreg->tcon->ses->server->dstaddr.ss_family) { > + case AF_INET: > + sa = (struct sockaddr_in *) &swnreg->tcon->ses->server->dstaddr; > + seq_printf(m, "%pI4", &sa->sin_addr.s_addr); > + break; > + case AF_INET6: > + sa6 = (struct sockaddr_in6 *) &swnreg->tcon->ses->server->dstaddr; > + seq_printf(m, "%pI6", &sa6->sin6_addr.s6_addr); > + if (sa6->sin6_scope_id) > + seq_printf(m, "%%%u", sa6->sin6_scope_id); > + break; > + default: > + seq_puts(m, "(unknown)"); > + } > + seq_printf(m, "%s", swnreg->ip_notify ? "(y)" : "(n)"); > + } > + mutex_unlock(&cifs_swnreg_idr_mutex); > + seq_puts(m, "\n"); > +} > diff --git a/fs/cifs/cifs_swn.h b/fs/cifs/cifs_swn.h > index 7ef9ecedbd05..13b25cdc9295 100644 > --- a/fs/cifs/cifs_swn.h > +++ b/fs/cifs/cifs_swn.h > @@ -18,4 +18,6 @@ extern int cifs_swn_unregister(struct cifs_tcon *tcon); > > extern int cifs_swn_notify(struct sk_buff *skb, struct genl_info *info); > > +extern void cifs_swn_dump(struct seq_file *m); > + > #endif /* _CIFS_SWN_H */ > -- > 2.29.2 >
diff --git a/fs/cifs/cifs_debug.c b/fs/cifs/cifs_debug.c index 53588d7517b4..b231dcf1d1f9 100644 --- a/fs/cifs/cifs_debug.c +++ b/fs/cifs/cifs_debug.c @@ -23,6 +23,9 @@ #ifdef CONFIG_CIFS_SMB_DIRECT #include "smbdirect.h" #endif +#ifdef CONFIG_CIFS_SWN_UPCALL +#include "cifs_swn.h" +#endif void cifs_dump_mem(char *label, void *data, int length) @@ -115,6 +118,10 @@ static void cifs_debug_tcon(struct seq_file *m, struct cifs_tcon *tcon) seq_printf(m, " POSIX Extensions"); if (tcon->ses->server->ops->dump_share_caps) tcon->ses->server->ops->dump_share_caps(m, tcon); +#ifdef CONFIG_CIFS_SWN_UPCALL + if (tcon->use_witness) + seq_puts(m, " Witness"); +#endif if (tcon->need_reconnect) seq_puts(m, "\tDISCONNECTED "); @@ -262,6 +269,9 @@ static int cifs_debug_data_proc_show(struct seq_file *m, void *v) seq_printf(m, ",XATTR"); #endif seq_printf(m, ",ACL"); +#ifdef CONFIG_CIFS_SWN_UPCALL + seq_puts(m, ",WITNESS"); +#endif seq_putc(m, '\n'); seq_printf(m, "CIFSMaxBufSize: %d\n", CIFSMaxBufSize); seq_printf(m, "Active VFS Requests: %d\n", GlobalTotalActiveXid); @@ -462,6 +472,9 @@ static int cifs_debug_data_proc_show(struct seq_file *m, void *v) spin_unlock(&cifs_tcp_ses_lock); seq_putc(m, '\n'); +#ifdef CONFIG_CIFS_SWN_UPCALL + cifs_swn_dump(m); +#endif /* BB add code to dump additional info such as TCP session info now */ return 0; } diff --git a/fs/cifs/cifs_swn.c b/fs/cifs/cifs_swn.c index 63b0764af5d5..140a53a19aa0 100644 --- a/fs/cifs/cifs_swn.c +++ b/fs/cifs/cifs_swn.c @@ -505,3 +505,38 @@ int cifs_swn_unregister(struct cifs_tcon *tcon) return 0; } + +void cifs_swn_dump(struct seq_file *m) +{ + struct cifs_swn_reg *swnreg; + struct sockaddr_in *sa; + struct sockaddr_in6 *sa6; + int id; + + seq_puts(m, "Witness registrations:"); + + mutex_lock(&cifs_swnreg_idr_mutex); + idr_for_each_entry(&cifs_swnreg_idr, swnreg, id) { + seq_printf(m, "\nId: %u Refs: %u Network name: '%s'%s Share name: '%s'%s Ip address: ", + id, kref_read(&swnreg->ref_count), + swnreg->net_name, swnreg->net_name_notify ? "(y)" : "(n)", + swnreg->share_name, swnreg->share_name_notify ? "(y)" : "(n)"); + switch (swnreg->tcon->ses->server->dstaddr.ss_family) { + case AF_INET: + sa = (struct sockaddr_in *) &swnreg->tcon->ses->server->dstaddr; + seq_printf(m, "%pI4", &sa->sin_addr.s_addr); + break; + case AF_INET6: + sa6 = (struct sockaddr_in6 *) &swnreg->tcon->ses->server->dstaddr; + seq_printf(m, "%pI6", &sa6->sin6_addr.s6_addr); + if (sa6->sin6_scope_id) + seq_printf(m, "%%%u", sa6->sin6_scope_id); + break; + default: + seq_puts(m, "(unknown)"); + } + seq_printf(m, "%s", swnreg->ip_notify ? "(y)" : "(n)"); + } + mutex_unlock(&cifs_swnreg_idr_mutex); + seq_puts(m, "\n"); +} diff --git a/fs/cifs/cifs_swn.h b/fs/cifs/cifs_swn.h index 7ef9ecedbd05..13b25cdc9295 100644 --- a/fs/cifs/cifs_swn.h +++ b/fs/cifs/cifs_swn.h @@ -18,4 +18,6 @@ extern int cifs_swn_unregister(struct cifs_tcon *tcon); extern int cifs_swn_notify(struct sk_buff *skb, struct genl_info *info); +extern void cifs_swn_dump(struct seq_file *m); + #endif /* _CIFS_SWN_H */
+ Indicate if witness feature is supported + Indicate if witness is used when dumping tcons + Dumps witness registrations. Example: Witness registrations: Id: 1 Refs: 1 Network name: 'fs.fover.ad'(y) Share name: 'share1'(y) \ Ip address: 192.168.103.200(n) Signed-off-by: Samuel Cabrero <scabrero@suse.de> --- fs/cifs/cifs_debug.c | 13 +++++++++++++ fs/cifs/cifs_swn.c | 35 +++++++++++++++++++++++++++++++++++ fs/cifs/cifs_swn.h | 2 ++ 3 files changed, 50 insertions(+)