linux-nfs.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH -v2] pnfs: unlock lo_lock spinlock before calling specific layoutdriver's setup_layoutcommit() operation
@ 2010-05-25  8:51 Tao Guo
  2010-05-25 13:01 ` Boaz Harrosh
  2010-05-25 13:33 ` [PATCH v3] SQUASHME: pnfs: unlock lo_lock before calling layoutdriver's setup_layoutcommit Boaz Harrosh
  0 siblings, 2 replies; 8+ messages in thread
From: Tao Guo @ 2010-05-25  8:51 UTC (permalink / raw)
  To: linux-nfs; +Cc: Benny Halevy

So in blocklayoutdriver, we can use GFP_KERNEL to do memory
allocation in bl_setup_layoutcommit().

Signed-off-by: Tao Guo <guotao-U4AKAne5IzAR5TUyvShJeg@public.gmane.org>
---
 fs/nfs/pnfs.c |   63 ++++++++++++++++++++++++++------------------------------
 1 files changed, 29 insertions(+), 34 deletions(-)

diff --git a/fs/nfs/pnfs.c b/fs/nfs/pnfs.c
index d4e4ba9..bbd1548 100644
--- a/fs/nfs/pnfs.c
+++ b/fs/nfs/pnfs.c
@@ -2075,15 +2075,23 @@ pnfs_layoutcommit_done(struct pnfs_layoutcommit_data *data)
  * Set up the argument/result storage required for the RPC call.
  */
 static int
-pnfs_layoutcommit_setup(struct pnfs_layoutcommit_data *data, int sync)
+pnfs_layoutcommit_setup(struct inode *inode,
+			struct pnfs_layoutcommit_data *data, int sync)
 {
-	struct nfs_inode *nfsi = NFS_I(data->args.inode);
-	struct nfs_server *nfss = NFS_SERVER(data->args.inode);
+	struct nfs_inode *nfsi = NFS_I(inode);
+	struct nfs_server *nfss = NFS_SERVER(inode);
 	int result = 0;
 
 	dprintk("%s Begin (sync:%d)\n", __func__, sync);
+
+	data->is_sync = sync;
+	data->cred = nfsi->lo_cred;
+	data->args.inode = inode;
 	data->args.fh = NFS_FH(data->args.inode);
 	data->args.layout_type = nfss->pnfs_curr_ld->id;
+	pnfs_get_layout_stateid(&data->args.stateid, &nfsi->layout);
+	data->res.fattr = &data->fattr;
+	nfs_fattr_init(&data->fattr);
 
 	/* TODO: Need to determine the correct values */
 	data->args.time_modify_changed = 0;
@@ -2098,19 +2106,21 @@ pnfs_layoutcommit_setup(struct pnfs_layoutcommit_data *data, int sync)
 	data->args.bitmask = nfss->attr_bitmask;
 	data->res.server = nfss;
 
+	/* Clear layoutcommit properties in the inode so
+	 * new lc info can be generated
+	 */
+	nfsi->pnfs_write_begin_pos = 0;
+	nfsi->pnfs_write_end_pos = 0;
+	nfsi->lo_cred = NULL;
+
+	spin_unlock(&nfsi->lo_lock);
+
 	/* Call layout driver to set the arguments.
 	 */
-	if (nfss->pnfs_curr_ld->ld_io_ops->setup_layoutcommit) {
+	if (nfss->pnfs_curr_ld->ld_io_ops->setup_layoutcommit)
 		result = nfss->pnfs_curr_ld->ld_io_ops->setup_layoutcommit(
 				&nfsi->layout, &data->args);
-		if (result)
-			goto out;
-	}
-	pnfs_get_layout_stateid(&data->args.stateid, &nfsi->layout);
-	data->res.fattr = &data->fattr;
-	nfs_fattr_init(&data->fattr);
 
-out:
 	dprintk("%s End Status %d\n", __func__, result);
 	return result;
 }
@@ -2133,39 +2143,24 @@ pnfs_layoutcommit_inode(struct inode *inode, int sync)
 		return -ENOMEM;
 
 	spin_lock(&nfsi->lo_lock);
-	if (!layoutcommit_needed(nfsi))
-		goto out_unlock;
-
-	data->args.inode = inode;
-	data->cred = nfsi->lo_cred;
-
-	/* Set up layout commit args*/
-	status = pnfs_layoutcommit_setup(data, sync);
-
-	/* Clear layoutcommit properties in the inode so
-	 * new lc info can be generated
-	 */
-	nfsi->pnfs_write_begin_pos = 0;
-	nfsi->pnfs_write_end_pos = 0;
-	nfsi->lo_cred = NULL;
+	if (!layoutcommit_needed(nfsi)) {
+		spin_unlock(&nfsi->lo_lock);
+		goto out_free;
+	}
 
+	/* Set up layout commit args */
+	status = pnfs_layoutcommit_setup(inode, data, sync);
 	if (status) {
 		/* The layout driver failed to setup the layoutcommit */
 		put_rpccred(data->cred);
-		goto out_unlock;
+		goto out_free;
 	}
-
-	/* release lock on pnfs layoutcommit attrs */
-	spin_unlock(&nfsi->lo_lock);
-
-	data->is_sync = sync;
 	status = pnfs4_proc_layoutcommit(data);
 out:
 	dprintk("%s end (err:%d)\n", __func__, status);
 	return status;
-out_unlock:
+out_free:
 	pnfs_layoutcommit_free(data);
-	spin_unlock(&nfsi->lo_lock);
 	goto out;
 }
 
-- 
1.6.3.3


^ permalink raw reply related	[flat|nested] 8+ messages in thread

* Re: [PATCH -v2] pnfs: unlock lo_lock spinlock before calling specific layoutdriver's setup_layoutcommit() operation
  2010-05-25  8:51 [PATCH -v2] pnfs: unlock lo_lock spinlock before calling specific layoutdriver's setup_layoutcommit() operation Tao Guo
