From: Alan C. <al...@lx...> - 2002-08-04 12:36:16
|
On Sun, 2004-06-27 at 19:49, Jos=E9 Fonseca wrote: > And the actual code is >=20 > #if LINUX_VERSION_CODE < 0x020500 > atomic_dec(&virt_to_page(page)->count); > clear_bit(PG_locked, &virt_to_page(page)->flags); > wake_up(&virt_to_page(page)->wait); > #else > struct page *p =3D virt_to_page(page); > put_page(p); > unlock_page(p); > #endif > Has the change that lead to the above error happened during the 2.4.x > series or must been added by the vendor? As of 2.4.19 the page structure reads as follows typedef struct page { struct list_head list; /* ->mapping has some page lists. */ struct address_space *mapping; /* The inode (or ...) we belong to. */ unsigned long index; /* Our offset within mapping. */ struct page *next_hash; /* Next page sharing our hash bucket in the pagecache hash table. */ atomic_t count; /* Usage count, see below. */ unsigned long flags; /* atomic flags, some possibly updated asynchronously */ struct list_head lru; /* Pageout list, eg. active_list; protected by pagemap_lru_lock !! */ struct page **pprev_hash; /* Complement to *next_hash. */ struct buffer_head * buffers; /* Buffer maps us to a disk block. */ /* * On machines where all RAM is mapped into kernel address space, * we can simply calculate the virtual address. On machines with * highmem some memory is mapped into kernel virtual memory * dynamically, so we need a place to store that address. * Note that this field could be 16 bits on x86 ... ;) * * Architectures with slow multiplication can define * WANT_PAGE_VIRTUAL in asm/page.h */ #if defined(CONFIG_HIGHMEM) || defined(WANT_PAGE_VIRTUAL) void *virtual; /* Kernel virtual address (NULL if not kmapped, ie. highmem) */ #endif /* CONFIG_HIGMEM || WANT_PAGE_VIRTUAL */ } mem_map_t; The page fields are abstracted by the interface "wait_on_page(page)" since at least 2.4.9. Similarly according to the 2.4.9 tree I took a quick look at get_page/put_page are also abstracted in 2.4. Alan |