[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] Merge.
# HG changeset patch # User adsharma@xxxxxxxxxxxxxxxxxxxx # Node ID fa0754a9f64fc9e02c3eed2bb10368dd07d67d3f # Parent cc5f88b719d038555e62460bbdf9d38e13b953ac # Parent b74c15e4dd4f77b11ecb3eb112b94e0dbbc14607 Merge. diff -r cc5f88b719d0 -r fa0754a9f64f linux-2.6-xen-sparse/arch/xen/configs/xenU_defconfig_x86_64 --- a/linux-2.6-xen-sparse/arch/xen/configs/xenU_defconfig_x86_64 Tue Aug 23 19:03:21 2005 +++ b/linux-2.6-xen-sparse/arch/xen/configs/xenU_defconfig_x86_64 Wed Aug 24 20:29:21 2005 @@ -674,10 +674,10 @@ CONFIG_EXT2_FS_XATTR=y CONFIG_EXT2_FS_POSIX_ACL=y CONFIG_EXT2_FS_SECURITY=y -CONFIG_EXT3_FS=m +CONFIG_EXT3_FS=y CONFIG_EXT3_FS_XATTR=y -CONFIG_EXT3_FS_POSIX_ACL=y -CONFIG_EXT3_FS_SECURITY=y +# CONFIG_EXT3_FS_POSIX_ACL is not set +# CONFIG_EXT3_FS_SECURITY is not set CONFIG_JBD=m # CONFIG_JBD_DEBUG is not set CONFIG_FS_MBCACHE=y diff -r cc5f88b719d0 -r fa0754a9f64f linux-2.6-xen-sparse/arch/xen/x86_64/ia32/syscall32.c --- a/linux-2.6-xen-sparse/arch/xen/x86_64/ia32/syscall32.c Tue Aug 23 19:03:21 2005 +++ b/linux-2.6-xen-sparse/arch/xen/x86_64/ia32/syscall32.c Wed Aug 24 20:29:21 2005 @@ -128,8 +128,12 @@ #endif return 0; } - -__initcall(init_syscall32); + +/* + * This must be done early in case we have an initrd containing 32-bit + * binaries (e.g., hotplug). This could be pushed upstream to arch/x86_64. + */ +core_initcall(init_syscall32); /* May not be __init: called during resume */ void syscall32_cpu_init(void) diff -r cc5f88b719d0 -r fa0754a9f64f linux-2.6-xen-sparse/arch/xen/x86_64/kernel/head.S --- a/linux-2.6-xen-sparse/arch/xen/x86_64/kernel/head.S Tue Aug 23 19:03:21 2005 +++ b/linux-2.6-xen-sparse/arch/xen/x86_64/kernel/head.S Wed Aug 24 20:29:21 2005 @@ -43,7 +43,7 @@ cld /* Copy the necessary stuff from xen_start_info structure. */ movq $xen_start_info_union,%rdi - movq $64,%rcx /* sizeof (union xen_start_info_union) / sizeof (long) */ + movq $256,%rcx rep movsq #ifdef CONFIG_SMP diff -r cc5f88b719d0 -r fa0754a9f64f linux-2.6-xen-sparse/arch/xen/x86_64/kernel/setup.c --- a/linux-2.6-xen-sparse/arch/xen/x86_64/kernel/setup.c Tue Aug 23 19:03:21 2005 +++ b/linux-2.6-xen-sparse/arch/xen/x86_64/kernel/setup.c Wed Aug 24 20:29:21 2005 @@ -428,8 +428,9 @@ { unsigned long bootmap_size = init_bootmem(start_pfn, end_pfn); free_bootmem(0, end_pfn << PAGE_SHIFT); - /* XXX KAF: Why can't we leave low 1MB of memory free? */ - reserve_bootmem(0, (PFN_PHYS(start_pfn) + bootmap_size + PAGE_SIZE-1)); + reserve_bootmem(HIGH_MEMORY, + (PFN_PHYS(start_pfn) + bootmap_size + PAGE_SIZE-1) + - HIGH_MEMORY); } #else static void __init contig_initmem_init(void) diff -r cc5f88b719d0 -r fa0754a9f64f linux-2.6-xen-sparse/arch/xen/x86_64/mm/init.c --- a/linux-2.6-xen-sparse/arch/xen/x86_64/mm/init.c Tue Aug 23 19:03:21 2005 +++ b/linux-2.6-xen-sparse/arch/xen/x86_64/mm/init.c Wed Aug 24 20:29:21 2005 @@ -441,6 +441,31 @@ *dst = val; } +static inline int make_readonly(unsigned long paddr) +{ + int readonly = 0; + + /* Make new page tables read-only. */ + if ((paddr < ((table_start << PAGE_SHIFT) + tables_space)) && + (paddr >= (table_start << PAGE_SHIFT))) + readonly = 1; + + /* Make old page tables read-only. */ + if ((paddr < ((xen_start_info.pt_base - __START_KERNEL_map) + + (xen_start_info.nr_pt_frames << PAGE_SHIFT))) && + (paddr >= (xen_start_info.pt_base - __START_KERNEL_map))) + readonly = 1; + + /* + * No need for writable mapping of kernel image. This also ensures that + * page and descriptor tables embedded inside don't have writable mappings. + */ + if ((paddr >= __pa_symbol(&_text)) && (paddr < __pa_symbol(&_end))) + readonly = 1; + + return readonly; +} + void __init phys_pud_init(pud_t *pud, unsigned long address, unsigned long end) { long i, j, k; @@ -477,9 +502,7 @@ pte = alloc_low_page(&pte_phys); pte_save = pte; for (k = 0; k < PTRS_PER_PTE; pte++, k++, paddr += PTE_SIZE) { - if (paddr < (table_start << PAGE_SHIFT) - + tables_space) - { + if (make_readonly(paddr)) { __set_pte(pte, __pte(paddr | (_KERNPG_TABLE & ~_PAGE_RW))); continue; diff -r cc5f88b719d0 -r fa0754a9f64f linux-2.6-xen-sparse/drivers/xen/blkback/xenbus.c --- a/linux-2.6-xen-sparse/drivers/xen/blkback/xenbus.c Tue Aug 23 19:03:21 2005 +++ b/linux-2.6-xen-sparse/drivers/xen/blkback/xenbus.c Wed Aug 24 20:29:21 2005 @@ -75,21 +75,9 @@ err = xenbus_gather(be->frontpath, "grant-id", "%lu", &sharedmfn, "event-channel", "%u", &evtchn, NULL); if (err) { - xenbus_dev_error(be->dev, err, + xenbus_dev_error(be->dev, err, "reading %s/grant-id and event-channel", be->frontpath); - return; - } - - /* Domains must use same shared frame for all vbds. */ - if (evtchn != be->blkif->remote_evtchn || - sharedmfn != be->blkif->shmem_frame) { - xenbus_dev_error(be->dev, err, - "Shared frame/evtchn %li/%u not same as" - " old %li/%u", - sharedmfn, evtchn, - be->blkif->shmem_frame, - be->blkif->remote_evtchn); return; } @@ -189,6 +177,9 @@ err = register_xenbus_watch(&be->watch); if (err) { be->watch.node = NULL; + xenbus_dev_error(dev, err, + "adding frontend watch on %s", + be->frontpath); goto device_fail; } } @@ -223,12 +214,15 @@ if (IS_ERR(be->blkif)) { err = PTR_ERR(be->blkif); be->blkif = NULL; + xenbus_dev_error(dev, err, "creating block interface"); goto device_fail; } err = vbd_create(be->blkif, handle, be->pdev, be->readonly); - if (err) + if (err) { + xenbus_dev_error(dev, err, "creating vbd structure"); goto device_fail; + } frontend_changed(&be->watch, be->frontpath); } @@ -250,8 +244,10 @@ int err; be = kmalloc(sizeof(*be), GFP_KERNEL); - if (!be) + if (!be) { + xenbus_dev_error(dev, -ENOMEM, "allocating backend structure"); return -ENOMEM; + } memset(be, 0, sizeof(*be)); @@ -259,8 +255,11 @@ be->backend_watch.node = dev->nodename; be->backend_watch.callback = backend_changed; err = register_xenbus_watch(&be->backend_watch); - if (err) + if (err) { + xenbus_dev_error(dev, err, "adding backend watch on %s", + dev->nodename); goto free_be; + } dev->data = be; diff -r cc5f88b719d0 -r fa0754a9f64f linux-2.6-xen-sparse/drivers/xen/blkfront/blkfront.c --- a/linux-2.6-xen-sparse/drivers/xen/blkfront/blkfront.c Tue Aug 23 19:03:21 2005 +++ b/linux-2.6-xen-sparse/drivers/xen/blkfront/blkfront.c Wed Aug 24 20:29:21 2005 @@ -1165,8 +1165,10 @@ /* Create shared ring, alloc event channel. */ err = setup_blkring(dev, info); - if (err) + if (err) { + xenbus_dev_error(dev, err, "setting up block ring"); goto out; + } err = xenbus_transaction_start(dev->nodename); if (err) { @@ -1329,9 +1331,9 @@ int i; /* - * We should read 'nr_interfaces' from response message and wait - * for notifications before proceeding. For now we assume that we - * will be notified of exactly one interface. + * We should figure out how many and which devices we need to + * proceed and only wait for those. For now, continue once the + * first device is around. */ for ( i=0; blkif_state != BLKIF_STATE_CONNECTED && (i < 10*HZ); i++ ) { diff -r cc5f88b719d0 -r fa0754a9f64f linux-2.6-xen-sparse/drivers/xen/netfront/netfront.c --- a/linux-2.6-xen-sparse/drivers/xen/netfront/netfront.c Tue Aug 23 19:03:21 2005 +++ b/linux-2.6-xen-sparse/drivers/xen/netfront/netfront.c Wed Aug 24 20:29:21 2005 @@ -200,6 +200,7 @@ [BEST_CONNECTED] = "connected", }; +#define DEBUG #ifdef DEBUG #define DPRINTK(fmt, args...) \ printk(KERN_ALERT "xen_net (%s:%d) " fmt, __FUNCTION__, __LINE__, ##args) @@ -919,6 +920,7 @@ /* Send a connect message to xend to tell it to bring up the interface. */ static void send_interface_connect(struct net_private *np) { + int err; ctrl_msg_t cmsg = { .type = CMSG_NETIF_FE, .subtype = CMSG_NETIF_FE_INTERFACE_CONNECT, @@ -929,24 +931,22 @@ msg->handle = np->handle; msg->tx_shmem_frame = virt_to_mfn(np->tx); #ifdef CONFIG_XEN_NETDEV_GRANT_TX - msg->tx_shmem_ref = (u32)gnttab_claim_grant_reference(&gref_tx_head); - if(msg->tx_shmem_ref < 0) { - printk(KERN_ALERT "#### netfront can't claim tx_shmem reference\n"); + err = gnttab_grant_foreign_access(rdomid, msg->tx_shmem_frame, 0); + if (err < 0) { + printk(KERN_ALERT "#### netfront can't grant access to tx_shmem\n"); BUG(); } - gnttab_grant_foreign_access_ref (msg->tx_shmem_ref, rdomid, - msg->tx_shmem_frame, 0); + msg->tx_shmem_ref = err; #endif msg->rx_shmem_frame = virt_to_mfn(np->rx); #ifdef CONFIG_XEN_NETDEV_GRANT_RX - msg->rx_shmem_ref = (u32)gnttab_claim_grant_reference(&gref_rx_head); - if(msg->rx_shmem_ref < 0) { - printk(KERN_ALERT "#### netfront can't claim rx_shmem reference\n"); + err = gnttab_grant_foreign_access(rdomid, msg->rx_shmem_frame, 0); + if (err < 0) { + printk(KERN_ALERT "#### netfront can't grant access to rx_shmem\n"); BUG(); } - gnttab_grant_foreign_access_ref (msg->rx_shmem_ref, rdomid, - msg->rx_shmem_frame, 0); + msg->rx_shmem_ref = err; #endif ctrl_if_send_message_block(&cmsg, NULL, 0, TASK_UNINTERRUPTIBLE); @@ -1416,8 +1416,8 @@ if (xen_start_info.flags & SIF_INITDOMAIN) return 0; #ifdef CONFIG_XEN_NETDEV_GRANT_TX - /* A grant for every ring slot, plus one for the ring itself */ - if (gnttab_alloc_grant_references(NETIF_TX_RING_SIZE + 1, + /* A grant for every ring slot */ + if (gnttab_alloc_grant_references(NETIF_TX_RING_SIZE, &gref_tx_head) < 0) { printk(KERN_ALERT "#### netfront can't alloc tx grant refs\n"); return 1; @@ -1425,8 +1425,8 @@ printk(KERN_ALERT "Netdev frontend (TX) is using grant tables.\n"); #endif #ifdef CONFIG_XEN_NETDEV_GRANT_RX - /* A grant for every ring slot, plus one for the ring itself */ - if (gnttab_alloc_grant_references(NETIF_RX_RING_SIZE + 1, + /* A grant for every ring slot */ + if (gnttab_alloc_grant_references(NETIF_RX_RING_SIZE, &gref_rx_head) < 0) { printk(KERN_ALERT "#### netfront can't alloc rx grant refs\n"); return 1; diff -r cc5f88b719d0 -r fa0754a9f64f linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_probe.c --- a/linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_probe.c Tue Aug 23 19:03:21 2005 +++ b/linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_probe.c Wed Aug 24 20:29:21 2005 @@ -627,6 +627,8 @@ /* Watch for changes. */ register_xenbus_watch(&fe_watch); register_xenbus_watch(&be_watch); + /* Notify others that xenstore is up */ + notifier_call_chain(&xenstore_chain, 0, 0); up(&xenbus_lock); return 0; } @@ -637,7 +639,7 @@ bus_register(&xenbus_backend.bus); device_register(&xenbus_frontend.dev); device_register(&xenbus_backend.dev); - + if (!xen_start_info.store_evtchn) return 0; diff -r cc5f88b719d0 -r fa0754a9f64f linux-2.6-xen-sparse/include/asm-xen/asm-i386/mach-xen/setup_arch_post.h --- a/linux-2.6-xen-sparse/include/asm-xen/asm-i386/mach-xen/setup_arch_post.h Tue Aug 23 19:03:21 2005 +++ b/linux-2.6-xen-sparse/include/asm-xen/asm-i386/mach-xen/setup_arch_post.h Wed Aug 24 20:29:21 2005 @@ -8,23 +8,12 @@ static char * __init machine_specific_memory_setup(void) { - char *who; - unsigned long start_pfn, max_pfn; - - who = "Xen"; - - /* In dom0, we have to start the fake e820 map above the first - * 1MB, in other domains, it can start at 0. */ - if (xen_start_info.flags & SIF_INITDOMAIN) - start_pfn = 0x100; - else - start_pfn = 0; - max_pfn = xen_start_info.nr_pages; + unsigned long max_pfn = xen_start_info.nr_pages; e820.nr_map = 0; - add_memory_region(PFN_PHYS(start_pfn), PFN_PHYS(max_pfn) - PFN_PHYS(start_pfn), E820_RAM); + add_memory_region(0, PFN_PHYS(max_pfn), E820_RAM); - return who; + return "Xen"; } void __init machine_specific_modify_cpu_capabilities(struct cpuinfo_x86 *c) diff -r cc5f88b719d0 -r fa0754a9f64f tools/xenstore/testsuite/02directory.test --- a/tools/xenstore/testsuite/02directory.test Tue Aug 23 19:03:21 2005 +++ b/tools/xenstore/testsuite/02directory.test Wed Aug 24 20:29:21 2005 @@ -32,3 +32,16 @@ mkdir /dir expect mkdir failed: File exists mkdir /dir/test2 + +# Mkdir implicitly creates directories. +mkdir /dir/1/2/3/4 +expect test2 +expect 1 +dir /dir +expect 2 +dir /dir/1 +expect 3 +dir /dir/1/2 +expect 4 +dir /dir/1/2/3 +dir /dir/1/2/3/4 diff -r cc5f88b719d0 -r fa0754a9f64f tools/xenstore/testsuite/03write.test --- a/tools/xenstore/testsuite/03write.test Tue Aug 23 19:03:21 2005 +++ b/tools/xenstore/testsuite/03write.test Wed Aug 24 20:29:21 2005 @@ -18,3 +18,22 @@ write /test create contents3 expect contents3 read /test + +# Write should implicitly create directories +write /dir/test create contents +expect test +dir /dir +expect contents +read /dir/test +write /dir/1/2/3/4 excl contents4 +expect test +expect 1 +dir /dir +expect 2 +dir /dir/1 +expect 3 +dir /dir/1/2 +expect 4 +dir /dir/1/2/3 +expect contents4 +read /dir/1/2/3/4 diff -r cc5f88b719d0 -r fa0754a9f64f tools/xenstore/testsuite/06dirpermissions.test --- a/tools/xenstore/testsuite/06dirpermissions.test Tue Aug 23 19:03:21 2005 +++ b/tools/xenstore/testsuite/06dirpermissions.test Wed Aug 24 20:29:21 2005 @@ -117,3 +117,11 @@ write /dir/subdir/subfile excl contents expect 3 READ/WRITE getperm /dir/subdir/subfile + +# Inheritence works through multiple directories, too. +write /dir/subdir/1/2/3/4 excl contents +expect 3 READ/WRITE +getperm /dir/subdir/1/2/3/4 +mkdir /dir/subdir/a/b/c/d +expect 3 READ/WRITE +getperm /dir/subdir/a/b/c/d diff -r cc5f88b719d0 -r fa0754a9f64f tools/xenstore/testsuite/test.sh --- a/tools/xenstore/testsuite/test.sh Tue Aug 23 19:03:21 2005 +++ b/tools/xenstore/testsuite/test.sh Wed Aug 24 20:29:21 2005 @@ -8,7 +8,7 @@ rm -rf $XENSTORED_ROOTDIR mkdir $XENSTORED_ROOTDIR if [ $VALGRIND -eq 1 ]; then - valgrind -q --logfile-fd=3 ./xenstored_test --output-pid --trace-file=testsuite/tmp/trace --no-fork 3>testsuite/tmp/vgout > /tmp/pid 2> testsuite/tmp/xenstored_errors & + valgrind --suppressions=testsuite/vg-suppressions -q ./xenstored_test --output-pid --trace-file=testsuite/tmp/trace --no-fork > /tmp/pid 2> testsuite/tmp/xenstored_errors & while [ ! -s /tmp/pid ]; do sleep 0; done PID=`cat /tmp/pid` rm /tmp/pid @@ -17,10 +17,10 @@ PID=`./xenstored_test --output-pid --trace-file=testsuite/tmp/trace` fi if ./xs_test $2 $1; then - if [ -s testsuite/tmp/vgout ]; then + if [ -s testsuite/tmp/xenstored_errors ]; then kill $PID - echo VALGRIND errors: - cat testsuite/tmp/vgout + echo Errors: + cat testsuite/tmp/xenstored_errors return 1 fi echo shutdown | ./xs_test @@ -52,11 +52,10 @@ case `basename $f` in $MATCH) RUN=1;; esac [ -n "$RUN" ] || continue - if run_test $f > /dev/null; then + if run_test $f -x >/tmp/out; then echo -n . else - echo Test $f failed, running verbosely... - run_test $f -x || true + cat /tmp/out # That will have filled the screen, repeat message. echo Test $f failed exit 1 diff -r cc5f88b719d0 -r fa0754a9f64f tools/xenstore/xenstored_core.c --- a/tools/xenstore/xenstored_core.c Tue Aug 23 19:03:21 2005 +++ b/tools/xenstore/xenstored_core.c Wed Aug 24 20:29:21 2005 @@ -423,14 +423,24 @@ return node_dir_inside_transaction(trans, node); } +static char *datafile(const char *dir) +{ + return talloc_asprintf(dir, "%s/.data", dir); +} + static char *node_datafile(struct transaction *trans, const char *node) { - return talloc_asprintf(node, "%s/.data", node_dir(trans, node)); + return datafile(node_dir(trans, node)); +} + +static char *permfile(const char *dir) +{ + return talloc_asprintf(dir, "%s/.perms", dir); } static char *node_permfile(struct transaction *trans, const char *node) { - return talloc_asprintf(node, "%s/.perms", node_dir(trans, node)); + return permfile(node_dir(trans, node)); } struct buffered_data *new_buffer(void *ctx) @@ -557,15 +567,14 @@ } /* If it fails, returns NULL and sets errno. */ -static struct xs_permissions *get_perms(struct transaction *transaction, - const char *node, unsigned int *num) +static struct xs_permissions *get_perms(const char *dir, unsigned int *num) { unsigned int size; char *strings; struct xs_permissions *ret; int *fd; - fd = talloc_open(node_permfile(transaction, node), O_RDONLY, 0); + fd = talloc_open(permfile(dir), O_RDONLY, 0); if (!fd) return NULL; strings = read_all(fd, &size); @@ -573,14 +582,14 @@ return NULL; *num = xs_count_strings(strings, size); - ret = talloc_array(node, struct xs_permissions, *num); + ret = talloc_array(dir, struct xs_permissions, *num); if (!xs_strings_to_perms(ret, *num, strings)) - corrupt(NULL, "Permissions corrupt for %s", node); + corrupt(NULL, "Permissions corrupt for %s", dir); return ret; } -static char *perms_to_strings(const char *node, +static char *perms_to_strings(const void *ctx, struct xs_permissions *perms, unsigned int num, unsigned int *len) { @@ -592,7 +601,7 @@ if (!xs_perm_to_string(&perms[i], buffer)) return NULL; - strings = talloc_realloc(node, strings, char, + strings = talloc_realloc(ctx, strings, char, *len + strlen(buffer) + 1); strcpy(strings + *len, buffer); *len += strlen(buffer) + 1; @@ -625,16 +634,23 @@ return 0; } +/* Create a self-destructing temporary path */ +static char *temppath(const char *path) +{ + char *tmppath = talloc_asprintf(path, "%s.tmp", path); + talloc_set_destructor(tmppath, destroy_path); + return tmppath; +} + /* Create a self-destructing temporary file */ static char *tempfile(const char *path, void *contents, unsigned int len) { int *fd; - char *tmppath = talloc_asprintf(path, "%s.tmp", path); + char *tmppath = temppath(path); fd = talloc_open(tmppath, O_WRONLY|O_CREAT|O_EXCL, 0640); if (!fd) return NULL; - talloc_set_destructor(tmppath, destroy_path); if (!xs_write_all(*fd, contents, len)) return NULL; @@ -732,7 +748,7 @@ do { node = get_parent(node); - perms = get_perms(conn->transaction, node, &num); + perms = get_perms(node_dir(conn->transaction, node), &num); if (perms) break; } while (!streq(node, "/")); @@ -788,7 +804,7 @@ return false; } - perms = get_perms(conn->transaction, node, &num); + perms = get_perms(node_dir(conn->transaction, node), &num); if (perms) { if (perm_for_id(conn->id, perms, num) & perm) @@ -875,44 +891,64 @@ send_reply(conn, XS_READ, value, size); } -/* Create a new directory. Optionally put data in it (if data != NULL) */ -static bool new_directory(struct connection *conn, - const char *node, void *data, unsigned int datalen) +/* Commit this directory, eg. comitting a/b.tmp/c causes a/b.tmp -> a.b */ +static bool commit_dir(char *dir) +{ + char *dot, *slash, *dest; + + dot = strrchr(dir, '.'); + slash = strchr(dot, '/'); + if (slash) + *slash = '\0'; + + dest = talloc_asprintf(dir, "%.*s", dot - dir, dir); + return rename(dir, dest) == 0; +} + +/* Create a temporary directory. Put data in it (if data != NULL) */ +static char *tempdir(struct connection *conn, + const char *node, void *data, unsigned int datalen) { struct xs_permissions *perms; char *permstr; unsigned int num, len; int *fd; - char *dir = node_dir(conn->transaction, node); - - if (mkdir(dir, 0750) != 0) - return false; - - /* Set destructor so we clean up if neccesary. */ - talloc_set_destructor(dir, destroy_path); - - perms = get_perms(conn->transaction, get_parent(node), &num); + char *dir; + + dir = temppath(node_dir(conn->transaction, node)); + if (mkdir(dir, 0750) != 0) { + if (errno != ENOENT) + return NULL; + + dir = tempdir(conn, get_parent(node), NULL, 0); + if (!dir) + return NULL; + + dir = talloc_asprintf(dir, "%s%s", dir, strrchr(node, '/')); + if (mkdir(dir, 0750) != 0) + return NULL; + talloc_set_destructor(dir, destroy_path); + } + + perms = get_perms(get_parent(dir), &num); + assert(perms); /* Domains own what they create. */ if (conn->id) perms->id = conn->id; permstr = perms_to_strings(dir, perms, num, &len); - fd = talloc_open(node_permfile(conn->transaction, node), - O_WRONLY|O_CREAT|O_EXCL, 0640); + fd = talloc_open(permfile(dir), O_WRONLY|O_CREAT|O_EXCL, 0640); if (!fd || !xs_write_all(*fd, permstr, len)) - return false; + return NULL; if (data) { - char *datapath = node_datafile(conn->transaction, node); + char *datapath = datafile(dir); fd = talloc_open(datapath, O_WRONLY|O_CREAT|O_EXCL, 0640); if (!fd || !xs_write_all(*fd, data, datalen)) - return false; - } - - /* Finished! */ - talloc_set_destructor(dir, NULL); - return true; + return NULL; + } + return dir; } /* path, flags, data... */ @@ -959,6 +995,8 @@ } if (lstat(node_dir(conn->transaction, node), &st) != 0) { + char *dir; + /* Does not exist... */ if (errno != ENOENT) { send_error(conn, errno); @@ -971,10 +1009,12 @@ return; } - if (!new_directory(conn, node, in->buffer + offset, datalen)) { + dir = tempdir(conn, node, in->buffer + offset, datalen); + if (!dir || !commit_dir(dir)) { send_error(conn, errno); return; } + } else { /* Exists... */ if (streq(vec[1], XS_WRITE_CREATE_EXCL)) { @@ -999,6 +1039,9 @@ static void do_mkdir(struct connection *conn, const char *node) { + char *dir; + struct stat st; + node = canonicalize(conn, node); if (!check_node_perms(conn, node, XS_PERM_WRITE|XS_PERM_ENOENT_OK)) { send_error(conn, errno); @@ -1013,7 +1056,14 @@ if (transaction_block(conn, node)) return; - if (!new_directory(conn, node, NULL, 0)) { + /* Must not already exist. */ + if (lstat(node_dir(conn->transaction, node), &st) == 0) { + send_error(conn, EEXIST); + return; + } + + dir = tempdir(conn, node, NULL, 0); + if (!dir || !commit_dir(dir)) { send_error(conn, errno); return; } @@ -1073,7 +1123,7 @@ return; } - perms = get_perms(conn->transaction, node, &num); + perms = get_perms(node_dir(conn->transaction, node), &num); if (!perms) { send_error(conn, errno); return; diff -r cc5f88b719d0 -r fa0754a9f64f tools/xenstore/xs_random.c --- a/tools/xenstore/xs_random.c Tue Aug 23 19:03:21 2005 +++ b/tools/xenstore/xs_random.c Wed Aug 24 20:29:21 2005 @@ -303,6 +303,34 @@ return true; } +static char *parent_filename(const char *name) +{ + char *slash = strrchr(name + 1, '/'); + if (!slash) + return talloc_strdup(name, "/"); + return talloc_asprintf(name, "%.*s", slash-name, name); +} + +static void make_dirs(const char *filename) +{ + struct stat st; + + if (lstat(filename, &st) == 0 && S_ISREG(st.st_mode)) + convert_to_dir(filename); + + if (mkdir(filename, 0700) == 0) { + init_perms(filename); + return; + } + if (errno == EEXIST) + return; + + make_dirs(parent_filename(filename)); + if (mkdir(filename, 0700) != 0) + barf_perror("Failed to mkdir %s", filename); + init_perms(filename); +} + static bool file_write(struct file_ops_info *info, const char *path, const void *data, unsigned int len, int createflags) @@ -329,6 +357,9 @@ } } + if (createflags & O_CREAT) + make_dirs(parent_filename(filename)); + fd = open(filename, createflags|O_TRUNC|O_WRONLY, 0600); if (fd < 0) { /* FIXME: Another hack. */ @@ -352,6 +383,7 @@ if (!write_ok(info, path)) return false; + make_dirs(parent_filename(dirname)); if (mkdir(dirname, 0700) != 0) return false; @@ -420,7 +452,7 @@ } if (abort) { - cmd = talloc_asprintf(NULL, "rm -r %s", info->transact_base); + cmd = talloc_asprintf(NULL, "rm -rf %s", info->transact_base); do_command(cmd); goto success; } @@ -1004,8 +1036,8 @@ } else { dup2(fds[1], STDOUT_FILENO); close(fds[0]); -#if 0 - execlp("valgrind", "valgrind", "xenstored_test", "--output-pid", +#if 1 + execlp("valgrind", "valgrind", "-q", "--suppressions=testsuite/vg-suppressions", "xenstored_test", "--output-pid", "--no-fork", NULL); #else execlp("./xenstored_test", "xenstored_test", "--output-pid", diff -r cc5f88b719d0 -r fa0754a9f64f xen/arch/x86/cpu/amd.c --- a/xen/arch/x86/cpu/amd.c Tue Aug 23 19:03:21 2005 +++ b/xen/arch/x86/cpu/amd.c Wed Aug 24 20:29:21 2005 @@ -8,6 +8,20 @@ #include <asm/processor.h> #include "cpu.h" + +/* + * amd_flush_filter={on,off}. Forcibly Enable or disable the TLB flush + * filter on AMD 64-bit processors. + */ +static int flush_filter_force; +static void flush_filter(char *s) +{ + if (!strcmp(s, "off")) + flush_filter_force = -1; + if (!strcmp(s, "on")) + flush_filter_force = 1; +} +custom_param("amd_flush_filter", flush_filter); #define num_physpages 0 @@ -190,6 +204,21 @@ case 6: set_bit(X86_FEATURE_K7, c->x86_capability); break; + } + + if (c->x86 == 15) { + rdmsr(MSR_K7_HWCR, l, h); + printk(KERN_INFO "CPU%d: AMD Flush Filter %sabled", + smp_processor_id(), (l & (1<<6)) ? "dis" : "en"); + if ((flush_filter_force > 0) && (l & (1<<6))) { + l &= ~(1<<6); + printk(" -> Forcibly enabled"); + } else if ((flush_filter_force < 0) && !(l & (1<<6))) { + l |= 1<<6; + printk(" -> Forcibly disabled"); + } + wrmsr(MSR_K7_HWCR, l, h); + printk("\n"); } display_cacheinfo(c); diff -r cc5f88b719d0 -r fa0754a9f64f xen/arch/x86/mm.c --- a/xen/arch/x86/mm.c Tue Aug 23 19:03:21 2005 +++ b/xen/arch/x86/mm.c Wed Aug 24 20:29:21 2005 @@ -1449,8 +1449,10 @@ if ( ((x & PGT_type_mask) != PGT_l2_page_table) || ((type & PGT_type_mask) != PGT_l1_page_table) ) MEM_LOG("Bad type (saw %" PRtype_info - "!= exp %" PRtype_info ") for pfn %lx", - x, type, page_to_pfn(page)); + "!= exp %" PRtype_info ") " + "for mfn %lx (pfn %x)", + x, type, page_to_pfn(page), + machine_to_phys_mapping[page_to_pfn(page)]); return 0; } else if ( (x & PGT_va_mask) == PGT_va_mutable ) _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |