On Wed, 15 Apr 2009, William Schumann wrote: > Alok, > Responses below. > Alok, Sanjay, > Generated new webrev: > http://cr.opensolaris.org/~wmsch/bug-7758/ > Previous webrev for reference: > http://cr.opensolaris.org/~wmsch/bug-7758-prior/ > > Alok Aggarwal wrote: >> >> On Tue, 14 Apr 2009, William Schumann wrote: >> >>> Alok, >>> >>> Alok Aggarwal wrote: >>>> Hi William, >>>> >>>> On Thu, 9 Apr 2009, William Schumann wrote: >>>> >>>>> There are two problems addressed by this bug. >>>>> >>>>> 1) After initial AI installation, the swap slice is regarded as user >>>>> data in subsequent AI installations instead of scratch >>>>> 2) The swap slice space allocation in TI is not done with any awareness >>>>> of AI customization >>>>> >>>>> The fix involving making AI aware of 1 and for AI to perform 2 instead >>>>> of leaving everything to TI, which allocates the swap space for GUI. >>>> >>>> So, from a high level, is it fair to say that the policy with respect to >>>> preserving slices by default isn't being >>>> changed? >>> Yes, the policy for preserving slices by default does not change. >>>> And, the change you're making here is to create >>>> a swap slice if either s1 doesn't exist or s1 exists with >>>> a V_SWAP tag. Correct? >>> The decision of whether a swap slice is created depends upon the memory >>> size of the machine. >>>> >>>> Also now that 7718 has been reversed in the source code >>>> only machines with less than 700MB memory will see this >>>> problem on every other AI install after the *first* install. >>> I think it would fail *all* AI installs after the first one (that didn't >>> explicitly delete slice 1 per the workaround); otherwise, what you said >>> is true. Also, without the fix, problem 2) above still exists - if a >>> swap slice is called for, any slice customization or any existing slices >>> which should be preserved will be destroyed instead. >> >> Okay, thanks for clarifying. Here are my comments - >> >> auto_install.c: Why is OM_ROOT being set for installs on >> slices other than slice zero? > OM_ROOT indicates that the VTOC partition tag for the install slice will be > set to "root" - slices 0,1,3,4,5,6, or 7 could be the install slice.
I didn't read that expression correctly the first time. I don't see how we exclude slice 2 from being the install slice, and if we don't, it is something we should revisit when we take a second look at the relevant design. >> perform_slim_install.c: line 2919: This function no longer >> returns a boolean_t > It returns the boolean_t values (0 or 1), which are evaluated in logical > expressions as either zero or non-zero, so I don't see a problem. In > principle, the definition of boolean_t could conceivably be changed, but > much code would break. Also, I think of the boolean_t type as helpful in > simplifying logical expressions making them more readable. <sys/types.h> defines boolean_t as - typedef enum { B_FALSE, B_TRUE } boolean_t; Thus, it would be more appropriate for the return value to be either B_FALSE or B_TRUE. >> ti_dm.c: lines 1503 - 1515: It seems that this comment should >> be made clearer to indicate under which conditions a swap slice >> would be created - a) If it is explicitly specified or, b) if >> the code figured out if the installation was being done on a low >> memory machine > added comments here For some reason I still don't see the comments in the updated webrev. >> disk_slices.c: line 50: Why this change? > I tried to explain this in the code review request - I was just changing the > name from "install", which is obviously not a unique token, to "s_install", > which would be more easily found in a text editor - that's the only reason. > Vim has a nice feature - if you type '*' on a token, it grabs the token as > the search string and jumps to the next occurrence. I don't see this as a reason to change, I think 'install' is as good. But I don't have any strong opinions on this, either way is fine. Btw, if you haven't played with cscope it's worth it. It's a much easier to search, among other things, variable/function definitions. >> disk_slices.c: line 365: How about check_slices_in_use() as >> the name instead? > I thought that "if (are_any_slices_in_table())" would be simple and readable > for a function that asks the question "are there any slices already defined > in the table?". Was this unclear? Too casual? I think it's too casual but again I don't have any strong opinions. >> disk_slices.c: line 376: What is an exempt slice? > A slice that is reserved for a special purpose and cannot be used for user > data. Changed "exempt" to "reserved". How about adding a blurb about what a reserved slice is? >> disk_slices.c: lines 430-432: Could you please expound on this? >> There seems to be implicit ordering here that the callers must >> maintain. > Actually, the purpose of the code here is to avoid implicit ordering by the > caller. If a swap slice is needed, it is easier to create it before > creating any other slices - otherwise you have to decide which slice to take > the space from. This create_swap_slice_if_necessary() call insures that the > swap slice will be allocated before any other new slices are created. Also, > create_swap_slice_if_necessary() is called during finalization for TI. > > Perhaps I should mention here that the creation of a swap slice cannot be > specified in a manifest - it is automatic. The last part is what I was missing, makes sense. >> disk_slices.c: line 658: The thought of possible recursion >> in this function makes me queasy. This seems like a perfect >> candidate for some code refactoring in the future. > Perhaps you understand this already, but I'll add the following just in > case. There is no explicit initialization call in the Orchestrator for AI > where the swap slice might be allocated. So, the first call from AI > concerning slice customization could be om_create_slice(). Within > om_create_slice() is a check to see if the swap slice is necessary. If it > is, om_create_slice will be called recursively once, before it does any > other work, so make sure that the swap slice is allocated. Furthermore, > there is a guard so that it is not run more than once for the same purpose. > Does this help? Is this the only scenario in which this function can be called recursively? Is there a way to restructure this so it isn't called recursively or is it too risky at this point? At a minimum, I think this code needs a giant comment stating the conditions under which this function can be called recursively. Alok