Skip to contentSkip to conversation

eCryptfs: convert mmap functions to use persistent file

bug report Dan Carpenter 1 participant 1 message Jan 19, 2022 Ecrypt file system

lore
Share & tools
lore
#0 lore raw

Hello eCryptFS developers,

The patch bf12be1cc851: "eCryptfs: convert mmap functions to use persistent file" from Oct 16, 2007, leads to the following Smatch static checker warning:

	./include/linux/fs.h:777 inode_lock()
	warn: sleeping in atomic context

ecryptfs_copy_up_encrypted_with_header() <- disables preempt -> ecryptfs_read_xattr_region()
-> ecryptfs_getxattr_lower()

      -> inode_lock()

fs/ecryptfs/mmap.c
108 static int
109 ecryptfs_copy_up_encrypted_with_header(struct page *page,
110 struct ecryptfs_crypt_stat *crypt_stat)
111 {
112 loff_t extent_num_in_page = 0;
113 loff_t num_extents_per_page = (PAGE_SIZE
114 / crypt_stat->extent_size);
115 int rc = 0;
116
117 while (extent_num_in_page < num_extents_per_page) {
118 loff_t view_extent_num = ((((loff_t)page->index)
119 * num_extents_per_page)
120 + extent_num_in_page);
121 size_t num_header_extents_at_front =
122 (crypt_stat->metadata_size / crypt_stat->extent_size);
123
124 if (view_extent_num < num_header_extents_at_front) {
125 /* This is a header extent */
126 char *page_virt;
127
128 page_virt = kmap_atomic(page);

kmap_atomic() disables preemption

   129                                memset(page_virt, 0, PAGE_SIZE);
   130                                /* TODO: Support more than one header extent */
   131                                if (view_extent_num == 0) {
   132                                        size_t written;
   133
   134                                        rc = ecryptfs_read_xattr_region(
                                                   ^^^^^^^^^^^^^^^^^^^^^^^^^^

ecryptfs_read_xattr_region() cannot succeed without taking a mutex.

   135                                                page_virt, page->mapping->host);
   136                                        strip_xattr_flag(page_virt + 16, crypt_stat);
   137                                        ecryptfs_write_header_metadata(page_virt + 20,
   138                                                                       crypt_stat,
   139                                                                       &written);
   140                                }
   141                                kunmap_atomic(page_virt);
   142                                flush_dcache_page(page);
   143                                if (rc) {
   144                                        printk(KERN_ERR "%s: Error reading xattr "
   145                                               "region; rc = [%d]\n", __func__, rc);
   146                                        goto out;
   147                                }
   148                        } else {

regards,
dan carpenter