@ 2010-05-25 13:01 ` Boaz Harrosh
  2010-05-25 13:23   ` Boaz Harrosh
  2010-05-25 13:33 ` [PATCH v3] SQUASHME: pnfs: unlock lo_lock before calling layoutdriver's setup_layoutcommit Boaz Harrosh
  1 sibling, 1 reply; 8+ messages in thread
From: Boaz Harrosh @ 2010-05-25 13:01 UTC (permalink / raw)
  To: Tao Guo; +Cc: linux-nfs, Benny Halevy

On 05/25/2010 11:51 AM, Tao Guo wrote:
> So in blocklayoutdriver, we can use GFP_KERNEL to do memory
> allocation in bl_setup_layoutcommit().
> 
> Signed-off-by: Tao Guo <guotao-U4AKAne5IzAR5TUyvShJeg@public.gmane.org>
> ---
>  fs/nfs/pnfs.c |   63 ++++++++++++++++++++++++++------------------------------
>  1 files changed, 29 insertions(+), 34 deletions(-)
> 
> diff --git a/fs/nfs/pnfs.c b/fs/nfs/pnfs.c
> index d4e4ba9..bbd1548 100644
> --- a/fs/nfs/pnfs.c
> +++ b/fs/nfs/pnfs.c
> @@ -2075,15 +2075,23 @@ pnfs_layoutcommit_done(struct pnfs_layoutcommit_data *data)
>   * Set up the argument/result storage required for the RPC call.
>   */
>  static int
> -pnfs_layoutcommit_setup(struct pnfs_layoutcommit_data *data, int sync)
> +pnfs_layoutcommit_setup(struct inode *inode,
> +			struct pnfs_layoutcommit_data *data, int sync)
>  {
> -	struct nfs_inode *nfsi = NFS_I(data->args.inode);
> -	struct nfs_server *nfss = NFS_SERVER(data->args.inode);
> +	struct nfs_inode *nfsi = NFS_I(inode);
> +	struct nfs_server *nfss = NFS_SERVER(inode);
>  	int result = 0;
>  
>  	dprintk("%s Begin (sync:%d)\n", __func__, sync);
> +
> +	data->is_sync = sync;
> +	data->cred = nfsi->lo_cred;
> +	data->args.inode = inode;
>  	data->args.fh = NFS_FH(data->args.inode);
>  	data->args.layout_type = nfss->pnfs_curr_ld->id;
> +	pnfs_get_layout_stateid(&data->args.stateid, &nfsi->layout);
> +	data->res.fattr = &data->fattr;
> +	nfs_fattr_init(&data->fattr);
>  
>  	/* TODO: Need to determine the correct values */
>  	data->args.time_modify_changed = 0;
> @@ -2098,19 +2106,21 @@ pnfs_layoutcommit_setup(struct pnfs_layoutcommit_data *data, int sync)
>  	data->args.bitmask = nfss->attr_bitmask;
>  	data->res.server = nfss;
>  
> +	/* Clear layoutcommit properties in the inode so
> +	 * new lc info can be generated
> +	 */
> +	nfsi->pnfs_write_begin_pos = 0;
> +	nfsi->pnfs_write_end_pos = 0;
> +	nfsi->lo_cred = NULL;
> +
> +	spin_unlock(&nfsi->lo_lock);
> +

I don't like it when _unlock is done in a different function then _lock

Please see below proposal for somthing I would think should be more clear.

>  	/* Call layout driver to set the arguments.
>  	 */
> -	if (nfss->pnfs_curr_ld->ld_io_ops->setup_layoutcommit) {
> +	if (nfss->pnfs_curr_ld->ld_io_ops->setup_layoutcommit)
>  		result = nfss->pnfs_curr_ld->ld_io_ops->setup_layoutcommit(
>  				&nfsi->layout, &data->args);
> -		if (result)
> -			goto out;
> -	}
> -	pnfs_get_layout_stateid(&data->args.stateid, &nfsi->layout);
> -	data->res.fattr = &data->fattr;
> -	nfs_fattr_init(&data->fattr);
>  
> -out:
>  	dprintk("%s End Status %d\n", __func__, result);
>  	return result;
>  }
> @@ -2133,39 +2143,24 @@ pnfs_layoutcommit_inode(struct inode *inode, int sync)
>  		return -ENOMEM;
>  
>  	spin_lock(&nfsi->lo_lock);
> -	if (!layoutcommit_needed(nfsi))
> -		goto out_unlock;
> -
> -	data->args.inode = inode;
> -	data->cred = nfsi->lo_cred;
> -
> -	/* Set up layout commit args*/
> -	status = pnfs_layoutcommit_setup(data, sync);
> -
> -	/* Clear layoutcommit properties in the inode so
> -	 * new lc info can be generated
> -	 */
> -	nfsi->pnfs_write_begin_pos = 0;
> -	nfsi->pnfs_write_end_pos = 0;
> -	nfsi->lo_cred = NULL;
> +	if (!layoutcommit_needed(nfsi)) {
> +		spin_unlock(&nfsi->lo_lock);
> +		goto out_free;
> +	}
>  
> +	/* Set up layout commit args */
> +	status = pnfs_layoutcommit_setup(inode, data, sync);
>  	if (status) {
>  		/* The layout driver failed to setup the layoutcommit */
>  		put_rpccred(data->cred);
> -		goto out_unlock;
> +		goto out_free;
>  	}
> -
> -	/* release lock on pnfs layoutcommit attrs */
> -	spin_unlock(&nfsi->lo_lock);
> -
> -	data->is_sync = sync;
>  	status = pnfs4_proc_layoutcommit(data);
>  out:
>  	dprintk("%s end (err:%d)\n", __func__, status);
>  	return status;
> -out_unlock:
> +out_free:
>  	pnfs_layoutcommit_free(data);
> -	spin_unlock(&nfsi->lo_lock);
>  	goto out;
>  }
>  

SQUASHME: apply this on top of: pnfs: unlock lo_lock spinlock before calling layoutdriver's setup_layoutcommit

(BTW subject line too long see above)

lock/unlock on same call sight. it is also much more clear what is protected by the spinlock which is
the write_begin/end_pos and most importantly the nfsi->lo_cred which is also the state variable.
(layoutcommit_needed)

I'm also sending a [PATCH -v3] which is a squash of this with Toa's patch.

---
git diff --stat -p -M fs/nfs/pnfs.c
 fs/nfs/pnfs.c |   37 ++++++++++++++++++++++---------------
 1 files changed, 22 insertions(+), 15 deletions(-)

diff --git a/fs/nfs/pnfs.c b/fs/nfs/pnfs.c
index bbd1548..88d4865 100644
--- a/fs/nfs/pnfs.c
+++ b/fs/nfs/pnfs.c
@@ -2076,7 +2076,8 @@ pnfs_layoutcommit_done(struct pnfs_layoutcommit_data *data)
  */
 static int
 pnfs_layoutcommit_setup(struct inode *inode,
-			struct pnfs_layoutcommit_data *data, int sync)
+			struct pnfs_layoutcommit_data *data,
+			loff_t write_begin_pos, loff_t write_end_pos, int sync)
 {
 	struct nfs_inode *nfsi = NFS_I(inode);
 	struct nfs_server *nfss = NFS_SERVER(inode);
@@ -2099,22 +2100,13 @@ pnfs_layoutcommit_setup(struct inode *inode,
 	/* Set values from inode so it can be reset
 	 */
 	data->args.lseg.iomode = IOMODE_RW;
-	data->args.lseg.offset = nfsi->pnfs_write_begin_pos;
-	data->args.lseg.length = nfsi->pnfs_write_end_pos - nfsi->pnfs_write_begin_pos + 1;
-	data->args.lastbytewritten =  min(nfsi->pnfs_write_end_pos,
-					i_size_read(&nfsi->vfs_inode) - 1);
+	data->args.lseg.offset = write_begin_pos;
+	data->args.lseg.length = write_end_pos - write_begin_pos + 1;
+	data->args.lastbytewritten =  min(write_end_pos,
+					  i_size_read(&nfsi->vfs_inode) - 1);
 	data->args.bitmask = nfss->attr_bitmask;
 	data->res.server = nfss;
 
-	/* Clear layoutcommit properties in the inode so
-	 * new lc info can be generated
-	 */
-	nfsi->pnfs_write_begin_pos = 0;
-	nfsi->pnfs_write_end_pos = 0;
-	nfsi->lo_cred = NULL;
-
-	spin_unlock(&nfsi->lo_lock);
-
 	/* Call layout driver to set the arguments.
 	 */
 	if (nfss->pnfs_curr_ld->ld_io_ops->setup_layoutcommit)
@@ -2132,6 +2124,9 @@ pnfs_layoutcommit_inode(struct inode *inode, int sync)
 {
 	struct pnfs_layoutcommit_data *data;
 	struct nfs_inode *nfsi = NFS_I(inode);
+	loff_t write_begin_pos;
+	loff_t write_end_pos;
+
 	int status = 0;
 
 	dprintk("%s Begin (sync:%d)\n", __func__, sync);
@@ -2148,8 +2143,20 @@ pnfs_layoutcommit_inode(struct inode *inode, int sync)
 		goto out_free;
 	}
 
+	/* Clear layoutcommit properties in the inode so
+	 * new lc info can be generated
+	 */
+	write_begin_pos = nfsi->pnfs_write_begin_pos;
+	write_end_pos = nfsi->pnfs_write_end_pos;
+	nfsi->pnfs_write_begin_pos = 0;
+	nfsi->pnfs_write_end_pos = 0;
+	nfsi->lo_cred = NULL;
+
+	spin_unlock(&nfsi->lo_lock);
+
 	/* Set up layout commit args */
-	status = pnfs_layoutcommit_setup(inode, data, sync);
+	status = pnfs_layoutcommit_setup(inode, data, write_begin_pos,
+					 write_end_pos, sync);
 	if (status) {
 		/* The layout driver failed to setup the layoutcommit */
 		put_rpccred(data->cred);



^ permalink raw reply related	[flat|nested] 8+ messages in thread

* Re: [PATCH -v2] pnfs: unlock lo_lock spinlock before calling specific layoutdriver's setup_layoutcommit() operation
  2010-05-25 13:01 ` Boaz Harrosh
