From: Dan Carpenter <dan.carpenter@oracle.com> To: James Simmons <jsimmons@infradead.org> Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>, devel@driverdev.osuosl.org, Andreas Dilger <andreas.dilger@intel.com>, Oleg Drokin <oleg.drokin@intel.com>, Nathaniel Clark <nathaniel.l.clark@intel.com>, Linux Kernel Mailing List <linux-kernel@vger.kernel.org>, Lustre Development List <lustre-devel@lists.lustre.org> Subject: Re: [PATCH 14/60] staging: lustre: lov: Ensure correct operation for large object sizes Date: Tue, 31 Jan 2017 11:53:24 +0300 [thread overview] Message-ID: <20170131085324.GG6881@mwanda> (raw) In-Reply-To: <1485648328-2141-15-git-send-email-jsimmons@infradead.org> On Sat, Jan 28, 2017 at 07:04:42PM -0500, James Simmons wrote: > From: Nathaniel Clark <nathaniel.l.clark@intel.com> > > If a backing filesystem (ZFS) returns that it supports very large > (LLONG_MAX) object sizes, that should be correctly supported. This > fixes the check for unitialized stripe_maxbytes in > lsm_unpackmd_common(), so that ZFS can return LLONG_MAX and it will be > okay. This issue is excersized by writing to or past the 2TB boundary > of a singly stripped file. > > Signed-off-by: Nathaniel Clark <nathaniel.l.clark@intel.com> > Intel-bug-id: https://jira.hpdd.intel.com/browse/LU-7890 > Reviewed-on: http://review.whamcloud.com/19066 > Reviewed-by: Andreas Dilger <andreas.dilger@intel.com> > Reviewed-by: Jinshan Xiong <jinshan.xiong@intel.com> > Reviewed-by: Oleg Drokin <oleg.drokin@intel.com> > Signed-off-by: James Simmons <jsimmons@infradead.org> > --- > drivers/staging/lustre/lustre/lov/lov_ea.c | 22 ++++++++++++---------- > 1 file changed, 12 insertions(+), 10 deletions(-) > > diff --git a/drivers/staging/lustre/lustre/lov/lov_ea.c b/drivers/staging/lustre/lustre/lov/lov_ea.c > index ac0bf64..07dee87 100644 > --- a/drivers/staging/lustre/lustre/lov/lov_ea.c > +++ b/drivers/staging/lustre/lustre/lov/lov_ea.c > @@ -150,7 +150,7 @@ static int lsm_unpackmd_common(struct lov_obd *lov, > struct lov_mds_md *lmm, > struct lov_ost_data_v1 *objects) > { > - loff_t stripe_maxbytes = LLONG_MAX; > + loff_t min_stripe_maxbytes = 0, lov_bytes; I've seen this thing in sevaral patches and I haven't commented on it but please don't do this. unsigned long foo = 0, bar; It took my a long time to find the lov_bytes declaration hiding off the end here. We haven't made checkpatch.pl complain about it yet but it's not kernel style. One declaration per line and especially if they aren't closely related like "int left, right;" and doubly especially if there is an initialization involved. > unsigned int stripe_count; > struct lov_oinfo *loi; > unsigned int i; > @@ -168,8 +168,6 @@ static int lsm_unpackmd_common(struct lov_obd *lov, > stripe_count = lsm_is_released(lsm) ? 0 : lsm->lsm_stripe_count; > > for (i = 0; i < stripe_count; i++) { > - loff_t tgt_bytes; > - > loi = lsm->lsm_oinfo[i]; > ostid_le_to_cpu(&objects[i].l_ost_oi, &loi->loi_oi); > loi->loi_ost_idx = le32_to_cpu(objects[i].l_ost_idx); > @@ -194,17 +192,21 @@ static int lsm_unpackmd_common(struct lov_obd *lov, > continue; > } > > - tgt_bytes = lov_tgt_maxbytes(lov->lov_tgts[loi->loi_ost_idx]); > - stripe_maxbytes = min_t(loff_t, stripe_maxbytes, tgt_bytes); > + lov_bytes = lov_tgt_maxbytes(lov->lov_tgts[loi->loi_ost_idx]); > + if (min_stripe_maxbytes == 0 || lov_bytes < min_stripe_maxbytes) > + min_stripe_maxbytes = lov_bytes; > } > > - if (stripe_maxbytes == LLONG_MAX) > - stripe_maxbytes = LUSTRE_EXT3_STRIPE_MAXBYTES; > + if (min_stripe_maxbytes == 0) > + min_stripe_maxbytes = LUSTRE_EXT3_STRIPE_MAXBYTES; > + > + stripe_count = lsm->lsm_stripe_count ?: lov->desc.ld_tgt_count; > + lov_bytes = min_stripe_maxbytes * stripe_count; > > - if (!lsm->lsm_stripe_count) > - lsm->lsm_maxbytes = stripe_maxbytes * lov->desc.ld_tgt_count; > + if (lov_bytes < min_stripe_maxbytes) /* handle overflow */ Signed overflows are undefined. I think we use GCC options so that the compiler does not remove these checks but I also know that I have been wrong before about GCC options and undefined behavior. regards, dan carpenter
WARNING: multiple messages have this Message-ID (diff)
From: Dan Carpenter <dan.carpenter@oracle.com> To: James Simmons <jsimmons@infradead.org> Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>, devel@driverdev.osuosl.org, Andreas Dilger <andreas.dilger@intel.com>, Oleg Drokin <oleg.drokin@intel.com>, Nathaniel Clark <nathaniel.l.clark@intel.com>, Linux Kernel Mailing List <linux-kernel@vger.kernel.org>, Lustre Development List <lustre-devel@lists.lustre.org> Subject: [lustre-devel] [PATCH 14/60] staging: lustre: lov: Ensure correct operation for large object sizes Date: Tue, 31 Jan 2017 11:53:24 +0300 [thread overview] Message-ID: <20170131085324.GG6881@mwanda> (raw) In-Reply-To: <1485648328-2141-15-git-send-email-jsimmons@infradead.org> On Sat, Jan 28, 2017 at 07:04:42PM -0500, James Simmons wrote: > From: Nathaniel Clark <nathaniel.l.clark@intel.com> > > If a backing filesystem (ZFS) returns that it supports very large > (LLONG_MAX) object sizes, that should be correctly supported. This > fixes the check for unitialized stripe_maxbytes in > lsm_unpackmd_common(), so that ZFS can return LLONG_MAX and it will be > okay. This issue is excersized by writing to or past the 2TB boundary > of a singly stripped file. > > Signed-off-by: Nathaniel Clark <nathaniel.l.clark@intel.com> > Intel-bug-id: https://jira.hpdd.intel.com/browse/LU-7890 > Reviewed-on: http://review.whamcloud.com/19066 > Reviewed-by: Andreas Dilger <andreas.dilger@intel.com> > Reviewed-by: Jinshan Xiong <jinshan.xiong@intel.com> > Reviewed-by: Oleg Drokin <oleg.drokin@intel.com> > Signed-off-by: James Simmons <jsimmons@infradead.org> > --- > drivers/staging/lustre/lustre/lov/lov_ea.c | 22 ++++++++++++---------- > 1 file changed, 12 insertions(+), 10 deletions(-) > > diff --git a/drivers/staging/lustre/lustre/lov/lov_ea.c b/drivers/staging/lustre/lustre/lov/lov_ea.c > index ac0bf64..07dee87 100644 > --- a/drivers/staging/lustre/lustre/lov/lov_ea.c > +++ b/drivers/staging/lustre/lustre/lov/lov_ea.c > @@ -150,7 +150,7 @@ static int lsm_unpackmd_common(struct lov_obd *lov, > struct lov_mds_md *lmm, > struct lov_ost_data_v1 *objects) > { > - loff_t stripe_maxbytes = LLONG_MAX; > + loff_t min_stripe_maxbytes = 0, lov_bytes; I've seen this thing in sevaral patches and I haven't commented on it but please don't do this. unsigned long foo = 0, bar; It took my a long time to find the lov_bytes declaration hiding off the end here. We haven't made checkpatch.pl complain about it yet but it's not kernel style. One declaration per line and especially if they aren't closely related like "int left, right;" and doubly especially if there is an initialization involved. > unsigned int stripe_count; > struct lov_oinfo *loi; > unsigned int i; > @@ -168,8 +168,6 @@ static int lsm_unpackmd_common(struct lov_obd *lov, > stripe_count = lsm_is_released(lsm) ? 0 : lsm->lsm_stripe_count; > > for (i = 0; i < stripe_count; i++) { > - loff_t tgt_bytes; > - > loi = lsm->lsm_oinfo[i]; > ostid_le_to_cpu(&objects[i].l_ost_oi, &loi->loi_oi); > loi->loi_ost_idx = le32_to_cpu(objects[i].l_ost_idx); > @@ -194,17 +192,21 @@ static int lsm_unpackmd_common(struct lov_obd *lov, > continue; > } > > - tgt_bytes = lov_tgt_maxbytes(lov->lov_tgts[loi->loi_ost_idx]); > - stripe_maxbytes = min_t(loff_t, stripe_maxbytes, tgt_bytes); > + lov_bytes = lov_tgt_maxbytes(lov->lov_tgts[loi->loi_ost_idx]); > + if (min_stripe_maxbytes == 0 || lov_bytes < min_stripe_maxbytes) > + min_stripe_maxbytes = lov_bytes; > } > > - if (stripe_maxbytes == LLONG_MAX) > - stripe_maxbytes = LUSTRE_EXT3_STRIPE_MAXBYTES; > + if (min_stripe_maxbytes == 0) > + min_stripe_maxbytes = LUSTRE_EXT3_STRIPE_MAXBYTES; > + > + stripe_count = lsm->lsm_stripe_count ?: lov->desc.ld_tgt_count; > + lov_bytes = min_stripe_maxbytes * stripe_count; > > - if (!lsm->lsm_stripe_count) > - lsm->lsm_maxbytes = stripe_maxbytes * lov->desc.ld_tgt_count; > + if (lov_bytes < min_stripe_maxbytes) /* handle overflow */ Signed overflows are undefined. I think we use GCC options so that the compiler does not remove these checks but I also know that I have been wrong before about GCC options and undefined behavior. regards, dan carpenter
next prev parent reply other threads:[~2017-01-31 8:54 UTC|newest] Thread overview: 159+ messages / expand[flat|nested] mbox.gz Atom feed top 2017-01-29 0:04 [PATCH 00/60] staging: lustre: batches of fixes for lustre client James Simmons 2017-01-29 0:04 ` [lustre-devel] " James Simmons 2017-01-29 0:04 ` [PATCH 01/60] staging: lustre: llite: Remove access of stripe in ll_setattr_raw James Simmons 2017-01-29 0:04 ` [lustre-devel] " James Simmons 2017-01-29 0:04 ` [PATCH 02/60] staging: lustre: statahead: drop support for remote entry James Simmons 2017-01-29 0:04 ` [lustre-devel] " James Simmons 2017-01-29 0:04 ` [PATCH 03/60] staging: lustre: clio: add cl_page LRU shrinker James Simmons 2017-01-29 0:04 ` [lustre-devel] " James Simmons 2017-01-29 0:04 ` [PATCH 04/60] staging: lustre: mdc: quiet console message for known -EINTR James Simmons 2017-01-29 0:04 ` [lustre-devel] " James Simmons 2017-01-29 0:04 ` [PATCH 05/60] staging: lustre: llite: check request != NULL in ll_migrate James Simmons 2017-01-29 0:04 ` [lustre-devel] " James Simmons 2017-01-30 11:34 ` Dan Carpenter 2017-01-30 11:34 ` [lustre-devel] " Dan Carpenter 2017-02-11 17:12 ` James Simmons 2017-02-11 17:12 ` [lustre-devel] " James Simmons 2017-01-29 0:04 ` [PATCH 06/60] staging: lustre: clio: revise readahead to support 16MB IO James Simmons 2017-01-29 0:04 ` [lustre-devel] " James Simmons 2017-01-29 0:04 ` [PATCH 07/60] staging: lustre: ptlrpc: set proper mbits for EINPROGRESS resend James Simmons 2017-01-29 0:04 ` [lustre-devel] " James Simmons 2017-01-29 0:04 ` [PATCH 08/60] staging: lustre: ldlm: Restore connect flags on failure James Simmons 2017-01-29 0:04 ` [lustre-devel] " James Simmons 2017-01-29 0:04 ` [PATCH 09/60] staging: lustre: lmv: Correctly generate target_obd James Simmons 2017-01-29 0:04 ` [lustre-devel] " James Simmons 2017-01-29 0:04 ` [PATCH 10/60] staging: lustre: obdclass: add more info to sysfs version string James Simmons 2017-01-29 0:04 ` [lustre-devel] " James Simmons 2017-02-03 10:33 ` Greg Kroah-Hartman 2017-02-03 10:33 ` [lustre-devel] " Greg Kroah-Hartman 2017-02-08 1:04 ` Dilger, Andreas 2017-02-08 1:04 ` Dilger, Andreas 2017-02-08 6:27 ` Greg Kroah-Hartman 2017-02-08 6:27 ` Greg Kroah-Hartman 2017-01-29 0:04 ` [PATCH 11/60] staging: lustre: obd: RCU stalls in lu_cache_shrink_count() James Simmons 2017-01-29 0:04 ` [lustre-devel] " James Simmons 2017-01-29 0:04 ` [PATCH 12/60] staging: lustre: lmv: Error not handled for lmv_find_target James Simmons 2017-01-29 0:04 ` [lustre-devel] " James Simmons 2017-01-29 0:04 ` [PATCH 13/60] staging: lustre: obdclass: health_check to report unhealthy upon LBUG James Simmons 2017-01-29 0:04 ` [lustre-devel] " James Simmons 2017-01-30 12:03 ` Dan Carpenter 2017-01-30 12:03 ` [lustre-devel] " Dan Carpenter 2017-01-31 1:00 ` James Simmons 2017-01-31 1:00 ` [lustre-devel] " James Simmons 2017-01-29 0:04 ` [PATCH 14/60] staging: lustre: lov: Ensure correct operation for large object sizes James Simmons 2017-01-29 0:04 ` [lustre-devel] " James Simmons 2017-01-31 8:53 ` Dan Carpenter [this message] 2017-01-31 8:53 ` Dan Carpenter 2017-01-29 0:04 ` [PATCH 15/60] staging: lustre: hsm: stack overrun in hai_dump_data_field James Simmons 2017-01-29 0:04 ` [lustre-devel] " James Simmons 2017-01-29 0:04 ` [PATCH 16/60] staging: lustre: llite: don't ignore layout for group lock request James Simmons 2017-01-29 0:04 ` [lustre-devel] " James Simmons 2017-01-29 0:04 ` [PATCH 17/60] staging: lustre: obdclass: do not call lu_site_purge() for single object exceed James Simmons 2017-01-29 0:04 ` [lustre-devel] " James Simmons 2017-01-29 0:04 ` [PATCH 18/60] staging: lustre: ptlrpc: skip lock if export failed James Simmons 2017-01-29 0:04 ` [lustre-devel] " James Simmons 2017-01-29 0:04 ` [PATCH 19/60] staging: lustre: llite: handle inactive OSTs better in statfs James Simmons 2017-01-29 0:04 ` [lustre-devel] " James Simmons 2017-01-29 0:04 ` [PATCH 20/60] staging: lustre: llite: remove obsolete comment for ll_unlink() James Simmons 2017-01-29 0:04 ` [lustre-devel] " James Simmons 2017-01-29 0:04 ` [PATCH 21/60] staging: lustre: ptlrpc: correct use of list_add_tail() James Simmons 2017-01-29 0:04 ` [lustre-devel] " James Simmons 2017-01-31 8:54 ` Dan Carpenter 2017-01-31 8:54 ` [lustre-devel] " Dan Carpenter 2017-01-31 13:25 ` Patrick Farrell 2017-01-29 0:04 ` [PATCH 22/60] staging: lustre: fid: fix race in fid allocation James Simmons 2017-01-29 0:04 ` [lustre-devel] " James Simmons 2017-01-31 8:55 ` Dan Carpenter 2017-01-31 8:55 ` [lustre-devel] " Dan Carpenter 2017-01-29 0:04 ` [PATCH 23/60] staging: lustre: lmv: remove unused placement parameter James Simmons 2017-01-29 0:04 ` [lustre-devel] " James Simmons 2017-01-29 0:04 ` [PATCH 24/60] staging: lustre: lustre: Remove old commented out code James Simmons 2017-01-29 0:04 ` [lustre-devel] " James Simmons 2017-01-29 0:04 ` [PATCH 25/60] staging: lustre: llite: normal user can't set FS default stripe James Simmons 2017-01-29 0:04 ` [lustre-devel] " James Simmons 2017-01-29 0:04 ` [PATCH 26/60] staging: lustre: llite: Trust creates in revalidate too James Simmons 2017-01-29 0:04 ` [lustre-devel] " James Simmons 2017-01-29 0:04 ` [PATCH 27/60] staging: lustre: mgc: handle config_llog_data::cld_refcount properly James Simmons 2017-01-29 0:04 ` [lustre-devel] " James Simmons 2017-01-29 0:04 ` [PATCH 28/60] staging: lustre: ldlm: ASSERTION(flock->blocking_export!=0) failed James Simmons 2017-01-29 0:04 ` [lustre-devel] " James Simmons 2017-01-29 0:04 ` [PATCH 29/60] staging: lustre: llite: Setting xattr are properly checked with and without ACLs James Simmons 2017-01-29 0:04 ` [lustre-devel] " James Simmons 2017-01-29 0:04 ` [PATCH 30/60] staging: lustre: ptlrpc: comment for FLD_QUERY RPC reply swab James Simmons 2017-01-29 0:04 ` [lustre-devel] " James Simmons 2017-01-29 0:04 ` [PATCH 31/60] staging: lustre: clio: sync write should update mtime James Simmons 2017-01-29 0:04 ` [lustre-devel] " James Simmons 2017-01-29 0:05 ` [PATCH 32/60] staging: lustre: osc: limits the number of chunks in write RPC James Simmons 2017-01-29 0:05 ` [lustre-devel] " James Simmons 2017-01-29 0:05 ` [PATCH 33/60] staging: lustre: libcfs: avoid stomping on module param cpu_pattern James Simmons 2017-01-29 0:05 ` [lustre-devel] " James Simmons 2017-01-29 0:05 ` [PATCH 34/60] staging: lustre: libcfs: default CPT matches NUMA topology James Simmons 2017-01-29 0:05 ` [lustre-devel] " James Simmons 2017-01-29 0:05 ` [PATCH 35/60] staging: lustre: lov: ld_target could be NULL James Simmons 2017-01-29 0:05 ` [lustre-devel] " James Simmons 2017-01-29 0:05 ` [PATCH 36/60] staging: lustre: header: remove assert from interval_set() James Simmons 2017-01-29 0:05 ` [lustre-devel] " James Simmons 2017-01-29 0:05 ` [PATCH 37/60] staging: lustre: llite: specify READA debug mask for ras_update James Simmons 2017-01-29 0:05 ` [lustre-devel] " James Simmons 2017-01-29 0:05 ` [PATCH 38/60] staging: lustre: llite: Adding timed wait in ll_umount_begin James Simmons 2017-01-29 0:05 ` [lustre-devel] " James Simmons 2017-01-29 0:05 ` [PATCH 39/60] staging: libcfs: remove integer types abstraction from libcfs James Simmons 2017-01-29 0:05 ` [lustre-devel] " James Simmons 2017-01-29 0:05 ` [PATCH 40/60] staging: ptlrpc: leaked rs on difficult reply James Simmons 2017-01-29 0:05 ` [lustre-devel] " James Simmons 2017-01-29 0:05 ` [PATCH 41/60] staging: lustre: osc: osc_match_base prototype differs from declaration James Simmons 2017-01-29 0:05 ` [lustre-devel] " James Simmons 2017-01-29 0:05 ` [PATCH 42/60] staging: lustre: ptlrpc: allow blocking asts to be delayed James Simmons 2017-01-29 0:05 ` [lustre-devel] " James Simmons 2017-01-29 0:05 ` [PATCH 43/60] staging: lustre: obd: remove OBD_NOTIFY_CREATE James Simmons 2017-01-29 0:05 ` [lustre-devel] " James Simmons 2017-01-29 0:05 ` [PATCH 44/60] staging: lustre: libcfs: fix error messages James Simmons 2017-01-29 0:05 ` [lustre-devel] " James Simmons 2017-01-29 0:05 ` [PATCH 45/60] staging: lustre: libcfs: Change positional struct initializers to C99 James Simmons 2017-01-29 0:05 ` [lustre-devel] " James Simmons 2017-01-29 0:05 ` [PATCH 46/60] staging: lustre: mdc: Make IT_OPEN take lookup bits lock James Simmons 2017-01-29 0:05 ` [lustre-devel] " James Simmons 2017-01-29 0:05 ` [PATCH 47/60] staging: lustre: mdc: avoid returning freed request James Simmons 2017-01-29 0:05 ` [lustre-devel] " James Simmons 2017-01-29 0:05 ` [PATCH 48/60] staging: lustre: ksocklnd: ignore timedout TX on closing connection James Simmons 2017-01-29 0:05 ` [lustre-devel] " James Simmons 2017-01-29 0:05 ` [PATCH 49/60] staging: lustre: socklnd: remove socklnd_init_msg James Simmons 2017-01-29 0:05 ` [lustre-devel] " James Simmons 2017-01-29 0:05 ` [PATCH 50/60] staging: lustre: ptlrpc: remove unused pc->pc_env James Simmons 2017-01-29 0:05 ` [lustre-devel] " James Simmons 2017-01-29 0:05 ` [PATCH 51/60] staging: lustre: ptlrpc: update MODULE_PARAM_DESC in ptlrpcd.c James Simmons 2017-01-29 0:05 ` [lustre-devel] " James Simmons 2017-01-29 0:05 ` [PATCH 52/60] staging: lustre: linkea: linkEA size limitation James Simmons 2017-01-29 0:05 ` [lustre-devel] " James Simmons 2017-01-29 0:05 ` [PATCH 53/60] staging: lustre: ptlrpc: update replay cursor when close during replay James Simmons 2017-01-29 0:05 ` [lustre-devel] " James Simmons 2017-01-29 0:05 ` [PATCH 54/60] staging: lustre: fid: Change positional struct initializers to C99 James Simmons 2017-01-29 0:05 ` [lustre-devel] " James Simmons 2017-01-29 0:05 ` [PATCH 55/60] staging: lustre: obd: move s3 in lmd_parse to inner loop James Simmons 2017-01-29 0:05 ` [lustre-devel] " James Simmons 2017-01-29 0:05 ` [PATCH 56/60] staging: lustre: llite: don't invoke direct_IO for the EOF case James Simmons 2017-01-29 0:05 ` [lustre-devel] " James Simmons 2017-01-29 0:05 ` [PATCH 57/60] staging: lustre: lmv: remove nlink check in lmv_revalidate_slaves James Simmons 2017-01-29 0:05 ` [lustre-devel] " James Simmons 2017-01-29 0:05 ` [PATCH 58/60] staging: lustre: osc: avoid 64 divide in osc_cache_too_much James Simmons 2017-01-29 0:05 ` [lustre-devel] " James Simmons 2017-01-29 0:05 ` [PATCH 59/60] staging: lustre: ptlrpc : remove userland usage from ptlrpc James Simmons 2017-01-29 0:05 ` [lustre-devel] " James Simmons 2017-01-29 0:05 ` [PATCH 60/60] staging: lustre: libcfs: fix minimum size check for libcfs ioctl James Simmons 2017-01-29 0:05 ` [lustre-devel] " James Simmons 2017-01-30 10:51 ` Dan Carpenter 2017-01-30 10:51 ` [lustre-devel] " Dan Carpenter 2017-01-30 10:54 ` Dan Carpenter 2017-01-30 10:54 ` [lustre-devel] " Dan Carpenter 2017-01-31 0:48 ` James Simmons 2017-01-31 0:48 ` [lustre-devel] " James Simmons 2017-01-31 2:25 ` James Simmons 2017-01-31 2:25 ` [lustre-devel] " James Simmons 2017-01-31 8:13 ` Dan Carpenter 2017-01-31 8:13 ` [lustre-devel] " Dan Carpenter 2017-02-01 13:32 ` Olaf Weber 2017-02-01 13:32 ` Olaf Weber 2017-02-01 16:39 ` Greg Kroah-Hartman 2017-02-01 16:39 ` Greg Kroah-Hartman 2017-02-03 10:46 ` [PATCH 00/60] staging: lustre: batches of fixes for lustre client Greg Kroah-Hartman 2017-02-03 10:46 ` [lustre-devel] " Greg Kroah-Hartman
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=20170131085324.GG6881@mwanda \ --to=dan.carpenter@oracle.com \ --cc=andreas.dilger@intel.com \ --cc=devel@driverdev.osuosl.org \ --cc=gregkh@linuxfoundation.org \ --cc=jsimmons@infradead.org \ --cc=linux-kernel@vger.kernel.org \ --cc=lustre-devel@lists.lustre.org \ --cc=nathaniel.l.clark@intel.com \ --cc=oleg.drokin@intel.com \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.