Multics Technical Bulletin MTB-667 The Trouble with Quota To: Distribution From: Benson I. Margulies Date: 07/06/84 Subject: A Partial Solution to Limitations on Quota 1 ABSTRACT There is a serious design flaw in the file system quota mechanism. It produces a series of implementation and operational problems for us and sites. This MTB describes the problem and the solution. Comments should be sent to the author: via Multics Mail: Margulies at either System-M, MIT, or CISL-SERVICE. via Forum: >udd>m>mtgs>hardcore on System-M via telephone: (HVN) 261-9333, or (617) 492-9333 _________________________________________________________________ Multics project internal working documentation. Not to be reproduced or distributed outside the Multics project without the consent of the author or the author's management. MTB-667 Multics Technical Bulletin The Trouble with Quota 2 A SPECTRE IS HAUNTING MULTICS A spectre is haunting Multics, the spectre of "quota received." Every month or so we get another TR about the lack of a salvager, or the apparent 2**18 record limit on quota in a hierarchy. Sites have experienced serious service outages due to broken hierarchies. What is the problem, and why have we never fixed it? It is a combination of a design limitation with a bug that allows sites to circumvent the limitation. Having circumvented it, their hierarchy has become inconsistent, and cannot be made consistent again unless we remove the original limitation. 3 HOW THE QUOTA HIERARCHY WORKS The quota hierarchy is a hierarchy of directories with terminal quotas. Each such directory has a quota cell. The quota cell records the amount of quota that has been moved into the directory, and how much of it has been used. (In fact, all directories have quota cells, but they are only interesting for terminal quota.) When quota is moved into a directory, it is recorded in two fields in the quota cell: quota_cell.received and quota_cell.quota. So long as no sub-directories are given terminal quotas, these two cells are equal. As pages of data are created, they are counted in quota_cell.used. The amount of quota available for data is determined by subtracting quota_cell.used from quota_cell.quota. When quota is moved to a sub-directory, it is subtracted from quota_cell.quota, but NOT from quota_cell.received. Thus quota moved down is no longer available for data pages. At any time, quota_cell.received is the total amount of quota added to the directory with move_quota (or set_mdir_quota). quota_cell.quota is the portion of that which has not been moved further down. 4 THE LIMITATION -- 18 BIT FIELDS All of these fields are restricted to 18 bits. quota and used are stored in both the vtoce and the aste, and received in the vtoce alone. The result was supposed to be that no hierarchy could ever have more than 2**19-1 records of quota. Multics Technical Bulletin MTB-667 The Trouble with Quota 5 THE BUG -- RECEIVED ARITHMETIC IS MODULAR Unfortunately, size checking is not enabled by default in PL/1. None of the code in quota.pl1 that maintains quota_cell.received checks for overflow or underflow out of the 18 bits when doing arithmetic; it does 35 bit arithmetic. Thus the following script becomes possible. 1) Put 262143 records of quota in a directory. received = 262143 quota = 262143 2) Move all 262143 records to a sub-directory. received = 262143 quota = 0 3) Move another 262143 records into the directory. received = 0 (2*262143 mod 262143) quota = 262143 4) continue Now, we have a hierarchy with more than 262143 records in it, and a received value that is wrong. 6 WHAT'S WRONG WITH THIS PICTURE First, and most important, we cannot salvage crash-caused inconsistencies in received, because the salvage would detect these intentional inconsistencies. If we had such a salvager, a site would have to choose between tolerating these inconsistencies (which affect users) and adhereing to the 262143 record limit on quota in a hierarchy (which is simply impractical). Second, this is not a practical way to administer a system. The only way to determine how much quota has been moved into a hierarchy is to add up the subdirectories. Imagine trying to write an explanation of this mess. 7 WHAT DO WE DO ABOUT IT? Eventually, the aste and vtoce should be reformatted to maintain full words for all quota fields. This is a big project, and cannot be undertaken soon. However, there is a smaller change that rectifies much of the difficulty. There is sufficient pad space in the vtoce to move MTB-667 Multics Technical Bulletin The Trouble with Quota to 36 bit received values (see vtoce.pad6 in vtoce.incl.pl1). Such a change would allow hierarchies to contain more quota, but would continue the current restriction on the amount of quota that can be available as "quota" in a single directory. Received could be maintained in a consistent fashion. The change would be compatable. vtoc_attributes would be changed to save received in the new location. The quota salvager (fix_quota_used) would be changed to recalculate received on the basic of quota and used. Since the old values would be undisturbed, the hardcore system could be backed out painlessly. Page 4