@ 2010-05-25 13:23   ` Boaz Harrosh
  0 siblings, 0 replies; 8+ messages in thread
From: Boaz Harrosh @ 2010-05-25 13:23 UTC (permalink / raw)
  To: Tao Guo; +Cc: linux-nfs, Benny Halevy

On 05/25/2010 04:01 PM, Boaz Harrosh wrote:
> On 05/25/2010 11:51 AM, Tao Guo wrote:
>> So in blocklayoutdriver, we can use GFP_KERNEL to do memory
>> allocation in bl_setup_layoutcommit().
>>
>> Signed-off-by: Tao Guo <guotao-U4AKAne5IzAR5TUyvShJeg@public.gmane.org>
>> ---
>>  fs/nfs/pnfs.c |   63 ++++++++++++++++++++++++++------------------------------
>>  1 files changed, 29 insertions(+), 34 deletions(-)
>>
>> diff --git a/fs/nfs/pnfs.c b/fs/nfs/pnfs.c
>> index d4e4ba9..bbd1548 100644
>> --- a/fs/nfs/pnfs.c
>> +++ b/fs/nfs/pnfs.c
>> @@ -2075,15 +2075,23 @@ pnfs_layoutcommit_done(struct pnfs_layoutcommit_data *data)
>>   * Set up the argument/result storage required for the RPC call.
>>   */
>>  static int
>> -pnfs_layoutcommit_setup(struct pnfs_layoutcommit_data *data, int sync)
>> +pnfs_layoutcommit_setup(struct inode *inode,
>> +			struct pnfs_layoutcommit_data *data, int sync)
>>  {
>> -	struct nfs_inode *nfsi = NFS_I(data->args.inode);
>> -	struct nfs_server *nfss = NFS_SERVER(data->args.inode);
>> +	struct nfs_inode *nfsi = NFS_I(inode);
>> +	struct nfs_server *nfss = NFS_SERVER(inode);
>>  	int result = 0;
>>  
>>  	dprintk("%s Begin (sync:%d)\n", __func__, sync);
>> +
>> +	data->is_sync = sync;
>> +	data->cred = nfsi->lo_cred;
>> +	data->args.inode = inode;
>>  	data->args.fh = NFS_FH(data->args.inode);
>>  	data->args.layout_type = nfss->pnfs_curr_ld->id;
>> +	pnfs_get_layout_stateid(&data->args.stateid, &nfsi->layout);
>> +	data->res.fattr = &data->fattr;
>> +	nfs_fattr_init(&data->fattr);
>>  
>>  	/* TODO: Need to determine the correct values */
>>  	data->args.time_modify_changed = 0;
>> @@ -2098,19 +2106,21 @@ pnfs_layoutcommit_setup(struct pnfs_layoutcommit_data *data, int sync)
>>  	data->args.bitmask = nfss->attr_bitmask;
>>  	data->res.server = nfss;
>>  
>> +	/* Clear layoutcommit properties in the inode so
>> +	 * new lc info can be generated
>> +	 */
>> +	nfsi->pnfs_write_begin_pos = 0;
>> +	nfsi->pnfs_write_end_pos = 0;
>> +	nfsi->lo_cred = NULL;
>> +
>> +	spin_unlock(&nfsi->lo_lock);
>> +
> 
> I don't like it when _unlock is done in a different function then _lock
> 
> Please see below proposal for somthing I would think should be more clear.
> 
>>  	/* Call layout driver to set the arguments.
>>  	 */
>> -	if (nfss->pnfs_curr_ld->ld_io_ops->setup_layoutcommit) {
>> +	if (nfss->pnfs_curr_ld->ld_io_ops->setup_layoutcommit)
>>  		result = nfss->pnfs_curr_ld->ld_io_ops->setup_layoutcommit(
>>  				&nfsi->layout, &data->args);
>> -		if (result)
>> -			goto out;
>> -	}
>> -	pnfs_get_layout_stateid(&data->args.stateid, &nfsi->layout);
>> -	data->res.fattr = &data->fattr;
>> -	nfs_fattr_init(&data->fattr);
>>  
>> -out:
>>  	dprintk("%s End Status %d\n", __func__, result);
>>  	return result;
>>  }
>> @@ -2133,39 +2143,24 @@ pnfs_layoutcommit_inode(struct inode *inode, int sync)
>>  		return -ENOMEM;
>>  
>>  	spin_lock(&nfsi->lo_lock);
>> -	if (!layoutcommit_needed(nfsi))
>> -		goto out_unlock;
>> -
>> -	data->args.inode = inode;
>> -	data->cred = nfsi->lo_cred;
>> -
>> -	/* Set up layout commit args*/
>> -	status = pnfs_layoutcommit_setup(data, sync);
>> -
>> -	/* Clear layoutcommit properties in the inode so
>> -	 * new lc info can be generated
>> -	 */
>> -	nfsi->pnfs_write_begin_pos = 0;
>> -	nfsi->pnfs_write_end_pos = 0;
>> -	nfsi->lo_cred = NULL;
>> +	if (!layoutcommit_needed(nfsi)) {
>> +		spin_unlock(&nfsi->lo_lock);
>> +		goto out_free;
>> +	}
>>  
>> +	/* Set up layout commit args */
>> +	status = pnfs_layoutcommit_setup(inode, data, sync);
>>  	if (status) {
>>  		/* The layout driver failed to setup the layoutcommit */
>>  		put_rpccred(data->cred);
>> -		goto out_unlock;
>> +		goto out_free;
>>  	}
>> -
>> -	/* release lock on pnfs layoutcommit attrs */
>> -	spin_unlock(&nfsi->lo_lock);
>> -
>> -	data->is_sync = sync;
>>  	status = pnfs4_proc_layoutcommit(data);
>>  out:
>>  	dprintk("%s end (err:%d)\n", __func__, status);
>>  	return status;
>> -out_unlock:
>> +out_free:
>>  	pnfs_layoutcommit_free(data);
>> -	spin_unlock(&nfsi->lo_lock);
>>  	goto out;
>>  }
>>  
> 
> SQUASHME: apply this on top of: pnfs: unlock lo_lock spinlock before calling layoutdriver's setup_layoutcommit
> 
> (BTW subject line too long see above)
> 
> lock/unlock on same call sight. it is also much more clear what is protected by the spinlock which is
> the write_begin/end_pos and most importantly the nfsi->lo_cred which is also the state variable.
> (layoutcommit_needed)
> 
> I'm also sending a [PATCH -v3] which is a squash of this with Toa's patch.
> 
> ---
> git diff --stat -p -M fs/nfs/pnfs.c
>  fs/nfs/pnfs.c |   37 ++++++++++++++++++++++---------------
>  1 files changed, 22 insertions(+), 15 deletions(-)
> 
> diff --git a/fs/nfs/pnfs.c b/fs/nfs/pnfs.c
> index bbd1548..88d4865 100644
> --- a/fs/nfs/pnfs.c
> +++ b/fs/nfs/pnfs.c
> @@ -2076,7 +2076,8 @@ pnfs_layoutcommit_done(struct pnfs_layoutcommit_data *data)
>   */
>  static int
>  pnfs_layoutcommit_setup(struct inode *inode,
> -			struct pnfs_layoutcommit_data *data, int sync)
> +			struct pnfs_layoutcommit_data *data,
> +			loff_t write_begin_pos, loff_t write_end_pos, int sync)
>  {
>  	struct nfs_inode *nfsi = NFS_I(inode);
>  	struct nfs_server *nfss = NFS_SERVER(inode);
> @@ -2099,22 +2100,13 @@ pnfs_layoutcommit_setup(struct inode *inode,
>  	/* Set values from inode so it can be reset
>  	 */
>  	data->args.lseg.iomode = IOMODE_RW;
> -	data->args.lseg.offset = nfsi->pnfs_write_begin_pos;
> -	data->args.lseg.length = nfsi->pnfs_write_end_pos - nfsi->pnfs_write_begin_pos + 1;
> -	data->args.lastbytewritten =  min(nfsi->pnfs_write_end_pos,
> -					i_size_read(&nfsi->vfs_inode) - 1);
> +	data->args.lseg.offset = write_begin_pos;
> +	data->args.lseg.length = write_end_pos - write_begin_pos + 1;
> +	data->args.lastbytewritten =  min(write_end_pos,
> +					  i_size_read(&nfsi->vfs_inode) - 1);
>  	data->args.bitmask = nfss->attr_bitmask;
>  	data->res.server = nfss;
>  
> -	/* Clear layoutcommit properties in the inode so
> -	 * new lc info can be generated
> -	 */
> -	nfsi->pnfs_write_begin_pos = 0;
> -	nfsi->pnfs_write_end_pos = 0;
> -	nfsi->lo_cred = NULL;
> -
> -	spin_unlock(&nfsi->lo_lock);
> -
>  	/* Call layout driver to set the arguments.
>  	 */
>  	if (nfss->pnfs_curr_ld->ld_io_ops->setup_layoutcommit)
> @@ -2132,6 +2124,9 @@ pnfs_layoutcommit_inode(struct inode *inode, int sync)
>  {
>  	struct pnfs_layoutcommit_data *data;
>  	struct nfs_inode *nfsi = NFS_I(inode);
> +	loff_t write_begin_pos;
> +	loff_t write_end_pos;
> +
>  	int status = 0;
>  
>  	dprintk("%s Begin (sync:%d)\n", __func__, sync);
> @@ -2148,8 +2143,20 @@ pnfs_layoutcommit_inode(struct inode *inode, int sync)
>  		goto out_free;
>  	}
>  
> +	/* Clear layoutcommit properties in the inode so
> +	 * new lc info can be generated
> +	 */
> +	write_begin_pos = nfsi->pnfs_write_begin_pos;
> +	write_end_pos = nfsi->pnfs_write_end_pos;
> +	nfsi->pnfs_write_begin_pos = 0;
> +	nfsi->pnfs_write_end_pos = 0;
> +	nfsi->lo_cred = NULL;
> +
> +	spin_unlock(&nfsi->lo_lock);
> +
>  	/* Set up layout commit args */
> -	status = pnfs_layoutcommit_setup(inode, data, sync);
> +	status = pnfs_layoutcommit_setup(inode, data, write_begin_pos,
> +					 write_end_pos, sync);
>  	if (status) {
>  		/* The layout driver failed to setup the layoutcommit */
>  		put_rpccred(data->cred);
> 
> 

So that had a bug, should test before posting. Here is a 3rd squashme
on top of my squashme. (Am sending a v3 yet)

Also probably pnfs_get_layout_stateid should be under the lock, so
fix that too.

Boaz
---
git diff --stat -p -M fs/nfs/pnfs.c
 fs/nfs/pnfs.c |    8 ++++----
 1 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/fs/nfs/pnfs.c b/fs/nfs/pnfs.c
index 88d4865..cf9cfe5 100644
--- a/fs/nfs/pnfs.c
+++ b/fs/nfs/pnfs.c
@@ -2086,11 +2086,9 @@ pnfs_layoutcommit_setup(struct inode *inode,
 	dprintk("%s Begin (sync:%d)\n", __func__, sync);
 
 	data->is_sync = sync;
-	data->cred = nfsi->lo_cred;
 	data->args.inode = inode;
-	data->args.fh = NFS_FH(data->args.inode);
+	data->args.fh = NFS_FH(inode);
 	data->args.layout_type = nfss->pnfs_curr_ld->id;
-	pnfs_get_layout_stateid(&data->args.stateid, &nfsi->layout);
 	data->res.fattr = &data->fattr;
 	nfs_fattr_init(&data->fattr);
 
@@ -2103,7 +2101,7 @@ pnfs_layoutcommit_setup(struct inode *inode,
 	data->args.lseg.offset = write_begin_pos;
 	data->args.lseg.length = write_end_pos - write_begin_pos + 1;
 	data->args.lastbytewritten =  min(write_end_pos,
-					  i_size_read(&nfsi->vfs_inode) - 1);
+					  i_size_read(inode) - 1);
 	data->args.bitmask = nfss->attr_bitmask;
 	data->res.server = nfss;
 
@@ -2148,9 +2146,11 @@ pnfs_layoutcommit_inode(struct inode *inode, int sync)
 	 */
 	write_begin_pos = nfsi->pnfs_write_begin_pos;
 	write_end_pos = nfsi->pnfs_write_end_pos;
+	data->cred = nfsi->lo_cred;
 	nfsi->pnfs_write_begin_pos = 0;
 	nfsi->pnfs_write_end_pos = 0;
 	nfsi->lo_cred = NULL;
+	pnfs_get_layout_stateid(&data->args.stateid, &nfsi->layout);
 
 	spin_unlock(&nfsi->lo_lock);
 



^ permalink raw reply related	[flat|nested] 8+ messages in thread

* [PATCH v3] SQUASHME: pnfs: unlock lo_lock before calling layoutdriver's setup_layoutcommit
  2010-05-25  8:51 [PATCH -v2] pnfs: unlock lo_lock spinlock before calling specific layoutdriver's setup_layoutcommit() operation Tao Guo
  2010-05-25 13:01 ` Boaz Harrosh
