linux-nfs.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] nfsd: restore owner override for truncate
@ 2017-02-09 14:22 Christoph Hellwig
  2017-02-09 15:56 ` Chuck Lever
                   ` (2 more replies)
  0 siblings, 3 replies; 7+ messages in thread
From: Christoph Hellwig @ 2017-02-09 14:22 UTC (permalink / raw)
  To: bfields; +Cc: chucklever, linux-nfs

The switch to vfs_truncate in nfsd_setattr dropped the owner override
used for NFS permissions.  Add a copy of vfs_truncate with it restored
to the nfsd code for now as it's very late in the cycle, but there
should be a way to consolidate it back in the future.

Fixes: 41f53350 ("nfsd: special case truncates some more")
Signed-off-by: Christoph Hellwig <hch@lst.de>
Reported-by: Chuck Lever <chucklever@gmail.com>
---
 fs/nfsd/vfs.c | 81 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 80 insertions(+), 1 deletion(-)

diff --git a/fs/nfsd/vfs.c b/fs/nfsd/vfs.c
index a974368026a1..fd4a32e0b0b4 100644
--- a/fs/nfsd/vfs.c
+++ b/fs/nfsd/vfs.c
@@ -332,6 +332,85 @@ nfsd_sanitize_attrs(struct inode *inode, struct iattr *iap)
 	}
 }
 
+/* copy of vfs_truncate with NFS owner override hacked in, sigh.. */
+static long nfsd_truncate(const struct path *path, loff_t length)
+{
+	struct inode *inode;
+	struct dentry *upperdentry;
+	long error;
+
+	inode = path->dentry->d_inode;
+
+	/* For directories it's -EISDIR, for other non-regulars - -EINVAL */
+	if (S_ISDIR(inode->i_mode))
+		return -EISDIR;
+	if (!S_ISREG(inode->i_mode))
+		return -EINVAL;
+
+	error = mnt_want_write(path->mnt);
+	if (error)
+		goto out;
+
+	/*
+	 * The file owner always gets access permission for accesses that
+	 * would normally be checked at open time. This is to make
+	 * file access work even when the client has done a fchmod(fd, 0).
+	 *
+	 * However, `cp foo bar' should fail nevertheless when bar is
+	 * readonly. A sensible way to do this might be to reject all
+	 * attempts to truncate a read-only file, because a creat() call
+	 * always implies file truncation.
+	 * ... but this isn't really fair.  A process may reasonably call
+	 * ftruncate on an open file descriptor on a file with perm 000.
+	 * We must trust the client to do permission checking - using "ACCESS"
+	 * with NFSv3.
+	 */
+	if (!uid_eq(inode->i_uid, current_fsuid())) {
+		error = inode_permission(inode, MAY_WRITE);
+		if (error)
+			goto mnt_drop_write_and_out;
+	}
+
+	error = -EPERM;
+	if (IS_APPEND(inode))
+		goto mnt_drop_write_and_out;
+
+	/*
+	 * If this is an overlayfs then do as if opening the file so we get
+	 * write access on the upper inode, not on the overlay inode.  For
+	 * non-overlay filesystems d_real() is an identity function.
+	 */
+	upperdentry = d_real(path->dentry, NULL, O_WRONLY);
+	error = PTR_ERR(upperdentry);
+	if (IS_ERR(upperdentry))
+		goto mnt_drop_write_and_out;
+
+	error = get_write_access(upperdentry->d_inode);
+	if (error)
+		goto mnt_drop_write_and_out;
+
+	/*
+	 * Make sure that there are no leases.  get_write_access() protects
+	 * against the truncate racing with a lease-granting setlease().
+	 */
+	error = break_lease(inode, O_WRONLY);
+	if (error)
+		goto put_write_and_out;
+
+	error = locks_verify_truncate(inode, NULL, length);
+	if (!error)
+		error = security_path_truncate(path);
+	if (!error)
+		error = do_truncate(path->dentry, length, 0, NULL);
+
+put_write_and_out:
+	put_write_access(upperdentry->d_inode);
+mnt_drop_write_and_out:
+	mnt_drop_write(path->mnt);
+out:
+	return error;
+}
+
 /*
  * Set various file attributes.  After this call fhp needs an fh_put.
  */
@@ -398,7 +477,7 @@ nfsd_setattr(struct svc_rqst *rqstp, struct svc_fh *fhp, struct iattr *iap,
 		    ((iap->ia_valid & ~(ATTR_SIZE | ATTR_MTIME)) == 0))
 			implicit_mtime = true;
 
-		host_err = vfs_truncate(&path, iap->ia_size);
+		host_err = nfsd_truncate(&path, iap->ia_size);
 		if (host_err)
 			goto out_host_err;
 
-- 
2.11.0


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

* Re: [PATCH] nfsd: restore owner override for truncate
  2017-02-09 14:22 [PATCH] nfsd: restore owner override for truncate Christoph Hellwig
@ 2017-02-09 15:56 ` Chuck Lever
  2017-02-09 16:01 ` J. Bruce Fields
  2017-02-09 23:56 ` kbuild test robot
  2 siblings, 0 replies; 7+ messages in thread
From: Chuck Lever @ 2017-02-09 15:56 UTC (permalink / raw)
  To: Christoph Hellwig; +Cc: J. Bruce Fields, Linux NFS Mailing List


> On Feb 9, 2017, at 9:22 AM, Christoph Hellwig <hch@lst.de> wrote:
>=20
> The switch to vfs_truncate in nfsd_setattr dropped the owner override
> used for NFS permissions.  Add a copy of vfs_truncate with it restored
> to the nfsd code for now as it's very late in the cycle, but there
> should be a way to consolidate it back in the future.
>=20
> Fixes: 41f53350 ("nfsd: special case truncates some more")
> Signed-off-by: Christoph Hellwig <hch@lst.de>
> Reported-by: Chuck Lever <chucklever@gmail.com>
> ---
> fs/nfsd/vfs.c | 81 =
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-
> 1 file changed, 80 insertions(+), 1 deletion(-)
>=20
> diff --git a/fs/nfsd/vfs.c b/fs/nfsd/vfs.c
> index a974368026a1..fd4a32e0b0b4 100644
> --- a/fs/nfsd/vfs.c
> +++ b/fs/nfsd/vfs.c
> @@ -332,6 +332,85 @@ nfsd_sanitize_attrs(struct inode *inode, struct =
iattr *iap)
> 	}
> }
>=20
> +/* copy of vfs_truncate with NFS owner override hacked in, sigh.. */
> +static long nfsd_truncate(const struct path *path, loff_t length)
> +{
> +	struct inode *inode;
> +	struct dentry *upperdentry;
> +	long error;
> +
> +	inode =3D path->dentry->d_inode;
> +
> +	/* For directories it's -EISDIR, for other non-regulars - =
-EINVAL */
> +	if (S_ISDIR(inode->i_mode))
> +		return -EISDIR;
> +	if (!S_ISREG(inode->i_mode))
> +		return -EINVAL;
> +
> +	error =3D mnt_want_write(path->mnt);
> +	if (error)
> +		goto out;
> +
> +	/*
> +	 * The file owner always gets access permission for accesses =
that
> +	 * would normally be checked at open time. This is to make
> +	 * file access work even when the client has done a fchmod(fd, =
0).
> +	 *
> +	 * However, `cp foo bar' should fail nevertheless when bar is
> +	 * readonly. A sensible way to do this might be to reject all
> +	 * attempts to truncate a read-only file, because a creat() call
> +	 * always implies file truncation.
> +	 * ... but this isn't really fair.  A process may reasonably =
call
> +	 * ftruncate on an open file descriptor on a file with perm 000.
> +	 * We must trust the client to do permission checking - using =
"ACCESS"
> +	 * with NFSv3.
> +	 */
> +	if (!uid_eq(inode->i_uid, current_fsuid())) {
> +		error =3D inode_permission(inode, MAY_WRITE);
> +		if (error)
> +			goto mnt_drop_write_and_out;
> +	}
> +
> +	error =3D -EPERM;
> +	if (IS_APPEND(inode))
> +		goto mnt_drop_write_and_out;
> +
> +	/*
> +	 * If this is an overlayfs then do as if opening the file so we =
get
> +	 * write access on the upper inode, not on the overlay inode.  =
For
> +	 * non-overlay filesystems d_real() is an identity function.
> +	 */
> +	upperdentry =3D d_real(path->dentry, NULL, O_WRONLY);
> +	error =3D PTR_ERR(upperdentry);
> +	if (IS_ERR(upperdentry))
> +		goto mnt_drop_write_and_out;
> +
> +	error =3D get_write_access(upperdentry->d_inode);
> +	if (error)
> +		goto mnt_drop_write_and_out;
> +
> +	/*
> +	 * Make sure that there are no leases.  get_write_access() =
protects
> +	 * against the truncate racing with a lease-granting setlease().
> +	 */
> +	error =3D break_lease(inode, O_WRONLY);
> +	if (error)
> +		goto put_write_and_out;
> +
> +	error =3D locks_verify_truncate(inode, NULL, length);
> +	if (!error)
> +		error =3D security_path_truncate(path);
> +	if (!error)
> +		error =3D do_truncate(path->dentry, length, 0, NULL);

do_truncate does not seem to be available in the EXPORT_SYMBOL pool.


> +
> +put_write_and_out:
> +	put_write_access(upperdentry->d_inode);
> +mnt_drop_write_and_out:
> +	mnt_drop_write(path->mnt);
> +out:
> +	return error;
> +}
> +
> /*
>  * Set various file attributes.  After this call fhp needs an fh_put.
>  */
> @@ -398,7 +477,7 @@ nfsd_setattr(struct svc_rqst *rqstp, struct svc_fh =
*fhp, struct iattr *iap,
> 		    ((iap->ia_valid & ~(ATTR_SIZE | ATTR_MTIME)) =3D=3D =
0))
> 			implicit_mtime =3D true;
>=20
> -		host_err =3D vfs_truncate(&path, iap->ia_size);
> +		host_err =3D nfsd_truncate(&path, iap->ia_size);
> 		if (host_err)
> 			goto out_host_err;
>=20
> --=20
> 2.11.0
>=20
> --
> To unsubscribe from this list: send the line "unsubscribe linux-nfs" =
in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html

--
Chuck Lever
chucklever@gmail.com




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

* Re: [PATCH] nfsd: restore owner override for truncate
  2017-02-09 14:22 [PATCH] nfsd: restore owner override for truncate Christoph Hellwig
  2017-02-09 15:56 ` Chuck Lever
@ 2017-02-09 16:01 ` J. Bruce Fields
  2017-02-09 16:01   ` Christoph Hellwig
                     ` (2 more replies)
  2017-02-09 23:56 ` kbuild test robot
  2 siblings, 3 replies; 7+ messages in thread
From: J. Bruce Fields @ 2017-02-09 16:01 UTC (permalink / raw)
  To: Christoph Hellwig; +Cc: chucklever, linux-nfs

On Thu, Feb 09, 2017 at 03:22:38PM +0100, Christoph Hellwig wrote:
> The switch to vfs_truncate in nfsd_setattr dropped the owner override
> used for NFS permissions.  Add a copy of vfs_truncate with it restored
> to the nfsd code for now as it's very late in the cycle, but there
> should be a way to consolidate it back in the future.

This also needs:


diff --git a/fs/open.c b/fs/open.c
index 9921f70bc5ca..5d8126b230d9 100644
--- a/fs/open.c
+++ b/fs/open.c
@@ -64,6 +64,7 @@ int do_truncate(struct dentry *dentry, loff_t length, unsigned int time_attrs,
 	inode_unlock(dentry->d_inode);
 	return ret;
 }
+EXPORT_SYMBOL_GPL(do_truncate);
 
 long vfs_truncate(const struct path *path, loff_t length)
 {

--b.

> 
> Fixes: 41f53350 ("nfsd: special case truncates some more")
> Signed-off-by: Christoph Hellwig <hch@lst.de>
> Reported-by: Chuck Lever <chucklever@gmail.com>
> ---
>  fs/nfsd/vfs.c | 81 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-
>  1 file changed, 80 insertions(+), 1 deletion(-)
> 
> diff --git a/fs/nfsd/vfs.c b/fs/nfsd/vfs.c
> index a974368026a1..fd4a32e0b0b4 100644
> --- a/fs/nfsd/vfs.c
> +++ b/fs/nfsd/vfs.c
> @@ -332,6 +332,85 @@ nfsd_sanitize_attrs(struct inode *inode, struct iattr *iap)
>  	}
>  }
>  
> +/* copy of vfs_truncate with NFS owner override hacked in, sigh.. */
> +static long nfsd_truncate(const struct path *path, loff_t length)
> +{
> +	struct inode *inode;
> +	struct dentry *upperdentry;
> +	long error;
> +
> +	inode = path->dentry->d_inode;
> +
> +	/* For directories it's -EISDIR, for other non-regulars - -EINVAL */
> +	if (S_ISDIR(inode->i_mode))
> +		return -EISDIR;
> +	if (!S_ISREG(inode->i_mode))
> +		return -EINVAL;
> +
> +	error = mnt_want_write(path->mnt);
> +	if (error)
> +		goto out;
> +
> +	/*
> +	 * The file owner always gets access permission for accesses that
> +	 * would normally be checked at open time. This is to make
> +	 * file access work even when the client has done a fchmod(fd, 0).
> +	 *
> +	 * However, `cp foo bar' should fail nevertheless when bar is
> +	 * readonly. A sensible way to do this might be to reject all
> +	 * attempts to truncate a read-only file, because a creat() call
> +	 * always implies file truncation.
> +	 * ... but this isn't really fair.  A process may reasonably call
> +	 * ftruncate on an open file descriptor on a file with perm 000.
> +	 * We must trust the client to do permission checking - using "ACCESS"
> +	 * with NFSv3.
> +	 */
> +	if (!uid_eq(inode->i_uid, current_fsuid())) {
> +		error = inode_permission(inode, MAY_WRITE);
> +		if (error)
> +			goto mnt_drop_write_and_out;
> +	}
> +
> +	error = -EPERM;
> +	if (IS_APPEND(inode))
> +		goto mnt_drop_write_and_out;
> +
> +	/*
> +	 * If this is an overlayfs then do as if opening the file so we get
> +	 * write access on the upper inode, not on the overlay inode.  For
> +	 * non-overlay filesystems d_real() is an identity function.
> +	 */
> +	upperdentry = d_real(path->dentry, NULL, O_WRONLY);
> +	error = PTR_ERR(upperdentry);
> +	if (IS_ERR(upperdentry))
> +		goto mnt_drop_write_and_out;
> +
> +	error = get_write_access(upperdentry->d_inode);
> +	if (error)
> +		goto mnt_drop_write_and_out;
> +
> +	/*
> +	 * Make sure that there are no leases.  get_write_access() protects
> +	 * against the truncate racing with a lease-granting setlease().
> +	 */
> +	error = break_lease(inode, O_WRONLY);
> +	if (error)
> +		goto put_write_and_out;
> +
> +	error = locks_verify_truncate(inode, NULL, length);
> +	if (!error)
> +		error = security_path_truncate(path);
> +	if (!error)
> +		error = do_truncate(path->dentry, length, 0, NULL);
> +
> +put_write_and_out:
> +	put_write_access(upperdentry->d_inode);
> +mnt_drop_write_and_out:
> +	mnt_drop_write(path->mnt);
> +out:
> +	return error;
> +}
> +
>  /*
>   * Set various file attributes.  After this call fhp needs an fh_put.
>   */
> @@ -398,7 +477,7 @@ nfsd_setattr(struct svc_rqst *rqstp, struct svc_fh *fhp, struct iattr *iap,
>  		    ((iap->ia_valid & ~(ATTR_SIZE | ATTR_MTIME)) == 0))
>  			implicit_mtime = true;
>  
> -		host_err = vfs_truncate(&path, iap->ia_size);
> +		host_err = nfsd_truncate(&path, iap->ia_size);
>  		if (host_err)
>  			goto out_host_err;
>  
> -- 
> 2.11.0

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

* Re: [PATCH] nfsd: restore owner override for truncate
  2017-02-09 16:01 ` J. Bruce Fields
@ 2017-02-09 16:01   ` Christoph Hellwig
  2017-02-09 18:04   ` Chuck Lever
  2017-02-09 19:32   ` J. Bruce Fields
  2 siblings, 0 replies; 7+ messages in thread
From: Christoph Hellwig @ 2017-02-09 16:01 UTC (permalink / raw)
  To: J. Bruce Fields; +Cc: Christoph Hellwig, chucklever, linux-nfs

On Thu, Feb 09, 2017 at 11:01:31AM -0500, J. Bruce Fields wrote:
> On Thu, Feb 09, 2017 at 03:22:38PM +0100, Christoph Hellwig wrote:
> > The switch to vfs_truncate in nfsd_setattr dropped the owner override
> > used for NFS permissions.  Add a copy of vfs_truncate with it restored
> > to the nfsd code for now as it's very late in the cycle, but there
> > should be a way to consolidate it back in the future.
> 
> This also needs:

Yes, indeed.

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

* Re: [PATCH] nfsd: restore owner override for truncate
  2017-02-09 16:01 ` J. Bruce Fields
  2017-02-09 16:01   ` Christoph Hellwig
@ 2017-02-09 18:04   ` Chuck Lever
  2017-02-09 19:32   ` J. Bruce Fields
  2 siblings, 0 replies; 7+ messages in thread
