Re: [PATCH 05/12] RFC: nfs: ask for layouttypes during fsinfo call

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

 



On Mon, Sep 20, 2010 at 6:29 AM, Benny Halevy <bhalevy@xxxxxxxxxxx> wrote:
> On 2010-09-18 05:17, Fred Isaman wrote:
>> From: The pNFS Team <linux-nfs@xxxxxxxxxxxxxxx>
>>
>> This information will be used to determine which layout driver,
>> if any, to use for subsequent IO on this filesystem.  Each driver
>> is assigned an integer id, with 0 reserved to indicate no driver.
>>
>> The server can in theory return multiple ids.  However, our current
>> client implementation only notes the first entry and ignores the
>> rest.
>>
>> Signed-off-by: TBD - melding/reorganization of several patches
>> ---
>>  fs/nfs/nfs4proc.c       |    2 +-
>>  fs/nfs/nfs4xdr.c        |   57 +++++++++++++++++++++++++++++++++++++++++++++++
>>  include/linux/nfs_xdr.h |    1 +
>>  3 files changed, 59 insertions(+), 1 deletions(-)
>>
>> diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c
>> index c46e45e..c0d9ff4 100644
>> --- a/fs/nfs/nfs4proc.c
>> +++ b/fs/nfs/nfs4proc.c
>> @@ -129,7 +129,7 @@ const u32 nfs4_fsinfo_bitmap[2] = { FATTR4_WORD0_MAXFILESIZE
>>                       | FATTR4_WORD0_MAXREAD
>>                       | FATTR4_WORD0_MAXWRITE
>>                       | FATTR4_WORD0_LEASE_TIME,
>> -                     0
>> +                     FATTR4_WORD1_FS_LAYOUT_TYPES
>
> Note that originally (9170cf5 pnfs_submit: set and unset pnfs layoutdriver modules),
> we set this only under CONFIG_NFS_V4_1, but it should be ok to ask for
> it anyhow.
>
> Benny
>

Yes.

Fred

>>  };
>>
>>  const u32 nfs4_fs_locations_bitmap[2] = {
>> diff --git a/fs/nfs/nfs4xdr.c b/fs/nfs/nfs4xdr.c
>> index b0bd7ef..e138237 100644
>> --- a/fs/nfs/nfs4xdr.c
>> +++ b/fs/nfs/nfs4xdr.c
>> @@ -3868,6 +3868,60 @@ xdr_error:
>>       return status;
>>  }
>>
>> +/*
>> + * Decode potentially multiple layout types. Currently we only support
>> + * one layout driver per file system.
>> + */
>> +static int decode_first_pnfs_layout_type(struct xdr_stream *xdr,
>> +                                      uint32_t *layouttype)
>> +{
>> +     uint32_t *p;
>> +     int num;
>> +
>> +     p = xdr_inline_decode(xdr, 4);
>> +     if (unlikely(!p))
>> +             goto out_overflow;
>> +     num = be32_to_cpup(p);
>> +
>> +     /* pNFS is not supported by the underlying file system */
>> +     if (num == 0) {
>> +             *layouttype = 0;
>> +             return 0;
>> +     }
>> +     if (num > 1)
>> +             printk(KERN_INFO "%s: Warning: Multiple pNFS layout drivers "
>> +                     "per filesystem not supported\n", __func__);
>> +
>> +     /* Decode and set first layout type, move xdr->p past unused types */
>> +     p = xdr_inline_decode(xdr, num * 4);
>> +     if (unlikely(!p))
>> +             goto out_overflow;
>> +     *layouttype = be32_to_cpup(p);
>> +     return 0;
>> +out_overflow:
>> +     print_overflow_msg(__func__, xdr);
>> +     return -EIO;
>> +}
>> +
>> +/*
>> + * The type of file system exported.
>> + * Note we must ensure that layouttype is set in any non-error case.
>> + */
>> +static int decode_attr_pnfstype(struct xdr_stream *xdr, uint32_t *bitmap,
>> +                             uint32_t *layouttype)
>> +{
>> +     int status = 0;
>> +
>> +     dprintk("%s: bitmap is %x\n", __func__, bitmap[1]);
>> +     if (unlikely(bitmap[1] & (FATTR4_WORD1_FS_LAYOUT_TYPES - 1U)))
>> +             return -EIO;
>> +     if (bitmap[1] & FATTR4_WORD1_FS_LAYOUT_TYPES) {
>> +             status = decode_first_pnfs_layout_type(xdr, layouttype);
>> +             bitmap[1] &= ~FATTR4_WORD1_FS_LAYOUT_TYPES;
>> +     } else
>> +             *layouttype = 0;
>> +     return status;
>> +}
>>
>>  static int decode_fsinfo(struct xdr_stream *xdr, struct nfs_fsinfo *fsinfo)
>>  {
>> @@ -3894,6 +3948,9 @@ static int decode_fsinfo(struct xdr_stream *xdr, struct nfs_fsinfo *fsinfo)
>>       if ((status = decode_attr_maxwrite(xdr, bitmap, &fsinfo->wtmax)) != 0)
>>               goto xdr_error;
>>       fsinfo->wtpref = fsinfo->wtmax;
>> +     status = decode_attr_pnfstype(xdr, bitmap, &fsinfo->layouttype);
>> +     if (status)
>> +             goto xdr_error;
>>
>>       status = verify_attr_len(xdr, savep, attrlen);
>>  xdr_error:
>> diff --git a/include/linux/nfs_xdr.h b/include/linux/nfs_xdr.h
>> index 172df83..7d68a5c 100644
>> --- a/include/linux/nfs_xdr.h
>> +++ b/include/linux/nfs_xdr.h
>> @@ -113,6 +113,7 @@ struct nfs_fsinfo {
>>       __u32                   dtpref; /* pref. readdir transfer size */
>>       __u64                   maxfilesize;
>>       __u32                   lease_time; /* in seconds */
>> +     __u32                   layouttype; /* supported pnfs layout driver */
>>  };
>>
>>  struct nfs_fsstat {
> --
> To unsubscribe from this list: send the line "unsubscribe linux-nfs" in
> the body of a message to majordomo@xxxxxxxxxxxxxxx
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
>
--
To unsubscribe from this list: send the line "unsubscribe linux-nfs" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[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