@ 2010-05-25 13:33 ` Boaz Harrosh
  2010-05-25 14:40   ` Benny Halevy
  1 sibling, 1 reply; 8+ messages in thread
From: Boaz Harrosh @ 2010-05-25 13:33 UTC (permalink / raw)
  To: Tao Guo; +Cc: linux-nfs, Benny Halevy

From: Tao Guo <guotao-U4AKAne5IzAR5TUyvShJeg@public.gmane.org>

So in blocklayoutdriver, we can use GFP_KERNEL to do memory
allocation in bl_setup_layoutcommit().

The state protected by the lo_lock here is clear now, which is the
layout_commit's position and state. .i.e write_begin/end_pos,
nfsi->lo_cred, and the call to pnfs_get_layout_stateid.

Signed-off-by: Tao Guo <guotao-U4AKAne5IzAR5TUyvShJeg@public.gmane.org>
Signed-off-by: Boaz Harrosh <bharrosh@panasas.com>
---
 fs/nfs/pnfs.c |   66 +++++++++++++++++++++++++++++---------------------------
 1 files changed, 34 insertions(+), 32 deletions(-)

diff --git a/fs/nfs/pnfs.c b/fs/nfs/pnfs.c
index d4e4ba9..cf9cfe5 100644
--- a/fs/nfs/pnfs.c
+++ b/fs/nfs/pnfs.c
@@ -2075,15 +2075,22 @@ pnfs_layoutcommit_done(struct pnfs_layoutcommit_data *data)
  * Set up the argument/result storage required for the RPC call.
  */
 static int
