Storage systems have evolved from small disk systems under control of a file server to large, independent disk and disk-array systems that can be directly accessed by applications. It is becoming increasingly difficult for system administrators to manage these complex storage systems manually. This work addresses this problem by proposing to develop smart storage systems that perform complex tasks like configuration, capacity planning, fault management, and load balancing in addition to routine tasks like data storage and retrieval and data backups. The automated storage system adapts to changes in the workload and system configuration without human intervention. The storage management software uses device and workload models to compute the optimum data-to-device mapping. These models are embedded inside the storage management software that is developed using constraint satisfaction programming techniques. The main contribution of the proposed work is the development of workload-aware and system-aware storage techniques that significantly improve system performance and ease storage data management.