A filter driver for implementing disk space quotas is described. quota limits on disk space taken up by files in the file system are established for users and directories, and an internal database is established to track quotas against actual disk space utilization. A driver in accordance with the invention uses kernel resources of the operating system to prevent execution of file system I/O operations which would violate any established quota. In doing so, the driver executes a logic in kernel mode which serializes file allocation operations and also serializes access to the internal database. The first step in this logic is to intercept file system I/O requests before they reach the file system driver. Then the driver determines prospectively—before the I/O request is completed—whether any quota would be exceeded by completion of the I/O request. If a quota would be exceeded, completion of the I/O request is blocked and an error status is issued. If a quota would not be exceeded, the I/O request is allowed to complete and the driver's internal database is updated with revised disk space utilization data.
|
0. 18. A computerized method for implementing disk space quotas comprising the steps of:
maintaining a database of disk space quotas;
intercepting an I/O request before it reaches a file system driver;
determining whether any disk space quota would be exceeded by completion of the I/O request; and
allowing the I/O request to complete only if a disk space quota would not be exceeded.
0. 9. A computerized method for implementing disk space quotas comprising the steps of:
maintaining a database of disk space quotas and disk space utilization data;
intercepting an I/O request before it reaches a file system driver;
determining whether any disk space quota would be exceeded by completion of the I/O request;
blocking completion of the I/O request if any disk space quota would be exceeded by completion of the I/O request; and
allowing the I/O request to complete and updating the disk space utilization data to reflect completion if a disk space quota would not be exceeded.
0. 1. A filter driver for use with an operating system, comprising:
means for establishing disk space quotas, said quotas being established in relation to a plurality of quota parameters;
means for determining disk space utilization in relation to each of said quota parameters;
means for storing said disk space quotas and said disk space utilization in a file structure;
means for monitoring disk I/O;
means for prospectively evaluating the effect of said disk I/O on said disk space utilization, said effect being a revised disk space utilization in relation to said disk space quotas;
means for terminating said disk I/O if said revised disk space utilization exceeds any of said disk space quotas; and
means for updating said file structure to reflect completion of said disk I/O if said revised disk space utilization does not exceed any of said disk space quotas.
0. 2. The filter driver of
means for detecting disk I/O operations, each said disk I/O operation being associated with a named disk file;
means for serializing operations on said named disk file.
0. 3. The filter driver of
means for locking a synchronizing object, said synchronizing object being associated with said named disk file, and said locking means serving to block further disk I/O operations on said named disk file.
0. 4. The filter driver of
0. 5. The filter driver of
0. 6. The filter driver of
0. 7. The filter driver of
0. 8. The filter driver of
means for determining said revised disk space utilization; and
means for comparing said revised disk space utilization to said disk space quotas.
0. 10. The method of
0. 11. The method of
0. 12. The method of
0. 13. The method of
0. 14. The method of
0. 15. The method of
0. 16. The method of
0. 17. The method of
0. 19. The method of
0. 20. The method of
0. 21. The method of
0. 22. The method of
0. 23. The method of
maintaining disk space utilization data; and
updating the disk space utilization data to reflect completion of the I/O request.
|
This patent application is a continuation in part of provisional application 60/067,671 of the same title filed on Dec. 5, 1997. This application is a Divisional of application Ser. No. 10/186,419 filed on Jul. 2, 2002 now U.S. Pat. No. RE39,201, which is a Reissue of Ser. No. 09/205,066, filed Dec. 4, 1998, now U.S. Pat. No. 6,092,163, which is a continuation in part of provisional application 60/067,671 of the same title filed on Dec. 5, 1997.
1. Field of the Invention
The present invention generally relates to devices for managing and controlling the allocation of disk space under an operating system, and more particularly to filter driver techniques for for implementing disk space quotas.
2. Background Description
Disk space quotas limit the amount of disk space that can be consumed by users on a system. Disk space is a resource that is necessary for proper system operation. In the absence of an enforceable disk space quota system, users are free to allocate as much disk space as they wish. This situation can interfere with system operation, as other users, as well as the operating system itself, may be unable to allocate disk space when it is needed. A disk space quota system allows system managers to set the maximum amount of disk space that each user may consume, ensuring that there will always be adequate space available for system operation.
While quota systems are implemented in many operating systems, some operating systems do not have quota systems or do not have robust quota functionality. For example, Windows NT (through version 4.0) does not provide a disk space quota system. Since Windows NT is increasingly being used in large multi-user server environments, it is necessary for third parties to provide this functionality. Some have attempted to provide this functionality using prior art techniques, but the methods they have used do not satisfactorily accomplish the goal of limiting disk space consumption by users.
For example, the prior art for implementing quotas under an operating system such as Windows NT version 4.0, where the operating system does not itself provide this functionality, relies upon the operating system's directory change notification mechanism to detect file allocation changes. Under this approach, if a quota is exceeded file protections are changed so that users may no longer create files in the directory to which the quota applies. This method is reactive; it detects changes after they have occurred, and has several disadvantages which limit its usefulness:
It is therefore an object of the present invention to implement disk space quotas in a manner which detects quota violations before they are written to disk.
A further object of the invention is to fail a disk I/O operation which would exceed a quota.
It is also an object of the invention to apply quotas to files which have been opened.
Another object of the invention is to use facilities available in the kernel of the operating system, including synchronization facilities.
A further object of the invention is to be implemented in pageable code.
The present invention is a filter driver for implementing disk space quotas. Quota limits on disk space taken up by files in the file system are established for users and directories, and an internal database is established to track quotas against actual disk space utilization. A driver in accordance with the invention uses kernel resources of the operating system to prevent execution of file system I/O operations which would violate any established quota. In doing so, the driver executes a logic in kernel mode which serializes file allocation operations and also serializes access to the internal database.
The first step in this logic is to intercept file system I/O requests before they reach the file system driver. Then the driver determines prospectively—before the I/O request is completed—whether any quota would be exceeded by completion of the I/O request. If a quota would be exceeded, completion of the I/O request is blocked and an error status is issued. If a quota would not be exceeded, the I/O request is allowed to complete and the driver's internal database is updated with revised disk space utilization data.
The invention includes a file system filter driver that has the responsibility of monitoring disk space usage by users, and enforcing the quotas established by the system manager for each user. Quotas may also be established for directories where files are stored. The invention's file system filter driver intercepts every cell bound for the file system driver and processes each of them with respect to their effect on disk space allocation in relation to the established quotas.
The invention keeps a persistent database of the established quotas and the amount of disk space used. This database is updated when file allocation changes, and it is used to store the quota information across system boots.
By using a file system filter driver to implement quotas, the invention is able to evaluate the effects of file system operations before the operation is actually executed. This allows the invention to enforce quotas in real time with a high degree of precision. Since the invention is in the actual I/O path, it can fail I/Os with the appropriate “Quota Exceeded” status code and can maintain an exact record of file allocation at any point in time.
The foregoing and other objects, aspects and advantages will be better understood from the following detailed description of a preferred embodiment of the invention with reference to the drawings, in which:
Referring now to the drawings, and more particularly to
In contrast to this prior art method, the present invention uses a file system filter to implement a quota system. A practical implementation of the invention can be described with reference to the Windows NT 4.0 operating system. See Inside the Windows NT File System by Helen Custer (Microsoft Press, 1994), which is incorporated herein by this reference, for a description of the environment within which the invention is implemented, in particular Chapter 2 which describes the layered driver model. The present invention is implemented to provide a quota system for Windows NT 4.0 as a filter driver on top of the NTFS Driver provided by Windows NT.
A file system filter is a kernel mode driver which intercepts file system I/O requests before they reach the file system driver, and may optionally specify a routine to be executed after the file system driver completes a request. File system filter drivers are old in the art and have been used for on-disk data encryption/decryption, file system performance monitoring, and other purposes.
Turning now to
Further details of how QaFilter operates with respect to I/O requests which may affect quotas will now be explained.
A request to open a file causes QaFilter to create internal data structures (not shown) describing the file and the space currently allocated to the file. The allocation size of the file to be opened is retrieved from the file system and stored in the internal data structures so that the effect on file size of subsequent operations on the file can be accurately determined.
A write which extends beyond the current allocated space or a Set Information operation which changes the size of the file will affect the allocation size of the file on disk. QaFilter calculates the change the operation will have on file allocation. If the change would result in exceeding any applicable quota, the operation is failed immediately with “Quota Exceeded” status. If the change is permissible, a post processing routine is specified which will be executed after the file system has completed the request. The post processing routine examines the actual effect the operation had on disk space allocation for the file and updates the data structures for the file, both in memory and in the persistent database on disk.
Since many quotas are based on file ownership, changing the owner of a file can affect disk space allocation. When a request to change file ownership is received, it is examined to determine if it would put the new owner over his quota. If so, the request is failed immediately with “Quota Exceeded” status. If the change is permissible, a post processing routine is specified which will be executed after the file system has completed the request. The post processing routine determines whether the file system successfully changed the file ownership, and if so, updates the in-memory data structures and the persistent database. The allocation size of the file is subtracted from the quota for the old owner, and added to the quota for the new owner.
Renaming a file can cause a change in quotas. A file may be renamed from one directory to another, which may change the quotas which apply to the directory where the file is located. Rename requests are intercepted, and they are examined to determine whether they have any effect on quotas. If the request would result in exceeding any applicable quota, it is failed immediately with a “Quota Exceeded” status. If the change is permissible, a post processing routine is specified which will execute after the file system has completed the request. The post processing routine examines the effects of the rename operation and updates the in-memory data structures and persistent database appropriately. The size of the renamed file (or multiple files in the case of a directory rename operation) is subtracted from any quotas which no longer apply, and added to any quotas which now apply, but previously did not.
Changing the compression status of a file will affect its allocation. When a compressed file is uncompressed, it may cause a user to exceed his quota. If this would be the case, the request is failed immediately with “Quota Exceeded” status. If the uncompress operation is permissible, or a file is being compressed, a post processing routine is specified which will execute after the file system has completed the request. The post processing routine determines the effect of the operation on disk space allocation and updates the in-memory data structures and the persistent database appropriately.
When a user closes his handle to a file, QaFilter receives a Cleanup request. This causes QaFilter to eliminate any in-memory data structures for the file which are no longer needed.
Synchronization Issues
In order to accurately detect changes in file size, operations which might affect allocation must be serialized. In order to effect serialization, it is necessary to synchronize the operations which are related. In Windows NT, this can be accomplished through the use of a kernel event, which is one of the synchronization objects made available by the operating system. A kernel event is associated with each open file. A kernel event is in one of two states, signaled or non-signaled. Multiple processes can have a handle to a kernel event. When an operation which might affect file size is detected, the event for the file is cleared by QaFilter, i.e. reset to the non-signaled or locked state. While the event is locked, other operations on the file are blocked, waiting for the event to be signaled. The event is signaled in the post-processing routing for the operation which cleared the event, effectively serializing operations.
Additionally, QaFilter must serialize access to its internal data structures. This is done through the use of a single kernel mutex, which is another synchronization object made available by the Windows NT operating system. A mutex is useful in coordinating mutually exclusive access to a shared resource (thus the name “mutex”). Only one thread at a time can own a particular mutex. In order to access QaFilter's internal data structures, a thread must own a single kernel mutex. This mutex is in a signaled state when it is not owned by any thread, and is reset to a non-signaled or locked state by a thread which needs to access those data structures. While so locked, no other thread can access those data structures, thus serializing access.
Avoiding Recursive Operations
QaFilter must do file system I/O to acquire initial space used values and to update its database when necessary. This could cause recursive calls into QaFilter, resulting in deadlocks if a resource is held. To avoid this situation, the thread id of the thread which accesses the quota database, and of a thread created to do a file system scan, is recorded, and any I/O from those threads is ignored by QaFilter and passed directly to the file system driver.
Paging I/O
Paging I/O does not cause file allocation to change and is ignored. Ignoring paging I/O allows much of the driver's code to be pageable (incurring a page fault while processing a page fault causes a system crash), and improves performance by involving QaFilter only when necessary.
Retrieving Initial File Allocation
In some cases, e.g. when opening a file for overwrite access, a QaFilter must retrieve the size of a file before the file is actually opened. Ordinarily, QaFilter gets the size of a file by doing an I/O against the file object which represents the user's handle to the file. However, before the file is opened, the file object does not represent a valid handle. In this case, QaFilter opens the file before the user's open is processed, getting it's own handle to the file. This handle is used to retrieve the allocation information. Then QaFilter's handle is closed, and the user's open request is allowed to proceed.
Renaming Directories
Renaming a directory which is subject to quotas presents special problems. When a directory is renamed, causing the set of quotas which apply to the directory to change, the sum of the allocation of all the files in that directory and all of it's subdirectories must be used to adjust the applicable quotas. This is a case where an operation on one file (the directory) affects many other files. When such an operation occurs, QaFilter calculates the allocation size for the entire directory by doing a “scan”, the same operation which takes place when a new quota is created. This sum is subtracted from all quotas which previously applied to the directory and no longer do, and it is added to all new quotas for the directory.
Flushing on Cleanup
When the user closes his handle to a file, some data he has written may still be in cache. The size of a file may change when this data is committed to disk, particularly in the case of a compressed file, where the file allocation will decrease significantly when the data is written to disk. Since QaFilter can no longer effectively track the file after the user's handle is closed, it must force the data to be written to the disk at this point to get an accurate final file size. It does this by issuing a flush on the file object which represents the user's handle when a cleanup operation occurs. This causes the file size to be updated, and QaFilter can then retrieve an accurate allocation for quota calculations.
IROL Issues
Windows NT I/O post-processing routines may execute at DISPATCH_LEVEL (IRQL 2) or lower. This causes some complications for QaFilter, because many routines should not be called at DISPATCH_LEVEL. For example, taking a page fault or performing I/O at DISPATCH_LEVEL may cause a system crash. Since QaFilter must access pageable file system data structures and do I/O to retrieve file sizes and to update the quota database in I/O post-processing, practice of the invention requires a method to perform these operations without using DISPATCH_LEVEL.
Turning now to
If the filesystem's dispatch routine returned STATUS_PENDING 33, then QaFilter's dispatch routine has already returned, and the user's I/O may be asynchronous. This means QaFilter must do other work to guarantee executing the post-processing functions at PASSIVE_LEVEL. If the NT I/O completion routine is executing at PASSIVE_LEVEL (a determination made at block 34 in FIG. 3), then QaFilter's post-processing routine 37 is called directly 38, allowing for greatest performance. If the NT I/O completion routine is called at DISPATCH_LEVEL (a determination made at block 34 in FIG. 3), then QaFilter's post-processing routine is queued 35 to a pool of worker threads which execute at PASSIVE_LEVEL and the I/O completion is delayed by returning 36 STATUS_MORE_PROCESSING_REQUIRED to the I/O Manager. When the worker thread has completed post-processing, it completes the I/O by calling IoCompleteRequest.
The best mode of implementing the features of the invention shown and described in connection with
APPENDIX
NTSTATUS FASTCALL set_completion (
PDEVICE_OBJECT
device_object,
PIRP
irp,
PQA_COMPLETION_ROUTINE
routine,
PQFCB
qfcb)
{
NTSTATUS
status =3D STATUS_SUCCESS;
PDEVICE_OBJECT
target_device =3D NULL;
PIO_STACK_LOCATION
irp_sp =3D NULL;
PIO_STACK_LOCATION
irp_next_sp =3D NULL;
PIRP_CONTEXT
irp_context =3D NULL;
PFILE_OBJECT
file_obj;
PAGED_CODE( );
TraceEnter(“set_completion”);
target_device =3D ((PFILTER_DEV_EXTENSION)
=device_object->DeviceExtension)->fs_device;
irp_sp =3D IoGetCurrentIrpStackLocation (
irp);
file_obj =3D irp_sp->FileObject;
irp_next_sp =3D IoGetNextIrpStackLocation (
irp);
irp_next_sp->MajorFunction =3D
irp_sp->MajorFunction;
irp_next_sp->MinorFunction =3D
irp_sp->MinorFunction;
irp_next_sp->Flags =3D irp_sp->Flags;
irp_next_sp->Parameters =3D irp_sp->Parameters;
irp_next_sp->FileObject =3D irp_sp->FileObject;
irp_next_sp->DeviceObject =3D target_device;
irp_context =3D create_irp_context (
device_object,
irp,
qfcb);
if (irp_context =3D=3D NULL)
{
return STATUS_INSUFFICIENT_RESOURCES;
}
irp_context->completion_routine =3D routine;
IoSetCompletionRoutine (
irp,
post_process,
irp_context,
TRUE,
TRUE,
TRUE);
status =3D IoCallDriver (
target_device,
irp);
if (status !=3D STATUS_PENDING)
{
(VOID) (*routine) (
irp_context);
free irp_context (
irp_context);
}
return status;
}
NTSTATUS post_process (
PDEVICE_OBJECT devobj,
PIRP irp,
PIRP_CONTEXT irp_context)
{
NTSTATUS status =3D STATUS_SUCCESS;
PIO_STACK_LOCATION irp_sp =3D
IoGetCurrentIrpStackLocation(irp);
PSID owner =3D NULL;
PQSEC_DESC sd =3D NULL;
//
//
If IoCallDriver returned PENDING, mark our
//
stack location with pending.
//
irp_context->io_status =3D irp->IoStatus.Status;
irp_context->io info =3D irp->IoStatus_Information;
if (!irp->PendingReturned)
{
return STATUS_STATUS;
}
IoMarkirpPending( irp );
if (KeGetCurrentIrql ( ) =3D=3D PASSIVE_LEVEL)
{
status =3D (*irp_context->completion routine)(
irp_context);
free_irp_context (
irp_context);
return status;
}
else
{
ExInitializeWorkItem (
&irp_context->work_item,
work_post,
irp_context);
QaQueueWorkItem (
&irp_context->work_item,
CriticalWorkQueue);
return STATUS_MORE_PROCESSING_REQUIRED;
}
}
VOID work_post (
PIRP_CONTEXT irp_context)
{
PAGED_CODE( );
(*irp_context->completion_routine) (
irp_context);
IoCompleteRequest (
irp_context->irp;
IO_NO_INCREMENT);
free_irp_context (
irp_context);
return;
}
NTSTATUS FASTCALL synchronous_completion (
PDEVICE_OBJECT
device_object,
PIRP
irp,
PQA_COMPLETION_ROUTINE routine,
PQFCB
qfcb)
{
NTSTATUS
status =3D STATUS_SUCCESS;
NTSTATUS
io_call_status =3D
STATUS_SUCCESS;
PDEVICE_OBJECT
target_device =3D NULL;
PIO_STACK_LOCATION
irp_sp =3D NULL;
PIO_STACK_LOCATION
irp_next_sp =3D NULL;
PIRP_CONTEXT
irp_context =3D NULL;
PFILE_OBJECT
file_obj;
PAGED_CODE( );
TraceEnter(“set_completion”);
target_device =3D ((PFILTER_DEV_EXTENSION)
=device_object->DeviceExtension)->fs_device;
irp_sp =3D IoGetCurrentIrpStackLocation (
irp);
file_obj =3D irp_sp->FileObject;
irp_next_sp =3D IoGetNextIrpStackLocation (
irp);
irp_next_sp->MajorFunction =3D
irp_sp->MajorFunction;
irp_next_sp->MinorFunction =3D
irp_sp->MinorFunction;
irp_next_sp->Flags =3D irp_sp->Flags;
irp_next_sp->Parameters =3D irp_sp->Parameters;
irp_next_sp->FileObject =3D irp_sp->FileObject;
irp_next_sp->DeviceObject =3D target_device;
irp_context =3D create_irp_context (
device_object,
irp,
qfcb);
if (irp_context =3D=3D NULL)
{
return STATUS_INSUFFICIENT_RESOURCES;
}
irp_context->completion_routine =3D routine;
KeInitializeEvent (
&irp_context->event,
NotificationEvent,
FALSE);
IoSetCompletionRoutine (
irp,
synch_post,
irp_context,
TRUE,
TRUE,
TRUE);
io_call_status =3D IoCallDriver (
target_device,
irp);
KeWaitForSingleObject (
&irp_context->event,
Executive,
KernelMode,
FALSE,
NULL);
status =3D (*routine) (
irp_context);
ASSERT(status =3D=3D STATUS_SUCCESS);
free_irp_context (
irp_context);
return io_call_status;
}
NTSTATUS synch_post (
PDEVICE_OBJECT devobj,
PIRP
irp,
PIRP_CONTEXT irp_context)
{
//
// If IoCallDriver returned PENDING, mark our
// stack location with pending.
//
if (irp->PendingReturned)
{
IoMarkIrpPending( irp );
}
irp_context->io_status =3D irp->Io_Status.Status;
irp_context->io_info =3D irp->Io_Status.Information;
KeSetEvent (
&irp_context->event,
0,
FALSE);
return STATUS_SUCCESS;
}
While the invention has been described in terms of a single preferred embodiment, those skilled in the art will recognize that the invention can be practiced with modification within the spirit and scope of the appended claims.
Kyler, Daniel B., Husain, Najaf S.
Patent | Priority | Assignee | Title |
9361243, | Jul 31 1998 | KOM SOFTWARE INC | Method and system for providing restricted access to a storage medium |
9881013, | Jul 31 1998 | KOM Software Inc. | Method and system for providing restricted access to a storage medium |
Patent | Priority | Assignee | Title |
5237661, | May 29 1989 | HITACHI, LTD , 6, KANDA SURUGADAI 4-CHOME, CHIYODA-KU, TOKYO, JAPAN, A CORP OF JAPAN | Buffer management method and system therefor using an I/O buffer on main memory and utilizing virtual memory and page fixing |
5247660, | Jul 13 1989 | FileTek, Inc. | Method of virtual memory storage allocation with dynamic adjustment |
5421011, | Dec 20 1991 | International Business Machines Corporation; INTERNATIONAL BUSINESS MACHINES CORPORATION A CORP OF NEW YORK | Method and system for access and accounting control in a data processing system by using a single resource account for a user or a group of users |
5491807, | Mar 20 1989 | INTERNATIONAL BUSINESS MACHINES CORPORATION, A CORP OF NY | System and method for worm volume management of new and updated data files using variable threshold block addresses |
5574952, | May 11 1994 | Western Digital Technologies, INC | Data storage system and method for operating a disk controller including allocating disk space for compressed data |
5634050, | Jan 29 1992 | Microsoft Technology Licensing, LLC | Method and system for file system management using a flash-erasable programmable, read-only memory |
5644751, | Oct 03 1994 | International Business Machines Corporation | Distributed file system (DFS) cache management based on file access characteristics |
5671420, | Jun 28 1995 | Canon Kabushiki Kaisha | Distribution diskette utility |
5701473, | Mar 17 1995 | Unisys Corporation | System for optimally storing a data file for enhanced query processing |
5713013, | Jan 25 1996 | Apple Inc | System for establishing and enforcing maximum size of directory by preventing the size of the directory from exceeding the set quota size of the directory |
5734909, | Sep 01 1995 | International Business Machines Corporation; IBM Corporation | Method for controlling the locking and unlocking of system resources in a shared resource distributed computing environment |
5805932, | Apr 22 1994 | Sony Corporation | System for transmitting compressed data if compression ratio is at least preset ratio and pre-compressed data if compression ratio is less than preset ratio |
5819047, | Aug 30 1996 | AT&T Corp | Method for controlling resource usage by network identities |
5946686, | Jul 11 1997 | International Business Machines Corporation | Parallel file system and method with quota allocation |
5956734, | Jul 11 1997 | International Business Machines Corporation | Parallel file system with a quota check utility |
6000009, | May 06 1997 | Western Digital Technologies, INC | Method and apparatus for allocation of disk memory space for compressed data records |
6032216, | Jul 11 1997 | International Business Machines Corporation | Parallel file system with method using tokens for locking modes |
6192471, | Jan 26 1996 | Dell USA, LP | Operating system independent system for running utility programs in a defined environment |
Executed on | Assignor | Assignee | Conveyance | Frame | Reel | Doc |
Sep 04 2001 | PRECISE SOFTWARE SOLUTIONS | PRECISE SOFTWARE SOLUTIONS | MERGER AND CHANGE OF NAME SEE DOCUMENT FOR DETAILS | 035747 | /0340 | |
Sep 04 2001 | W QUINN | PRECISE SOFTWARE SOLUTIONS | MERGER AND CHANGE OF NAME SEE DOCUMENT FOR DETAILS | 035747 | /0340 | |
Feb 05 2004 | Symantec Operating Corporation | (assignment on the face of the patent) | / | |||
Mar 07 2008 | PRECISE SOFTWARE SOLUTIONS | SYM COMPANY P, INC | CHANGE OF NAME SEE DOCUMENT FOR DETAILS | 035805 | /0408 | |
Dec 16 2009 | Symantec Corporation | Symantec Corporation | MERGER AND CHANGE OF NAME SEE DOCUMENT FOR DETAILS | 035747 | /0436 | |
Dec 16 2009 | SYM COMPANY P, INC | Symantec Corporation | MERGER AND CHANGE OF NAME SEE DOCUMENT FOR DETAILS | 035747 | /0436 | |
Jan 29 2016 | Symantec Corporation | Veritas US IP Holdings LLC | ASSIGNMENT OF ASSIGNORS INTEREST SEE DOCUMENT FOR DETAILS | 037697 | /0412 | |
Jan 29 2016 | Veritas US IP Holdings LLC | BANK OF AMERICA, N A , AS COLLATERAL AGENT | SECURITY INTEREST SEE DOCUMENT FOR DETAILS | 037891 | /0001 | |
Jan 29 2016 | Veritas US IP Holdings LLC | WILMINGTON TRUST, NATIONAL ASSOCIATION, AS COLLATERAL AGENT | SECURITY INTEREST SEE DOCUMENT FOR DETAILS | 037891 | /0726 | |
Mar 29 2016 | Veritas US IP Holdings LLC | Veritas Technologies LLC | MERGER AND CHANGE OF NAME SEE DOCUMENT FOR DETAILS | 038455 | /0752 | |
Mar 29 2016 | Veritas Technologies LLC | Veritas Technologies LLC | MERGER AND CHANGE OF NAME SEE DOCUMENT FOR DETAILS | 038455 | /0752 | |
Aug 20 2020 | Veritas Technologies LLC | WILMINGTON TRUST, NATIONAL ASSOCIATION, AS NOTES COLLATERAL AGENT | SECURITY INTEREST SEE DOCUMENT FOR DETAILS | 054370 | /0134 | |
Nov 27 2020 | WILMINGTON TRUST, NATIONAL ASSOCIATION, AS COLLATERAL AGENT | VERITAS US IP HOLDINGS, LLC | TERMINATION AND RELEASE OF SECURITY IN PATENTS AT R F 037891 0726 | 054535 | /0814 | |
Nov 22 2024 | BANK OF AMERICA, N A , AS ASSIGNOR | ACQUIOM AGENCY SERVICES LLC, AS ASSIGNEE | ASSIGNMENT OF SECURITY INTEREST IN PATENT COLLATERAL | 069440 | /0084 | |
Dec 06 2024 | Veritas Technologies LLC | ARCTERA US LLC | ASSIGNMENT OF ASSIGNORS INTEREST SEE DOCUMENT FOR DETAILS | 069548 | /0468 | |
Dec 09 2024 | ARCTERA US LLC | BANK OF AMERICA, N A , AS COLLATERAL AGENT | SECURITY INTEREST SEE DOCUMENT FOR DETAILS | 069563 | /0243 | |
Dec 09 2024 | ARCTERA US LLC | WILMINGTON TRUST, NATIONAL ASSOCIATION, AS COLLATERAL AGENT | PATENT SECURITY AGREEMENT | 069585 | /0150 | |
Dec 09 2024 | WILMINGTON TRUST, NATIONAL ASSOCIATION, AS NOTES COLLATERAL AGENT | Veritas Technologies LLC | RELEASE BY SECURED PARTY SEE DOCUMENT FOR DETAILS | 069634 | /0584 | |
Dec 09 2024 | ACQUIOM AGENCY SERVICES LLC, AS COLLATERAL AGENT | VERITAS TECHNOLOGIES LLC F K A VERITAS US IP HOLDINGS LLC | RELEASE BY SECURED PARTY SEE DOCUMENT FOR DETAILS | 069712 | /0090 |
Date | Maintenance Fee Events |
Jan 18 2012 | M1553: Payment of Maintenance Fee, 12th Year, Large Entity. |
Date | Maintenance Schedule |
Jan 05 2013 | 4 years fee payment window open |
Jul 05 2013 | 6 months grace period start (w surcharge) |
Jan 05 2014 | patent expiry (for year 4) |
Jan 05 2016 | 2 years to revive unintentionally abandoned end. (for year 4) |
Jan 05 2017 | 8 years fee payment window open |
Jul 05 2017 | 6 months grace period start (w surcharge) |
Jan 05 2018 | patent expiry (for year 8) |
Jan 05 2020 | 2 years to revive unintentionally abandoned end. (for year 8) |
Jan 05 2021 | 12 years fee payment window open |
Jul 05 2021 | 6 months grace period start (w surcharge) |
Jan 05 2022 | patent expiry (for year 12) |
Jan 05 2024 | 2 years to revive unintentionally abandoned end. (for year 12) |