From: Chuck Lever @ 2017-02-09 18:04 UTC (permalink / raw)
  To: J. Bruce Fields; +Cc: Christoph Hellwig, Linux NFS Mailing List


> On Feb 9, 2017, at 11:01 AM, J. Bruce Fields <bfields@fieldses.org> =
wrote:
>=20
> On Thu, Feb 09, 2017 at 03:22:38PM +0100, Christoph Hellwig wrote:
>> The switch to vfs_truncate in nfsd_setattr dropped the owner override
>> used for NFS permissions.  Add a copy of vfs_truncate with it =
restored
>> to the nfsd code for now as it's very late in the cycle, but there
>> should be a way to consolidate it back in the future.
>=20
> This also needs:
>=20
>=20
> diff --git a/fs/open.c b/fs/open.c
> index 9921f70bc5ca..5d8126b230d9 100644
> --- a/fs/open.c
> +++ b/fs/open.c
> @@ -64,6 +64,7 @@ int do_truncate(struct dentry *dentry, loff_t =
length, unsigned int time_attrs,
> 	inode_unlock(dentry->d_inode);
> 	return ret;
> }
> +EXPORT_SYMBOL_GPL(do_truncate);
>=20
> long vfs_truncate(const struct path *path, loff_t length)
> {

After adding this change, I confirmed that t1050-large.sh is working
as expected.

Tested-by: Chuck Lever <chuck.lever@oracle.com>


> --b.
>=20
>>=20
>> Fixes: 41f53350 ("nfsd: special case truncates some more")
>> Signed-off-by: Christoph Hellwig <hch@lst.de>
>> Reported-by: Chuck Lever <chucklever@gmail.com>
>> ---
>> fs/nfsd/vfs.c | 81 =
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-
>> 1 file changed, 80 insertions(+), 1 deletion(-)
>>=20
>> diff --git a/fs/nfsd/vfs.c b/fs/nfsd/vfs.c
>> index a974368026a1..fd4a32e0b0b4 100644
>> --- a/fs/nfsd/vfs.c
>> +++ b/fs/nfsd/vfs.c
>> @@ -332,6 +332,85 @@ nfsd_sanitize_attrs(struct inode *inode, struct =
iattr *iap)
>> 	}
>> }
>>=20
>> +/* copy of vfs_truncate with NFS owner override hacked in, sigh.. */
>> +static long nfsd_truncate(const struct path *path, loff_t length)
>> +{
>> +	struct inode *inode;
>> +	struct dentry *upperdentry;
>> +	long error;
>> +
>> +	inode =3D path->dentry->d_inode;
>> +
>> +	/* For directories it's -EISDIR, for other non-regulars - =
-EINVAL */
>> +	if (S_ISDIR(inode->i_mode))
>> +		return -EISDIR;
>> +	if (!S_ISREG(inode->i_mode))
>> +		return -EINVAL;
>> +
>> +	error =3D mnt_want_write(path->mnt);
>> +	if (error)
>> +		goto out;
>> +
>> +	/*
>> +	 * The file owner always gets access permission for accesses =
that
>> +	 * would normally be checked at open time. This is to make
>> +	 * file access work even when the client has done a fchmod(fd, =
0).
>> +	 *
>> +	 * However, `cp foo bar' should fail nevertheless when bar is
>> +	 * readonly. A sensible way to do this might be to reject all
>> +	 * attempts to truncate a read-only file, because a creat() call
>> +	 * always implies file truncation.
>> +	 * ... but this isn't really fair.  A process may reasonably =
call
>> +	 * ftruncate on an open file descriptor on a file with perm 000.
>> +	 * We must trust the client to do permission checking - using =
"ACCESS"
>> +	 * with NFSv3.
>> +	 */
>> +	if (!uid_eq(inode->i_uid, current_fsuid())) {
>> +		error =3D inode_permission(inode, MAY_WRITE);
>> +		if (error)
>> +			goto mnt_drop_write_and_out;
>> +	}
>> +
>> +	error =3D -EPERM;
>> +	if (IS_APPEND(inode))
>> +		goto mnt_drop_write_and_out;
>> +
>> +	/*
>> +	 * If this is an overlayfs then do as if opening the file so we =
get
>> +	 * write access on the upper inode, not on the overlay inode.  =
For
>> +	 * non-overlay filesystems d_real() is an identity function.
>> +	 */
>> +	upperdentry =3D d_real(path->dentry, NULL, O_WRONLY);
>> +	error =3D PTR_ERR(upperdentry);
>> +	if (IS_ERR(upperdentry))
>> +		goto mnt_drop_write_and_out;
>> +
>> +	error =3D get_write_access(upperdentry->d_inode);
>> +	if (error)
>> +		goto mnt_drop_write_and_out;
>> +
>> +	/*
>> +	 * Make sure that there are no leases.  get_write_access() =
protects
>> +	 * against the truncate racing with a lease-granting setlease().
>> +	 */
>> +	error =3D break_lease(inode, O_WRONLY);
>> +	if (error)
>> +		goto put_write_and_out;
>> +
>> +	error =3D locks_verify_truncate(inode, NULL, length);
>> +	if (!error)
>> +		error =3D security_path_truncate(path);
>> +	if (!error)
>> +		error =3D do_truncate(path->dentry, length, 0, NULL);
>> +
>> +put_write_and_out:
>> +	put_write_access(upperdentry->d_inode);
>> +mnt_drop_write_and_out:
>> +	mnt_drop_write(path->mnt);
>> +out:
>> +	return error;
>> +}
>> +
>> /*
>>  * Set various file attributes.  After this call fhp needs an fh_put.
>>  */
>> @@ -398,7 +477,7 @@ nfsd_setattr(struct svc_rqst *rqstp, struct =
svc_fh *fhp, struct iattr *iap,
>> 		    ((iap->ia_valid & ~(ATTR_SIZE | ATTR_MTIME)) =3D=3D =
0))
>> 			implicit_mtime =3D true;
>>=20
>> -		host_err =3D vfs_truncate(&path, iap->ia_size);
>> +		host_err =3D nfsd_truncate(&path, iap->ia_size);
>> 		if (host_err)
>> 			goto out_host_err;
>>=20
>> --=20
>> 2.11.0
> --
> To unsubscribe from this list: send the line "unsubscribe linux-nfs" =
in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html

