[pnfs] [PATCH 03/13] pnfsd: Simplify getdeviceinfo export ops.
Dean Hildebrand
seattleplus at gmail.com
Mon Jan 14 17:52:13 EST 2008
Hi Benny,
I resent my device export changes as 5 patches (instead of the original
11). The first 3 are "setup" type patches and the 4th and 5th handle
the device changes.
Thanks for the feedback. Please let me know if you have any questions.
Dean
Benny Halevy wrote:
> On Jan. 13, 2008, 0:01 +0200, Dean Hildebrand <seattleplus at gmail.com> wrote:
>
>> Benny Halevy wrote:
>>
>>> Dean Hildebrand wrote:
>>>
>>>> Benny Halevy wrote:
>>>>
>>>>> Dean, this patch would break compilation of the tree
>>>>> so it makes the patchset non-bisectable. The main problem
>>>>> with that is if a regression is found we can't use git-bisect
>>>>> to semi-automatically find the offending patch in O(log(#patches)).
>>>>>
>>>>>
>>>> I agree, but I'm not sure how. That patch changes a data structure
>>>> that is used in a lot of different places. Should I merge all
>>>> patches together that are affected by the change to this data
>>>> structure? (I think that is almost all of my patches)
>>>>
>>> I'm not sure what is the best approach in this case, but in general,
>>> off the top of my head we can use several techniques:
>>>
>>> 1. make the change atomic, i.e. make the change in data structures and
>>> in the code using them
>>> in the same patch.
>>>
>> ok, I guess these days bisection is more important than small patches,
>> so I'll go with option 1.
>> Dean
>>
>
> More than a matter of temporal taste or mere preference, I try to follow
> Documentation/SubmittingPatches:
>
> 3) Separate your changes.
>
> Separate _logical changes_ into a single patch file.
>
> For example, if your changes include both bug fixes and performance
> enhancements for a single driver, separate those changes into two
> or more patches. If your changes include an API update, and a new
> driver which uses that new API, separate those into two patches.
>
> On the other hand, if you make a single change to numerous files,
> group those changes into a single patch. Thus a single logical change
> is contained within a single patch.
>
> Breaking one logical change into smaller pieces just because it appears
> too big is bad. However, if that can be done by distilling it into several
> smaller, logical, _and self-sufficient_ patches then go ahead with it.
> This is certainly the way to go.
>
> Benny
>
>
>>> 2. If that is too complicated, consider making a serious of patches
>>> that implements the above
>>> in layers, each atomically changing part of the data structure and its
>>> usage.
>>>
>>> 3. If the approaches above still don't work, the new data structures
>>> can be given new names
>>> and their usage can be implemented gradually, e.g. one function in a
>>> patch.
>>> Once everything got converted the old data structures can be deleted,
>>> and if really wanted
>>> the new structures can then be renamed to the old names (in an atomic
>>> change).
>>> Each patch in this series should at least compile and ideally run
>>> correctly.
>>> If there's a correctness issue while the new API is introduced you can
>>> introduce the
>>> new functions with new names, without removing the old code yet (and I
>>> think it makes sense
>>> in this case because the change in functionality is through enough
>>> that the diff in the patches
>>> that you sent that show the new code with the existing code in a
>>> merged view are almost useless
>>> as they don't help understanding what you did but rather make it
>>> harder...)
>>> and then when the new API is fully implemented, change the layer that
>>> uses it and remove
>>> the old implementation and interface.
>>>
>>> Benny
>>>
>>>
>>>> Dean
>>>>
>>>>> Also, minor nit below.
>>>>>
>>>>> Thanks for sending the patches!
>>>>>
>>>>> Benny
>>>>>
>>>>> On Jan. 10, 2008, 23:38 +0200, seattleplus at gmail.com wrote:
>>>>> <snip>
>>>>>
>>>>>
>>>>>
>>>>>> @@ -35,6 +35,35 @@ enum fid_type {
>>>>>> FILEID_INO32_GEN_PARENT = 2,
>>>>>> };
>>>>>>
>>>>>> +#if defined(CONFIG_PNFS)
>>>>>> +
>>>>>> +/* XDR stream arguments and results. Exported file system uses this
>>>>>> + * struct to encode information and return how many bytes were
>>>>>> encoded.
>>>>>> + */
>>>>>> +struct pnfs_xdr_info {
>>>>>> + u32 *p; /* in */
>>>>>> + u32 *end; /* in */
>>>>>> + u32 maxcount; /* in */
>>>>>> + u32 bytes_written; /* out */
>>>>>> +};
>>>>>> +
>>>>>> +/* Used by get_device_info to encode a device (da_addr_body in spec)
>>>>>> + * Args:
>>>>>> + * xdr - xdr stream
>>>>>> + * device - pointer to device to be encoded
>>>>>> +*/
>>>>>> +typedef int (*pnfs_encodedev_t)(struct pnfs_xdr_info *xdr, void
>>>>>> *device);
>>>>>> +
>>>>>> +/* Arguments for get_device_info */
>>>>>> +struct pnfs_devinfo_arg {
>>>>>> + u32 type;
>>>>>> + u32 devid;
>>>>>> + struct pnfs_xdr_info xdr;
>>>>>> + pnfs_encodedev_t func;
>>>>>> +};
>>>>>> +
>>>>>> +#endif
>>>>>>
>>>>>>
>>>>> please add comment after #endif, like this:
>>>>> #endif /* CONFIG_PNFS */
>>>>>
>>>>>
>>>>>
>>>>>
>> _______________________________________________
>> pNFS mailing list
>> pNFS at linux-nfs.org
>> http://linux-nfs.org/cgi-bin/mailman/listinfo/pnfs
>>
>>
>
>
More information about the pNFS
mailing list