-pnfs_layoutcommit_setup(struct pnfs_layoutcommit_data *data, int sync)
+pnfs_layoutcommit_setup(struct inode *inode,
+			struct pnfs_layoutcommit_data *data,
+			loff_t write_begin_pos, loff_t write_end_pos, int sync)
 {
-	struct nfs_inode *nfsi = NFS_I(data->args.inode);
-	struct nfs_server *nfss = NFS_SERVER(data->args.inode);
+	struct nfs_inode *nfsi = NFS_I(inode);
+	struct nfs_server *nfss = NFS_SERVER(inode);
 	int result = 0;
 
 	dprintk("%s Begin (sync:%d)\n", __func__, sync);
-	data->args.fh = NFS_FH(data->args.inode);
+
+	data->is_sync = sync;
+	data->args.inode = inode;
+	data->args.fh = NFS_FH(inode);
 	data->args.layout_type = nfss->pnfs_curr_ld->id;
+	data->res.fattr = &data->fattr;
+	nfs_fattr_init(&data->fattr);
 
 	/* TODO: Need to determine the correct values */
 	data->args.time_modify_changed = 0;
@@ -2091,26 +2098,19 @@ pnfs_layoutcommit_setup(struct pnfs_layoutcommit_data *data, int sync)
 	/* Set values from inode so it can be reset
 	 */
 	data->args.lseg.iomode = IOMODE_RW;
-	data->args.lseg.offset = nfsi->pnfs_write_begin_pos;
-	data->args.lseg.length = nfsi->pnfs_write_end_pos - nfsi->pnfs_write_begin_pos + 1;
-	data->args.lastbytewritten =  min(nfsi->pnfs_write_end_pos,
-					i_size_read(&nfsi->vfs_inode) - 1);
+	data->args.lseg.offset = write_begin_pos;
+	data->args.lseg.length = write_end_pos - write_begin_pos + 1;
+	data->args.lastbytewritten =  min(write_end_pos,
+					  i_size_read(inode) - 1);
 	data->args.bitmask = nfss->attr_bitmask;
 	data->res.server = nfss;
 
 	/* Call layout driver to set the arguments.
 	 */
-	if (nfss->pnfs_curr_ld->ld_io_ops->setup_layoutcommit) {
+	if (nfss->pnfs_curr_ld->ld_io_ops->setup_layoutcommit)
 		result = nfss->pnfs_curr_ld->ld_io_ops->setup_layoutcommit(
 				&nfsi->layout, &data->args);
-		if (result)
-			goto out;
-	}
-	pnfs_get_layout_stateid(&data->args.stateid, &nfsi->layout);
-	data->res.fattr = &data->fattr;
-	nfs_fattr_init(&data->fattr);
 
-out:
 	dprintk("%s End Status %d\n", __func__, result);
 	return result;
 }
