Re: [PATCH v2 1/1] nfs42: client needs to update file mode after ALLOCATE op

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

 




> On Aug 24, 2023, at 12:01 PM, Trond Myklebust <trondmy@xxxxxxxxxxxxxxx> wrote:
> 
> On Thu, 2023-08-24 at 11:42 -0700, dai.ngo@xxxxxxxxxx wrote:
>> 
>>> On 8/24/23 9:38 AM, dai.ngo@xxxxxxxxxx wrote:
>>> 
>>> On 8/24/23 9:34 AM, Trond Myklebust wrote:
>>>> On Thu, 2023-08-24 at 09:12 -0700, dai.ngo@xxxxxxxxxx wrote:
>>>>> On 8/24/23 9:01 AM, Trond Myklebust wrote:
>>>>>> On Thu, 2023-08-24 at 08:53 -0700, Dai Ngo wrote:
>>>>>>> The Linux NFS server strips the SUID and SGID from the file
>>>>>>> mode
>>>>>>> on ALLOCATE op. The GETATTR op in the ALLOCATE compound
>>>>>>> needs to
>>>>>>> request the file mode from the server to update its file
>>>>>>> mode in
>>>>>>> case the SUID/SGUI bit were stripped.
>>>>>>> 
>>>>>>> Signed-off-by: Dai Ngo <dai.ngo@xxxxxxxxxx>
>>>>>>> ---
>>>>>>>    fs/nfs/nfs42proc.c | 2 +-
>>>>>>>    1 file changed, 1 insertion(+), 1 deletion(-)
>>>>>>> 
>>>>>>> diff --git a/fs/nfs/nfs42proc.c b/fs/nfs/nfs42proc.c
>>>>>>> index 63802d195556..d3d050171822 100644
>>>>>>> --- a/fs/nfs/nfs42proc.c
>>>>>>> +++ b/fs/nfs/nfs42proc.c
>>>>>>> @@ -70,7 +70,7 @@ static int _nfs42_proc_fallocate(struct
>>>>>>> rpc_message
>>>>>>> *msg, struct file *filep,
>>>>>>>           }
>>>>>>>              nfs4_bitmask_set(bitmask, server-
>>>>>>>> cache_consistency_bitmask,
>>>>>>> inode,
>>>>>>> -                        NFS_INO_INVALID_BLOCKS);
>>>>>>> +                       NFS_INO_INVALID_BLOCKS |
>>>>>>> NFS_INO_INVALID_MODE);
>>>>>>>              res.falloc_fattr = nfs_alloc_fattr();
>>>>>>>           if (!res.falloc_fattr)
>>>>>> Actually... Wait... Why isn't the existing code sufficient?
>>>>>> 
>>>>>>           status = nfs4_call_sync(server->client, server,
>>>>>> msg,
>>>>>>                                   &args.seq_args,
>>>>>> &res.seq_res, 0);
>>>>>>           if (status == 0) {
>>>>>>                   if (nfs_should_remove_suid(inode)) {
>>>>>>                           spin_lock(&inode->i_lock);
>>>>>>                           nfs_set_cache_invalid(inode,
>>>>>> NFS_INO_INVALID_MODE);
>>>>>> spin_unlock(&inode->i_lock);
>>>>>>                   }
>>>>>>                   status =
>>>>>> nfs_post_op_update_inode_force_wcc(inode,
>>>>>> res.falloc_fattr);
>>>>>>           }
>>>>>> 
>>>>>> We explicitly check for SUID bits, and invalidate the mode if
>>>>>> they
>>>>>> are
>>>>>> set.
>>>>> nfs_set_cache_invalid checks for delegation and clears the
>>>>> NFS_INO_INVALID_MODE.
>>>>> 
>>>> Oh. That just means we need to add NFS_INO_REVAL_FORCED, so let's
>>>> rather do that.
>>> 
>>> ok, I'll create a new patch and test it.
>> 
>> This is the new patch:
>> 
>> diff --git a/fs/nfs/nfs42proc.c b/fs/nfs/nfs42proc.c
>> index 63802d195556..ea1991e393e2 100644
>> --- a/fs/nfs/nfs42proc.c
>> +++ b/fs/nfs/nfs42proc.c
>> @@ -81,7 +81,7 @@ static int _nfs42_proc_fallocate(struct rpc_message
>> *msg, struct file *filep,
>>         if (status == 0) {
>>                 if (nfs_should_remove_suid(inode)) {
>>                         spin_lock(&inode->i_lock);
>> -                       nfs_set_cache_invalid(inode,
>> NFS_INO_INVALID_MODE);
>> +                       nfs_set_cache_invalid(inode,
>> NFS_INO_REVAL_FORCED);
> 
> No. The above needs to add NFS_INO_REVAL_FORCED.
> 
> IOW: 
>    nfs_set_cache_invalid(inode, NFS_INO_INVALID_MODE | NFS_INO_REVAL_FORCED);
Ok, I’ll try again.

Thanks,
-Dai
> 
>>                         spin_unlock(&inode->i_lock);
>>                 }
>>                 status = nfs_post_op_update_inode_force_wcc(inode,
> 
> -- 
> Trond Myklebust
> Linux NFS client maintainer, Hammerspace
> trond.myklebust@xxxxxxxxxxxxxxx
> 
> 




[Index of Archives]     [Linux Filesystem Development]     [Linux USB Development]     [Linux Media Development]     [Video for Linux]     [Linux NILFS]     [Linux Audio Users]     [Yosemite Info]     [Linux SCSI]

  Powered by Linux