--
Chuck Lever
chucklever@gmail.com




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

* Re: [PATCH] nfsd: restore owner override for truncate
  2017-02-09 16:01 ` J. Bruce Fields
  2017-02-09 16:01   ` Christoph Hellwig
  2017-02-09 18:04   ` Chuck Lever
@ 2017-02-09 19:32   ` J. Bruce Fields
  2 siblings, 0 replies; 7+ messages in thread
From: J. Bruce Fields @ 2017-02-09 19:32 UTC (permalink / raw)
  To: Christoph Hellwig; +Cc: chucklever, linux-nfs

On Thu, Feb 09, 2017 at 11:01:31AM -0500, J. Bruce Fields wrote:
> On Thu, Feb 09, 2017 at 03:22:38PM +0100, Christoph Hellwig wrote:
> > The switch to vfs_truncate in nfsd_setattr dropped the owner override
> > used for NFS permissions.  Add a copy of vfs_truncate with it restored
> > to the nfsd code for now as it's very late in the cycle, but there
> > should be a way to consolidate it back in the future.
> 
> This also needs:
> 
> 
> diff --git a/fs/open.c b/fs/open.c
> index 9921f70bc5ca..5d8126b230d9 100644
> --- a/fs/open.c
> +++ b/fs/open.c
> @@ -64,6 +64,7 @@ int do_truncate(struct dentry *dentry, loff_t length, unsigned int time_attrs,
>  	inode_unlock(dentry->d_inode);
>  	return ret;
>  }
> +EXPORT_SYMBOL_GPL(do_truncate);
>  
>  long vfs_truncate(const struct path *path, loff_t length)
>  {

Also there's still a warning about a nested mnt_want_write when called
from nfsd4_setattr.

Probably not hard to fix.

But at this point I'd like to revert the original 4af53350 "nfsd:
special case truncates some more".  It fixed a real bug (incorrect
handling of setattrs with both mode and file size), but a bug we've had
for a long time.  It can wait another week or two for us to get this all
right.