@@ -2122,6 +2122,9 @@ pnfs_layoutcommit_inode(struct inode *inode, int sync)
 {
 	struct pnfs_layoutcommit_data *data;
 	struct nfs_inode *nfsi = NFS_I(inode);
+	loff_t write_begin_pos;
+	loff_t write_end_pos;
+
 	int status = 0;
 
 	dprintk("%s Begin (sync:%d)\n", __func__, sync);
@@ -2133,39 +2136,38 @@ pnfs_layoutcommit_inode(struct inode *inode, int sync)
 		return -ENOMEM;
 
 	spin_lock(&nfsi->lo_lock);
-	if (!layoutcommit_needed(nfsi))
-		goto out_unlock;
-
-	data->args.inode = inode;
-	data->cred = nfsi->lo_cred;
-
-	/* Set up layout commit args*/
-	status = pnfs_layoutcommit_setup(data, sync);
+	if (!layoutcommit_needed(nfsi)) {
+		spin_unlock(&nfsi->lo_lock);
+		goto out_free;
+	}
 
 	/* Clear layoutcommit properties in the inode so
 	 * new lc info can be generated
 	 */
+	write_begin_pos = nfsi->pnfs_write_begin_pos;
+	write_end_pos = nfsi->pnfs_write_end_pos;
+	data->cred = nfsi->lo_cred;
 	nfsi->pnfs_write_begin_pos = 0;
 	nfsi->pnfs_write_end_pos = 0;
 	nfsi->lo_cred = NULL;
+	pnfs_get_layout_stateid(&data->args.stateid, &nfsi->layout);
 
+	spin_unlock(&nfsi->lo_lock);
+
+	/* Set up layout commit args */
+	status = pnfs_layoutcommit_setup(inode, data, write_begin_pos,
+					 write_end_pos, sync);
 	if (status) {
 		/* The layout driver failed to setup the layoutcommit */
 		put_rpccred(data->cred);
-		goto out_unlock;
+		goto out_free;
 	}
-
-	/* release lock on pnfs layoutcommit attrs */
-	spin_unlock(&nfsi->lo_lock);
-
-	data->is_sync = sync;
 	status = pnfs4_proc_layoutcommit(data);
 out:
 	dprintk("%s end (err:%d)\n", __func__, status);
 	return status;
-out_unlock:
+out_free:
 	pnfs_layoutcommit_free(data);
-	spin_unlock(&nfsi->lo_lock);
 	goto out;
 }
 
-- 
1.6.6.1



^ permalink raw reply related	[flat|nested] 8+ messages in thread

* Re: [PATCH v3] SQUASHME: pnfs: unlock lo_lock before calling layoutdriver's setup_layoutcommit
  2010-05-25 13:33 ` [PATCH v3] SQUASHME: pnfs: unlock lo_lock before calling layoutdriver's setup_layoutcommit Boaz Harrosh
@ 2010-05-25 14:40   ` Benny Halevy
  2010-05-25 15:26     ` Tao Guo
  0 siblings, 1 reply; 8+ messages in thread
From: Benny Halevy @ 2010-05-25 14:40 UTC (permalink / raw)
  To: Boaz Harrosh, Tao Guo; +Cc: linux-nfs

Boaz Harrosh wrote:
> From: Tao Guo <guotao-U4AKAne5IzAR5TUyvShJeg@public.gmane.org>
> 
> So in blocklayoutdriver, we can use GFP_KERNEL to do memory
> allocation in bl_setup_layoutcommit().
> 
> The state protected by the lo_lock here is clear now, which is the
> layout_commit's position and state. .i.e write_begin/end_pos,
> nfsi->lo_cred, and the call to pnfs_get_layout_stateid.

Yeah, this looks cleaner.
Tao, can you please test and ack this patch before I merge it?

Thanks!

Benny

> 
> Signed-off-by: Tao Guo <guotao-U4AKAne5IzAR5TUyvShJeg@public.gmane.org>
> Signed-off-by: Boaz Harrosh <bharrosh@panasas.com>
> ---
>  fs/nfs/pnfs.c |   66 +++++++++++++++++++++++++++++---------------------------
>  1 files changed, 34 insertions(+), 32 deletions(-)
> 
> diff --git a/fs/nfs/pnfs.c b/fs/nfs/pnfs.c
> index d4e4ba9..cf9cfe5 100644
> --- a/fs/nfs/pnfs.c
> +++ b/fs/nfs/pnfs.c
> @@ -2075,15 +2075,22 @@ pnfs_layoutcommit_done(struct pnfs_layoutcommit_data *data)
>   * Set up the argument/result storage required for the RPC call.
>   */
>  static int
> -pnfs_layoutcommit_setup(struct pnfs_layoutcommit_data *data, int sync)
> +pnfs_layoutcommit_setup(struct inode *inode,
> +			struct pnfs_layoutcommit_data *data,
> +			loff_t write_begin_pos, loff_t write_end_pos, int sync)
>  {
> -	struct nfs_inode *nfsi = NFS_I(data->args.inode);
> -	struct nfs_server *nfss = NFS_SERVER(data->args.inode);
> +	struct nfs_inode *nfsi = NFS_I(inode);
> +	struct nfs_server *nfss = NFS_SERVER(inode);
>  	int result = 0;
>  
>  	dprintk("%s Begin (sync:%d)\n", __func__, sync);
> -	data->args.fh = NFS_FH(data->args.inode);
> +
> +	data->is_sync = sync;
> +	data->args.inode = inode;
> +	data->args.fh = NFS_FH(inode);
>  	data->args.layout_type = nfss->pnfs_curr_ld->id;
> +	data->res.fattr = &data->fattr;
> +	nfs_fattr_init(&data->fattr);
>  
>  	/* TODO: Need to determine the correct values */
>  	data->args.time_modify_changed = 0;
> @@ -2091,26 +2098,19 @@ pnfs_layoutcommit_setup(struct pnfs_layoutcommit_data *data, int sync)
>  	/* Set values from inode so it can be reset
>  	 */
>  	data->args.lseg.iomode = IOMODE_RW;
> -	data->args.lseg.offset = nfsi->pnfs_write_begin_pos;
> -	data->args.lseg.length = nfsi->pnfs_write_end_pos - nfsi->pnfs_write_begin_pos + 1;
> -	data->args.lastbytewritten =  min(nfsi->pnfs_write_end_pos,
> -					i_size_read(&nfsi->vfs_inode) - 1);
> +	data->args.lseg.offset = write_begin_pos;
> +	data->args.lseg.length = write_end_pos - write_begin_pos + 1;
> +	data->args.lastbytewritten =  min(write_end_pos,
> +					  i_size_read(inode) - 1);
>  	data->args.bitmask = nfss->attr_bitmask;
>  	data->res.server = nfss;
>  
>  	/* Call layout driver to set the arguments.
>  	 */
> -	if (nfss->pnfs_curr_ld->ld_io_ops->setup_layoutcommit) {
> +	if (nfss->pnfs_curr_ld->ld_io_ops->setup_layoutcommit)
>  		result = nfss->pnfs_curr_ld->ld_io_ops->setup_layoutcommit(
>  				&nfsi->layout, &data->args);
> -		if (result)
> -			goto out;
> -	}
> -	pnfs_get_layout_stateid(&data->args.stateid, &nfsi->layout);
> -	data->res.fattr = &data->fattr;
> -	nfs_fattr_init(&data->fattr);
>  
> -out:
>  	dprintk("%s End Status %d\n", __func__, result);
>  	return result;
>  }
> @@ -2122,6 +2122,9 @@ pnfs_layoutcommit_inode(struct inode *inode, int sync)
>  {
>  	struct pnfs_layoutcommit_data *data;
>  	struct nfs_inode *nfsi = NFS_I(inode);
> +	loff_t write_begin_pos;
> +	loff_t write_end_pos;
> +
>  	int status = 0;
>  
>  	dprintk("%s Begin (sync:%d)\n", __func__, sync);
> @@ -2133,39 +2136,38 @@ pnfs_layoutcommit_inode(struct inode *inode, int sync)
>  		return -ENOMEM;
>  
>  	spin_lock(&nfsi->lo_lock);
> -	if (!layoutcommit_needed(nfsi))
> -		goto out_unlock;
> -
> -	data->args.inode = inode;
> -	data->cred = nfsi->lo_cred;
> -
> -	/* Set up layout commit args*/
> -	status = pnfs_layoutcommit_setup(data, sync);
> +	if (!layoutcommit_needed(nfsi)) {
> +		spin_unlock(&nfsi->lo_lock);
> +		goto out_free;
> +	}
>  
>  	/* Clear layoutcommit properties in the inode so
>  	 * new lc info can be generated
>  	 */
> +	write_begin_pos = nfsi->pnfs_write_begin_pos;
> +	write_end_pos = nfsi->pnfs_write_end_pos;
> +	data->cred = nfsi->lo_cred;
>  	nfsi->pnfs_write_begin_pos = 0;
>  	nfsi->pnfs_write_end_pos = 0;
>  	nfsi->lo_cred = NULL;
> +	pnfs_get_layout_stateid(&data->args.stateid, &nfsi->layout);
>  
> +	spin_unlock(&nfsi->lo_lock);
> +
> +	/* Set up layout commit args */
> +	status = pnfs_layoutcommit_setup(inode, data, write_begin_pos,
> +					 write_end_pos, sync);
>  	if (status) {
>  		/* The layout driver failed to setup the layoutcommit */
>  		put_rpccred(data->cred);
> -		goto out_unlock;
> +		goto out_free;
>  	}
> -
> -	/* release lock on pnfs layoutcommit attrs */
> -	spin_unlock(&nfsi->lo_lock);
> -
> -	data->is_sync = sync;
>  	status = pnfs4_proc_layoutcommit(data);
>  out:
>  	dprintk("%s end (err:%d)\n", __func__, status);
>  	return status;
> -out_unlock:
> +out_free:
>  	pnfs_layoutcommit_free(data);
> -	spin_unlock(&nfsi->lo_lock);
>  	goto out;
>  }
>  


^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH v3] SQUASHME: pnfs: unlock lo_lock before calling layoutdriver's setup_layoutcommit
  2010-05-25 14:40   ` Benny Halevy