--b.

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

* Re: [PATCH] nfsd: restore owner override for truncate
  2017-02-09 14:22 [PATCH] nfsd: restore owner override for truncate Christoph Hellwig
  2017-02-09 15:56 ` Chuck Lever
  2017-02-09 16:01 ` J. Bruce Fields
@ 2017-02-09 23:56 ` kbuild test robot
  2 siblings, 0 replies; 7+ messages in thread
From: kbuild test robot @ 2017-02-09 23:56 UTC (permalink / raw)
  To: Christoph Hellwig; +Cc: kbuild-all, bfields, chucklever, linux-nfs

[-- Attachment #1: Type: text/plain, Size: 1016 bytes --]

Hi Christoph,

[auto build test ERROR on nfsd/nfsd-next]
[also build test ERROR on v4.10-rc7 next-20170209]
[if your patch is applied to the wrong git tree, please drop us a note to help improve the system]

url:    https://github.com/0day-ci/linux/commits/Christoph-Hellwig/nfsd-restore-owner-override-for-truncate/20170210-035117
base:   git://linux-nfs.org/~bfields/linux.git nfsd-next
config: powerpc-mvme5100_defconfig (attached as .config)
compiler: powerpc-linux-gnu-gcc (Debian 6.1.1-9) 6.1.1 20160705
reproduce:
        wget https://git.kernel.org/cgit/linux/kernel/git/wfg/lkp-tests.git/plain/sbin/make.cross -O ~/bin/make.cross
        chmod +x ~/bin/make.cross
        # save the attached .config to linux build tree
        make.cross ARCH=powerpc 

All errors (new ones prefixed by >>):

>> ERROR: "do_truncate" [fs/nfsd/nfsd.ko] undefined!

---
0-DAY kernel test infrastructure                Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all                   Intel Corporation

[-- Attachment #2: .config.gz --]
[-- Type: application/gzip, Size: 13033 bytes --]

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

end of thread, other threads:[~2017-02-09 23:57 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2017-02-09 14:22 [PATCH] nfsd: restore owner override for truncate Christoph Hellwig
2017-02-09 15:56 ` Chuck Lever
2017-02-09 16:01 ` J. Bruce Fields
2017-02-09 16:01   ` Christoph Hellwig
2017-02-09 18:04   ` Chuck Lever
2017-02-09 19:32   ` J. Bruce Fields
2017-02-09 23:56 ` kbuild test robot

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).