@ 2010-05-25 15:26     ` Tao Guo
       [not found]       ` <AANLkTik8xzvd8vahf_tm-9UyauObg5ES3gmyFOXZy3MJ-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
  0 siblings, 1 reply; 8+ messages in thread
From: Tao Guo @ 2010-05-25 15:26 UTC (permalink / raw)
  To: Benny Halevy; +Cc: Boaz Harrosh, linux-nfs

On Tue, May 25, 2010 at 10:40 PM, Benny Halevy <bhalevy@panasas.com> wrote:
> Boaz Harrosh wrote:
>> From: Tao Guo <guotao-U4AKAne5IzAR5TUyvShJeg@public.gmane.org>
>>
>> So in blocklayoutdriver, we can use GFP_KERNEL to do memory
>> allocation in bl_setup_layoutcommit().
>>
>> The state protected by the lo_lock here is clear now, which is the
>> layout_commit's position and state. .i.e write_begin/end_pos,
>> nfsi->lo_cred, and the call to pnfs_get_layout_stateid.
>
> Yeah, this looks cleaner.
Yes, thanks.
> Tao, can you please test and ack this patch before I merge it?
>
> Thanks!
>
> Benny
>
Ok, I will test it tomorrow morning.
-- 
Tao.

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH v3] SQUASHME: pnfs: unlock lo_lock before calling layoutdriver's setup_layoutcommit
       [not found]       ` <AANLkTik8xzvd8vahf_tm-9UyauObg5ES3gmyFOXZy3MJ-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
@ 2010-05-26  1:15         ` Tao Guo
       [not found]           ` <AANLkTimR9XBYuja0kj_8LEv-F1_9kbHQ97bcYcnTj4tI-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
  0 siblings, 1 reply; 8+ messages in thread
From: Tao Guo @ 2010-05-26  1:15 UTC (permalink / raw)
  To: Benny Halevy; +Cc: Boaz Harrosh, linux-nfs

On Tue, May 25, 2010 at 11:26 PM, Tao Guo <guotao-U4AKAne5IzAR5TUyvShJeg@public.gmane.org> wrote:
> On Tue, May 25, 2010 at 10:40 PM, Benny Halevy <bhalevy@panasas.com> wrote:
>> Boaz Harrosh wrote:
>>> From: Tao Guo <guotao-U4AKAne5IzAR5TUyvShJeg@public.gmane.org>
>>>
>>> So in blocklayoutdriver, we can use GFP_KERNEL to do memory
>>> allocation in bl_setup_layoutcommit().
>>>
>>> The state protected by the lo_lock here is clear now, which is the
>>> layout_commit's position and state. .i.e write_begin/end_pos,
>>> nfsi->lo_cred, and the call to pnfs_get_layout_stateid.
>>
>> Yeah, this looks cleaner.
> Yes, thanks.
>> Tao, can you please test and ack this patch before I merge it?
>>
>> Thanks!
>>
>> Benny
I have tested it, it is OK.

Tao
>

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH v3] SQUASHME: pnfs: unlock lo_lock before calling  layoutdriver's setup_layoutcommit
       [not found]           ` <AANLkTimR9XBYuja0kj_8LEv-F1_9kbHQ97bcYcnTj4tI-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
@ 2010-05-27 18:07             ` Benny Halevy
  0 siblings, 0 replies; 8+ messages in thread
From: Benny Halevy @ 2010-05-27 18:07 UTC (permalink / raw)
  To: Tao Guo; +Cc: Boaz Harrosh, linux-nfs

On May. 26, 2010, 4:15 +0300, Tao Guo <guotao-U4AKAne5IzAR5TUyvShJeg@public.gmane.org> wrote:
> On Tue, May 25, 2010 at 11:26 PM, Tao Guo <guotao-U4AKAne5IzAR5TUyvShJeg@public.gmane.org> wrote:
>> On Tue, May 25, 2010 at 10:40 PM, Benny Halevy <bhalevy@panasas.com> wrote:
>>> Boaz Harrosh wrote:
>>>> From: Tao Guo <guotao-U4AKAne5IzAR5TUyvShJeg@public.gmane.org>
>>>>
>>>> So in blocklayoutdriver, we can use GFP_KERNEL to do memory
>>>> allocation in bl_setup_layoutcommit().
>>>>
>>>> The state protected by the lo_lock here is clear now, which is the
>>>> layout_commit's position and state. .i.e write_begin/end_pos,
>>>> nfsi->lo_cred, and the call to pnfs_get_layout_stateid.
>>>
>>> Yeah, this looks cleaner.
>> Yes, thanks.
>>> Tao, can you please test and ack this patch before I merge it?
>>>
>>> Thanks!
>>>
>>> Benny
> I have tested it, it is OK.
> 
> Tao
>>

Great, Thanks!
I merged this patch for both the 2.6.34 pnfs-all-latest tree
and pnfs-all-2.6.33.

Benny

^ permalink raw reply	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2010-05-27 18:07 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2010-05-25  8:51 [PATCH -v2] pnfs: unlock lo_lock spinlock before calling specific layoutdriver's setup_layoutcommit() operation Tao Guo
2010-05-25 13:01 ` Boaz Harrosh
2010-05-25 13:23   ` Boaz Harrosh
2010-05-25 13:33 ` [PATCH v3] SQUASHME: pnfs: unlock lo_lock before calling layoutdriver's setup_layoutcommit Boaz Harrosh
2010-05-25 14:40   ` Benny Halevy
2010-05-25 15:26     ` Tao Guo
     [not found]       ` <AANLkTik8xzvd8vahf_tm-9UyauObg5ES3gmyFOXZy3MJ-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2010-05-26  1:15         ` Tao Guo
     [not found]           ` <AANLkTimR9XBYuja0kj_8LEv-F1_9kbHQ97bcYcnTj4tI-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2010-05-27 18:07             ` Benny Halevy

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).