Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Auto-update from upstream

Len Brown add5b5ee 25da0974

+3861 -2254
+1
.gitignore
··· 10 10 *.a 11 11 *.s 12 12 *.ko 13 + *.so 13 14 *.mod.c 14 15 15 16 #
-9
Documentation/feature-removal-schedule.txt
··· 71 71 72 72 --------------------------- 73 73 74 - What: i2c sysfs name change: in1_ref, vid deprecated in favour of cpu0_vid 75 - When: November 2005 76 - Files: drivers/i2c/chips/adm1025.c, drivers/i2c/chips/adm1026.c 77 - Why: Match the other drivers' name for the same function, duplicate names 78 - will be available until removal of old names. 79 - Who: Grant Coady <gcoady@gmail.com> 80 - 81 - --------------------------- 82 - 83 74 What: remove EXPORT_SYMBOL(panic_timeout) 84 75 When: April 2006 85 76 Files: kernel/panic.c
+11 -8
Documentation/hwmon/w83627hf
··· 54 54 use the w83781d driver. However this is not the preferred method 55 55 now that this ISA driver has been developed. 56 56 57 - Technically, the w83627thf does not support a VID reading. However, it's 58 - possible or even likely that your mainboard maker has routed these signals 59 - to a specific set of general purpose IO pins (the Asus P4C800-E is one such 60 - board). The w83627thf driver now interprets these as VID. If the VID on 61 - your board doesn't work, first see doc/vid in the lm_sensors package. If 62 - that still doesn't help, email us at lm-sensors@lm-sensors.org. 57 + The w83627_HF_ uses pins 110-106 as VID0-VID4. The w83627_THF_ uses the 58 + same pins as GPIO[0:4]. Technically, the w83627_THF_ does not support a 59 + VID reading. However the two chips have the identical 128 pin package. So, 60 + it is possible or even likely for a w83627thf to have the VID signals routed 61 + to these pins despite their not being labeled for that purpose. Therefore, 62 + the w83627thf driver interprets these as VID. If the VID on your board 63 + doesn't work, first see doc/vid in the lm_sensors package[1]. If that still 64 + doesn't help, you may just ignore the bogus VID reading with no harm done. 63 65 64 - For further information on this driver see the w83781d driver 65 - documentation. 66 + For further information on this driver see the w83781d driver documentation. 67 + 68 + [1] http://www2.lm-sensors.nu/~lm78/cvs/browse.cgi/lm_sensors2/doc/vid 66 69
+2 -1
Documentation/i2c/busses/i2c-nforce2
··· 5 5 * nForce2 Ultra 400 MCP 10de:0084 6 6 * nForce3 Pro150 MCP 10de:00D4 7 7 * nForce3 250Gb MCP 10de:00E4 8 - * nForce4 MCP 10de:0052 8 + * nForce4 MCP 10de:0052 9 + * nForce4 MCP-04 10de:0034 9 10 10 11 Datasheet: not publically available, but seems to be similar to the 11 12 AMD-8111 SMBus 2.0 adapter.
+1
Documentation/i2c/busses/i2c-parport
··· 17 17 * Velleman K8000 adapter 18 18 * ELV adapter 19 19 * Analog Devices evaluation boards (ADM1025, ADM1030, ADM1031, ADM1032) 20 + * Barco LPT->DVI (K5800236) adapter 20 21 21 22 These devices use different pinout configurations, so you have to tell 22 23 the driver what you have, using the type module parameter. There is no
+51 -35
Documentation/i2c/porting-clients
··· 1 - Revision 5, 2005-07-29 1 + Revision 6, 2005-11-20 2 2 Jean Delvare <khali@linux-fr.org> 3 3 Greg KH <greg@kroah.com> 4 4 5 5 This is a guide on how to convert I2C chip drivers from Linux 2.4 to 6 6 Linux 2.6. I have been using existing drivers (lm75, lm78) as examples. 7 7 Then I converted a driver myself (lm83) and updated this document. 8 + Note that this guide is strongly oriented towards hardware monitoring 9 + drivers. Many points are still valid for other type of drivers, but 10 + others may be irrelevant. 8 11 9 12 There are two sets of points below. The first set concerns technical 10 13 changes. The second set concerns coding policy. Both are mandatory. ··· 25 22 #include <linux/module.h> 26 23 #include <linux/init.h> 27 24 #include <linux/slab.h> 25 + #include <linux/jiffies.h> 28 26 #include <linux/i2c.h> 27 + #include <linux/i2c-isa.h> /* for ISA drivers */ 29 28 #include <linux/hwmon.h> /* for hardware monitoring drivers */ 30 29 #include <linux/hwmon-sysfs.h> 31 30 #include <linux/hwmon-vid.h> /* if you need VRM support */ 31 + #include <linux/err.h> /* for class registration */ 32 32 #include <asm/io.h> /* if you have I/O operations */ 33 33 Please respect this inclusion order. Some extra headers may be 34 34 required for a given driver (e.g. "lm75.h"). 35 35 36 36 * [Addresses] SENSORS_I2C_END becomes I2C_CLIENT_END, ISA addresses 37 - are no more handled by the i2c core. 37 + are no more handled by the i2c core. Address ranges are no more 38 + supported either, define each individual address separately. 38 39 SENSORS_INSMOD_<n> becomes I2C_CLIENT_INSMOD_<n>. 39 40 40 41 * [Client data] Get rid of sysctl_id. Try using standard names for ··· 55 48 int kind); 56 49 static void lm75_init_client(struct i2c_client *client); 57 50 static int lm75_detach_client(struct i2c_client *client); 58 - static void lm75_update_client(struct i2c_client *client); 51 + static struct lm75_data lm75_update_device(struct device *dev); 59 52 60 53 * [Sysctl] All sysctl stuff is of course gone (defines, ctl_table 61 54 and functions). Instead, you have to define show and set functions for 62 55 each sysfs file. Only define set for writable values. Take a look at an 63 - existing 2.6 driver for details (lm78 for example). Don't forget 56 + existing 2.6 driver for details (it87 for example). Don't forget 64 57 to define the attributes for each file (this is that step that 65 58 links callback functions). Use the file names specified in 66 - Documentation/i2c/sysfs-interface for the individual files. Also 59 + Documentation/hwmon/sysfs-interface for the individual files. Also 67 60 convert the units these files read and write to the specified ones. 68 61 If you need to add a new type of file, please discuss it on the 69 62 sensors mailing list <lm-sensors@lm-sensors.org> by providing a 70 - patch to the Documentation/i2c/sysfs-interface file. 63 + patch to the Documentation/hwmon/sysfs-interface file. 71 64 72 65 * [Attach] For I2C drivers, the attach function should make sure 73 - that the adapter's class has I2C_CLASS_HWMON, using the 74 - following construct: 66 + that the adapter's class has I2C_CLASS_HWMON (or whatever class is 67 + suitable for your driver), using the following construct: 75 68 if (!(adapter->class & I2C_CLASS_HWMON)) 76 69 return 0; 77 70 ISA-only drivers of course don't need this. ··· 79 72 80 73 * [Detect] As mentioned earlier, the flags parameter is gone. 81 74 The type_name and client_name strings are replaced by a single 82 - name string, which will be filled with a lowercase, short string 83 - (typically the driver name, e.g. "lm75"). 75 + name string, which will be filled with a lowercase, short string. 84 76 In i2c-only drivers, drop the i2c_is_isa_adapter check, it's 85 77 useless. Same for isa-only drivers, as the test would always be 86 78 true. Only hybrid drivers (which are quite rare) still need it. 87 - The errorN labels are reduced to the number needed. If that number 88 - is 2 (i2c-only drivers), it is advised that the labels are named 89 - exit and exit_free. For i2c+isa drivers, labels should be named 90 - ERROR0, ERROR1 and ERROR2. Don't forget to properly set err before 79 + The labels used for error paths are reduced to the number needed. 80 + It is advised that the labels are given descriptive names such as 81 + exit and exit_free. Don't forget to properly set err before 91 82 jumping to error labels. By the way, labels should be left-aligned. 92 83 Use kzalloc instead of kmalloc. 93 84 Use i2c_set_clientdata to set the client data (as opposed to 94 85 a direct access to client->data). 95 - Use strlcpy instead of strcpy to copy the client name. 86 + Use strlcpy instead of strcpy or snprintf to copy the client name. 96 87 Replace the sysctl directory registration by calls to 97 88 device_create_file. Move the driver initialization before any 98 89 sysfs file creation. 90 + Register the client with the hwmon class (using hwmon_device_register) 91 + if applicable. 99 92 Drop client->id. 100 93 Drop any 24RF08 corruption prevention you find, as this is now done 101 94 at the i2c-core level, and doing it twice voids it. 95 + Don't add I2C_CLIENT_ALLOW_USE to client->flags, it's the default now. 102 96 103 97 * [Init] Limits must not be set by the driver (can be done later in 104 98 user-space). Chip should not be reset default (although a module 105 - parameter may be used to force is), and initialization should be 99 + parameter may be used to force it), and initialization should be 106 100 limited to the strictly necessary steps. 107 101 108 - * [Detach] Get rid of data, remove the call to 109 - i2c_deregister_entry. Do not log an error message if 110 - i2c_detach_client fails, as i2c-core will now do it for you. 102 + * [Detach] Remove the call to i2c_deregister_entry. Do not log an 103 + error message if i2c_detach_client fails, as i2c-core will now do 104 + it for you. 105 + Unregister from the hwmon class if applicable. 111 106 112 - * [Update] Don't access client->data directly, use 113 - i2c_get_clientdata(client) instead. 107 + * [Update] The function prototype changed, it is now 108 + passed a device structure, which you have to convert to a client 109 + using to_i2c_client(dev). The update function should return a 110 + pointer to the client data. 111 + Don't access client->data directly, use i2c_get_clientdata(client) 112 + instead. 113 + Use time_after() instead of direct jiffies comparison. 114 114 115 - * [Interface] Init function should not print anything. Make sure 116 - there is a MODULE_LICENSE() line, at the bottom of the file 117 - (after MODULE_AUTHOR() and MODULE_DESCRIPTION(), in this order). 115 + * [Interface] Make sure there is a MODULE_LICENSE() line, at the bottom 116 + of the file (after MODULE_AUTHOR() and MODULE_DESCRIPTION(), in this 117 + order). 118 + 119 + * [Driver] The flags field of the i2c_driver structure is gone. 120 + I2C_DF_NOTIFY is now the default behavior. 121 + The i2c_driver structure has a driver member, which is itself a 122 + structure, those name member should be initialized to a driver name 123 + string. i2c_driver itself has no name member anymore. 118 124 119 125 Coding policy: 120 126 121 127 * [Copyright] Use (C), not (c), for copyright. 122 128 123 129 * [Debug/log] Get rid of #ifdef DEBUG/#endif constructs whenever you 124 - can. Calls to printk/pr_debug for debugging purposes are replaced 125 - by calls to dev_dbg. Here is an example on how to call it (taken 126 - from lm75_detect): 130 + can. Calls to printk for debugging purposes are replaced by calls to 131 + dev_dbg where possible, else to pr_debug. Here is an example of how 132 + to call it (taken from lm75_detect): 127 133 dev_dbg(&client->dev, "Starting lm75 update\n"); 128 134 Replace other printk calls with the dev_info, dev_err or dev_warn 129 135 function, as appropriate. 130 136 131 - * [Constants] Constants defines (registers, conversions, initial 132 - values) should be aligned. This greatly improves readability. 133 - Same goes for variables declarations. Alignments are achieved by the 134 - means of tabs, not spaces. Remember that tabs are set to 8 in the 135 - Linux kernel code. 136 - 137 - * [Structure definition] The name field should be standardized. All 138 - lowercase and as simple as the driver name itself (e.g. "lm75"). 137 + * [Constants] Constants defines (registers, conversions) should be 138 + aligned. This greatly improves readability. 139 + Alignments are achieved by the means of tabs, not spaces. Remember 140 + that tabs are set to 8 in the Linux kernel code. 139 141 140 142 * [Layout] Avoid extra empty lines between comments and what they 141 143 comment. Respect the coding style (see Documentation/CodingStyle),
+6 -14
Documentation/i2c/writing-clients
··· 25 25 address. 26 26 27 27 static struct i2c_driver foo_driver = { 28 - .owner = THIS_MODULE, 29 - .name = "Foo version 2.3 driver", 30 - .flags = I2C_DF_NOTIFY, 28 + .driver = { 29 + .name = "foo", 30 + }, 31 31 .attach_adapter = &foo_attach_adapter, 32 32 .detach_client = &foo_detach_client, 33 33 .command = &foo_command /* may be NULL */ ··· 35 35 36 36 The name field must match the driver name, including the case. It must not 37 37 contain spaces, and may be up to 31 characters long. 38 - 39 - Don't worry about the flags field; just put I2C_DF_NOTIFY into it. This 40 - means that your driver will be notified when new adapters are found. 41 - This is almost always what you want. 42 38 43 39 All other fields are for call-back functions which will be explained 44 40 below. ··· 492 496 by `__init_data'. Hose functions and structures can be removed after 493 497 kernel booting (or module loading) is completed. 494 498 499 + 495 500 Command function 496 501 ================ 497 502 498 503 A generic ioctl-like function call back is supported. You will seldom 499 - need this. You may even set it to NULL. 500 - 501 - /* No commands defined */ 502 - int foo_command(struct i2c_client *client, unsigned int cmd, void *arg) 503 - { 504 - return 0; 505 - } 504 + need this, and its use is deprecated anyway, so newer design should not 505 + use it. Set it to NULL. 506 506 507 507 508 508 Sending and receiving
+40
Documentation/kbuild/modules.txt
··· 18 18 === 5. Include files 19 19 --- 5.1 How to include files from the kernel include dir 20 20 --- 5.2 External modules using an include/ dir 21 + --- 5.3 External modules using several directories 21 22 === 6. Module installation 22 23 --- 6.1 INSTALL_MOD_PATH 23 24 --- 6.2 INSTALL_MOD_DIR ··· 345 344 Note that in the assignment there is no space between -I and the path. 346 345 This is a kbuild limitation: there must be no space present. 347 346 347 + --- 5.3 External modules using several directories 348 + 349 + If an external module does not follow the usual kernel style but 350 + decide to spread files over several directories then kbuild can 351 + support this too. 352 + 353 + Consider the following example: 354 + 355 + | 356 + +- src/complex_main.c 357 + | +- hal/hardwareif.c 358 + | +- hal/include/hardwareif.h 359 + +- include/complex.h 360 + 361 + To build a single module named complex.ko we then need the following 362 + kbuild file: 363 + 364 + Kbuild: 365 + obj-m := complex.o 366 + complex-y := src/complex_main.o 367 + complex-y += src/hal/hardwareif.o 368 + 369 + EXTRA_CFLAGS := -I$(src)/include 370 + EXTRA_CFLAGS += -I$(src)src/hal/include 371 + 372 + 373 + kbuild knows how to handle .o files located in another directory - 374 + although this is NOT reccommended practice. The syntax is to specify 375 + the directory relative to the directory where the Kbuild file is 376 + located. 377 + 378 + To find the .h files we have to explicitly tell kbuild where to look 379 + for the .h files. When kbuild executes current directory is always 380 + the root of the kernel tree (argument to -C) and therefore we have to 381 + tell kbuild how to find the .h files using absolute paths. 382 + $(src) will specify the absolute path to the directory where the 383 + Kbuild file are located when being build as an external module. 384 + Therefore -I$(src)/ is used to point out the directory of the Kbuild 385 + file and any additional path are just appended. 348 386 349 387 === 6. Module installation 350 388
+8
Documentation/kernel-parameters.txt
··· 910 910 nfsroot= [NFS] nfs root filesystem for disk-less boxes. 911 911 See Documentation/nfsroot.txt. 912 912 913 + nfs.callback_tcpport= 914 + [NFS] set the TCP port on which the NFSv4 callback 915 + channel should listen. 916 + 917 + nfs.idmap_cache_timeout= 918 + [NFS] set the maximum lifetime for idmapper cache 919 + entries. 920 + 913 921 nmi_watchdog= [KNL,BUGS=IA-32] Debugging features for SMP kernels 914 922 915 923 no387 [BUGS=IA-32] Tells the kernel to use the 387 maths
+6 -7
MAINTAINERS
··· 696 696 W: http://www.cyclades.com/ 697 697 S: Supported 698 698 699 - DAC960 RAID CONTROLLER DRIVER 700 - P: Dave Olien 701 - M dmo@osdl.org 702 - W: http://www.osdl.org/archive/dmo/DAC960 703 - L: linux-kernel@vger.kernel.org 704 - S: Maintained 705 - 706 699 DAMA SLAVE for AX.25 707 700 P: Joerg Reuter 708 701 M: jreuter@yaina.de ··· 2914 2921 L: video4linux-list@redhat.com 2915 2922 W: http://linuxtv.org 2916 2923 T: git kernel.org:/pub/scm/linux/kernel/git/mchehab/v4l-dvb.git 2924 + S: Maintained 2925 + 2926 + VT8231 HARDWARE MONITOR DRIVER 2927 + P: Roger Lucas 2928 + M: roger@planbit.co.uk 2929 + L: lm-sensors@lm-sensors.org 2917 2930 S: Maintained 2918 2931 2919 2932 W1 DALLAS'S 1-WIRE BUS
+3 -4
arch/arm/mach-pxa/akita-ioexp.c
··· 124 124 } 125 125 126 126 static struct i2c_driver max7310_i2c_driver = { 127 - .owner = THIS_MODULE, 128 - .name = "akita-max7310", 127 + .driver = { 128 + .name = "akita-max7310", 129 + }, 129 130 .id = I2C_DRIVERID_AKITAIOEXP, 130 - .flags = I2C_DF_NOTIFY, 131 131 .attach_adapter = max7310_attach_adapter, 132 132 .detach_client = max7310_detach_client, 133 133 }; 134 134 135 135 static struct i2c_client max7310_template = { 136 136 name: "akita-max7310", 137 - flags: I2C_CLIENT_ALLOW_USE, 138 137 driver: &max7310_i2c_driver, 139 138 }; 140 139
-1
arch/x86_64/ia32/.gitignore
··· 1 - vsyscall*.so
+3 -2
drivers/acorn/char/pcf8583.c
··· 257 257 } 258 258 259 259 static struct i2c_driver pcf8583_driver = { 260 - .name = "PCF8583", 260 + .driver = { 261 + .name = "PCF8583", 262 + }, 261 263 .id = I2C_DRIVERID_PCF8583, 262 - .flags = I2C_DF_NOTIFY, 263 264 .attach_adapter = pcf8583_probe, 264 265 .detach_client = pcf8583_detach, 265 266 .command = pcf8583_command
+57 -33
drivers/char/mmtimer.c
··· 1 1 /* 2 - * Intel Multimedia Timer device implementation for SGI SN platforms. 2 + * Timer device implementation for SGI SN platforms. 3 3 * 4 4 * This file is subject to the terms and conditions of the GNU General Public 5 5 * License. See the file "COPYING" in the main directory of this archive 6 6 * for more details. 7 7 * 8 - * Copyright (c) 2001-2004 Silicon Graphics, Inc. All rights reserved. 8 + * Copyright (c) 2001-2006 Silicon Graphics, Inc. All rights reserved. 9 9 * 10 10 * This driver exports an API that should be supportable by any HPET or IA-PC 11 11 * multimedia timer. The code below is currently specific to the SGI Altix ··· 45 45 /* name of the device, usually in /dev */ 46 46 #define MMTIMER_NAME "mmtimer" 47 47 #define MMTIMER_DESC "SGI Altix RTC Timer" 48 - #define MMTIMER_VERSION "2.0" 48 + #define MMTIMER_VERSION "2.1" 49 49 50 50 #define RTC_BITS 55 /* 55 bits for this implementation */ 51 51 ··· 227 227 struct tasklet_struct tasklet; 228 228 } mmtimer_t; 229 229 230 - /* 231 - * Total number of comparators is comparators/node * MAX nodes/running kernel 232 - */ 233 - static mmtimer_t timers[NUM_COMPARATORS*MAX_COMPACT_NODES]; 230 + static mmtimer_t ** timers; 234 231 235 232 /** 236 233 * mmtimer_ioctl - ioctl interface for /dev/mmtimer ··· 438 441 mmtimer_interrupt(int irq, void *dev_id, struct pt_regs *regs) 439 442 { 440 443 int i; 441 - mmtimer_t *base = timers + cpu_to_node(smp_processor_id()) * 442 - NUM_COMPARATORS; 443 444 unsigned long expires = 0; 444 445 int result = IRQ_NONE; 446 + unsigned indx = cpu_to_node(smp_processor_id()); 445 447 446 448 /* 447 449 * Do this once for each comparison register 448 450 */ 449 451 for (i = 0; i < NUM_COMPARATORS; i++) { 452 + mmtimer_t *base = timers[indx] + i; 450 453 /* Make sure this doesn't get reused before tasklet_sched */ 451 - spin_lock(&base[i].lock); 452 - if (base[i].cpu == smp_processor_id()) { 453 - if (base[i].timer) 454 - expires = base[i].timer->it.mmtimer.expires; 454 + spin_lock(&base->lock); 455 + if (base->cpu == smp_processor_id()) { 456 + if (base->timer) 457 + expires = base->timer->it.mmtimer.expires; 455 458 /* expires test won't work with shared irqs */ 456 459 if ((mmtimer_int_pending(i) > 0) || 457 460 (expires && (expires < rtc_time()))) { 458 461 mmtimer_clr_int_pending(i); 459 - tasklet_schedule(&base[i].tasklet); 462 + tasklet_schedule(&base->tasklet); 460 463 result = IRQ_HANDLED; 461 464 } 462 465 } 463 - spin_unlock(&base[i].lock); 466 + spin_unlock(&base->lock); 464 467 expires = 0; 465 468 } 466 469 return result; ··· 520 523 { 521 524 int i = timr->it.mmtimer.clock; 522 525 cnodeid_t nodeid = timr->it.mmtimer.node; 523 - mmtimer_t *t = timers + nodeid * NUM_COMPARATORS +i; 526 + mmtimer_t *t = timers[nodeid] + i; 524 527 unsigned long irqflags; 525 528 526 529 if (i != TIMER_OFF) { ··· 606 609 preempt_disable(); 607 610 608 611 nodeid = cpu_to_node(smp_processor_id()); 609 - base = timers + nodeid * NUM_COMPARATORS; 610 612 retry: 611 613 /* Don't use an allocated timer, or a deleted one that's pending */ 612 614 for(i = 0; i< NUM_COMPARATORS; i++) { 613 - if (!base[i].timer && !base[i].tasklet.state) { 615 + base = timers[nodeid] + i; 616 + if (!base->timer && !base->tasklet.state) { 614 617 break; 615 618 } 616 619 } ··· 620 623 return -EBUSY; 621 624 } 622 625 623 - spin_lock_irqsave(&base[i].lock, irqflags); 626 + spin_lock_irqsave(&base->lock, irqflags); 624 627 625 - if (base[i].timer || base[i].tasklet.state != 0) { 626 - spin_unlock_irqrestore(&base[i].lock, irqflags); 628 + if (base->timer || base->tasklet.state != 0) { 629 + spin_unlock_irqrestore(&base->lock, irqflags); 627 630 goto retry; 628 631 } 629 - base[i].timer = timr; 630 - base[i].cpu = smp_processor_id(); 632 + base->timer = timr; 633 + base->cpu = smp_processor_id(); 631 634 632 635 timr->it.mmtimer.clock = i; 633 636 timr->it.mmtimer.node = nodeid; ··· 642 645 } 643 646 } else { 644 647 timr->it.mmtimer.expires -= period; 645 - if (reschedule_periodic_timer(base+i)) 648 + if (reschedule_periodic_timer(base)) 646 649 err = -EINVAL; 647 650 } 648 651 649 - spin_unlock_irqrestore(&base[i].lock, irqflags); 652 + spin_unlock_irqrestore(&base->lock, irqflags); 650 653 651 654 preempt_enable(); 652 655 ··· 672 675 static int __init mmtimer_init(void) 673 676 { 674 677 unsigned i; 678 + cnodeid_t node, maxn = -1; 675 679 676 680 if (!ia64_platform_is("sn2")) 677 681 return -1; ··· 689 691 mmtimer_femtoperiod = ((unsigned long)1E15 + sn_rtc_cycles_per_second / 690 692 2) / sn_rtc_cycles_per_second; 691 693 692 - for (i=0; i< NUM_COMPARATORS*MAX_COMPACT_NODES; i++) { 693 - spin_lock_init(&timers[i].lock); 694 - timers[i].timer = NULL; 695 - timers[i].cpu = 0; 696 - timers[i].i = i % NUM_COMPARATORS; 697 - tasklet_init(&timers[i].tasklet, mmtimer_tasklet, (unsigned long) (timers+i)); 698 - } 699 - 700 694 if (request_irq(SGI_MMTIMER_VECTOR, mmtimer_interrupt, SA_PERCPU_IRQ, MMTIMER_NAME, NULL)) { 701 695 printk(KERN_WARNING "%s: unable to allocate interrupt.", 702 696 MMTIMER_NAME); ··· 700 710 printk(KERN_ERR "%s: failed to register device\n", 701 711 MMTIMER_NAME); 702 712 return -1; 713 + } 714 + 715 + /* Get max numbered node, calculate slots needed */ 716 + for_each_online_node(node) { 717 + maxn = node; 718 + } 719 + maxn++; 720 + 721 + /* Allocate list of node ptrs to mmtimer_t's */ 722 + timers = kmalloc(sizeof(mmtimer_t *)*maxn, GFP_KERNEL); 723 + if (timers == NULL) { 724 + printk(KERN_ERR "%s: failed to allocate memory for device\n", 725 + MMTIMER_NAME); 726 + return -1; 727 + } 728 + 729 + /* Allocate mmtimer_t's for each online node */ 730 + for_each_online_node(node) { 731 + timers[node] = kmalloc_node(sizeof(mmtimer_t)*NUM_COMPARATORS, GFP_KERNEL, node); 732 + if (timers[node] == NULL) { 733 + printk(KERN_ERR "%s: failed to allocate memory for device\n", 734 + MMTIMER_NAME); 735 + return -1; 736 + } 737 + for (i=0; i< NUM_COMPARATORS; i++) { 738 + mmtimer_t * base = timers[node] + i; 739 + 740 + spin_lock_init(&base->lock); 741 + base->timer = NULL; 742 + base->cpu = 0; 743 + base->i = i; 744 + tasklet_init(&base->tasklet, mmtimer_tasklet, 745 + (unsigned long) (base)); 746 + } 703 747 } 704 748 705 749 sgi_clock_period = sgi_clock.res = NSEC_PER_SEC / sn_rtc_cycles_per_second;
+12
drivers/hwmon/Kconfig
··· 350 350 This driver can also be built as a module. If so, the module 351 351 will be called via686a. 352 352 353 + config SENSORS_VT8231 354 + tristate "VT8231" 355 + depends on HWMON && I2C && PCI && EXPERIMENTAL 356 + select HWMON_VID 357 + select I2C_ISA 358 + help 359 + If you say yes here then you get support for the integrated sensors 360 + in the VIA VT8231 device. 361 + 362 + This driver can also be built as a module. If so, the module 363 + will be called vt8231. 364 + 353 365 config SENSORS_W83781D 354 366 tristate "Winbond W83781D, W83782D, W83783S, W83627HF, Asus AS99127F" 355 367 depends on HWMON && I2C
+1
drivers/hwmon/Makefile
··· 40 40 obj-$(CONFIG_SENSORS_SMSC47B397)+= smsc47b397.o 41 41 obj-$(CONFIG_SENSORS_SMSC47M1) += smsc47m1.o 42 42 obj-$(CONFIG_SENSORS_VIA686A) += via686a.o 43 + obj-$(CONFIG_SENSORS_VT8231) += vt8231.o 43 44 obj-$(CONFIG_SENSORS_W83627EHF) += w83627ehf.o 44 45 obj-$(CONFIG_SENSORS_W83L785TS) += w83l785ts.o 45 46
+3 -3
drivers/hwmon/adm1021.c
··· 126 126 127 127 /* This is the driver that will be inserted */ 128 128 static struct i2c_driver adm1021_driver = { 129 - .owner = THIS_MODULE, 130 - .name = "adm1021", 129 + .driver = { 130 + .name = "adm1021", 131 + }, 131 132 .id = I2C_DRIVERID_ADM1021, 132 - .flags = I2C_DF_NOTIFY, 133 133 .attach_adapter = adm1021_attach_adapter, 134 134 .detach_client = adm1021_detach_client, 135 135 };
+3 -7
drivers/hwmon/adm1025.c
··· 118 118 */ 119 119 120 120 static struct i2c_driver adm1025_driver = { 121 - .owner = THIS_MODULE, 122 - .name = "adm1025", 121 + .driver = { 122 + .name = "adm1025", 123 + }, 123 124 .id = I2C_DRIVERID_ADM1025, 124 - .flags = I2C_DF_NOTIFY, 125 125 .attach_adapter = adm1025_attach_adapter, 126 126 .detach_client = adm1025_detach_client, 127 127 }; ··· 287 287 struct adm1025_data *data = adm1025_update_device(dev); 288 288 return sprintf(buf, "%u\n", vid_from_reg(data->vid, data->vrm)); 289 289 } 290 - /* in1_ref is deprecated in favour of cpu0_vid, remove after 2005-11-11 */ 291 - static DEVICE_ATTR(in1_ref, S_IRUGO, show_vid, NULL); 292 290 static DEVICE_ATTR(cpu0_vid, S_IRUGO, show_vid, NULL); 293 291 294 292 static ssize_t show_vrm(struct device *dev, struct device_attribute *attr, char *buf) ··· 442 444 device_create_file(&new_client->dev, &dev_attr_temp1_max); 443 445 device_create_file(&new_client->dev, &dev_attr_temp2_max); 444 446 device_create_file(&new_client->dev, &dev_attr_alarms); 445 - /* in1_ref is deprecated, remove after 2005-11-11 */ 446 - device_create_file(&new_client->dev, &dev_attr_in1_ref); 447 447 device_create_file(&new_client->dev, &dev_attr_cpu0_vid); 448 448 device_create_file(&new_client->dev, &dev_attr_vrm); 449 449
+3 -7
drivers/hwmon/adm1026.c
··· 308 308 309 309 310 310 static struct i2c_driver adm1026_driver = { 311 - .owner = THIS_MODULE, 312 - .name = "adm1026", 313 - .flags = I2C_DF_NOTIFY, 311 + .driver = { 312 + .name = "adm1026", 313 + }, 314 314 .attach_adapter = adm1026_attach_adapter, 315 315 .detach_client = adm1026_detach_client, 316 316 }; ··· 1227 1227 struct adm1026_data *data = adm1026_update_device(dev); 1228 1228 return sprintf(buf,"%d\n", vid_from_reg(data->vid & 0x3f, data->vrm)); 1229 1229 } 1230 - /* vid deprecated in favour of cpu0_vid, remove after 2005-11-11 */ 1231 - static DEVICE_ATTR(vid, S_IRUGO, show_vid_reg, NULL); 1232 1230 static DEVICE_ATTR(cpu0_vid, S_IRUGO, show_vid_reg, NULL); 1233 1231 1234 1232 static ssize_t show_vrm_reg(struct device *dev, struct device_attribute *attr, char *buf) ··· 1671 1673 device_create_file(&new_client->dev, &dev_attr_temp1_crit_enable); 1672 1674 device_create_file(&new_client->dev, &dev_attr_temp2_crit_enable); 1673 1675 device_create_file(&new_client->dev, &dev_attr_temp3_crit_enable); 1674 - /* vid deprecated in favour of cpu0_vid, remove after 2005-11-11 */ 1675 - device_create_file(&new_client->dev, &dev_attr_vid); 1676 1676 device_create_file(&new_client->dev, &dev_attr_cpu0_vid); 1677 1677 device_create_file(&new_client->dev, &dev_attr_vrm); 1678 1678 device_create_file(&new_client->dev, &dev_attr_alarms);
+3 -3
drivers/hwmon/adm1031.c
··· 105 105 106 106 /* This is the driver that will be inserted */ 107 107 static struct i2c_driver adm1031_driver = { 108 - .owner = THIS_MODULE, 109 - .name = "adm1031", 110 - .flags = I2C_DF_NOTIFY, 108 + .driver = { 109 + .name = "adm1031", 110 + }, 111 111 .attach_adapter = adm1031_attach_adapter, 112 112 .detach_client = adm1031_detach_client, 113 113 };
+3 -3
drivers/hwmon/adm9240.c
··· 137 137 138 138 /* driver data */ 139 139 static struct i2c_driver adm9240_driver = { 140 - .owner = THIS_MODULE, 141 - .name = "adm9240", 140 + .driver = { 141 + .name = "adm9240", 142 + }, 142 143 .id = I2C_DRIVERID_ADM9240, 143 - .flags = I2C_DF_NOTIFY, 144 144 .attach_adapter = adm9240_attach_adapter, 145 145 .detach_client = adm9240_detach_client, 146 146 };
+3 -3
drivers/hwmon/asb100.c
··· 217 217 static void asb100_init_client(struct i2c_client *client); 218 218 219 219 static struct i2c_driver asb100_driver = { 220 - .owner = THIS_MODULE, 221 - .name = "asb100", 220 + .driver = { 221 + .name = "asb100", 222 + }, 222 223 .id = I2C_DRIVERID_ASB100, 223 - .flags = I2C_DF_NOTIFY, 224 224 .attach_adapter = asb100_attach_adapter, 225 225 .detach_client = asb100_detach_client, 226 226 };
+3 -3
drivers/hwmon/atxp1.c
··· 50 50 static int atxp1_detect(struct i2c_adapter *adapter, int address, int kind); 51 51 52 52 static struct i2c_driver atxp1_driver = { 53 - .owner = THIS_MODULE, 54 - .name = "atxp1", 55 - .flags = I2C_DF_NOTIFY, 53 + .driver = { 54 + .name = "atxp1", 55 + }, 56 56 .attach_adapter = atxp1_attach_adapter, 57 57 .detach_client = atxp1_detach_client, 58 58 };
+3 -3
drivers/hwmon/ds1621.c
··· 89 89 90 90 /* This is the driver that will be inserted */ 91 91 static struct i2c_driver ds1621_driver = { 92 - .owner = THIS_MODULE, 93 - .name = "ds1621", 92 + .driver = { 93 + .name = "ds1621", 94 + }, 94 95 .id = I2C_DRIVERID_DS1621, 95 - .flags = I2C_DF_NOTIFY, 96 96 .attach_adapter = ds1621_attach_adapter, 97 97 .detach_client = ds1621_detach_client, 98 98 };
+3 -3
drivers/hwmon/fscher.c
··· 118 118 */ 119 119 120 120 static struct i2c_driver fscher_driver = { 121 - .owner = THIS_MODULE, 122 - .name = "fscher", 121 + .driver = { 122 + .name = "fscher", 123 + }, 123 124 .id = I2C_DRIVERID_FSCHER, 124 - .flags = I2C_DF_NOTIFY, 125 125 .attach_adapter = fscher_attach_adapter, 126 126 .detach_client = fscher_detach_client, 127 127 };
+3 -3
drivers/hwmon/fscpos.c
··· 100 100 * Driver data (common to all clients) 101 101 */ 102 102 static struct i2c_driver fscpos_driver = { 103 - .owner = THIS_MODULE, 104 - .name = "fscpos", 103 + .driver = { 104 + .name = "fscpos", 105 + }, 105 106 .id = I2C_DRIVERID_FSCPOS, 106 - .flags = I2C_DF_NOTIFY, 107 107 .attach_adapter = fscpos_attach_adapter, 108 108 .detach_client = fscpos_detach_client, 109 109 };
+3 -3
drivers/hwmon/gl518sm.c
··· 151 151 152 152 /* This is the driver that will be inserted */ 153 153 static struct i2c_driver gl518_driver = { 154 - .owner = THIS_MODULE, 155 - .name = "gl518sm", 154 + .driver = { 155 + .name = "gl518sm", 156 + }, 156 157 .id = I2C_DRIVERID_GL518, 157 - .flags = I2C_DF_NOTIFY, 158 158 .attach_adapter = gl518_attach_adapter, 159 159 .detach_client = gl518_detach_client, 160 160 };
+3 -3
drivers/hwmon/gl520sm.c
··· 109 109 110 110 /* Driver data */ 111 111 static struct i2c_driver gl520_driver = { 112 - .owner = THIS_MODULE, 113 - .name = "gl520sm", 112 + .driver = { 113 + .name = "gl520sm", 114 + }, 114 115 .id = I2C_DRIVERID_GL520, 115 - .flags = I2C_DF_NOTIFY, 116 116 .attach_adapter = gl520_attach_adapter, 117 117 .detach_client = gl520_detach_client, 118 118 };
+42 -27
drivers/hwmon/hwmon-vid.c
··· 49 49 . . . . 50 50 11110 = 0.800 V 51 51 11111 = 0.000 V (off) 52 + 53 + The 17 specification is in fact Intel Mobile Voltage Positioning - 54 + (IMVP-II). You can find more information in the datasheet of Max1718 55 + http://www.maxim-ic.com/quick_view2.cfm/qv_pk/2452 56 + 52 57 */ 53 58 54 59 /* vrm is the VRM/VRD document version multiplied by 10. 55 60 val is the 4-, 5- or 6-bit VID code. 56 61 Returned value is in mV to avoid floating point in the kernel. */ 57 - int vid_from_reg(int val, int vrm) 62 + int vid_from_reg(int val, u8 vrm) 58 63 { 59 64 int vid; 60 65 61 66 switch(vrm) { 62 - 63 - case 0: 64 - return 0; 65 67 66 68 case 100: /* VRD 10.0 */ 67 69 if((val & 0x1f) == 0x1f) ··· 93 91 case 84: /* VRM 8.4 */ 94 92 val &= 0x0f; 95 93 /* fall through */ 96 - default: /* VRM 8.2 */ 94 + case 82: /* VRM 8.2 */ 97 95 return(val == 0x1f ? 0 : 98 96 val & 0x10 ? 5100 - (val) * 100 : 99 97 2050 - (val) * 50); 98 + case 17: /* Intel IMVP-II */ 99 + return(val & 0x10 ? 975 - (val & 0xF) * 25 : 100 + 1750 - val * 50); 101 + default: /* report 0 for unknown */ 102 + printk(KERN_INFO "hwmon-vid: requested unknown VRM version\n"); 103 + return 0; 100 104 } 101 105 } 102 106 ··· 116 108 u8 vendor; 117 109 u8 eff_family; 118 110 u8 eff_model; 119 - int vrm_type; 111 + u8 eff_stepping; 112 + u8 vrm_type; 120 113 }; 121 114 122 115 #define ANY 0xFF 123 116 124 117 #ifdef CONFIG_X86 125 118 119 + /* the stepping parameter is highest acceptable stepping for current line */ 120 + 126 121 static struct vrm_model vrm_models[] = { 127 - {X86_VENDOR_AMD, 0x6, ANY, 90}, /* Athlon Duron etc */ 128 - {X86_VENDOR_AMD, 0xF, ANY, 24}, /* Athlon 64, Opteron */ 129 - {X86_VENDOR_INTEL, 0x6, 0x9, 85}, /* 0.13um too */ 130 - {X86_VENDOR_INTEL, 0x6, 0xB, 85}, /* Tualatin */ 131 - {X86_VENDOR_INTEL, 0x6, ANY, 82}, /* any P6 */ 132 - {X86_VENDOR_INTEL, 0x7, ANY, 0}, /* Itanium */ 133 - {X86_VENDOR_INTEL, 0xF, 0x0, 90}, /* P4 */ 134 - {X86_VENDOR_INTEL, 0xF, 0x1, 90}, /* P4 Willamette */ 135 - {X86_VENDOR_INTEL, 0xF, 0x2, 90}, /* P4 Northwood */ 136 - {X86_VENDOR_INTEL, 0xF, 0x3, 100}, /* P4 Prescott */ 137 - {X86_VENDOR_INTEL, 0xF, 0x4, 100}, /* P4 Prescott */ 138 - {X86_VENDOR_INTEL, 0x10,ANY, 0}, /* Itanium 2 */ 139 - {X86_VENDOR_UNKNOWN, ANY, ANY, 0} /* stop here */ 122 + {X86_VENDOR_AMD, 0x6, ANY, ANY, 90}, /* Athlon Duron etc */ 123 + {X86_VENDOR_AMD, 0xF, ANY, ANY, 24}, /* Athlon 64, Opteron and above VRM 24 */ 124 + {X86_VENDOR_INTEL, 0x6, 0x9, ANY, 85}, /* 0.13um too */ 125 + {X86_VENDOR_INTEL, 0x6, 0xB, ANY, 85}, /* Tualatin */ 126 + {X86_VENDOR_INTEL, 0x6, ANY, ANY, 82}, /* any P6 */ 127 + {X86_VENDOR_INTEL, 0x7, ANY, ANY, 0}, /* Itanium */ 128 + {X86_VENDOR_INTEL, 0xF, 0x0, ANY, 90}, /* P4 */ 129 + {X86_VENDOR_INTEL, 0xF, 0x1, ANY, 90}, /* P4 Willamette */ 130 + {X86_VENDOR_INTEL, 0xF, 0x2, ANY, 90}, /* P4 Northwood */ 131 + {X86_VENDOR_INTEL, 0xF, ANY, ANY, 100}, /* Prescott and above assume VRD 10 */ 132 + {X86_VENDOR_INTEL, 0x10, ANY, ANY, 0}, /* Itanium 2 */ 133 + {X86_VENDOR_CENTAUR, 0x6, 0x7, ANY, 85}, /* Eden ESP/Ezra */ 134 + {X86_VENDOR_CENTAUR, 0x6, 0x8, 0x7, 85}, /* Ezra T */ 135 + {X86_VENDOR_CENTAUR, 0x6, 0x9, 0x7, 85}, /* Nemiah */ 136 + {X86_VENDOR_CENTAUR, 0x6, 0x9, ANY, 17}, /* C3-M */ 137 + {X86_VENDOR_UNKNOWN, ANY, ANY, ANY, 0} /* stop here */ 140 138 }; 141 139 142 - static int find_vrm(u8 eff_family, u8 eff_model, u8 vendor) 140 + static u8 find_vrm(u8 eff_family, u8 eff_model, u8 eff_stepping, u8 vendor) 143 141 { 144 142 int i = 0; 145 143 ··· 153 139 if (vrm_models[i].vendor==vendor) 154 140 if ((vrm_models[i].eff_family==eff_family) 155 141 && ((vrm_models[i].eff_model==eff_model) || 156 - (vrm_models[i].eff_model==ANY))) 142 + (vrm_models[i].eff_model==ANY)) && 143 + (eff_stepping <= vrm_models[i].eff_stepping)) 157 144 return vrm_models[i].vrm_type; 158 145 i++; 159 146 } ··· 162 147 return 0; 163 148 } 164 149 165 - int vid_which_vrm(void) 150 + u8 vid_which_vrm(void) 166 151 { 167 152 struct cpuinfo_x86 *c = cpu_data; 168 153 u32 eax; 169 - u8 eff_family, eff_model; 170 - int vrm_ret; 154 + u8 eff_family, eff_model, eff_stepping, vrm_ret; 171 155 172 156 if (c->x86 < 6) /* Any CPU with family lower than 6 */ 173 157 return 0; /* doesn't have VID and/or CPUID */ ··· 174 160 eax = cpuid_eax(1); 175 161 eff_family = ((eax & 0x00000F00)>>8); 176 162 eff_model = ((eax & 0x000000F0)>>4); 163 + eff_stepping = eax & 0xF; 177 164 if (eff_family == 0xF) { /* use extended model & family */ 178 165 eff_family += ((eax & 0x00F00000)>>20); 179 166 eff_model += ((eax & 0x000F0000)>>16)<<4; 180 167 } 181 - vrm_ret = find_vrm(eff_family,eff_model,c->x86_vendor); 168 + vrm_ret = find_vrm(eff_family, eff_model, eff_stepping, c->x86_vendor); 182 169 if (vrm_ret == 0) 183 170 printk(KERN_INFO "hwmon-vid: Unknown VRM version of your " 184 171 "x86 CPU\n"); 185 172 return vrm_ret; 186 173 } 187 174 188 - /* and now something completely different for the non-x86 world */ 175 + /* and now for something completely different for the non-x86 world */ 189 176 #else 190 - int vid_which_vrm(void) 177 + u8 vid_which_vrm(void) 191 178 { 192 179 printk(KERN_INFO "hwmon-vid: Unknown VRM version of your CPU\n"); 193 180 return 0;
+10 -8
drivers/hwmon/it87.c
··· 213 213 u8 sensor; /* Register value */ 214 214 u8 fan_div[3]; /* Register encoding, shifted right */ 215 215 u8 vid; /* Register encoding, combined */ 216 - int vrm; 216 + u8 vrm; 217 217 u32 alarms; /* Register encoding, combined */ 218 218 u8 fan_main_ctrl; /* Register value */ 219 219 u8 manual_pwm_ctl[3]; /* manual PWM value set by user */ ··· 234 234 235 235 236 236 static struct i2c_driver it87_driver = { 237 - .owner = THIS_MODULE, 238 - .name = "it87", 237 + .driver = { 238 + .name = "it87", 239 + }, 239 240 .id = I2C_DRIVERID_IT87, 240 - .flags = I2C_DF_NOTIFY, 241 241 .attach_adapter = it87_attach_adapter, 242 242 .detach_client = it87_detach_client, 243 243 }; 244 244 245 245 static struct i2c_driver it87_isa_driver = { 246 - .owner = THIS_MODULE, 247 - .name = "it87-isa", 246 + .driver = { 247 + .name = "it87-isa", 248 + }, 248 249 .attach_adapter = it87_isa_attach_adapter, 249 250 .detach_client = it87_detach_client, 250 251 }; ··· 669 668 show_vrm_reg(struct device *dev, struct device_attribute *attr, char *buf) 670 669 { 671 670 struct it87_data *data = it87_update_device(dev); 672 - return sprintf(buf, "%ld\n", (long) data->vrm); 671 + return sprintf(buf, "%u\n", data->vrm); 673 672 } 674 673 static ssize_t 675 674 store_vrm_reg(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) ··· 762 761 763 762 /* Reserve the ISA region */ 764 763 if (is_isa) 765 - if (!request_region(address, IT87_EXTENT, it87_isa_driver.name)) 764 + if (!request_region(address, IT87_EXTENT, 765 + it87_isa_driver.driver.name)) 766 766 goto ERROR0; 767 767 768 768 /* For now, we presume we have a valid client. We create the
+3 -3
drivers/hwmon/lm63.c
··· 139 139 */ 140 140 141 141 static struct i2c_driver lm63_driver = { 142 - .owner = THIS_MODULE, 143 - .name = "lm63", 144 - .flags = I2C_DF_NOTIFY, 142 + .driver = { 143 + .name = "lm63", 144 + }, 145 145 .attach_adapter = lm63_attach_adapter, 146 146 .detach_client = lm63_detach_client, 147 147 };
+3 -3
drivers/hwmon/lm75.c
··· 66 66 67 67 /* This is the driver that will be inserted */ 68 68 static struct i2c_driver lm75_driver = { 69 - .owner = THIS_MODULE, 70 - .name = "lm75", 69 + .driver = { 70 + .name = "lm75", 71 + }, 71 72 .id = I2C_DRIVERID_LM75, 72 - .flags = I2C_DF_NOTIFY, 73 73 .attach_adapter = lm75_attach_adapter, 74 74 .detach_client = lm75_detach_client, 75 75 };
+3 -3
drivers/hwmon/lm77.c
··· 74 74 75 75 /* This is the driver that will be inserted */ 76 76 static struct i2c_driver lm77_driver = { 77 - .owner = THIS_MODULE, 78 - .name = "lm77", 79 - .flags = I2C_DF_NOTIFY, 77 + .driver = { 78 + .name = "lm77", 79 + }, 80 80 .attach_adapter = lm77_attach_adapter, 81 81 .detach_client = lm77_detach_client, 82 82 };
+7 -6
drivers/hwmon/lm78.c
··· 164 164 165 165 166 166 static struct i2c_driver lm78_driver = { 167 - .owner = THIS_MODULE, 168 - .name = "lm78", 167 + .driver = { 168 + .name = "lm78", 169 + }, 169 170 .id = I2C_DRIVERID_LM78, 170 - .flags = I2C_DF_NOTIFY, 171 171 .attach_adapter = lm78_attach_adapter, 172 172 .detach_client = lm78_detach_client, 173 173 }; 174 174 175 175 static struct i2c_driver lm78_isa_driver = { 176 - .owner = THIS_MODULE, 177 - .name = "lm78-isa", 176 + .driver = { 177 + .name = "lm78-isa", 178 + }, 178 179 .attach_adapter = lm78_isa_attach_adapter, 179 180 .detach_client = lm78_detach_client, 180 181 }; ··· 498 497 /* Reserve the ISA region */ 499 498 if (is_isa) 500 499 if (!request_region(address, LM78_EXTENT, 501 - lm78_isa_driver.name)) { 500 + lm78_isa_driver.driver.name)) { 502 501 err = -EBUSY; 503 502 goto ERROR0; 504 503 }
+3 -3
drivers/hwmon/lm80.c
··· 143 143 */ 144 144 145 145 static struct i2c_driver lm80_driver = { 146 - .owner = THIS_MODULE, 147 - .name = "lm80", 146 + .driver = { 147 + .name = "lm80", 148 + }, 148 149 .id = I2C_DRIVERID_LM80, 149 - .flags = I2C_DF_NOTIFY, 150 150 .attach_adapter = lm80_attach_adapter, 151 151 .detach_client = lm80_detach_client, 152 152 };
+3 -3
drivers/hwmon/lm83.c
··· 124 124 */ 125 125 126 126 static struct i2c_driver lm83_driver = { 127 - .owner = THIS_MODULE, 128 - .name = "lm83", 127 + .driver = { 128 + .name = "lm83", 129 + }, 129 130 .id = I2C_DRIVERID_LM83, 130 - .flags = I2C_DF_NOTIFY, 131 131 .attach_adapter = lm83_attach_adapter, 132 132 .detach_client = lm83_detach_client, 133 133 };
+39 -11
drivers/hwmon/lm85.c
··· 380 380 381 381 382 382 static struct i2c_driver lm85_driver = { 383 - .owner = THIS_MODULE, 384 - .name = "lm85", 383 + .driver = { 384 + .name = "lm85", 385 + }, 385 386 .id = I2C_DRIVERID_LM85, 386 - .flags = I2C_DF_NOTIFY, 387 387 .attach_adapter = lm85_attach_adapter, 388 388 .detach_client = lm85_detach_client, 389 389 }; ··· 443 443 static ssize_t show_vid_reg(struct device *dev, struct device_attribute *attr, char *buf) 444 444 { 445 445 struct lm85_data *data = lm85_update_device(dev); 446 - return sprintf(buf, "%ld\n", (long) vid_from_reg(data->vid, data->vrm)); 446 + int vid; 447 + 448 + if (data->type == adt7463 && (data->vid & 0x80)) { 449 + /* 6-pin VID (VRM 10) */ 450 + vid = vid_from_reg(data->vid & 0x3f, data->vrm); 451 + } else { 452 + /* 5-pin VID (VRM 9) */ 453 + vid = vid_from_reg(data->vid & 0x1f, data->vrm); 454 + } 455 + 456 + return sprintf(buf, "%d\n", vid); 447 457 } 448 458 449 459 static DEVICE_ATTR(cpu0_vid, S_IRUGO, show_vid_reg, NULL); ··· 1186 1176 device_create_file(&new_client->dev, &dev_attr_in1_input); 1187 1177 device_create_file(&new_client->dev, &dev_attr_in2_input); 1188 1178 device_create_file(&new_client->dev, &dev_attr_in3_input); 1189 - device_create_file(&new_client->dev, &dev_attr_in4_input); 1190 1179 device_create_file(&new_client->dev, &dev_attr_in0_min); 1191 1180 device_create_file(&new_client->dev, &dev_attr_in1_min); 1192 1181 device_create_file(&new_client->dev, &dev_attr_in2_min); 1193 1182 device_create_file(&new_client->dev, &dev_attr_in3_min); 1194 - device_create_file(&new_client->dev, &dev_attr_in4_min); 1195 1183 device_create_file(&new_client->dev, &dev_attr_in0_max); 1196 1184 device_create_file(&new_client->dev, &dev_attr_in1_max); 1197 1185 device_create_file(&new_client->dev, &dev_attr_in2_max); 1198 1186 device_create_file(&new_client->dev, &dev_attr_in3_max); 1199 - device_create_file(&new_client->dev, &dev_attr_in4_max); 1200 1187 device_create_file(&new_client->dev, &dev_attr_temp1_input); 1201 1188 device_create_file(&new_client->dev, &dev_attr_temp2_input); 1202 1189 device_create_file(&new_client->dev, &dev_attr_temp3_input); ··· 1230 1223 device_create_file(&new_client->dev, &dev_attr_temp1_auto_temp_crit); 1231 1224 device_create_file(&new_client->dev, &dev_attr_temp2_auto_temp_crit); 1232 1225 device_create_file(&new_client->dev, &dev_attr_temp3_auto_temp_crit); 1226 + 1227 + /* The ADT7463 has an optional VRM 10 mode where pin 21 is used 1228 + as a sixth digital VID input rather than an analog input. */ 1229 + data->vid = lm85_read_value(new_client, LM85_REG_VID); 1230 + if (!(kind == adt7463 && (data->vid & 0x80))) { 1231 + device_create_file(&new_client->dev, &dev_attr_in4_input); 1232 + device_create_file(&new_client->dev, &dev_attr_in4_min); 1233 + device_create_file(&new_client->dev, &dev_attr_in4_max); 1234 + } 1233 1235 1234 1236 return 0; 1235 1237 ··· 1398 1382 irrelevant. So it is left in 4*/ 1399 1383 data->adc_scale = (data->type == emc6d102 ) ? 16 : 4; 1400 1384 1401 - for (i = 0; i <= 4; ++i) { 1385 + data->vid = lm85_read_value(client, LM85_REG_VID); 1386 + 1387 + for (i = 0; i <= 3; ++i) { 1402 1388 data->in[i] = 1403 1389 lm85_read_value(client, LM85_REG_IN(i)); 1390 + } 1391 + 1392 + if (!(data->type == adt7463 && (data->vid & 0x80))) { 1393 + data->in[4] = lm85_read_value(client, 1394 + LM85_REG_IN(4)); 1404 1395 } 1405 1396 1406 1397 for (i = 0; i <= 3; ++i) { ··· 1473 1450 /* Things that don't change often */ 1474 1451 dev_dbg(&client->dev, "Reading config values\n"); 1475 1452 1476 - for (i = 0; i <= 4; ++i) { 1453 + for (i = 0; i <= 3; ++i) { 1477 1454 data->in_min[i] = 1478 1455 lm85_read_value(client, LM85_REG_IN_MIN(i)); 1479 1456 data->in_max[i] = 1480 1457 lm85_read_value(client, LM85_REG_IN_MAX(i)); 1458 + } 1459 + 1460 + if (!(data->type == adt7463 && (data->vid & 0x80))) { 1461 + data->in_min[4] = lm85_read_value(client, 1462 + LM85_REG_IN_MIN(4)); 1463 + data->in_max[4] = lm85_read_value(client, 1464 + LM85_REG_IN_MAX(4)); 1481 1465 } 1482 1466 1483 1467 if ( data->type == emc6d100 ) { ··· 1507 1477 data->temp_max[i] = 1508 1478 lm85_read_value(client, LM85_REG_TEMP_MAX(i)); 1509 1479 } 1510 - 1511 - data->vid = lm85_read_value(client, LM85_REG_VID); 1512 1480 1513 1481 for (i = 0; i <= 2; ++i) { 1514 1482 int val ;
+3 -3
drivers/hwmon/lm87.c
··· 161 161 */ 162 162 163 163 static struct i2c_driver lm87_driver = { 164 - .owner = THIS_MODULE, 165 - .name = "lm87", 164 + .driver = { 165 + .name = "lm87", 166 + }, 166 167 .id = I2C_DRIVERID_LM87, 167 - .flags = I2C_DF_NOTIFY, 168 168 .attach_adapter = lm87_attach_adapter, 169 169 .detach_client = lm87_detach_client, 170 170 };
+3 -3
drivers/hwmon/lm90.c
··· 186 186 */ 187 187 188 188 static struct i2c_driver lm90_driver = { 189 - .owner = THIS_MODULE, 190 - .name = "lm90", 189 + .driver = { 190 + .name = "lm90", 191 + }, 191 192 .id = I2C_DRIVERID_LM90, 192 - .flags = I2C_DF_NOTIFY, 193 193 .attach_adapter = lm90_attach_adapter, 194 194 .detach_client = lm90_detach_client, 195 195 };
+3 -3
drivers/hwmon/lm92.c
··· 410 410 */ 411 411 412 412 static struct i2c_driver lm92_driver = { 413 - .owner = THIS_MODULE, 414 - .name = "lm92", 413 + .driver = { 414 + .name = "lm92", 415 + }, 415 416 .id = I2C_DRIVERID_LM92, 416 - .flags = I2C_DF_NOTIFY, 417 417 .attach_adapter = lm92_attach_adapter, 418 418 .detach_client = lm92_detach_client, 419 419 };
+3 -3
drivers/hwmon/max1619.c
··· 90 90 */ 91 91 92 92 static struct i2c_driver max1619_driver = { 93 - .owner = THIS_MODULE, 94 - .name = "max1619", 95 - .flags = I2C_DF_NOTIFY, 93 + .driver = { 94 + .name = "max1619", 95 + }, 96 96 .attach_adapter = max1619_attach_adapter, 97 97 .detach_client = max1619_detach_client, 98 98 };
+4 -3
drivers/hwmon/pc87360.c
··· 236 236 */ 237 237 238 238 static struct i2c_driver pc87360_driver = { 239 - .owner = THIS_MODULE, 240 - .name = "pc87360", 239 + .driver = { 240 + .name = "pc87360", 241 + }, 241 242 .attach_adapter = pc87360_detect, 242 243 .detach_client = pc87360_detach_client, 243 244 }; ··· 799 798 for (i = 0; i < 3; i++) { 800 799 if (((data->address[i] = extra_isa[i])) 801 800 && !request_region(extra_isa[i], PC87360_EXTENT, 802 - pc87360_driver.name)) { 801 + pc87360_driver.driver.name)) { 803 802 dev_err(&new_client->dev, "Region 0x%x-0x%x already " 804 803 "in use!\n", extra_isa[i], 805 804 extra_isa[i]+PC87360_EXTENT-1);
+5 -3
drivers/hwmon/sis5595.c
··· 198 198 static void sis5595_init_client(struct i2c_client *client); 199 199 200 200 static struct i2c_driver sis5595_driver = { 201 - .owner = THIS_MODULE, 202 - .name = "sis5595", 201 + .driver = { 202 + .name = "sis5595", 203 + }, 203 204 .attach_adapter = sis5595_detect, 204 205 .detach_client = sis5595_detach_client, 205 206 }; ··· 485 484 if (force_addr) 486 485 address = force_addr & ~(SIS5595_EXTENT - 1); 487 486 /* Reserve the ISA region */ 488 - if (!request_region(address, SIS5595_EXTENT, sis5595_driver.name)) { 487 + if (!request_region(address, SIS5595_EXTENT, 488 + sis5595_driver.driver.name)) { 489 489 err = -EBUSY; 490 490 goto exit; 491 491 }
+5 -3
drivers/hwmon/smsc47b397.c
··· 226 226 static int smsc47b397_detect(struct i2c_adapter *adapter); 227 227 228 228 static struct i2c_driver smsc47b397_driver = { 229 - .owner = THIS_MODULE, 230 - .name = "smsc47b397", 229 + .driver = { 230 + .name = "smsc47b397", 231 + }, 231 232 .attach_adapter = smsc47b397_detect, 232 233 .detach_client = smsc47b397_detach_client, 233 234 }; ··· 239 238 struct smsc47b397_data *data; 240 239 int err = 0; 241 240 242 - if (!request_region(address, SMSC_EXTENT, smsc47b397_driver.name)) { 241 + if (!request_region(address, SMSC_EXTENT, 242 + smsc47b397_driver.driver.name)) { 243 243 dev_err(&adapter->dev, "Region 0x%x already in use!\n", 244 244 address); 245 245 return -EBUSY;
+4 -3
drivers/hwmon/smsc47m1.c
··· 126 126 127 127 128 128 static struct i2c_driver smsc47m1_driver = { 129 - .owner = THIS_MODULE, 130 - .name = "smsc47m1", 129 + .driver = { 130 + .name = "smsc47m1", 131 + }, 131 132 .attach_adapter = smsc47m1_detect, 132 133 .detach_client = smsc47m1_detach_client, 133 134 }; ··· 395 394 int err = 0; 396 395 int fan1, fan2, pwm1, pwm2; 397 396 398 - if (!request_region(address, SMSC_EXTENT, smsc47m1_driver.name)) { 397 + if (!request_region(address, SMSC_EXTENT, smsc47m1_driver.driver.name)) { 399 398 dev_err(&adapter->dev, "Region 0x%x already in use!\n", address); 400 399 return -EBUSY; 401 400 }
+5 -3
drivers/hwmon/via686a.c
··· 572 572 /* The driver. I choose to use type i2c_driver, as at is identical to both 573 573 smbus_driver and isa_driver, and clients could be of either kind */ 574 574 static struct i2c_driver via686a_driver = { 575 - .owner = THIS_MODULE, 576 - .name = "via686a", 575 + .driver = { 576 + .name = "via686a", 577 + }, 577 578 .attach_adapter = via686a_detect, 578 579 .detach_client = via686a_detach_client, 579 580 }; ··· 616 615 } 617 616 618 617 /* Reserve the ISA region */ 619 - if (!request_region(address, VIA686A_EXTENT, via686a_driver.name)) { 618 + if (!request_region(address, VIA686A_EXTENT, 619 + via686a_driver.driver.name)) { 620 620 dev_err(&adapter->dev, "region 0x%x already in use!\n", 621 621 address); 622 622 return -ENODEV;
+862
drivers/hwmon/vt8231.c
··· 1 + /* 2 + vt8231.c - Part of lm_sensors, Linux kernel modules 3 + for hardware monitoring 4 + 5 + Copyright (c) 2005 Roger Lucas <roger@planbit.co.uk> 6 + Copyright (c) 2002 Mark D. Studebaker <mdsxyz123@yahoo.com> 7 + Aaron M. Marsh <amarsh@sdf.lonestar.org> 8 + 9 + This program is free software; you can redistribute it and/or modify 10 + it under the terms of the GNU General Public License as published by 11 + the Free Software Foundation; either version 2 of the License, or 12 + (at your option) any later version. 13 + 14 + This program is distributed in the hope that it will be useful, 15 + but WITHOUT ANY WARRANTY; without even the implied warranty of 16 + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 17 + GNU General Public License for more details. 18 + 19 + You should have received a copy of the GNU General Public License 20 + along with this program; if not, write to the Free Software 21 + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 22 + */ 23 + 24 + /* Supports VIA VT8231 South Bridge embedded sensors 25 + */ 26 + 27 + #include <linux/module.h> 28 + #include <linux/init.h> 29 + #include <linux/slab.h> 30 + #include <linux/pci.h> 31 + #include <linux/jiffies.h> 32 + #include <linux/i2c.h> 33 + #include <linux/i2c-isa.h> 34 + #include <linux/hwmon.h> 35 + #include <linux/hwmon-sysfs.h> 36 + #include <linux/hwmon-vid.h> 37 + #include <linux/err.h> 38 + #include <asm/io.h> 39 + 40 + static int force_addr; 41 + module_param(force_addr, int, 0); 42 + MODULE_PARM_DESC(force_addr, "Initialize the base address of the sensors"); 43 + 44 + /* Device address 45 + Note that we can't determine the ISA address until we have initialized 46 + our module */ 47 + static unsigned short isa_address; 48 + 49 + #define VT8231_EXTENT 0x80 50 + #define VT8231_BASE_REG 0x70 51 + #define VT8231_ENABLE_REG 0x74 52 + 53 + /* The VT8231 registers 54 + 55 + The reset value for the input channel configuration is used (Reg 0x4A=0x07) 56 + which sets the selected inputs marked with '*' below if multiple options are 57 + possible: 58 + 59 + Voltage Mode Temperature Mode 60 + Sensor Linux Id Linux Id VIA Id 61 + -------- -------- -------- ------ 62 + CPU Diode N/A temp1 0 63 + UIC1 in0 temp2 * 1 64 + UIC2 in1 * temp3 2 65 + UIC3 in2 * temp4 3 66 + UIC4 in3 * temp5 4 67 + UIC5 in4 * temp6 5 68 + 3.3V in5 N/A 69 + 70 + Note that the BIOS may set the configuration register to a different value 71 + to match the motherboard configuration. 72 + */ 73 + 74 + /* fans numbered 0-1 */ 75 + #define VT8231_REG_FAN_MIN(nr) (0x3b + (nr)) 76 + #define VT8231_REG_FAN(nr) (0x29 + (nr)) 77 + 78 + /* Voltage inputs numbered 0-5 */ 79 + 80 + static const u8 regvolt[] = { 0x21, 0x22, 0x23, 0x24, 0x25, 0x26 }; 81 + static const u8 regvoltmax[] = { 0x3d, 0x2b, 0x2d, 0x2f, 0x31, 0x33 }; 82 + static const u8 regvoltmin[] = { 0x3e, 0x2c, 0x2e, 0x30, 0x32, 0x34 }; 83 + 84 + /* Temperatures are numbered 1-6 according to the Linux kernel specification. 85 + ** 86 + ** In the VIA datasheet, however, the temperatures are numbered from zero. 87 + ** Since it is important that this driver can easily be compared to the VIA 88 + ** datasheet, we will use the VIA numbering within this driver and map the 89 + ** kernel sysfs device name to the VIA number in the sysfs callback. 90 + */ 91 + 92 + #define VT8231_REG_TEMP_LOW01 0x49 93 + #define VT8231_REG_TEMP_LOW25 0x4d 94 + 95 + static const u8 regtemp[] = { 0x1f, 0x21, 0x22, 0x23, 0x24, 0x25 }; 96 + static const u8 regtempmax[] = { 0x39, 0x3d, 0x2b, 0x2d, 0x2f, 0x31 }; 97 + static const u8 regtempmin[] = { 0x3a, 0x3e, 0x2c, 0x2e, 0x30, 0x32 }; 98 + 99 + #define TEMP_FROM_REG(reg) (((253 * 4 - (reg)) * 550 + 105) / 210) 100 + #define TEMP_MAXMIN_FROM_REG(reg) (((253 - (reg)) * 2200 + 105) / 210) 101 + #define TEMP_MAXMIN_TO_REG(val) (253 - ((val) * 210 + 1100) / 2200) 102 + 103 + #define VT8231_REG_CONFIG 0x40 104 + #define VT8231_REG_ALARM1 0x41 105 + #define VT8231_REG_ALARM2 0x42 106 + #define VT8231_REG_FANDIV 0x47 107 + #define VT8231_REG_UCH_CONFIG 0x4a 108 + #define VT8231_REG_TEMP1_CONFIG 0x4b 109 + #define VT8231_REG_TEMP2_CONFIG 0x4c 110 + 111 + /* temps 0-5 as numbered in VIA datasheet - see later for mapping to Linux 112 + ** numbering 113 + */ 114 + #define ISTEMP(i, ch_config) ((i) == 0 ? 1 : \ 115 + ((ch_config) >> ((i)+1)) & 0x01) 116 + /* voltages 0-5 */ 117 + #define ISVOLT(i, ch_config) ((i) == 5 ? 1 : \ 118 + !(((ch_config) >> ((i)+2)) & 0x01)) 119 + 120 + #define DIV_FROM_REG(val) (1 << (val)) 121 + 122 + /* NB The values returned here are NOT temperatures. The calibration curves 123 + ** for the thermistor curves are board-specific and must go in the 124 + ** sensors.conf file. Temperature sensors are actually ten bits, but the 125 + ** VIA datasheet only considers the 8 MSBs obtained from the regtemp[] 126 + ** register. The temperature value returned should have a magnitude of 3, 127 + ** so we use the VIA scaling as the "true" scaling and use the remaining 2 128 + ** LSBs as fractional precision. 129 + ** 130 + ** All the on-chip hardware temperature comparisons for the alarms are only 131 + ** 8-bits wide, and compare against the 8 MSBs of the temperature. The bits 132 + ** in the registers VT8231_REG_TEMP_LOW01 and VT8231_REG_TEMP_LOW25 are 133 + ** ignored. 134 + */ 135 + 136 + /******** FAN RPM CONVERSIONS ******** 137 + ** This chip saturates back at 0, not at 255 like many the other chips. 138 + ** So, 0 means 0 RPM 139 + */ 140 + static inline u8 FAN_TO_REG(long rpm, int div) 141 + { 142 + if (rpm == 0) 143 + return 0; 144 + return SENSORS_LIMIT(1310720 / (rpm * div), 1, 255); 145 + } 146 + 147 + #define FAN_FROM_REG(val, div) ((val) == 0 ? 0 : 1310720 / ((val) * (div))) 148 + 149 + struct vt8231_data { 150 + struct i2c_client client; 151 + struct semaphore update_lock; 152 + struct class_device *class_dev; 153 + char valid; /* !=0 if following fields are valid */ 154 + unsigned long last_updated; /* In jiffies */ 155 + 156 + u8 in[6]; /* Register value */ 157 + u8 in_max[6]; /* Register value */ 158 + u8 in_min[6]; /* Register value */ 159 + u16 temp[6]; /* Register value 10 bit, right aligned */ 160 + u8 temp_max[6]; /* Register value */ 161 + u8 temp_min[6]; /* Register value */ 162 + u8 fan[2]; /* Register value */ 163 + u8 fan_min[2]; /* Register value */ 164 + u8 fan_div[2]; /* Register encoding, shifted right */ 165 + u16 alarms; /* Register encoding */ 166 + u8 uch_config; 167 + }; 168 + 169 + static struct pci_dev *s_bridge; 170 + static int vt8231_detect(struct i2c_adapter *adapter); 171 + static int vt8231_detach_client(struct i2c_client *client); 172 + static struct vt8231_data *vt8231_update_device(struct device *dev); 173 + static void vt8231_init_client(struct i2c_client *client); 174 + 175 + static inline int vt8231_read_value(struct i2c_client *client, u8 reg) 176 + { 177 + return inb_p(client->addr + reg); 178 + } 179 + 180 + static inline void vt8231_write_value(struct i2c_client *client, u8 reg, 181 + u8 value) 182 + { 183 + outb_p(value, client->addr + reg); 184 + } 185 + 186 + /* following are the sysfs callback functions */ 187 + static ssize_t show_in(struct device *dev, struct device_attribute *attr, 188 + char *buf) 189 + { 190 + struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr); 191 + int nr = sensor_attr->index; 192 + struct vt8231_data *data = vt8231_update_device(dev); 193 + 194 + return sprintf(buf, "%d\n", ((data->in[nr] - 3) * 10000) / 958); 195 + } 196 + 197 + static ssize_t show_in_min(struct device *dev, struct device_attribute *attr, 198 + char *buf) 199 + { 200 + struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr); 201 + int nr = sensor_attr->index; 202 + struct vt8231_data *data = vt8231_update_device(dev); 203 + 204 + return sprintf(buf, "%d\n", ((data->in_min[nr] - 3) * 10000) / 958); 205 + } 206 + 207 + static ssize_t show_in_max(struct device *dev, struct device_attribute *attr, 208 + char *buf) 209 + { 210 + struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr); 211 + int nr = sensor_attr->index; 212 + struct vt8231_data *data = vt8231_update_device(dev); 213 + 214 + return sprintf(buf, "%d\n", (((data->in_max[nr] - 3) * 10000) / 958)); 215 + } 216 + 217 + static ssize_t set_in_min(struct device *dev, struct device_attribute *attr, 218 + const char *buf, size_t count) 219 + { 220 + struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr); 221 + int nr = sensor_attr->index; 222 + struct i2c_client *client = to_i2c_client(dev); 223 + struct vt8231_data *data = i2c_get_clientdata(client); 224 + unsigned long val = simple_strtoul(buf, NULL, 10); 225 + 226 + down(&data->update_lock); 227 + data->in_min[nr] = SENSORS_LIMIT(((val * 958) / 10000) + 3, 0, 255); 228 + vt8231_write_value(client, regvoltmin[nr], data->in_min[nr]); 229 + up(&data->update_lock); 230 + return count; 231 + } 232 + 233 + static ssize_t set_in_max(struct device *dev, struct device_attribute *attr, 234 + const char *buf, size_t count) 235 + { 236 + struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr); 237 + int nr = sensor_attr->index; 238 + struct i2c_client *client = to_i2c_client(dev); 239 + struct vt8231_data *data = i2c_get_clientdata(client); 240 + unsigned long val = simple_strtoul(buf, NULL, 10); 241 + 242 + down(&data->update_lock); 243 + data->in_max[nr] = SENSORS_LIMIT(((val * 958) / 10000) + 3, 0, 255); 244 + vt8231_write_value(client, regvoltmax[nr], data->in_max[nr]); 245 + up(&data->update_lock); 246 + return count; 247 + } 248 + 249 + /* Special case for input 5 as this has 3.3V scaling built into the chip */ 250 + static ssize_t show_in5(struct device *dev, struct device_attribute *attr, 251 + char *buf) 252 + { 253 + struct vt8231_data *data = vt8231_update_device(dev); 254 + 255 + return sprintf(buf, "%d\n", 256 + (((data->in[5] - 3) * 10000 * 54) / (958 * 34))); 257 + } 258 + 259 + static ssize_t show_in5_min(struct device *dev, struct device_attribute *attr, 260 + char *buf) 261 + { 262 + struct vt8231_data *data = vt8231_update_device(dev); 263 + 264 + return sprintf(buf, "%d\n", 265 + (((data->in_min[5] - 3) * 10000 * 54) / (958 * 34))); 266 + } 267 + 268 + static ssize_t show_in5_max(struct device *dev, struct device_attribute *attr, 269 + char *buf) 270 + { 271 + struct vt8231_data *data = vt8231_update_device(dev); 272 + 273 + return sprintf(buf, "%d\n", 274 + (((data->in_max[5] - 3) * 10000 * 54) / (958 * 34))); 275 + } 276 + 277 + static ssize_t set_in5_min(struct device *dev, struct device_attribute *attr, 278 + const char *buf, size_t count) 279 + { 280 + struct i2c_client *client = to_i2c_client(dev); 281 + struct vt8231_data *data = i2c_get_clientdata(client); 282 + unsigned long val = simple_strtoul(buf, NULL, 10); 283 + 284 + down(&data->update_lock); 285 + data->in_min[5] = SENSORS_LIMIT(((val * 958 * 34) / (10000 * 54)) + 3, 286 + 0, 255); 287 + vt8231_write_value(client, regvoltmin[5], data->in_min[5]); 288 + up(&data->update_lock); 289 + return count; 290 + } 291 + 292 + static ssize_t set_in5_max(struct device *dev, struct device_attribute *attr, 293 + const char *buf, size_t count) 294 + { 295 + struct i2c_client *client = to_i2c_client(dev); 296 + struct vt8231_data *data = i2c_get_clientdata(client); 297 + unsigned long val = simple_strtoul(buf, NULL, 10); 298 + 299 + down(&data->update_lock); 300 + data->in_max[5] = SENSORS_LIMIT(((val * 958 * 34) / (10000 * 54)) + 3, 301 + 0, 255); 302 + vt8231_write_value(client, regvoltmax[5], data->in_max[5]); 303 + up(&data->update_lock); 304 + return count; 305 + } 306 + 307 + #define define_voltage_sysfs(offset) \ 308 + static SENSOR_DEVICE_ATTR(in##offset##_input, S_IRUGO, \ 309 + show_in, NULL, offset); \ 310 + static SENSOR_DEVICE_ATTR(in##offset##_min, S_IRUGO | S_IWUSR, \ 311 + show_in_min, set_in_min, offset); \ 312 + static SENSOR_DEVICE_ATTR(in##offset##_max, S_IRUGO | S_IWUSR, \ 313 + show_in_max, set_in_max, offset) 314 + 315 + define_voltage_sysfs(0); 316 + define_voltage_sysfs(1); 317 + define_voltage_sysfs(2); 318 + define_voltage_sysfs(3); 319 + define_voltage_sysfs(4); 320 + 321 + static DEVICE_ATTR(in5_input, S_IRUGO, show_in5, NULL); 322 + static DEVICE_ATTR(in5_min, S_IRUGO | S_IWUSR, show_in5_min, set_in5_min); 323 + static DEVICE_ATTR(in5_max, S_IRUGO | S_IWUSR, show_in5_max, set_in5_max); 324 + 325 + /* Temperatures */ 326 + static ssize_t show_temp0(struct device *dev, struct device_attribute *attr, 327 + char *buf) 328 + { 329 + struct vt8231_data *data = vt8231_update_device(dev); 330 + return sprintf(buf, "%d\n", data->temp[0] * 250); 331 + } 332 + 333 + static ssize_t show_temp0_max(struct device *dev, struct device_attribute *attr, 334 + char *buf) 335 + { 336 + struct vt8231_data *data = vt8231_update_device(dev); 337 + return sprintf(buf, "%d\n", data->temp_max[0] * 1000); 338 + } 339 + 340 + static ssize_t show_temp0_min(struct device *dev, struct device_attribute *attr, 341 + char *buf) 342 + { 343 + struct vt8231_data *data = vt8231_update_device(dev); 344 + return sprintf(buf, "%d\n", data->temp_min[0] * 1000); 345 + } 346 + 347 + static ssize_t set_temp0_max(struct device *dev, struct device_attribute *attr, 348 + const char *buf, size_t count) 349 + { 350 + struct i2c_client *client = to_i2c_client(dev); 351 + struct vt8231_data *data = i2c_get_clientdata(client); 352 + int val = simple_strtol(buf, NULL, 10); 353 + 354 + down(&data->update_lock); 355 + data->temp_max[0] = SENSORS_LIMIT((val + 500) / 1000, 0, 255); 356 + vt8231_write_value(client, regtempmax[0], data->temp_max[0]); 357 + up(&data->update_lock); 358 + return count; 359 + } 360 + static ssize_t set_temp0_min(struct device *dev, struct device_attribute *attr, 361 + const char *buf, size_t count) 362 + { 363 + struct i2c_client *client = to_i2c_client(dev); 364 + struct vt8231_data *data = i2c_get_clientdata(client); 365 + int val = simple_strtol(buf, NULL, 10); 366 + 367 + down(&data->update_lock); 368 + data->temp_min[0] = SENSORS_LIMIT((val + 500) / 1000, 0, 255); 369 + vt8231_write_value(client, regtempmin[0], data->temp_min[0]); 370 + up(&data->update_lock); 371 + return count; 372 + } 373 + 374 + static ssize_t show_temp(struct device *dev, struct device_attribute *attr, 375 + char *buf) 376 + { 377 + struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr); 378 + int nr = sensor_attr->index; 379 + struct vt8231_data *data = vt8231_update_device(dev); 380 + return sprintf(buf, "%d\n", TEMP_FROM_REG(data->temp[nr])); 381 + } 382 + 383 + static ssize_t show_temp_max(struct device *dev, struct device_attribute *attr, 384 + char *buf) 385 + { 386 + struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr); 387 + int nr = sensor_attr->index; 388 + struct vt8231_data *data = vt8231_update_device(dev); 389 + return sprintf(buf, "%d\n", TEMP_MAXMIN_FROM_REG(data->temp_max[nr])); 390 + } 391 + 392 + static ssize_t show_temp_min(struct device *dev, struct device_attribute *attr, 393 + char *buf) 394 + { 395 + struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr); 396 + int nr = sensor_attr->index; 397 + struct vt8231_data *data = vt8231_update_device(dev); 398 + return sprintf(buf, "%d\n", TEMP_MAXMIN_FROM_REG(data->temp_min[nr])); 399 + } 400 + 401 + static ssize_t set_temp_max(struct device *dev, struct device_attribute *attr, 402 + const char *buf, size_t count) 403 + { 404 + struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr); 405 + int nr = sensor_attr->index; 406 + struct i2c_client *client = to_i2c_client(dev); 407 + struct vt8231_data *data = i2c_get_clientdata(client); 408 + int val = simple_strtol(buf, NULL, 10); 409 + 410 + down(&data->update_lock); 411 + data->temp_max[nr] = SENSORS_LIMIT(TEMP_MAXMIN_TO_REG(val), 0, 255); 412 + vt8231_write_value(client, regtempmax[nr], data->temp_max[nr]); 413 + up(&data->update_lock); 414 + return count; 415 + } 416 + static ssize_t set_temp_min(struct device *dev, struct device_attribute *attr, 417 + const char *buf, size_t count) 418 + { 419 + struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr); 420 + int nr = sensor_attr->index; 421 + struct i2c_client *client = to_i2c_client(dev); 422 + struct vt8231_data *data = i2c_get_clientdata(client); 423 + int val = simple_strtol(buf, NULL, 10); 424 + 425 + down(&data->update_lock); 426 + data->temp_min[nr] = SENSORS_LIMIT(TEMP_MAXMIN_TO_REG(val), 0, 255); 427 + vt8231_write_value(client, regtempmin[nr], data->temp_min[nr]); 428 + up(&data->update_lock); 429 + return count; 430 + } 431 + 432 + /* Note that these map the Linux temperature sensor numbering (1-6) to the VIA 433 + ** temperature sensor numbering (0-5) 434 + */ 435 + #define define_temperature_sysfs(offset) \ 436 + static SENSOR_DEVICE_ATTR(temp##offset##_input, S_IRUGO, \ 437 + show_temp, NULL, offset - 1); \ 438 + static SENSOR_DEVICE_ATTR(temp##offset##_max, S_IRUGO | S_IWUSR, \ 439 + show_temp_max, set_temp_max, offset - 1); \ 440 + static SENSOR_DEVICE_ATTR(temp##offset##_min, S_IRUGO | S_IWUSR, \ 441 + show_temp_min, set_temp_min, offset - 1) 442 + 443 + static DEVICE_ATTR(temp1_input, S_IRUGO, show_temp0, NULL); 444 + static DEVICE_ATTR(temp1_max, S_IRUGO | S_IWUSR, show_temp0_max, set_temp0_max); 445 + static DEVICE_ATTR(temp1_min, S_IRUGO | S_IWUSR, show_temp0_min, set_temp0_min); 446 + 447 + define_temperature_sysfs(2); 448 + define_temperature_sysfs(3); 449 + define_temperature_sysfs(4); 450 + define_temperature_sysfs(5); 451 + define_temperature_sysfs(6); 452 + 453 + #define CFG_INFO_TEMP(id) { &sensor_dev_attr_temp##id##_input.dev_attr, \ 454 + &sensor_dev_attr_temp##id##_min.dev_attr, \ 455 + &sensor_dev_attr_temp##id##_max.dev_attr } 456 + #define CFG_INFO_VOLT(id) { &sensor_dev_attr_in##id##_input.dev_attr, \ 457 + &sensor_dev_attr_in##id##_min.dev_attr, \ 458 + &sensor_dev_attr_in##id##_max.dev_attr } 459 + 460 + struct str_device_attr_table { 461 + struct device_attribute *input; 462 + struct device_attribute *min; 463 + struct device_attribute *max; 464 + }; 465 + 466 + static struct str_device_attr_table cfg_info_temp[] = { 467 + { &dev_attr_temp1_input, &dev_attr_temp1_min, &dev_attr_temp1_max }, 468 + CFG_INFO_TEMP(2), 469 + CFG_INFO_TEMP(3), 470 + CFG_INFO_TEMP(4), 471 + CFG_INFO_TEMP(5), 472 + CFG_INFO_TEMP(6) 473 + }; 474 + 475 + static struct str_device_attr_table cfg_info_volt[] = { 476 + CFG_INFO_VOLT(0), 477 + CFG_INFO_VOLT(1), 478 + CFG_INFO_VOLT(2), 479 + CFG_INFO_VOLT(3), 480 + CFG_INFO_VOLT(4), 481 + { &dev_attr_in5_input, &dev_attr_in5_min, &dev_attr_in5_max } 482 + }; 483 + 484 + /* Fans */ 485 + static ssize_t show_fan(struct device *dev, struct device_attribute *attr, 486 + char *buf) 487 + { 488 + struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr); 489 + int nr = sensor_attr->index; 490 + struct vt8231_data *data = vt8231_update_device(dev); 491 + return sprintf(buf, "%d\n", FAN_FROM_REG(data->fan[nr], 492 + DIV_FROM_REG(data->fan_div[nr]))); 493 + } 494 + 495 + static ssize_t show_fan_min(struct device *dev, struct device_attribute *attr, 496 + char *buf) 497 + { 498 + struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr); 499 + int nr = sensor_attr->index; 500 + struct vt8231_data *data = vt8231_update_device(dev); 501 + return sprintf(buf, "%d\n", FAN_FROM_REG(data->fan_min[nr], 502 + DIV_FROM_REG(data->fan_div[nr]))); 503 + } 504 + 505 + static ssize_t show_fan_div(struct device *dev, struct device_attribute *attr, 506 + char *buf) 507 + { 508 + struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr); 509 + int nr = sensor_attr->index; 510 + struct vt8231_data *data = vt8231_update_device(dev); 511 + return sprintf(buf, "%d\n", DIV_FROM_REG(data->fan_div[nr])); 512 + } 513 + 514 + static ssize_t set_fan_min(struct device *dev, struct device_attribute *attr, 515 + const char *buf, size_t count) 516 + { 517 + struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr); 518 + int nr = sensor_attr->index; 519 + struct i2c_client *client = to_i2c_client(dev); 520 + struct vt8231_data *data = i2c_get_clientdata(client); 521 + int val = simple_strtoul(buf, NULL, 10); 522 + 523 + down(&data->update_lock); 524 + data->fan_min[nr] = FAN_TO_REG(val, DIV_FROM_REG(data->fan_div[nr])); 525 + vt8231_write_value(client, VT8231_REG_FAN_MIN(nr), data->fan_min[nr]); 526 + up(&data->update_lock); 527 + return count; 528 + } 529 + 530 + static ssize_t set_fan_div(struct device *dev, struct device_attribute *attr, 531 + const char *buf, size_t count) 532 + { 533 + struct i2c_client *client = to_i2c_client(dev); 534 + struct vt8231_data *data = i2c_get_clientdata(client); 535 + struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr); 536 + unsigned long val = simple_strtoul(buf, NULL, 10); 537 + int nr = sensor_attr->index; 538 + int old = vt8231_read_value(client, VT8231_REG_FANDIV); 539 + long min = FAN_FROM_REG(data->fan_min[nr], 540 + DIV_FROM_REG(data->fan_div[nr])); 541 + 542 + down(&data->update_lock); 543 + switch (val) { 544 + case 1: data->fan_div[nr] = 0; break; 545 + case 2: data->fan_div[nr] = 1; break; 546 + case 4: data->fan_div[nr] = 2; break; 547 + case 8: data->fan_div[nr] = 3; break; 548 + default: 549 + dev_err(&client->dev, "fan_div value %ld not supported." 550 + "Choose one of 1, 2, 4 or 8!\n", val); 551 + up(&data->update_lock); 552 + return -EINVAL; 553 + } 554 + 555 + /* Correct the fan minimum speed */ 556 + data->fan_min[nr] = FAN_TO_REG(min, DIV_FROM_REG(data->fan_div[nr])); 557 + vt8231_write_value(client, VT8231_REG_FAN_MIN(nr), data->fan_min[nr]); 558 + 559 + old = (old & 0x0f) | (data->fan_div[1] << 6) | (data->fan_div[0] << 4); 560 + vt8231_write_value(client, VT8231_REG_FANDIV, old); 561 + up(&data->update_lock); 562 + return count; 563 + } 564 + 565 + 566 + #define define_fan_sysfs(offset) \ 567 + static SENSOR_DEVICE_ATTR(fan##offset##_input, S_IRUGO, \ 568 + show_fan, NULL, offset - 1); \ 569 + static SENSOR_DEVICE_ATTR(fan##offset##_div, S_IRUGO | S_IWUSR, \ 570 + show_fan_div, set_fan_div, offset - 1); \ 571 + static SENSOR_DEVICE_ATTR(fan##offset##_min, S_IRUGO | S_IWUSR, \ 572 + show_fan_min, set_fan_min, offset - 1) 573 + 574 + define_fan_sysfs(1); 575 + define_fan_sysfs(2); 576 + 577 + /* Alarms */ 578 + static ssize_t show_alarms(struct device *dev, struct device_attribute *attr, 579 + char *buf) 580 + { 581 + struct vt8231_data *data = vt8231_update_device(dev); 582 + return sprintf(buf, "%d\n", data->alarms); 583 + } 584 + 585 + static DEVICE_ATTR(alarms, S_IRUGO, show_alarms, NULL); 586 + 587 + static struct i2c_driver vt8231_driver = { 588 + .driver = { 589 + .name = "vt8231", 590 + }, 591 + .attach_adapter = vt8231_detect, 592 + .detach_client = vt8231_detach_client, 593 + }; 594 + 595 + static struct pci_device_id vt8231_pci_ids[] = { 596 + { PCI_DEVICE(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_8231_4) }, 597 + { 0, } 598 + }; 599 + 600 + MODULE_DEVICE_TABLE(pci, vt8231_pci_ids); 601 + 602 + static int __devinit vt8231_pci_probe(struct pci_dev *dev, 603 + const struct pci_device_id *id); 604 + 605 + static struct pci_driver vt8231_pci_driver = { 606 + .name = "vt8231", 607 + .id_table = vt8231_pci_ids, 608 + .probe = vt8231_pci_probe, 609 + }; 610 + 611 + int vt8231_detect(struct i2c_adapter *adapter) 612 + { 613 + struct i2c_client *client; 614 + struct vt8231_data *data; 615 + int err = 0, i; 616 + u16 val; 617 + 618 + /* 8231 requires multiple of 256 */ 619 + if (force_addr) { 620 + isa_address = force_addr & 0xFF00; 621 + dev_warn(&adapter->dev, "forcing ISA address 0x%04X\n", 622 + isa_address); 623 + if (PCIBIOS_SUCCESSFUL != pci_write_config_word(s_bridge, 624 + VT8231_BASE_REG, isa_address)) 625 + return -ENODEV; 626 + } 627 + 628 + if (PCIBIOS_SUCCESSFUL != 629 + pci_read_config_word(s_bridge, VT8231_ENABLE_REG, &val)) 630 + return -ENODEV; 631 + 632 + if (!(val & 0x0001)) { 633 + dev_warn(&adapter->dev, "enabling sensors\n"); 634 + if (PCIBIOS_SUCCESSFUL != 635 + pci_write_config_word(s_bridge, VT8231_ENABLE_REG, 636 + val | 0x0001)) 637 + return -ENODEV; 638 + } 639 + 640 + /* Reserve the ISA region */ 641 + if (!request_region(isa_address, VT8231_EXTENT, 642 + vt8231_pci_driver.name)) { 643 + dev_err(&adapter->dev, "region 0x%x already in use!\n", 644 + isa_address); 645 + return -ENODEV; 646 + } 647 + 648 + if (!(data = kzalloc(sizeof(struct vt8231_data), GFP_KERNEL))) { 649 + err = -ENOMEM; 650 + goto exit_release; 651 + } 652 + 653 + client = &data->client; 654 + i2c_set_clientdata(client, data); 655 + client->addr = isa_address; 656 + client->adapter = adapter; 657 + client->driver = &vt8231_driver; 658 + client->dev.parent = &adapter->dev; 659 + 660 + /* Fill in the remaining client fields and put into the global list */ 661 + strlcpy(client->name, "vt8231", I2C_NAME_SIZE); 662 + 663 + init_MUTEX(&data->update_lock); 664 + 665 + /* Tell the I2C layer a new client has arrived */ 666 + if ((err = i2c_attach_client(client))) 667 + goto exit_free; 668 + 669 + vt8231_init_client(client); 670 + 671 + /* Register sysfs hooks */ 672 + data->class_dev = hwmon_device_register(&client->dev); 673 + if (IS_ERR(data->class_dev)) { 674 + err = PTR_ERR(data->class_dev); 675 + goto exit_detach; 676 + } 677 + 678 + /* Must update device information to find out the config field */ 679 + data->uch_config = vt8231_read_value(client, VT8231_REG_UCH_CONFIG); 680 + 681 + for (i = 0; i < ARRAY_SIZE(cfg_info_temp); i++) { 682 + if (ISTEMP(i, data->uch_config)) { 683 + device_create_file(&client->dev, 684 + cfg_info_temp[i].input); 685 + device_create_file(&client->dev, cfg_info_temp[i].max); 686 + device_create_file(&client->dev, cfg_info_temp[i].min); 687 + } 688 + } 689 + 690 + for (i = 0; i < ARRAY_SIZE(cfg_info_volt); i++) { 691 + if (ISVOLT(i, data->uch_config)) { 692 + device_create_file(&client->dev, 693 + cfg_info_volt[i].input); 694 + device_create_file(&client->dev, cfg_info_volt[i].max); 695 + device_create_file(&client->dev, cfg_info_volt[i].min); 696 + } 697 + } 698 + 699 + device_create_file(&client->dev, &sensor_dev_attr_fan1_input.dev_attr); 700 + device_create_file(&client->dev, &sensor_dev_attr_fan2_input.dev_attr); 701 + device_create_file(&client->dev, &sensor_dev_attr_fan1_min.dev_attr); 702 + device_create_file(&client->dev, &sensor_dev_attr_fan2_min.dev_attr); 703 + device_create_file(&client->dev, &sensor_dev_attr_fan1_div.dev_attr); 704 + device_create_file(&client->dev, &sensor_dev_attr_fan2_div.dev_attr); 705 + 706 + device_create_file(&client->dev, &dev_attr_alarms); 707 + return 0; 708 + 709 + exit_detach: 710 + i2c_detach_client(client); 711 + exit_free: 712 + kfree(data); 713 + exit_release: 714 + release_region(isa_address, VT8231_EXTENT); 715 + return err; 716 + } 717 + 718 + static int vt8231_detach_client(struct i2c_client *client) 719 + { 720 + struct vt8231_data *data = i2c_get_clientdata(client); 721 + int err; 722 + 723 + hwmon_device_unregister(data->class_dev); 724 + 725 + if ((err = i2c_detach_client(client))) { 726 + return err; 727 + } 728 + 729 + release_region(client->addr, VT8231_EXTENT); 730 + kfree(data); 731 + 732 + return 0; 733 + } 734 + 735 + static void vt8231_init_client(struct i2c_client *client) 736 + { 737 + vt8231_write_value(client, VT8231_REG_TEMP1_CONFIG, 0); 738 + vt8231_write_value(client, VT8231_REG_TEMP2_CONFIG, 0); 739 + } 740 + 741 + static struct vt8231_data *vt8231_update_device(struct device *dev) 742 + { 743 + struct i2c_client *client = to_i2c_client(dev); 744 + struct vt8231_data *data = i2c_get_clientdata(client); 745 + int i; 746 + u16 low; 747 + 748 + down(&data->update_lock); 749 + 750 + if (time_after(jiffies, data->last_updated + HZ + HZ / 2) 751 + || !data->valid) { 752 + for (i = 0; i < 6; i++) { 753 + if (ISVOLT(i, data->uch_config)) { 754 + data->in[i] = vt8231_read_value(client, 755 + regvolt[i]); 756 + data->in_min[i] = vt8231_read_value(client, 757 + regvoltmin[i]); 758 + data->in_max[i] = vt8231_read_value(client, 759 + regvoltmax[i]); 760 + } 761 + } 762 + for (i = 0; i < 2; i++) { 763 + data->fan[i] = vt8231_read_value(client, 764 + VT8231_REG_FAN(i)); 765 + data->fan_min[i] = vt8231_read_value(client, 766 + VT8231_REG_FAN_MIN(i)); 767 + } 768 + 769 + low = vt8231_read_value(client, VT8231_REG_TEMP_LOW01); 770 + low = (low >> 6) | ((low & 0x30) >> 2) 771 + | (vt8231_read_value(client, VT8231_REG_TEMP_LOW25) << 4); 772 + for (i = 0; i < 6; i++) { 773 + if (ISTEMP(i, data->uch_config)) { 774 + data->temp[i] = (vt8231_read_value(client, 775 + regtemp[i]) << 2) 776 + | ((low >> (2 * i)) & 0x03); 777 + data->temp_max[i] = vt8231_read_value(client, 778 + regtempmax[i]); 779 + data->temp_min[i] = vt8231_read_value(client, 780 + regtempmin[i]); 781 + } 782 + } 783 + 784 + i = vt8231_read_value(client, VT8231_REG_FANDIV); 785 + data->fan_div[0] = (i >> 4) & 0x03; 786 + data->fan_div[1] = i >> 6; 787 + data->alarms = vt8231_read_value(client, VT8231_REG_ALARM1) | 788 + (vt8231_read_value(client, VT8231_REG_ALARM2) << 8); 789 + 790 + /* Set alarm flags correctly */ 791 + if (!data->fan[0] && data->fan_min[0]) { 792 + data->alarms |= 0x40; 793 + } else if (data->fan[0] && !data->fan_min[0]) { 794 + data->alarms &= ~0x40; 795 + } 796 + 797 + if (!data->fan[1] && data->fan_min[1]) { 798 + data->alarms |= 0x80; 799 + } else if (data->fan[1] && !data->fan_min[1]) { 800 + data->alarms &= ~0x80; 801 + } 802 + 803 + data->last_updated = jiffies; 804 + data->valid = 1; 805 + } 806 + 807 + up(&data->update_lock); 808 + 809 + return data; 810 + } 811 + 812 + static int __devinit vt8231_pci_probe(struct pci_dev *dev, 813 + const struct pci_device_id *id) 814 + { 815 + u16 val; 816 + 817 + if (PCIBIOS_SUCCESSFUL != pci_read_config_word(dev, VT8231_BASE_REG, 818 + &val)) 819 + return -ENODEV; 820 + 821 + isa_address = val & ~(VT8231_EXTENT - 1); 822 + if (isa_address == 0 && force_addr == 0) { 823 + dev_err(&dev->dev, "base address not set -\ 824 + upgrade BIOS or use force_addr=0xaddr\n"); 825 + return -ENODEV; 826 + } 827 + 828 + s_bridge = pci_dev_get(dev); 829 + 830 + if (i2c_isa_add_driver(&vt8231_driver)) { 831 + pci_dev_put(s_bridge); 832 + s_bridge = NULL; 833 + } 834 + 835 + /* Always return failure here. This is to allow other drivers to bind 836 + * to this pci device. We don't really want to have control over the 837 + * pci device, we only wanted to read as few register values from it. 838 + */ 839 + return -ENODEV; 840 + } 841 + 842 + static int __init sm_vt8231_init(void) 843 + { 844 + return pci_module_init(&vt8231_pci_driver); 845 + } 846 + 847 + static void __exit sm_vt8231_exit(void) 848 + { 849 + pci_unregister_driver(&vt8231_pci_driver); 850 + if (s_bridge != NULL) { 851 + i2c_isa_del_driver(&vt8231_driver); 852 + pci_dev_put(s_bridge); 853 + s_bridge = NULL; 854 + } 855 + } 856 + 857 + MODULE_AUTHOR("Roger Lucas <roger@planbit.co.uk>"); 858 + MODULE_DESCRIPTION("VT8231 sensors"); 859 + MODULE_LICENSE("GPL"); 860 + 861 + module_init(sm_vt8231_init); 862 + module_exit(sm_vt8231_exit);
+4 -3
drivers/hwmon/w83627ehf.c
··· 676 676 int i, err = 0; 677 677 678 678 if (!request_region(address + REGION_OFFSET, REGION_LENGTH, 679 - w83627ehf_driver.name)) { 679 + w83627ehf_driver.driver.name)) { 680 680 err = -EBUSY; 681 681 goto exit; 682 682 } ··· 785 785 } 786 786 787 787 static struct i2c_driver w83627ehf_driver = { 788 - .owner = THIS_MODULE, 789 - .name = "w83627ehf", 788 + .driver = { 789 + .name = "w83627ehf", 790 + }, 790 791 .attach_adapter = w83627ehf_detect, 791 792 .detach_client = w83627ehf_detach_client, 792 793 };
+11 -12
drivers/hwmon/w83627hf.c
··· 332 332 static void w83627hf_init_client(struct i2c_client *client); 333 333 334 334 static struct i2c_driver w83627hf_driver = { 335 - .owner = THIS_MODULE, 336 - .name = "w83627hf", 335 + .driver = { 336 + .name = "w83627hf", 337 + }, 337 338 .attach_adapter = w83627hf_detect, 338 339 .detach_client = w83627hf_detach_client, 339 340 }; ··· 1010 1009 address = force_addr & WINB_ALIGNMENT; 1011 1010 1012 1011 if (!request_region(address + WINB_REGION_OFFSET, WINB_REGION_SIZE, 1013 - w83627hf_driver.name)) { 1012 + w83627hf_driver.driver.name)) { 1014 1013 err = -EBUSY; 1015 1014 goto ERROR0; 1016 1015 } ··· 1123 1122 if (kind != w83697hf) 1124 1123 device_create_file_temp(new_client, 3); 1125 1124 1126 - if (kind != w83697hf) 1125 + if (kind != w83697hf && data->vid != 0xff) { 1127 1126 device_create_file_vid(new_client); 1128 - 1129 - if (kind != w83697hf) 1130 1127 device_create_file_vrm(new_client); 1128 + } 1131 1129 1132 1130 device_create_file_fan_div(new_client, 1); 1133 1131 device_create_file_fan_div(new_client, 2); ··· 1232 1232 1233 1233 /* Make sure the pins are configured for input 1234 1234 There must be at least five (VRM 9), and possibly 6 (VRM 10) */ 1235 - sel = superio_inb(W83627THF_GPIO5_IOSR); 1235 + sel = superio_inb(W83627THF_GPIO5_IOSR) & 0x3f; 1236 1236 if ((sel & 0x1f) != 0x1f) { 1237 1237 dev_dbg(&client->dev, "GPIO5 not configured for VID " 1238 1238 "function\n"); ··· 1323 1323 int hi = w83627hf_read_value(client, W83781D_REG_CHIPID); 1324 1324 data->vid = (lo & 0x0f) | ((hi & 0x01) << 4); 1325 1325 } else if (w83627thf == data->type) { 1326 - data->vid = w83627thf_read_gpio5(client) & 0x3f; 1326 + data->vid = w83627thf_read_gpio5(client); 1327 1327 } 1328 1328 1329 1329 /* Read VRM & OVT Config only once */ 1330 1330 if (w83627thf == data->type || w83637hf == data->type) { 1331 1331 data->vrm_ovt = 1332 1332 w83627hf_read_value(client, W83627THF_REG_VRM_OVT_CFG); 1333 - data->vrm = (data->vrm_ovt & 0x01) ? 90 : 82; 1334 - } else { 1335 - /* Convert VID to voltage based on default VRM */ 1336 - data->vrm = vid_which_vrm(); 1337 1333 } 1334 + 1335 + /* Convert VID to voltage based on VRM */ 1336 + data->vrm = vid_which_vrm(); 1338 1337 1339 1338 tmp = w83627hf_read_value(client, W83781D_REG_SCFG1); 1340 1339 for (i = 1; i <= 3; i++) {
+7 -6
drivers/hwmon/w83781d.c
··· 269 269 static void w83781d_init_client(struct i2c_client *client); 270 270 271 271 static struct i2c_driver w83781d_driver = { 272 - .owner = THIS_MODULE, 273 - .name = "w83781d", 272 + .driver = { 273 + .name = "w83781d", 274 + }, 274 275 .id = I2C_DRIVERID_W83781D, 275 - .flags = I2C_DF_NOTIFY, 276 276 .attach_adapter = w83781d_attach_adapter, 277 277 .detach_client = w83781d_detach_client, 278 278 }; 279 279 280 280 static struct i2c_driver w83781d_isa_driver = { 281 - .owner = THIS_MODULE, 282 - .name = "w83781d-isa", 281 + .driver = { 282 + .name = "w83781d-isa", 283 + }, 283 284 .attach_adapter = w83781d_isa_attach_adapter, 284 285 .detach_client = w83781d_detach_client, 285 286 }; ··· 1013 1012 1014 1013 if (is_isa) 1015 1014 if (!request_region(address, W83781D_EXTENT, 1016 - w83781d_isa_driver.name)) { 1015 + w83781d_isa_driver.driver.name)) { 1017 1016 dev_dbg(&adapter->dev, "Request of region " 1018 1017 "0x%x-0x%x for w83781d failed\n", address, 1019 1018 address + W83781D_EXTENT - 1);
+22 -61
drivers/hwmon/w83792d.c
··· 269 269 struct w83792d_data { 270 270 struct i2c_client client; 271 271 struct class_device *class_dev; 272 - struct semaphore lock; 273 272 enum chips type; 274 273 275 274 struct semaphore update_lock; ··· 281 282 u8 in[9]; /* Register value */ 282 283 u8 in_max[9]; /* Register value */ 283 284 u8 in_min[9]; /* Register value */ 284 - u8 low_bits[2]; /* Additional resolution to voltage in0-6 */ 285 + u16 low_bits; /* Additional resolution to voltage in6-0 */ 285 286 u8 fan[7]; /* Register value */ 286 287 u8 fan_min[7]; /* Register value */ 287 288 u8 temp1[3]; /* current, over, thyst */ ··· 316 317 static void w83792d_init_client(struct i2c_client *client); 317 318 318 319 static struct i2c_driver w83792d_driver = { 319 - .owner = THIS_MODULE, 320 - .name = "w83792d", 321 - .flags = I2C_DF_NOTIFY, 320 + .driver = { 321 + .name = "w83792d", 322 + }, 322 323 .attach_adapter = w83792d_attach_adapter, 323 324 .detach_client = w83792d_detach_client, 324 325 }; 325 326 326 - static long in_count_from_reg(int nr, struct w83792d_data *data) 327 + static inline long in_count_from_reg(int nr, struct w83792d_data *data) 327 328 { 328 - u16 vol_count = data->in[nr]; 329 - u16 low_bits = 0; 330 - vol_count = (vol_count << 2); 331 - switch (nr) 332 - { 333 - case 0: /* vin0 */ 334 - low_bits = (data->low_bits[0]) & 0x03; 335 - break; 336 - case 1: /* vin1 */ 337 - low_bits = ((data->low_bits[0]) & 0x0c) >> 2; 338 - break; 339 - case 2: /* vin2 */ 340 - low_bits = ((data->low_bits[0]) & 0x30) >> 4; 341 - break; 342 - case 3: /* vin3 */ 343 - low_bits = ((data->low_bits[0]) & 0xc0) >> 6; 344 - break; 345 - case 4: /* vin4 */ 346 - low_bits = (data->low_bits[1]) & 0x03; 347 - break; 348 - case 5: /* vin5 */ 349 - low_bits = ((data->low_bits[1]) & 0x0c) >> 2; 350 - break; 351 - case 6: /* vin6 */ 352 - low_bits = ((data->low_bits[1]) & 0x30) >> 4; 353 - default: 354 - break; 355 - } 356 - vol_count = vol_count | low_bits; 357 - return vol_count; 329 + /* in7 and in8 do not have low bits, but the formula still works */ 330 + return ((data->in[nr] << 2) | ((data->low_bits >> (2 * nr)) & 0x03)); 358 331 } 359 332 360 333 /* following are the sysfs callback functions */ ··· 1163 1192 new_client = &data->client; 1164 1193 i2c_set_clientdata(new_client, data); 1165 1194 new_client->addr = address; 1166 - init_MUTEX(&data->lock); 1167 1195 new_client->adapter = adapter; 1168 1196 new_client->driver = &w83792d_driver; 1169 1197 new_client->flags = 0; ··· 1213 1243 goto ERROR1; 1214 1244 } 1215 1245 val1 = w83792d_read_value(new_client, W83792D_REG_WCHIPID); 1216 - if (val1 == 0x7a && address >= 0x2c) { 1246 + if (val1 == 0x7a) { 1217 1247 kind = w83792d; 1218 1248 } else { 1219 1249 if (kind == 0) ··· 1386 1416 return 0; 1387 1417 } 1388 1418 1389 - /* The SMBus locks itself, usually, but nothing may access the Winbond between 1390 - bank switches. ISA access must always be locked explicitly! 1391 - We ignore the W83792D BUSY flag at this moment - it could lead to deadlocks, 1392 - would slow down the W83792D access and should not be necessary. 1393 - There are some ugly typecasts here, but the good news is - they should 1394 - nowhere else be necessary! */ 1395 - static int 1396 - w83792d_read_value(struct i2c_client *client, u8 reg) 1419 + /* The SMBus locks itself. The Winbond W83792D chip has a bank register, 1420 + but the driver only accesses registers in bank 0, so we don't have 1421 + to switch banks and lock access between switches. */ 1422 + static int w83792d_read_value(struct i2c_client *client, u8 reg) 1397 1423 { 1398 - int res=0; 1399 - res = i2c_smbus_read_byte_data(client, reg); 1400 - 1401 - return res; 1424 + return i2c_smbus_read_byte_data(client, reg); 1402 1425 } 1403 1426 1404 - static int 1405 - w83792d_write_value(struct i2c_client *client, u8 reg, u8 value) 1427 + static int w83792d_write_value(struct i2c_client *client, u8 reg, u8 value) 1406 1428 { 1407 - i2c_smbus_write_byte_data(client, reg, value); 1408 - return 0; 1429 + return i2c_smbus_write_byte_data(client, reg, value); 1409 1430 } 1410 1431 1411 1432 static void ··· 1453 1492 data->in_min[i] = w83792d_read_value(client, 1454 1493 W83792D_REG_IN_MIN[i]); 1455 1494 } 1456 - data->low_bits[0] = w83792d_read_value(client, 1457 - W83792D_REG_LOW_BITS1); 1458 - data->low_bits[1] = w83792d_read_value(client, 1459 - W83792D_REG_LOW_BITS2); 1495 + data->low_bits = w83792d_read_value(client, 1496 + W83792D_REG_LOW_BITS1) + 1497 + (w83792d_read_value(client, 1498 + W83792D_REG_LOW_BITS2) << 8); 1460 1499 for (i = 0; i < 7; i++) { 1461 1500 /* Update the Fan measured value and limits */ 1462 1501 data->fan[i] = w83792d_read_value(client, ··· 1467 1506 pwm_array_tmp[i] = w83792d_read_value(client, 1468 1507 W83792D_REG_PWM[i]); 1469 1508 data->pwm[i] = pwm_array_tmp[i] & 0x0f; 1470 - data->pwm_mode[i] = (pwm_array_tmp[i] >> 7) & 0x01; 1509 + data->pwm_mode[i] = pwm_array_tmp[i] >> 7; 1471 1510 } 1472 1511 1473 1512 reg_tmp = w83792d_read_value(client, W83792D_REG_FAN_CFG); ··· 1568 1607 dev_dbg(dev, "vin[%d] max is: 0x%x\n", i, data->in_max[i]); 1569 1608 dev_dbg(dev, "vin[%d] min is: 0x%x\n", i, data->in_min[i]); 1570 1609 } 1571 - dev_dbg(dev, "Low Bit1 is: 0x%x\n", data->low_bits[0]); 1572 - dev_dbg(dev, "Low Bit2 is: 0x%x\n", data->low_bits[1]); 1610 + dev_dbg(dev, "Low Bit1 is: 0x%x\n", data->low_bits & 0xff); 1611 + dev_dbg(dev, "Low Bit2 is: 0x%x\n", data->low_bits >> 8); 1573 1612 dev_dbg(dev, "7 set of Fan Counts and Duty Cycles: =====>\n"); 1574 1613 for (i=0; i<7; i++) { 1575 1614 dev_dbg(dev, "fan[%d] is: 0x%x\n", i, data->fan[i]);
+3 -3
drivers/hwmon/w83l785ts.c
··· 92 92 */ 93 93 94 94 static struct i2c_driver w83l785ts_driver = { 95 - .owner = THIS_MODULE, 96 - .name = "w83l785ts", 95 + .driver = { 96 + .name = "w83l785ts", 97 + }, 97 98 .id = I2C_DRIVERID_W83L785TS, 98 - .flags = I2C_DF_NOTIFY, 99 99 .attach_adapter = w83l785ts_attach_adapter, 100 100 .detach_client = w83l785ts_detach_client, 101 101 };
+1 -5
drivers/i2c/busses/i2c-i801.c
··· 468 468 return -1; 469 469 } 470 470 471 - if (hwpec) 472 - outb_p(1, SMBAUXCTL); /* enable hardware PEC */ 471 + outb_p(hwpec, SMBAUXCTL); /* enable/disable hardware PEC */ 473 472 474 473 if(block) 475 474 ret = i801_block_transaction(data, read_write, size, hwpec); ··· 476 477 outb_p(xact | ENABLE_INT9, SMBHSTCNT); 477 478 ret = i801_transaction(); 478 479 } 479 - 480 - if (hwpec) 481 - outb_p(0, SMBAUXCTL); /* disable hardware PEC */ 482 480 483 481 if(block) 484 482 return ret;
+1
drivers/i2c/busses/i2c-ibm_iic.c
··· 725 725 strcpy(adap->name, "IBM IIC"); 726 726 i2c_set_adapdata(adap, dev); 727 727 adap->id = I2C_HW_OCP; 728 + adap->class = I2C_CLASS_HWMON; 728 729 adap->algo = &iic_algo; 729 730 adap->client_register = NULL; 730 731 adap->client_unregister = NULL;
+4 -6
drivers/i2c/busses/i2c-isa.c
··· 92 92 int res; 93 93 94 94 /* Add the driver to the list of i2c drivers in the driver core */ 95 - driver->driver.name = driver->name; 96 - driver->driver.owner = driver->owner; 97 95 driver->driver.bus = &i2c_bus_type; 98 96 driver->driver.probe = i2c_isa_device_probe; 99 97 driver->driver.remove = i2c_isa_device_remove; 100 98 res = driver_register(&driver->driver); 101 99 if (res) 102 100 return res; 103 - dev_dbg(&isa_adapter.dev, "Driver %s registered\n", driver->name); 101 + dev_dbg(&isa_adapter.dev, "Driver %s registered\n", driver->driver.name); 104 102 105 103 /* Now look for clients */ 106 104 driver->attach_adapter(&isa_adapter); ··· 122 124 if ((res = driver->detach_client(client))) { 123 125 dev_err(&isa_adapter.dev, "Failed, driver " 124 126 "%s not unregistered!\n", 125 - driver->name); 127 + driver->driver.name); 126 128 return res; 127 129 } 128 130 } 129 131 130 132 /* Get the driver off the core list */ 131 133 driver_unregister(&driver->driver); 132 - dev_dbg(&isa_adapter.dev, "Driver %s unregistered\n", driver->name); 134 + dev_dbg(&isa_adapter.dev, "Driver %s unregistered\n", driver->driver.name); 133 135 134 136 return 0; 135 137 } ··· 174 176 list_for_each_safe(item, _n, &isa_adapter.clients) { 175 177 client = list_entry(item, struct i2c_client, list); 176 178 dev_err(&isa_adapter.dev, "Driver %s still has an active " 177 - "ISA client at 0x%x\n", client->driver->name, 179 + "ISA client at 0x%x\n", client->driver->driver.name, 178 180 client->addr); 179 181 } 180 182 if (client != NULL)
+15 -18
drivers/i2c/busses/i2c-mv64xxx.c
··· 1 1 /* 2 - * drivers/i2c/busses/i2c-mv64xxx.c 3 - * 4 2 * Driver for the i2c controller on the Marvell line of host bridges for MIPS 5 3 * and PPC (e.g, gt642[46]0, mv643[46]0, mv644[46]0). 6 4 * ··· 63 65 MV64XXX_I2C_STATE_WAITING_FOR_ADDR_2_ACK, 64 66 MV64XXX_I2C_STATE_WAITING_FOR_SLAVE_ACK, 65 67 MV64XXX_I2C_STATE_WAITING_FOR_SLAVE_DATA, 66 - MV64XXX_I2C_STATE_ABORTING, 67 68 }; 68 69 69 70 /* Driver actions */ ··· 82 85 int irq; 83 86 u32 state; 84 87 u32 action; 88 + u32 aborting; 85 89 u32 cntl_bits; 86 90 void __iomem *reg_base; 87 91 u32 reg_base_p; ··· 120 122 return; 121 123 } 122 124 123 - if (drv_data->state == MV64XXX_I2C_STATE_ABORTING) { 124 - drv_data->action = MV64XXX_I2C_ACTION_SEND_STOP; 125 - drv_data->state = MV64XXX_I2C_STATE_IDLE; 126 - return; 127 - } 128 - 129 125 /* The status from the ctlr [mostly] tells us what to do next */ 130 126 switch (status) { 131 127 /* Start condition interrupt */ ··· 140 148 /* FALLTHRU */ 141 149 case MV64XXX_I2C_STATUS_MAST_WR_ADDR_2_ACK: /* 0xd0 */ 142 150 case MV64XXX_I2C_STATUS_MAST_WR_ACK: /* 0x28 */ 143 - if (drv_data->bytes_left > 0) { 151 + if ((drv_data->bytes_left == 0) 152 + || (drv_data->aborting 153 + && (drv_data->byte_posn != 0))) { 154 + drv_data->action = MV64XXX_I2C_ACTION_SEND_STOP; 155 + drv_data->state = MV64XXX_I2C_STATE_IDLE; 156 + } else { 144 157 drv_data->action = MV64XXX_I2C_ACTION_SEND_DATA; 145 158 drv_data->state = 146 159 MV64XXX_I2C_STATE_WAITING_FOR_SLAVE_ACK; 147 160 drv_data->bytes_left--; 148 - } else { 149 - drv_data->action = MV64XXX_I2C_ACTION_SEND_STOP; 150 - drv_data->state = MV64XXX_I2C_STATE_IDLE; 151 161 } 152 162 break; 153 163 ··· 178 184 } 179 185 drv_data->state = MV64XXX_I2C_STATE_WAITING_FOR_SLAVE_DATA; 180 186 181 - if (drv_data->bytes_left == 1) 187 + if ((drv_data->bytes_left == 1) || drv_data->aborting) 182 188 drv_data->cntl_bits &= ~MV64XXX_I2C_REG_CONTROL_ACK; 183 189 break; 184 190 ··· 314 320 drv_data->msg = msg; 315 321 drv_data->byte_posn = 0; 316 322 drv_data->bytes_left = msg->len; 323 + drv_data->aborting = 0; 317 324 drv_data->rc = 0; 318 325 drv_data->cntl_bits = MV64XXX_I2C_REG_CONTROL_ACK | 319 326 MV64XXX_I2C_REG_CONTROL_INTEN | MV64XXX_I2C_REG_CONTROL_TWSIEN; ··· 354 359 } 355 360 356 361 if (abort && drv_data->block) { 357 - drv_data->state = MV64XXX_I2C_STATE_ABORTING; 362 + drv_data->aborting = 1; 358 363 spin_unlock_irqrestore(&drv_data->lock, flags); 359 364 360 365 time_left = wait_event_timeout(drv_data->waitq, 361 366 !drv_data->block, 362 367 msecs_to_jiffies(drv_data->adapter.timeout)); 363 368 364 - if (time_left <= 0) { 369 + if ((time_left <= 0) && drv_data->block) { 365 370 drv_data->state = MV64XXX_I2C_STATE_IDLE; 366 371 dev_err(&drv_data->adapter.dev, 367 - "mv64xxx: I2C bus locked\n"); 372 + "mv64xxx: I2C bus locked, block: %d, " 373 + "time_left: %d\n", drv_data->block, 374 + (int)time_left); 368 375 } 369 376 } else 370 377 spin_unlock_irqrestore(&drv_data->lock, flags); ··· 507 510 goto exit_kfree; 508 511 } 509 512 510 - strncpy(drv_data->adapter.name, MV64XXX_I2C_CTLR_NAME " adapter", 513 + strlcpy(drv_data->adapter.name, MV64XXX_I2C_CTLR_NAME " adapter", 511 514 I2C_NAME_SIZE); 512 515 513 516 init_waitqueue_head(&drv_data->waitq);
+2
drivers/i2c/busses/i2c-nforce2.c
··· 30 30 nForce3 Pro150 MCP 00D4 31 31 nForce3 250Gb MCP 00E4 32 32 nForce4 MCP 0052 33 + nForce4 MCP-04 0034 33 34 34 35 This driver supports the 2 SMBuses that are included in the MCP of the 35 36 nForce2/3/4 chipsets. ··· 258 257 { PCI_DEVICE(PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE3_SMBUS) }, 259 258 { PCI_DEVICE(PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE3S_SMBUS) }, 260 259 { PCI_DEVICE(PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE4_SMBUS) }, 260 + { PCI_DEVICE(PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_MCP04_SMBUS) }, 261 261 { 0 } 262 262 }; 263 263
+11 -1
drivers/i2c/busses/i2c-parport.h
··· 80 80 .setscl = { 0x01, DATA, 1 }, 81 81 .getsda = { 0x10, STAT, 1 }, 82 82 }, 83 + /* type 6: Barco LPT->DVI (K5800236) adapter */ 84 + { 85 + .setsda = { 0x02, DATA, 1 }, 86 + .setscl = { 0x01, DATA, 1 }, 87 + .getsda = { 0x20, STAT, 0 }, 88 + .getscl = { 0x40, STAT, 0 }, 89 + .init = { 0xfc, DATA, 0 }, 90 + }, 83 91 }; 84 92 85 93 static int type; ··· 99 91 " 2 = Velleman K8000 adapter\n" 100 92 " 3 = ELV adapter\n" 101 93 " 4 = ADM1032 evaluation board\n" 102 - " 5 = ADM1025, ADM1030 and ADM1031 evaluation boards\n"); 94 + " 5 = ADM1025, ADM1030 and ADM1031 evaluation boards\n" 95 + " 6 = Barco LPT->DVI (K5800236) adapter\n" 96 + );
+34 -9
drivers/i2c/chips/ds1337.c
··· 52 52 * Driver data (common to all clients) 53 53 */ 54 54 static struct i2c_driver ds1337_driver = { 55 - .owner = THIS_MODULE, 56 - .name = "ds1337", 57 - .flags = I2C_DF_NOTIFY, 55 + .driver = { 56 + .name = "ds1337", 57 + }, 58 58 .attach_adapter = ds1337_attach_adapter, 59 59 .detach_client = ds1337_detach_client, 60 60 .command = ds1337_command, ··· 337 337 338 338 static void ds1337_init_client(struct i2c_client *client) 339 339 { 340 - s32 val; 340 + u8 status, control; 341 341 342 - /* Ensure that device is set in 24-hour mode */ 343 - val = i2c_smbus_read_byte_data(client, DS1337_REG_HOUR); 344 - if ((val >= 0) && (val & (1 << 6))) 345 - i2c_smbus_write_byte_data(client, DS1337_REG_HOUR, 346 - val & 0x3f); 342 + /* On some boards, the RTC isn't configured by boot firmware. 343 + * Handle that case by starting/configuring the RTC now. 344 + */ 345 + status = i2c_smbus_read_byte_data(client, DS1337_REG_STATUS); 346 + control = i2c_smbus_read_byte_data(client, DS1337_REG_CONTROL); 347 + 348 + if ((status & 0x80) || (control & 0x80)) { 349 + /* RTC not running */ 350 + u8 buf[16]; 351 + struct i2c_msg msg[1]; 352 + 353 + dev_dbg(&client->dev, "%s: RTC not running!\n", __FUNCTION__); 354 + 355 + /* Initialize all, including STATUS and CONTROL to zero */ 356 + memset(buf, 0, sizeof(buf)); 357 + msg[0].addr = client->addr; 358 + msg[0].flags = 0; 359 + msg[0].len = sizeof(buf); 360 + msg[0].buf = &buf[0]; 361 + 362 + i2c_transfer(client->adapter, msg, 1); 363 + } else { 364 + /* Running: ensure that device is set in 24-hour mode */ 365 + s32 val; 366 + 367 + val = i2c_smbus_read_byte_data(client, DS1337_REG_HOUR); 368 + if ((val >= 0) && (val & (1 << 6))) 369 + i2c_smbus_write_byte_data(client, DS1337_REG_HOUR, 370 + val & 0x3f); 371 + } 347 372 } 348 373 349 374 static int ds1337_detach_client(struct i2c_client *client)
+3 -3
drivers/i2c/chips/ds1374.c
··· 232 232 } 233 233 234 234 static struct i2c_driver ds1374_driver = { 235 - .owner = THIS_MODULE, 236 - .name = DS1374_DRV_NAME, 235 + .driver = { 236 + .name = DS1374_DRV_NAME, 237 + }, 237 238 .id = I2C_DRIVERID_DS1374, 238 - .flags = I2C_DF_NOTIFY, 239 239 .attach_adapter = ds1374_attach, 240 240 .detach_client = ds1374_detach, 241 241 };
+3 -3
drivers/i2c/chips/eeprom.c
··· 68 68 69 69 /* This is the driver that will be inserted */ 70 70 static struct i2c_driver eeprom_driver = { 71 - .owner = THIS_MODULE, 72 - .name = "eeprom", 71 + .driver = { 72 + .name = "eeprom", 73 + }, 73 74 .id = I2C_DRIVERID_EEPROM, 74 - .flags = I2C_DF_NOTIFY, 75 75 .attach_adapter = eeprom_attach_adapter, 76 76 .detach_client = eeprom_detach_client, 77 77 };
+3 -3
drivers/i2c/chips/isp1301_omap.c
··· 1632 1632 } 1633 1633 1634 1634 static struct i2c_driver isp1301_driver = { 1635 - .owner = THIS_MODULE, 1636 - .name = "isp1301_omap", 1635 + .driver = { 1636 + .name = "isp1301_omap", 1637 + }, 1637 1638 .id = 1301, /* FIXME "official", i2c-ids.h */ 1638 1639 .class = I2C_CLASS_HWMON, 1639 - .flags = I2C_DF_NOTIFY, 1640 1640 .attach_adapter = isp1301_scan_bus, 1641 1641 .detach_client = isp1301_detach_client, 1642 1642 };
+3 -3
drivers/i2c/chips/m41t00.c
··· 211 211 } 212 212 213 213 static struct i2c_driver m41t00_driver = { 214 - .owner = THIS_MODULE, 215 - .name = M41T00_DRV_NAME, 214 + .driver = { 215 + .name = M41T00_DRV_NAME, 216 + }, 216 217 .id = I2C_DRIVERID_STM41T00, 217 - .flags = I2C_DF_NOTIFY, 218 218 .attach_adapter = m41t00_attach, 219 219 .detach_client = m41t00_detach, 220 220 };
+3 -3
drivers/i2c/chips/max6875.c
··· 67 67 68 68 /* This is the driver that will be inserted */ 69 69 static struct i2c_driver max6875_driver = { 70 - .owner = THIS_MODULE, 71 - .name = "max6875", 72 - .flags = I2C_DF_NOTIFY, 70 + .driver = { 71 + .name = "max6875", 72 + }, 73 73 .attach_adapter = max6875_attach_adapter, 74 74 .detach_client = max6875_detach_client, 75 75 };
+3 -3
drivers/i2c/chips/pca9539.c
··· 38 38 39 39 /* This is the driver that will be inserted */ 40 40 static struct i2c_driver pca9539_driver = { 41 - .owner = THIS_MODULE, 42 - .name = "pca9539", 43 - .flags = I2C_DF_NOTIFY, 41 + .driver = { 42 + .name = "pca9539", 43 + }, 44 44 .attach_adapter = pca9539_attach_adapter, 45 45 .detach_client = pca9539_detach_client, 46 46 };
+3 -3
drivers/i2c/chips/pcf8574.c
··· 65 65 66 66 /* This is the driver that will be inserted */ 67 67 static struct i2c_driver pcf8574_driver = { 68 - .owner = THIS_MODULE, 69 - .name = "pcf8574", 68 + .driver = { 69 + .name = "pcf8574", 70 + }, 70 71 .id = I2C_DRIVERID_PCF8574, 71 - .flags = I2C_DF_NOTIFY, 72 72 .attach_adapter = pcf8574_attach_adapter, 73 73 .detach_client = pcf8574_detach_client, 74 74 };
+3 -3
drivers/i2c/chips/pcf8591.c
··· 88 88 89 89 /* This is the driver that will be inserted */ 90 90 static struct i2c_driver pcf8591_driver = { 91 - .owner = THIS_MODULE, 92 - .name = "pcf8591", 91 + .driver = { 92 + .name = "pcf8591", 93 + }, 93 94 .id = I2C_DRIVERID_PCF8591, 94 - .flags = I2C_DF_NOTIFY, 95 95 .attach_adapter = pcf8591_attach_adapter, 96 96 .detach_client = pcf8591_detach_client, 97 97 };
+20 -23
drivers/i2c/chips/rtc8564.c
··· 14 14 */ 15 15 #include <linux/module.h> 16 16 #include <linux/kernel.h> 17 + #include <linux/bcd.h> 17 18 #include <linux/i2c.h> 18 19 #include <linux/slab.h> 19 20 #include <linux/string.h> ··· 52 51 53 52 #define CTRL1(c) _rtc8564_ctrl1(c) 54 53 #define CTRL2(c) _rtc8564_ctrl2(c) 55 - 56 - #define BCD_TO_BIN(val) (((val)&15) + ((val)>>4)*10) 57 - #define BIN_TO_BCD(val) ((((val)/10)<<4) + (val)%10) 58 54 59 55 static int debug;; 60 56 module_param(debug, int, S_IRUGO | S_IWUSR); ··· 155 157 156 158 strlcpy(new_client->name, "RTC8564", I2C_NAME_SIZE); 157 159 i2c_set_clientdata(new_client, d); 158 - new_client->flags = I2C_CLIENT_ALLOW_USE; 159 160 new_client->addr = addr; 160 161 new_client->adapter = adap; 161 162 new_client->driver = &rtc8564_driver; ··· 221 224 return ret; 222 225 223 226 /* century stored in minute alarm reg */ 224 - dt->year = BCD_TO_BIN(buf[RTC8564_REG_YEAR]); 225 - dt->year += 100 * BCD_TO_BIN(buf[RTC8564_REG_AL_MIN] & 0x3f); 226 - dt->mday = BCD_TO_BIN(buf[RTC8564_REG_DAY] & 0x3f); 227 - dt->wday = BCD_TO_BIN(buf[RTC8564_REG_WDAY] & 7); 228 - dt->mon = BCD_TO_BIN(buf[RTC8564_REG_MON_CENT] & 0x1f); 227 + dt->year = BCD2BIN(buf[RTC8564_REG_YEAR]); 228 + dt->year += 100 * BCD2BIN(buf[RTC8564_REG_AL_MIN] & 0x3f); 229 + dt->mday = BCD2BIN(buf[RTC8564_REG_DAY] & 0x3f); 230 + dt->wday = BCD2BIN(buf[RTC8564_REG_WDAY] & 7); 231 + dt->mon = BCD2BIN(buf[RTC8564_REG_MON_CENT] & 0x1f); 229 232 230 - dt->secs = BCD_TO_BIN(buf[RTC8564_REG_SEC] & 0x7f); 233 + dt->secs = BCD2BIN(buf[RTC8564_REG_SEC] & 0x7f); 231 234 dt->vl = (buf[RTC8564_REG_SEC] & 0x80) == 0x80; 232 - dt->mins = BCD_TO_BIN(buf[RTC8564_REG_MIN] & 0x7f); 233 - dt->hours = BCD_TO_BIN(buf[RTC8564_REG_HR] & 0x3f); 235 + dt->mins = BCD2BIN(buf[RTC8564_REG_MIN] & 0x7f); 236 + dt->hours = BCD2BIN(buf[RTC8564_REG_HR] & 0x3f); 234 237 235 238 _DBGRTCTM(2, *dt); 236 239 ··· 252 255 253 256 buf[RTC8564_REG_CTRL1] = CTRL1(client) | RTC8564_CTRL1_STOP; 254 257 buf[RTC8564_REG_CTRL2] = CTRL2(client); 255 - buf[RTC8564_REG_SEC] = BIN_TO_BCD(dt->secs); 256 - buf[RTC8564_REG_MIN] = BIN_TO_BCD(dt->mins); 257 - buf[RTC8564_REG_HR] = BIN_TO_BCD(dt->hours); 258 + buf[RTC8564_REG_SEC] = BIN2BCD(dt->secs); 259 + buf[RTC8564_REG_MIN] = BIN2BCD(dt->mins); 260 + buf[RTC8564_REG_HR] = BIN2BCD(dt->hours); 258 261 259 262 if (datetoo) { 260 263 len += 5; 261 - buf[RTC8564_REG_DAY] = BIN_TO_BCD(dt->mday); 262 - buf[RTC8564_REG_WDAY] = BIN_TO_BCD(dt->wday); 263 - buf[RTC8564_REG_MON_CENT] = BIN_TO_BCD(dt->mon) & 0x1f; 264 + buf[RTC8564_REG_DAY] = BIN2BCD(dt->mday); 265 + buf[RTC8564_REG_WDAY] = BIN2BCD(dt->wday); 266 + buf[RTC8564_REG_MON_CENT] = BIN2BCD(dt->mon) & 0x1f; 264 267 /* century stored in minute alarm reg */ 265 - buf[RTC8564_REG_YEAR] = BIN_TO_BCD(dt->year % 100); 266 - buf[RTC8564_REG_AL_MIN] = BIN_TO_BCD(dt->year / 100); 268 + buf[RTC8564_REG_YEAR] = BIN2BCD(dt->year % 100); 269 + buf[RTC8564_REG_AL_MIN] = BIN2BCD(dt->year / 100); 267 270 } 268 271 269 272 ret = rtc8564_write(client, 0, buf, len); ··· 358 361 } 359 362 360 363 static struct i2c_driver rtc8564_driver = { 361 - .owner = THIS_MODULE, 362 - .name = "RTC8564", 364 + .driver = { 365 + .name = "RTC8564", 366 + }, 363 367 .id = I2C_DRIVERID_RTC8564, 364 - .flags = I2C_DF_NOTIFY, 365 368 .attach_adapter = rtc8564_probe, 366 369 .detach_client = rtc8564_detach, 367 370 .command = rtc8564_command
+3 -3
drivers/i2c/chips/tps65010.c
··· 637 637 } 638 638 639 639 static struct i2c_driver tps65010_driver = { 640 - .owner = THIS_MODULE, 641 - .name = "tps65010", 642 - .flags = I2C_DF_NOTIFY, 640 + .driver = { 641 + .name = "tps65010", 642 + }, 643 643 .attach_adapter = tps65010_scan_bus, 644 644 .detach_client = __exit_p(tps65010_detach_client), 645 645 };
+3 -3
drivers/i2c/chips/x1205.c
··· 105 105 void *arg); 106 106 107 107 static struct i2c_driver x1205_driver = { 108 - .owner = THIS_MODULE, 109 - .name = "x1205", 110 - .flags = I2C_DF_NOTIFY, 108 + .driver = { 109 + .name = "x1205", 110 + }, 111 111 .attach_adapter = &x1205_attach, 112 112 .detach_client = &x1205_detach, 113 113 };
+24 -46
drivers/i2c/i2c-core.c
··· 197 197 /* inform drivers of new adapters */ 198 198 list_for_each(item,&drivers) { 199 199 driver = list_entry(item, struct i2c_driver, list); 200 - if (driver->flags & I2C_DF_NOTIFY) 200 + if (driver->attach_adapter) 201 201 /* We ignore the return code; if it fails, too bad */ 202 202 driver->attach_adapter(adap); 203 203 } ··· 235 235 if (driver->detach_adapter) 236 236 if ((res = driver->detach_adapter(adap))) { 237 237 dev_err(&adap->dev, "detach_adapter failed " 238 - "for driver [%s]\n", driver->name); 238 + "for driver [%s]\n", 239 + driver->driver.name); 239 240 goto out_unlock; 240 241 } 241 242 } ··· 246 245 list_for_each_safe(item, _n, &adap->clients) { 247 246 client = list_entry(item, struct i2c_client, list); 248 247 249 - /* detaching devices is unconditional of the set notify 250 - * flag, as _all_ clients that reside on the adapter 251 - * must be deleted, as this would cause invalid states. 252 - */ 253 248 if ((res=client->driver->detach_client(client))) { 254 249 dev_err(&adap->dev, "detach_client failed for client " 255 250 "[%s] at address 0x%02x\n", client->name, ··· 283 286 * chips. 284 287 */ 285 288 286 - int i2c_add_driver(struct i2c_driver *driver) 289 + int i2c_register_driver(struct module *owner, struct i2c_driver *driver) 287 290 { 288 291 struct list_head *item; 289 292 struct i2c_adapter *adapter; ··· 292 295 down(&core_lists); 293 296 294 297 /* add the driver to the list of i2c drivers in the driver core */ 295 - driver->driver.owner = driver->owner; 296 - driver->driver.name = driver->name; 298 + driver->driver.owner = owner; 297 299 driver->driver.bus = &i2c_bus_type; 298 300 driver->driver.probe = i2c_device_probe; 299 301 driver->driver.remove = i2c_device_remove; ··· 302 306 goto out_unlock; 303 307 304 308 list_add_tail(&driver->list,&drivers); 305 - pr_debug("i2c-core: driver [%s] registered\n", driver->name); 309 + pr_debug("i2c-core: driver [%s] registered\n", driver->driver.name); 306 310 307 311 /* now look for instances of driver on our adapters */ 308 - if (driver->flags & I2C_DF_NOTIFY) { 312 + if (driver->attach_adapter) { 309 313 list_for_each(item,&adapters) { 310 314 adapter = list_entry(item, struct i2c_adapter, list); 311 315 driver->attach_adapter(adapter); ··· 316 320 up(&core_lists); 317 321 return res; 318 322 } 323 + EXPORT_SYMBOL(i2c_register_driver); 319 324 320 325 int i2c_del_driver(struct i2c_driver *driver) 321 326 { ··· 331 334 /* Have a look at each adapter, if clients of this driver are still 332 335 * attached. If so, detach them to be able to kill the driver 333 336 * afterwards. 334 - * 335 - * Removing clients does not depend on the notify flag, else 336 - * invalid operation might (will!) result, when using stale client 337 - * pointers. 338 337 */ 339 338 list_for_each(item1,&adapters) { 340 339 adap = list_entry(item1, struct i2c_adapter, list); 341 340 if (driver->detach_adapter) { 342 341 if ((res = driver->detach_adapter(adap))) { 343 342 dev_err(&adap->dev, "detach_adapter failed " 344 - "for driver [%s]\n", driver->name); 343 + "for driver [%s]\n", 344 + driver->driver.name); 345 345 goto out_unlock; 346 346 } 347 347 } else { ··· 362 368 363 369 driver_unregister(&driver->driver); 364 370 list_del(&driver->list); 365 - pr_debug("i2c-core: driver [%s] unregistered\n", driver->name); 371 + pr_debug("i2c-core: driver [%s] unregistered\n", driver->driver.name); 366 372 367 373 out_unlock: 368 374 up(&core_lists); ··· 413 419 } 414 420 } 415 421 416 - if (client->flags & I2C_CLIENT_ALLOW_USE) 417 - client->usage_count = 0; 422 + client->usage_count = 0; 418 423 419 424 client->dev.parent = &client->adapter->dev; 420 425 client->dev.driver = &client->driver->driver; ··· 436 443 struct i2c_adapter *adapter = client->adapter; 437 444 int res = 0; 438 445 439 - if ((client->flags & I2C_CLIENT_ALLOW_USE) 440 - && (client->usage_count > 0)) { 446 + if (client->usage_count > 0) { 441 447 dev_warn(&client->dev, "Client [%s] still busy, " 442 448 "can't detach\n", client->name); 443 449 return -EBUSY; ··· 467 475 static int i2c_inc_use_client(struct i2c_client *client) 468 476 { 469 477 470 - if (!try_module_get(client->driver->owner)) 478 + if (!try_module_get(client->driver->driver.owner)) 471 479 return -ENODEV; 472 480 if (!try_module_get(client->adapter->owner)) { 473 - module_put(client->driver->owner); 481 + module_put(client->driver->driver.owner); 474 482 return -ENODEV; 475 483 } 476 484 ··· 479 487 480 488 static void i2c_dec_use_client(struct i2c_client *client) 481 489 { 482 - module_put(client->driver->owner); 490 + module_put(client->driver->driver.owner); 483 491 module_put(client->adapter->owner); 484 492 } 485 493 ··· 491 499 if (ret) 492 500 return ret; 493 501 494 - if (client->flags & I2C_CLIENT_ALLOW_USE) { 495 - if (client->flags & I2C_CLIENT_ALLOW_MULTIPLE_USE) 496 - client->usage_count++; 497 - else if (client->usage_count > 0) 498 - goto busy; 499 - else 500 - client->usage_count++; 501 - } 502 + client->usage_count++; 502 503 503 504 return 0; 504 - busy: 505 - i2c_dec_use_client(client); 506 - return -EBUSY; 507 505 } 508 506 509 507 int i2c_release_client(struct i2c_client *client) 510 508 { 511 - if(client->flags & I2C_CLIENT_ALLOW_USE) { 512 - if(client->usage_count>0) 513 - client->usage_count--; 514 - else { 515 - pr_debug("i2c-core: %s used one too many times\n", 516 - __FUNCTION__); 517 - return -EPERM; 518 - } 509 + if (!client->usage_count) { 510 + pr_debug("i2c-core: %s used one too many times\n", 511 + __FUNCTION__); 512 + return -EPERM; 519 513 } 520 514 515 + client->usage_count--; 521 516 i2c_dec_use_client(client); 522 517 523 518 return 0; ··· 518 539 down(&adap->clist_lock); 519 540 list_for_each(item,&adap->clients) { 520 541 client = list_entry(item, struct i2c_client, list); 521 - if (!try_module_get(client->driver->owner)) 542 + if (!try_module_get(client->driver->driver.owner)) 522 543 continue; 523 544 if (NULL != client->driver->command) { 524 545 up(&adap->clist_lock); 525 546 client->driver->command(client,cmd,arg); 526 547 down(&adap->clist_lock); 527 548 } 528 - module_put(client->driver->owner); 549 + module_put(client->driver->driver.owner); 529 550 } 530 551 up(&adap->clist_lock); 531 552 } ··· 1126 1147 1127 1148 EXPORT_SYMBOL(i2c_add_adapter); 1128 1149 EXPORT_SYMBOL(i2c_del_adapter); 1129 - EXPORT_SYMBOL(i2c_add_driver); 1130 1150 EXPORT_SYMBOL(i2c_del_driver); 1131 1151 EXPORT_SYMBOL(i2c_attach_client); 1132 1152 EXPORT_SYMBOL(i2c_detach_client);
+23 -40
drivers/i2c/i2c-dev.c
··· 42 42 struct i2c_dev { 43 43 int minor; 44 44 struct i2c_adapter *adap; 45 - struct class_device class_dev; 46 - struct completion released; /* FIXME, we need a class_device_unregister() */ 45 + struct class_device *class_dev; 47 46 }; 48 47 #define to_i2c_dev(d) container_of(d, struct i2c_dev, class_dev) 49 48 ··· 104 105 105 106 static ssize_t show_adapter_name(struct class_device *class_dev, char *buf) 106 107 { 107 - struct i2c_dev *i2c_dev = to_i2c_dev(class_dev); 108 + struct i2c_dev *i2c_dev = i2c_dev_get_by_minor(MINOR(class_dev->devt)); 109 + 110 + if (!i2c_dev) 111 + return -ENODEV; 108 112 return sprintf(buf, "%s\n", i2c_dev->adap->name); 109 113 } 110 114 static CLASS_DEVICE_ATTR(name, S_IRUGO, show_adapter_name, NULL); ··· 410 408 .release = i2cdev_release, 411 409 }; 412 410 413 - static void release_i2c_dev(struct class_device *dev) 414 - { 415 - struct i2c_dev *i2c_dev = to_i2c_dev(dev); 416 - complete(&i2c_dev->released); 417 - } 418 - 419 - static struct class i2c_dev_class = { 420 - .name = "i2c-dev", 421 - .release = &release_i2c_dev, 422 - }; 411 + static struct class *i2c_dev_class; 423 412 424 413 static int i2cdev_attach_adapter(struct i2c_adapter *adap) 425 414 { 426 415 struct i2c_dev *i2c_dev; 427 - int retval; 416 + struct device *dev; 428 417 429 418 i2c_dev = get_free_i2c_dev(adap); 430 419 if (IS_ERR(i2c_dev)) ··· 427 434 /* register this i2c device with the driver core */ 428 435 i2c_dev->adap = adap; 429 436 if (adap->dev.parent == &platform_bus) 430 - i2c_dev->class_dev.dev = &adap->dev; 437 + dev = &adap->dev; 431 438 else 432 - i2c_dev->class_dev.dev = adap->dev.parent; 433 - i2c_dev->class_dev.class = &i2c_dev_class; 434 - i2c_dev->class_dev.devt = MKDEV(I2C_MAJOR, i2c_dev->minor); 435 - snprintf(i2c_dev->class_dev.class_id, BUS_ID_SIZE, "i2c-%d", i2c_dev->minor); 436 - retval = class_device_register(&i2c_dev->class_dev); 437 - if (retval) 439 + dev = adap->dev.parent; 440 + i2c_dev->class_dev = class_device_create(i2c_dev_class, NULL, 441 + MKDEV(I2C_MAJOR, i2c_dev->minor), 442 + dev, "i2c-%d", i2c_dev->minor); 443 + if (!i2c_dev->class_dev) 438 444 goto error; 439 - class_device_create_file(&i2c_dev->class_dev, &class_device_attr_name); 445 + class_device_create_file(i2c_dev->class_dev, &class_device_attr_name); 440 446 return 0; 441 447 error: 442 448 return_i2c_dev(i2c_dev); 443 449 kfree(i2c_dev); 444 - return retval; 450 + return -ENODEV; 445 451 } 446 452 447 453 static int i2cdev_detach_adapter(struct i2c_adapter *adap) ··· 451 459 if (!i2c_dev) 452 460 return -ENODEV; 453 461 454 - init_completion(&i2c_dev->released); 455 462 return_i2c_dev(i2c_dev); 456 - class_device_unregister(&i2c_dev->class_dev); 457 - wait_for_completion(&i2c_dev->released); 463 + class_device_destroy(i2c_dev_class, MKDEV(I2C_MAJOR, i2c_dev->minor)); 458 464 kfree(i2c_dev); 459 465 460 466 pr_debug("i2c-dev: adapter [%s] unregistered\n", adap->name); ··· 464 474 return 0; 465 475 } 466 476 467 - static int i2cdev_command(struct i2c_client *client, unsigned int cmd, 468 - void *arg) 469 - { 470 - return -1; 471 - } 472 - 473 477 static struct i2c_driver i2cdev_driver = { 474 - .owner = THIS_MODULE, 475 - .name = "dev_driver", 478 + .driver = { 479 + .name = "dev_driver", 480 + }, 476 481 .id = I2C_DRIVERID_I2CDEV, 477 - .flags = I2C_DF_NOTIFY, 478 482 .attach_adapter = i2cdev_attach_adapter, 479 483 .detach_adapter = i2cdev_detach_adapter, 480 484 .detach_client = i2cdev_detach_client, 481 - .command = i2cdev_command, 482 485 }; 483 486 484 487 static struct i2c_client i2cdev_client_template = { ··· 490 507 if (res) 491 508 goto out; 492 509 493 - res = class_register(&i2c_dev_class); 494 - if (res) 510 + i2c_dev_class = class_create(THIS_MODULE, "i2c-dev"); 511 + if (IS_ERR(i2c_dev_class)) 495 512 goto out_unreg_chrdev; 496 513 497 514 res = i2c_add_driver(&i2cdev_driver); ··· 501 518 return 0; 502 519 503 520 out_unreg_class: 504 - class_unregister(&i2c_dev_class); 521 + class_destroy(i2c_dev_class); 505 522 out_unreg_chrdev: 506 523 unregister_chrdev(I2C_MAJOR, "i2c"); 507 524 out: ··· 512 529 static void __exit i2c_dev_exit(void) 513 530 { 514 531 i2c_del_driver(&i2cdev_driver); 515 - class_unregister(&i2c_dev_class); 532 + class_destroy(i2c_dev_class); 516 533 unregister_chrdev(I2C_MAJOR,"i2c"); 517 534 } 518 535
+3 -3
drivers/macintosh/therm_adt746x.c
··· 176 176 } 177 177 178 178 static struct i2c_driver thermostat_driver = { 179 - .owner = THIS_MODULE, 180 - .name = "therm_adt746x", 181 - .flags = I2C_DF_NOTIFY, 179 + .driver = { 180 + .name = "therm_adt746x", 181 + }, 182 182 .attach_adapter = attach_thermostat, 183 183 .detach_adapter = detach_thermostat, 184 184 };
+3 -3
drivers/macintosh/therm_pm72.c
··· 283 283 284 284 static struct i2c_driver therm_pm72_driver = 285 285 { 286 - .owner = THIS_MODULE, 287 - .name = "therm_pm72", 288 - .flags = I2C_DF_NOTIFY, 286 + .driver = { 287 + .name = "therm_pm72", 288 + }, 289 289 .attach_adapter = therm_pm72_attach, 290 290 .detach_adapter = therm_pm72_detach, 291 291 };
+3 -3
drivers/macintosh/therm_windtunnel.c
··· 354 354 } 355 355 356 356 static struct i2c_driver g4fan_driver = { 357 - .owner = THIS_MODULE, 358 - .name = "therm_windtunnel", 357 + .driver = { 358 + .name = "therm_windtunnel", 359 + }, 359 360 .id = I2C_DRIVERID_G4FAN, 360 - .flags = I2C_DF_NOTIFY, 361 361 .attach_adapter = do_attach, 362 362 .detach_client = do_detach, 363 363 };
+3 -3
drivers/macintosh/windfarm_lm75_sensor.c
··· 47 47 static int wf_lm75_detach(struct i2c_client *client); 48 48 49 49 static struct i2c_driver wf_lm75_driver = { 50 - .owner = THIS_MODULE, 51 - .name = "wf_lm75", 52 - .flags = I2C_DF_NOTIFY, 50 + .driver = { 51 + .name = "wf_lm75", 52 + }, 53 53 .attach_adapter = wf_lm75_attach, 54 54 .detach_client = wf_lm75_detach, 55 55 };
+1 -1
drivers/media/dvb/cinergyT2/cinergyT2.c
··· 60 60 #define dprintk(level, args...) \ 61 61 do { \ 62 62 if ((debug & level)) { \ 63 - printk("%s: %s(): ", __stringify(KBUILD_MODNAME), \ 63 + printk("%s: %s(): ", KBUILD_MODNAME, \ 64 64 __FUNCTION__); \ 65 65 printk(args); } \ 66 66 } while (0)
+1 -1
drivers/media/dvb/ttpci/budget.h
··· 19 19 #endif 20 20 21 21 #define dprintk(level,args...) \ 22 - do { if ((budget_debug & level)) { printk("%s: %s(): ",__stringify(KBUILD_MODNAME), __FUNCTION__); printk(args); } } while (0) 22 + do { if ((budget_debug & level)) { printk("%s: %s(): ", KBUILD_MODNAME, __FUNCTION__); printk(args); } } while (0) 23 23 24 24 struct budget_info { 25 25 char *name;
+3 -4
drivers/media/video/adv7170.c
··· 420 420 client->addr = address; 421 421 client->adapter = adapter; 422 422 client->driver = &i2c_driver_adv7170; 423 - client->flags = I2C_CLIENT_ALLOW_USE; 424 423 if ((client->addr == I2C_ADV7170 >> 1) || 425 424 (client->addr == (I2C_ADV7170 >> 1) + 1)) { 426 425 dname = adv7170_name; ··· 497 498 /* ----------------------------------------------------------------------- */ 498 499 499 500 static struct i2c_driver i2c_driver_adv7170 = { 500 - .owner = THIS_MODULE, 501 - .name = "adv7170", /* name */ 501 + .driver = { 502 + .name = "adv7170", /* name */ 503 + }, 502 504 503 505 .id = I2C_DRIVERID_ADV7170, 504 - .flags = I2C_DF_NOTIFY, 505 506 506 507 .attach_adapter = adv7170_attach_adapter, 507 508 .detach_client = adv7170_detach_client,
+3 -4
drivers/media/video/adv7175.c
··· 470 470 client->addr = address; 471 471 client->adapter = adapter; 472 472 client->driver = &i2c_driver_adv7175; 473 - client->flags = I2C_CLIENT_ALLOW_USE; 474 473 if ((client->addr == I2C_ADV7175 >> 1) || 475 474 (client->addr == (I2C_ADV7175 >> 1) + 1)) { 476 475 dname = adv7175_name; ··· 547 548 /* ----------------------------------------------------------------------- */ 548 549 549 550 static struct i2c_driver i2c_driver_adv7175 = { 550 - .owner = THIS_MODULE, 551 - .name = "adv7175", /* name */ 551 + .driver = { 552 + .name = "adv7175", /* name */ 553 + }, 552 554 553 555 .id = I2C_DRIVERID_ADV7175, 554 - .flags = I2C_DF_NOTIFY, 555 556 556 557 .attach_adapter = adv7175_attach_adapter, 557 558 .detach_client = adv7175_detach_client,
+3 -4
drivers/media/video/bt819.c
··· 535 535 client->addr = address; 536 536 client->adapter = adapter; 537 537 client->driver = &i2c_driver_bt819; 538 - client->flags = I2C_CLIENT_ALLOW_USE; 539 538 540 539 decoder = kmalloc(sizeof(struct bt819), GFP_KERNEL); 541 540 if (decoder == NULL) { ··· 622 623 /* ----------------------------------------------------------------------- */ 623 624 624 625 static struct i2c_driver i2c_driver_bt819 = { 625 - .owner = THIS_MODULE, 626 - .name = "bt819", 626 + .driver = { 627 + .name = "bt819", 628 + }, 627 629 628 630 .id = I2C_DRIVERID_BT819, 629 - .flags = I2C_DF_NOTIFY, 630 631 631 632 .attach_adapter = bt819_attach_adapter, 632 633 .detach_client = bt819_detach_client,
+3 -4
drivers/media/video/bt832.c
··· 230 230 /* ----------------------------------------------------------------------- */ 231 231 232 232 static struct i2c_driver driver = { 233 - .owner = THIS_MODULE, 234 - .name = "i2c bt832 driver", 233 + .driver = { 234 + .name = "i2c bt832 driver", 235 + }, 235 236 .id = -1, /* FIXME */ 236 - .flags = I2C_DF_NOTIFY, 237 237 .attach_adapter = bt832_probe, 238 238 .detach_client = bt832_detach, 239 239 .command = bt832_command, ··· 241 241 static struct i2c_client client_template = 242 242 { 243 243 .name = "bt832", 244 - .flags = I2C_CLIENT_ALLOW_USE, 245 244 .driver = &driver, 246 245 }; 247 246
+3 -4
drivers/media/video/bt856.c
··· 323 323 client->addr = address; 324 324 client->adapter = adapter; 325 325 client->driver = &i2c_driver_bt856; 326 - client->flags = I2C_CLIENT_ALLOW_USE; 327 326 strlcpy(I2C_NAME(client), "bt856", sizeof(I2C_NAME(client))); 328 327 329 328 encoder = kmalloc(sizeof(struct bt856), GFP_KERNEL); ··· 404 405 /* ----------------------------------------------------------------------- */ 405 406 406 407 static struct i2c_driver i2c_driver_bt856 = { 407 - .owner = THIS_MODULE, 408 - .name = "bt856", 408 + .driver = { 409 + .name = "bt856", 410 + }, 409 411 410 412 .id = I2C_DRIVERID_BT856, 411 - .flags = I2C_DF_NOTIFY, 412 413 413 414 .attach_adapter = bt856_attach_adapter, 414 415 .detach_client = bt856_detach_client,
+1 -1
drivers/media/video/bttv-i2c.c
··· 300 300 301 301 if (bttv_debug) 302 302 printk(KERN_DEBUG "bttv%d: %s i2c attach [addr=0x%x,client=%s]\n", 303 - btv->c.nr,client->driver->name,client->addr, 303 + btv->c.nr, client->driver->driver.name, client->addr, 304 304 client->name); 305 305 if (!client->driver->command) 306 306 return 0;
+7 -7
drivers/media/video/cs53l32a.c
··· 42 42 #define cs53l32a_dbg(fmt, arg...) \ 43 43 do { \ 44 44 if (debug) \ 45 - printk(KERN_INFO "%s debug %d-%04x: " fmt, client->driver->name, \ 45 + printk(KERN_INFO "%s debug %d-%04x: " fmt, \ 46 + client->driver->driver.name, \ 46 47 i2c_adapter_id(client->adapter), client->addr , ## arg); \ 47 48 } while (0) 48 49 49 50 #define cs53l32a_err(fmt, arg...) do { \ 50 - printk(KERN_ERR "%s %d-%04x: " fmt, client->driver->name, \ 51 + printk(KERN_ERR "%s %d-%04x: " fmt, client->driver->driver.name, \ 51 52 i2c_adapter_id(client->adapter), client->addr , ## arg); } while (0) 52 53 #define cs53l32a_info(fmt, arg...) do { \ 53 - printk(KERN_INFO "%s %d-%04x: " fmt, client->driver->name, \ 54 + printk(KERN_INFO "%s %d-%04x: " fmt, client->driver->driver.name, \ 54 55 i2c_adapter_id(client->adapter), client->addr , ## arg); } while (0) 55 56 56 57 static unsigned short normal_i2c[] = { 0x22 >> 1, I2C_CLIENT_END }; ··· 155 154 client->addr = address; 156 155 client->adapter = adapter; 157 156 client->driver = &i2c_driver; 158 - client->flags = I2C_CLIENT_ALLOW_USE; 159 157 snprintf(client->name, sizeof(client->name) - 1, "cs53l32a"); 160 158 161 159 cs53l32a_info("chip found @ 0x%x (%s)\n", address << 1, adapter->name); ··· 216 216 217 217 /* i2c implementation */ 218 218 static struct i2c_driver i2c_driver = { 219 - .name = "cs53l32a", 219 + .driver = { 220 + .name = "cs53l32a", 221 + }, 220 222 .id = I2C_DRIVERID_CS53L32A, 221 - .flags = I2C_DF_NOTIFY, 222 223 .attach_adapter = cs53l32a_probe, 223 224 .detach_client = cs53l32a_detach, 224 225 .command = cs53l32a_command, 225 - .owner = THIS_MODULE, 226 226 }; 227 227 228 228
+3 -4
drivers/media/video/cx25840/cx25840-core.c
··· 773 773 client->addr = address; 774 774 client->adapter = adapter; 775 775 client->driver = &i2c_driver_cx25840; 776 - client->flags = I2C_CLIENT_ALLOW_USE; 777 776 snprintf(client->name, sizeof(client->name) - 1, "cx25840"); 778 777 779 778 cx25840_dbg("detecting cx25840 client on address 0x%x\n", address << 1); ··· 843 844 /* ----------------------------------------------------------------------- */ 844 845 845 846 static struct i2c_driver i2c_driver_cx25840 = { 846 - .name = "cx25840", 847 + .driver = { 848 + .name = "cx25840", 849 + }, 847 850 848 851 .id = I2C_DRIVERID_CX25840, 849 - .flags = I2C_DF_NOTIFY, 850 852 851 853 .attach_adapter = cx25840_attach_adapter, 852 854 .detach_client = cx25840_detach_client, 853 855 .command = cx25840_command, 854 - .owner = THIS_MODULE, 855 856 }; 856 857 857 858
+4 -3
drivers/media/video/cx25840/cx25840.h
··· 27 27 extern int cx25840_debug; 28 28 29 29 #define cx25840_dbg(fmt, arg...) do { if (cx25840_debug) \ 30 - printk(KERN_INFO "%s debug %d-%04x: " fmt, client->driver->name, \ 30 + printk(KERN_INFO "%s debug %d-%04x: " fmt, \ 31 + client->driver->driver.name, \ 31 32 i2c_adapter_id(client->adapter), client->addr , ## arg); } while (0) 32 33 33 34 #define cx25840_err(fmt, arg...) do { \ 34 - printk(KERN_ERR "%s %d-%04x: " fmt, client->driver->name, \ 35 + printk(KERN_ERR "%s %d-%04x: " fmt, client->driver->driver.name, \ 35 36 i2c_adapter_id(client->adapter), client->addr , ## arg); } while (0) 36 37 37 38 #define cx25840_info(fmt, arg...) do { \ 38 - printk(KERN_INFO "%s %d-%04x: " fmt, client->driver->name, \ 39 + printk(KERN_INFO "%s %d-%04x: " fmt, client->driver->driver.name, \ 39 40 i2c_adapter_id(client->adapter), client->addr , ## arg); } while (0) 40 41 41 42 #define CX25840_CID_CARDTYPE (V4L2_CID_PRIVATE_BASE+0)
+1 -1
drivers/media/video/cx88/cx88-i2c.c
··· 94 94 struct cx88_core *core = i2c_get_adapdata(client->adapter); 95 95 96 96 dprintk(1, "%s i2c attach [addr=0x%x,client=%s]\n", 97 - client->driver->name, client->addr, client->name); 97 + client->driver->driver.name, client->addr, client->name); 98 98 if (!client->driver->command) 99 99 return 0; 100 100
-1
drivers/media/video/em28xx/em28xx-i2c.c
··· 497 497 498 498 static struct i2c_client em28xx_client_template = { 499 499 .name = "em28xx internal", 500 - .flags = I2C_CLIENT_ALLOW_USE, 501 500 }; 502 501 503 502 /* ----------------------------------------------------------- */
+3 -3
drivers/media/video/indycam.c
··· 451 451 } 452 452 453 453 static struct i2c_driver i2c_driver_indycam = { 454 - .owner = THIS_MODULE, 455 - .name = "indycam", 454 + .driver = { 455 + .name = "indycam", 456 + }, 456 457 .id = I2C_DRIVERID_INDYCAM, 457 - .flags = I2C_DF_NOTIFY, 458 458 .attach_adapter = indycam_probe, 459 459 .detach_client = indycam_detach, 460 460 .command = indycam_command,
+3 -2
drivers/media/video/ir-kbd-i2c.c
··· 278 278 static int ir_probe(struct i2c_adapter *adap); 279 279 280 280 static struct i2c_driver driver = { 281 - .name = "ir remote kbd driver", 281 + .driver = { 282 + .name = "ir remote kbd driver", 283 + }, 282 284 .id = I2C_DRIVERID_INFRARED, 283 - .flags = I2C_DF_NOTIFY, 284 285 .attach_adapter = ir_probe, 285 286 .detach_client = ir_detach, 286 287 };
+10 -10
drivers/media/video/msp3400.c
··· 59 59 #define msp3400_dbg(fmt, arg...) \ 60 60 do { \ 61 61 if (debug) \ 62 - printk(KERN_INFO "%s debug %d-%04x: " fmt, client->driver->name, \ 62 + printk(KERN_INFO "%s debug %d-%04x: " fmt, \ 63 + client->driver->driver.name, \ 63 64 i2c_adapter_id(client->adapter), client->addr , ## arg); \ 64 65 } while (0) 65 66 ··· 68 67 #define msp3400_dbg_mediumvol(fmt, arg...) \ 69 68 do { \ 70 69 if (debug >= 2) \ 71 - printk(KERN_INFO "%s debug %d-%04x: " fmt, client->driver->name, \ 70 + printk(KERN_INFO "%s debug %d-%04x: " fmt, \ 71 + client->driver->driver.name, \ 72 72 i2c_adapter_id(client->adapter), client->addr , ## arg); \ 73 73 } while (0) 74 74 ··· 77 75 #define msp3400_dbg_highvol(fmt, arg...) \ 78 76 do { \ 79 77 if (debug >= 16) \ 80 - printk(KERN_INFO "%s debug %d-%04x: " fmt, client->driver->name, \ 78 + printk(KERN_INFO "%s debug %d-%04x: " fmt, \ 79 + client->driver->driver.name, \ 81 80 i2c_adapter_id(client->adapter), client->addr , ## arg); \ 82 81 } while (0) 83 82 84 83 #define msp3400_err(fmt, arg...) do { \ 85 - printk(KERN_ERR "%s %d-%04x: " fmt, client->driver->name, \ 84 + printk(KERN_ERR "%s %d-%04x: " fmt, client->driver->driver.name, \ 86 85 i2c_adapter_id(client->adapter), client->addr , ## arg); } while (0) 87 86 #define msp3400_warn(fmt, arg...) do { \ 88 - printk(KERN_WARNING "%s %d-%04x: " fmt, client->driver->name, \ 87 + printk(KERN_WARNING "%s %d-%04x: " fmt, client->driver->driver.name, \ 89 88 i2c_adapter_id(client->adapter), client->addr , ## arg); } while (0) 90 89 #define msp3400_info(fmt, arg...) do { \ 91 - printk(KERN_INFO "%s %d-%04x: " fmt, client->driver->name, \ 90 + printk(KERN_INFO "%s %d-%04x: " fmt, client->driver->driver.name, \ 92 91 i2c_adapter_id(client->adapter), client->addr , ## arg); } while (0) 93 92 94 93 #define OPMODE_AUTO -1 ··· 1564 1561 static void msp_wake_thread(struct i2c_client *client); 1565 1562 1566 1563 static struct i2c_driver driver = { 1567 - .owner = THIS_MODULE, 1568 - .name = "msp3400", 1569 1564 .id = I2C_DRIVERID_MSP3400, 1570 - .flags = I2C_DF_NOTIFY, 1571 1565 .attach_adapter = msp_probe, 1572 1566 .detach_client = msp_detach, 1573 1567 .command = msp_command, 1574 1568 .driver = { 1569 + .name = "i2c msp3400 driver", 1575 1570 .suspend = msp_suspend, 1576 1571 .resume = msp_resume, 1577 1572 }, ··· 1578 1577 static struct i2c_client client_template = 1579 1578 { 1580 1579 .name = "(unset)", 1581 - .flags = I2C_CLIENT_ALLOW_USE, 1582 1580 .driver = &driver, 1583 1581 }; 1584 1582
+3 -3
drivers/media/video/ovcamchip/ovcamchip_core.c
··· 410 410 /* ----------------------------------------------------------------------- */ 411 411 412 412 static struct i2c_driver driver = { 413 - .owner = THIS_MODULE, 414 - .name = "ovcamchip", 413 + .driver = { 414 + .name = "ovcamchip", 415 + }, 415 416 .id = I2C_DRIVERID_OVCAMCHIP, 416 417 .class = I2C_CLASS_CAM_DIGITAL, 417 - .flags = I2C_DF_NOTIFY, 418 418 .attach_adapter = ovcamchip_attach, 419 419 .detach_client = ovcamchip_detach, 420 420 .command = ovcamchip_command,
+3 -10
drivers/media/video/saa5246a.c
··· 151 151 return 0; 152 152 } 153 153 154 - static int saa5246a_command(struct i2c_client *device, unsigned int cmd, 155 - void *arg) 156 - { 157 - return -EINVAL; 158 - } 159 - 160 154 /* 161 155 * I2C interfaces 162 156 */ 163 157 164 158 static struct i2c_driver i2c_driver_videotext = 165 159 { 166 - .owner = THIS_MODULE, 167 - .name = IF_NAME, /* name */ 160 + .driver = { 161 + .name = IF_NAME, /* name */ 162 + }, 168 163 .id = I2C_DRIVERID_SAA5249, /* in i2c.h */ 169 - .flags = I2C_DF_NOTIFY, 170 164 .attach_adapter = saa5246a_probe, 171 165 .detach_client = saa5246a_detach, 172 - .command = saa5246a_command 173 166 }; 174 167 175 168 static struct i2c_client client_template = {
+3 -10
drivers/media/video/saa5249.c
··· 226 226 return 0; 227 227 } 228 228 229 - static int saa5249_command(struct i2c_client *device, 230 - unsigned int cmd, void *arg) 231 - { 232 - return -EINVAL; 233 - } 234 - 235 229 /* new I2C driver support */ 236 230 237 231 static struct i2c_driver i2c_driver_videotext = 238 232 { 239 - .owner = THIS_MODULE, 240 - .name = IF_NAME, /* name */ 233 + .driver = { 234 + .name = IF_NAME, /* name */ 235 + }, 241 236 .id = I2C_DRIVERID_SAA5249, /* in i2c.h */ 242 - .flags = I2C_DF_NOTIFY, 243 237 .attach_adapter = saa5249_probe, 244 238 .detach_client = saa5249_detach, 245 - .command = saa5249_command 246 239 }; 247 240 248 241 static struct i2c_client client_template = {
+3 -4
drivers/media/video/saa6588.c
··· 495 495 /* ----------------------------------------------------------------------- */ 496 496 497 497 static struct i2c_driver driver = { 498 - .owner = THIS_MODULE, 499 - .name = "i2c saa6588 driver", 498 + .driver = { 499 + .name = "i2c saa6588 driver", 500 + }, 500 501 .id = -1, /* FIXME */ 501 - .flags = I2C_DF_NOTIFY, 502 502 .attach_adapter = saa6588_probe, 503 503 .detach_client = saa6588_detach, 504 504 .command = saa6588_command, ··· 506 506 507 507 static struct i2c_client client_template = { 508 508 .name = "saa6588", 509 - .flags = I2C_CLIENT_ALLOW_USE, 510 509 .driver = &driver, 511 510 }; 512 511
+3 -4
drivers/media/video/saa7110.c
··· 501 501 client->addr = address; 502 502 client->adapter = adapter; 503 503 client->driver = &i2c_driver_saa7110; 504 - client->flags = I2C_CLIENT_ALLOW_USE; 505 504 strlcpy(I2C_NAME(client), "saa7110", sizeof(I2C_NAME(client))); 506 505 507 506 decoder = kmalloc(sizeof(struct saa7110), GFP_KERNEL); ··· 586 587 /* ----------------------------------------------------------------------- */ 587 588 588 589 static struct i2c_driver i2c_driver_saa7110 = { 589 - .owner = THIS_MODULE, 590 - .name = "saa7110", 590 + .driver = { 591 + .name = "saa7110", 592 + }, 591 593 592 594 .id = I2C_DRIVERID_SAA7110, 593 - .flags = I2C_DF_NOTIFY, 594 595 595 596 .attach_adapter = saa7110_attach_adapter, 596 597 .detach_client = saa7110_detach_client,
+3 -4
drivers/media/video/saa7111.c
··· 518 518 client->addr = address; 519 519 client->adapter = adapter; 520 520 client->driver = &i2c_driver_saa7111; 521 - client->flags = I2C_CLIENT_ALLOW_USE; 522 521 strlcpy(I2C_NAME(client), "saa7111", sizeof(I2C_NAME(client))); 523 522 524 523 decoder = kmalloc(sizeof(struct saa7111), GFP_KERNEL); ··· 589 590 /* ----------------------------------------------------------------------- */ 590 591 591 592 static struct i2c_driver i2c_driver_saa7111 = { 592 - .owner = THIS_MODULE, 593 - .name = "saa7111", 593 + .driver = { 594 + .name = "saa7111", 595 + }, 594 596 595 597 .id = I2C_DRIVERID_SAA7111A, 596 - .flags = I2C_DF_NOTIFY, 597 598 598 599 .attach_adapter = saa7111_attach_adapter, 599 600 .detach_client = saa7111_detach_client,
+3 -4
drivers/media/video/saa7114.c
··· 859 859 client->addr = address; 860 860 client->adapter = adapter; 861 861 client->driver = &i2c_driver_saa7114; 862 - client->flags = I2C_CLIENT_ALLOW_USE; 863 862 strlcpy(I2C_NAME(client), "saa7114", sizeof(I2C_NAME(client))); 864 863 865 864 decoder = kmalloc(sizeof(struct saa7114), GFP_KERNEL); ··· 1203 1204 /* ----------------------------------------------------------------------- */ 1204 1205 1205 1206 static struct i2c_driver i2c_driver_saa7114 = { 1206 - .owner = THIS_MODULE, 1207 - .name = "saa7114", 1207 + .driver = { 1208 + .name = "saa7114", 1209 + }, 1208 1210 1209 1211 .id = I2C_DRIVERID_SAA7114, 1210 - .flags = I2C_DF_NOTIFY, 1211 1212 1212 1213 .attach_adapter = saa7114_attach_adapter, 1213 1214 .detach_client = saa7114_detach_client,
+7 -7
drivers/media/video/saa7115.c
··· 52 52 #define saa7115_dbg(fmt,arg...) \ 53 53 do { \ 54 54 if (debug) \ 55 - printk(KERN_INFO "%s debug %d-%04x: " fmt, client->driver->name, \ 55 + printk(KERN_INFO "%s debug %d-%04x: " fmt, \ 56 + client->driver->driver.name, \ 56 57 i2c_adapter_id(client->adapter), client->addr , ## arg); \ 57 58 } while (0) 58 59 59 60 #define saa7115_err(fmt, arg...) do { \ 60 - printk(KERN_ERR "%s %d-%04x: " fmt, client->driver->name, \ 61 + printk(KERN_ERR "%s %d-%04x: " fmt, client->driver->driver.name, \ 61 62 i2c_adapter_id(client->adapter), client->addr , ## arg); } while (0) 62 63 #define saa7115_info(fmt, arg...) do { \ 63 - printk(KERN_INFO "%s %d-%04x: " fmt, client->driver->name, \ 64 + printk(KERN_INFO "%s %d-%04x: " fmt, client->driver->driver.name, \ 64 65 i2c_adapter_id(client->adapter), client->addr , ## arg); } while (0) 65 66 66 67 static unsigned short normal_i2c[] = { 0x42 >> 1, 0x40 >> 1, I2C_CLIENT_END }; ··· 1271 1270 client->addr = address; 1272 1271 client->adapter = adapter; 1273 1272 client->driver = &i2c_driver_saa7115; 1274 - client->flags = I2C_CLIENT_ALLOW_USE; 1275 1273 snprintf(client->name, sizeof(client->name) - 1, "saa7115"); 1276 1274 1277 1275 saa7115_dbg("detecting saa7115 client on address 0x%x\n", address << 1); ··· 1354 1354 1355 1355 /* i2c implementation */ 1356 1356 static struct i2c_driver i2c_driver_saa7115 = { 1357 - .name = "saa7115", 1357 + .driver = { 1358 + .name = "saa7115", 1359 + }, 1358 1360 .id = I2C_DRIVERID_SAA711X, 1359 - .flags = I2C_DF_NOTIFY, 1360 1361 .attach_adapter = saa7115_probe, 1361 1362 .detach_client = saa7115_detach, 1362 1363 .command = saa7115_command, 1363 - .owner = THIS_MODULE, 1364 1364 }; 1365 1365 1366 1366
+3 -4
drivers/media/video/saa711x.c
··· 494 494 client->addr = address; 495 495 client->adapter = adapter; 496 496 client->driver = &i2c_driver_saa711x; 497 - client->flags = I2C_CLIENT_ALLOW_USE; 498 497 strlcpy(I2C_NAME(client), "saa711x", sizeof(I2C_NAME(client))); 499 498 decoder = kmalloc(sizeof(struct saa711x), GFP_KERNEL); 500 499 if (decoder == NULL) { ··· 564 565 /* ----------------------------------------------------------------------- */ 565 566 566 567 static struct i2c_driver i2c_driver_saa711x = { 567 - .owner = THIS_MODULE, 568 - .name = "saa711x", 568 + .driver = { 569 + .name = "saa711x", 570 + }, 569 571 570 572 .id = I2C_DRIVERID_SAA711X, 571 - .flags = I2C_DF_NOTIFY, 572 573 573 574 .attach_adapter = saa711x_attach_adapter, 574 575 .detach_client = saa711x_detach_client,
+9 -8
drivers/media/video/saa7127.c
··· 69 69 #define saa7127_dbg(fmt, arg...) \ 70 70 do { \ 71 71 if (debug >= 1) \ 72 - printk(KERN_INFO "%s debug %d-%04x: " fmt, client->driver->name, \ 72 + printk(KERN_INFO "%s debug %d-%04x: " fmt, \ 73 + client->driver->driver.name, \ 73 74 i2c_adapter_id(client->adapter), client->addr , ## arg); \ 74 75 } while (0) 75 76 ··· 78 77 #define saa7127_dbg_highvol(fmt, arg...) \ 79 78 do { \ 80 79 if (debug == 2) \ 81 - printk(KERN_INFO "%s debug %d-%04x: " fmt, client->driver->name, \ 80 + printk(KERN_INFO "%s debug %d-%04x: " fmt, \ 81 + client->driver->driver.name, \ 82 82 i2c_adapter_id(client->adapter), client->addr , ## arg); \ 83 83 } while (0) 84 84 85 85 #define saa7127_err(fmt, arg...) do { \ 86 - printk(KERN_ERR "%s %d-%04x: " fmt, client->driver->name, \ 86 + printk(KERN_ERR "%s %d-%04x: " fmt, client->driver->driver.name, \ 87 87 i2c_adapter_id(client->adapter), client->addr , ## arg); } while (0) 88 88 #define saa7127_info(fmt, arg...) do { \ 89 - printk(KERN_INFO "%s %d-%04x: " fmt, client->driver->name, \ 89 + printk(KERN_INFO "%s %d-%04x: " fmt, client->driver->driver.name, \ 90 90 i2c_adapter_id(client->adapter), client->addr , ## arg); } while (0) 91 91 92 92 static unsigned short normal_i2c[] = { 0x88 >> 1, I2C_CLIENT_END }; ··· 721 719 client->addr = address; 722 720 client->adapter = adapter; 723 721 client->driver = &i2c_driver_saa7127; 724 - client->flags = I2C_CLIENT_ALLOW_USE; 725 722 snprintf(client->name, sizeof(client->name) - 1, "saa7127"); 726 723 727 724 saa7127_dbg("detecting saa7127 client on address 0x%x\n", address << 1); ··· 820 819 /* ----------------------------------------------------------------------- */ 821 820 822 821 static struct i2c_driver i2c_driver_saa7127 = { 823 - .name = "saa7127", 822 + .driver = { 823 + .name = "saa7127", 824 + }, 824 825 .id = I2C_DRIVERID_SAA7127, 825 - .flags = I2C_DF_NOTIFY, 826 826 .attach_adapter = saa7127_probe, 827 827 .detach_client = saa7127_detach, 828 828 .command = saa7127_command, 829 - .owner = THIS_MODULE, 830 829 }; 831 830 832 831
+3 -4
drivers/media/video/saa7134/saa6752hs.c
··· 597 597 /* ----------------------------------------------------------------------- */ 598 598 599 599 static struct i2c_driver driver = { 600 - .owner = THIS_MODULE, 601 - .name = "i2c saa6752hs MPEG encoder", 600 + .driver = { 601 + .name = "i2c saa6752hs MPEG encoder", 602 + }, 602 603 .id = I2C_DRIVERID_SAA6752HS, 603 - .flags = I2C_DF_NOTIFY, 604 604 .attach_adapter = saa6752hs_probe, 605 605 .detach_client = saa6752hs_detach, 606 606 .command = saa6752hs_command, ··· 609 609 static struct i2c_client client_template = 610 610 { 611 611 .name = "saa6752hs", 612 - .flags = I2C_CLIENT_ALLOW_USE, 613 612 .driver = &driver, 614 613 }; 615 614
+2 -2
drivers/media/video/saa7134/saa7134-i2c.c
··· 333 333 struct tuner_setup tun_setup; 334 334 335 335 d1printk( "%s i2c attach [addr=0x%x,client=%s]\n", 336 - client->driver->name, client->addr, client->name); 336 + client->driver->driver.name, client->addr, client->name); 337 337 338 338 /* Am I an i2c remote control? */ 339 339 ··· 343 343 { 344 344 struct IR_i2c *ir = i2c_get_clientdata(client); 345 345 d1printk("%s i2c IR detected (%s).\n", 346 - client->driver->name,ir->phys); 346 + client->driver->driver.name, ir->phys); 347 347 saa7134_set_i2c_ir(dev,ir); 348 348 break; 349 349 }
+3 -4
drivers/media/video/saa7185.c
··· 415 415 client->addr = address; 416 416 client->adapter = adapter; 417 417 client->driver = &i2c_driver_saa7185; 418 - client->flags = I2C_CLIENT_ALLOW_USE; 419 418 strlcpy(I2C_NAME(client), "saa7185", sizeof(I2C_NAME(client))); 420 419 421 420 encoder = kmalloc(sizeof(struct saa7185), GFP_KERNEL); ··· 486 487 /* ----------------------------------------------------------------------- */ 487 488 488 489 static struct i2c_driver i2c_driver_saa7185 = { 489 - .owner = THIS_MODULE, 490 - .name = "saa7185", /* name */ 490 + .driver = { 491 + .name = "saa7185", /* name */ 492 + }, 491 493 492 494 .id = I2C_DRIVERID_SAA7185B, 493 - .flags = I2C_DF_NOTIFY, 494 495 495 496 .attach_adapter = saa7185_attach_adapter, 496 497 .detach_client = saa7185_detach_client,
+3 -3
drivers/media/video/saa7191.c
··· 788 788 } 789 789 790 790 static struct i2c_driver i2c_driver_saa7191 = { 791 - .owner = THIS_MODULE, 792 - .name = "saa7191", 791 + .driver = { 792 + .name = "saa7191", 793 + }, 793 794 .id = I2C_DRIVERID_SAA7191, 794 - .flags = I2C_DF_NOTIFY, 795 795 .attach_adapter = saa7191_probe, 796 796 .detach_client = saa7191_detach, 797 797 .command = saa7191_command
+3 -3
drivers/media/video/tda7432.c
··· 501 501 } 502 502 503 503 static struct i2c_driver driver = { 504 - .owner = THIS_MODULE, 505 - .name = "i2c tda7432 driver", 504 + .driver = { 505 + .name = "i2c tda7432 driver", 506 + }, 506 507 .id = I2C_DRIVERID_TDA7432, 507 - .flags = I2C_DF_NOTIFY, 508 508 .attach_adapter = tda7432_probe, 509 509 .detach_client = tda7432_detach, 510 510 .command = tda7432_command,
+4 -4
drivers/media/video/tda9840.c
··· 34 34 module_param(debug, int, 0644); 35 35 MODULE_PARM_DESC(debug, "Turn on/off device debugging (default:off)."); 36 36 #define dprintk(args...) \ 37 - do { if (debug) { printk("%s: %s()[%d]: ",__stringify(KBUILD_MODNAME), __FUNCTION__, __LINE__); printk(args); } } while (0) 37 + do { if (debug) { printk("%s: %s()[%d]: ", KBUILD_MODNAME, __FUNCTION__, __LINE__); printk(args); } } while (0) 38 38 39 39 #define SWITCH 0x00 40 40 #define LEVEL_ADJUST 0x02 ··· 221 221 } 222 222 223 223 static struct i2c_driver driver = { 224 - .owner = THIS_MODULE, 225 - .name = "tda9840", 224 + .driver = { 225 + .name = "tda9840", 226 + }, 226 227 .id = I2C_DRIVERID_TDA9840, 227 - .flags = I2C_DF_NOTIFY, 228 228 .attach_adapter = attach, 229 229 .detach_client = detach, 230 230 .command = command,
+3 -3
drivers/media/video/tda9875.c
··· 372 372 373 373 374 374 static struct i2c_driver driver = { 375 - .owner = THIS_MODULE, 376 - .name = "i2c tda9875 driver", 375 + .driver = { 376 + .name = "i2c tda9875 driver", 377 + }, 377 378 .id = I2C_DRIVERID_TDA9875, 378 - .flags = I2C_DF_NOTIFY, 379 379 .attach_adapter = tda9875_probe, 380 380 .detach_client = tda9875_detach, 381 381 .command = tda9875_command,
+1 -4
drivers/media/video/tda9887.c
··· 819 819 /* ----------------------------------------------------------------------- */ 820 820 821 821 static struct i2c_driver driver = { 822 - .owner = THIS_MODULE, 823 - .name = "i2c tda9887 driver", 824 822 .id = -1, /* FIXME */ 825 - .flags = I2C_DF_NOTIFY, 826 823 .attach_adapter = tda9887_probe, 827 824 .detach_client = tda9887_detach, 828 825 .command = tda9887_command, 829 826 .driver = { 827 + .name = "i2c tda9887 driver", 830 828 .suspend = tda9887_suspend, 831 829 .resume = tda9887_resume, 832 830 }, ··· 832 834 static struct i2c_client client_template = 833 835 { 834 836 .name = "tda9887", 835 - .flags = I2C_CLIENT_ALLOW_USE, 836 837 .driver = &driver, 837 838 }; 838 839
+4 -4
drivers/media/video/tea6415c.c
··· 36 36 module_param(debug, int, 0644); 37 37 MODULE_PARM_DESC(debug, "Turn on/off device debugging (default:off)."); 38 38 #define dprintk(args...) \ 39 - do { if (debug) { printk("%s: %s()[%d]: ",__stringify(KBUILD_MODNAME), __FUNCTION__, __LINE__); printk(args); } } while (0) 39 + do { if (debug) { printk("%s: %s()[%d]: ", KBUILD_MODNAME, __FUNCTION__, __LINE__); printk(args); } } while (0) 40 40 41 41 #define TEA6415C_NUM_INPUTS 8 42 42 #define TEA6415C_NUM_OUTPUTS 6 ··· 190 190 } 191 191 192 192 static struct i2c_driver driver = { 193 - .owner = THIS_MODULE, 194 - .name = "tea6415c", 193 + .driver = { 194 + .name = "tea6415c", 195 + }, 195 196 .id = I2C_DRIVERID_TEA6415C, 196 - .flags = I2C_DF_NOTIFY, 197 197 .attach_adapter = attach, 198 198 .detach_client = detach, 199 199 .command = command,
+4 -4
drivers/media/video/tea6420.c
··· 36 36 module_param(debug, int, 0644); 37 37 MODULE_PARM_DESC(debug, "Turn on/off device debugging (default:off)."); 38 38 #define dprintk(args...) \ 39 - do { if (debug) { printk("%s: %s()[%d]: ",__stringify(KBUILD_MODNAME), __FUNCTION__, __LINE__); printk(args); } } while (0) 39 + do { if (debug) { printk("%s: %s()[%d]: ", KBUILD_MODNAME, __FUNCTION__, __LINE__); printk(args); } } while (0) 40 40 41 41 /* addresses to scan, found only at 0x4c and/or 0x4d (7-Bit) */ 42 42 static unsigned short normal_i2c[] = { I2C_TEA6420_1, I2C_TEA6420_2, I2C_CLIENT_END }; ··· 167 167 } 168 168 169 169 static struct i2c_driver driver = { 170 - .owner = THIS_MODULE, 171 - .name = "tea6420", 170 + .driver = { 171 + .name = "tea6420", 172 + }, 172 173 .id = I2C_DRIVERID_TEA6420, 173 - .flags = I2C_DF_NOTIFY, 174 174 .attach_adapter = attach, 175 175 .detach_client = detach, 176 176 .command = command,
+3 -3
drivers/media/video/tuner-3036.c
··· 175 175 static struct i2c_driver 176 176 i2c_driver_tuner = 177 177 { 178 - .owner = THIS_MODULE, 179 - .name = "sab3036", 178 + .driver = { 179 + .name = "sab3036", 180 + }, 180 181 .id = I2C_DRIVERID_SAB3036, 181 - .flags = I2C_DF_NOTIFY, 182 182 .attach_adapter = tuner_probe, 183 183 .detach_client = tuner_detach, 184 184 .command = tuner_command
+2 -5
drivers/media/video/tuner-core.c
··· 206 206 207 207 set_freq(c, t->freq); 208 208 tuner_dbg("%s %s I2C addr 0x%02x with type %d used for 0x%02x\n", 209 - c->adapter->name, c->driver->name, c->addr << 1, type, 209 + c->adapter->name, c->driver->driver.name, c->addr << 1, type, 210 210 t->mode_mask); 211 211 } 212 212 ··· 742 742 /* ----------------------------------------------------------------------- */ 743 743 744 744 static struct i2c_driver driver = { 745 - .owner = THIS_MODULE, 746 - .name = "tuner", 747 745 .id = I2C_DRIVERID_TUNER, 748 - .flags = I2C_DF_NOTIFY, 749 746 .attach_adapter = tuner_probe, 750 747 .detach_client = tuner_detach, 751 748 .command = tuner_command, 752 749 .driver = { 750 + .name = "tuner", 753 751 .suspend = tuner_suspend, 754 752 .resume = tuner_resume, 755 753 }, 756 754 }; 757 755 static struct i2c_client client_template = { 758 756 .name = "(tuner unset)", 759 - .flags = I2C_CLIENT_ALLOW_USE, 760 757 .driver = &driver, 761 758 }; 762 759
+3 -4
drivers/media/video/tvaudio.c
··· 1702 1702 1703 1703 1704 1704 static struct i2c_driver driver = { 1705 - .owner = THIS_MODULE, 1706 - .name = "generic i2c audio driver", 1705 + .driver = { 1706 + .name = "generic i2c audio driver", 1707 + }, 1707 1708 .id = I2C_DRIVERID_TVAUDIO, 1708 - .flags = I2C_DF_NOTIFY, 1709 1709 .attach_adapter = chip_probe, 1710 1710 .detach_client = chip_detach, 1711 1711 .command = chip_command, ··· 1714 1714 static struct i2c_client client_template = 1715 1715 { 1716 1716 .name = "(unset)", 1717 - .flags = I2C_CLIENT_ALLOW_USE, 1718 1717 .driver = &driver, 1719 1718 }; 1720 1719
+3 -4
drivers/media/video/tveeprom.c
··· 751 751 client->addr = address; 752 752 client->adapter = adapter; 753 753 client->driver = &i2c_driver_tveeprom; 754 - client->flags = I2C_CLIENT_ALLOW_USE; 755 754 snprintf(client->name, sizeof(client->name), "tveeprom"); 756 755 i2c_attach_client(client); 757 756 ··· 778 779 } 779 780 780 781 static struct i2c_driver i2c_driver_tveeprom = { 781 - .owner = THIS_MODULE, 782 - .name = "tveeprom", 782 + .driver = { 783 + .name = "tveeprom", 784 + }, 783 785 .id = I2C_DRIVERID_TVEEPROM, 784 - .flags = I2C_DF_NOTIFY, 785 786 .attach_adapter = tveeprom_attach_adapter, 786 787 .detach_client = tveeprom_detach_client, 787 788 .command = tveeprom_command,
+6 -8
drivers/media/video/tvmixer.c
··· 228 228 229 229 static struct i2c_driver driver = { 230 230 #ifdef I2C_PEC 231 - .owner = THIS_MODULE, 232 - #endif 233 - .name = "tv card mixer driver", 234 - .id = I2C_DRIVERID_TVMIXER, 235 - #ifdef I2C_DF_DUMMY 236 - .flags = I2C_DF_DUMMY, 231 + .driver = { 232 + .name = "tv card mixer driver", 233 + }, 237 234 #else 238 - .flags = I2C_DF_NOTIFY, 239 - .detach_adapter = tvmixer_adapters, 235 + .name = "tv card mixer driver", 240 236 #endif 237 + .id = I2C_DRIVERID_TVMIXER, 238 + .detach_adapter = tvmixer_adapters, 241 239 .attach_adapter = tvmixer_adapters, 242 240 .detach_client = tvmixer_clients, 243 241 };
+3 -4
drivers/media/video/tvp5150.c
··· 714 714 715 715 static struct i2c_client client_template = { 716 716 .name = "(unset)", 717 - .flags = I2C_CLIENT_ALLOW_USE, 718 717 .driver = &driver, 719 718 }; 720 719 ··· 800 801 /* ----------------------------------------------------------------------- */ 801 802 802 803 static struct i2c_driver driver = { 803 - .owner = THIS_MODULE, 804 - .name = "tvp5150", 804 + .driver = { 805 + .name = "tvp5150", 806 + }, 805 807 806 808 /* FIXME */ 807 809 .id = I2C_DRIVERID_SAA7110, 808 - .flags = I2C_DF_NOTIFY, 809 810 810 811 .attach_adapter = tvp5150_attach_adapter, 811 812 .detach_client = tvp5150_detach_client,
+3 -4
drivers/media/video/vpx3220.c
··· 631 631 client->addr = address; 632 632 client->adapter = adapter; 633 633 client->driver = &vpx3220_i2c_driver; 634 - client->flags = I2C_CLIENT_ALLOW_USE; 635 634 636 635 /* Check for manufacture ID and part number */ 637 636 if (kind < 0) { ··· 721 722 */ 722 723 723 724 static struct i2c_driver vpx3220_i2c_driver = { 724 - .owner = THIS_MODULE, 725 - .name = "vpx3220", 725 + .driver = { 726 + .name = "vpx3220", 727 + }, 726 728 727 729 .id = I2C_DRIVERID_VPX3220, 728 - .flags = I2C_DF_NOTIFY, 729 730 730 731 .attach_adapter = vpx3220_attach_adapter, 731 732 .detach_client = vpx3220_detach_client,
+5 -6
drivers/media/video/wm8775.c
··· 40 40 MODULE_LICENSE("GPL"); 41 41 42 42 #define wm8775_err(fmt, arg...) do { \ 43 - printk(KERN_ERR "%s %d-%04x: " fmt, client->driver->name, \ 43 + printk(KERN_ERR "%s %d-%04x: " fmt, client->driver->driver.name, \ 44 44 i2c_adapter_id(client->adapter), client->addr , ## arg); } while (0) 45 45 #define wm8775_info(fmt, arg...) do { \ 46 - printk(KERN_INFO "%s %d-%04x: " fmt, client->driver->name, \ 46 + printk(KERN_INFO "%s %d-%04x: " fmt, client->driver->driver.name, \ 47 47 i2c_adapter_id(client->adapter), client->addr , ## arg); } while (0) 48 48 49 49 ··· 168 168 client->addr = address; 169 169 client->adapter = adapter; 170 170 client->driver = &i2c_driver; 171 - client->flags = I2C_CLIENT_ALLOW_USE; 172 171 snprintf(client->name, sizeof(client->name) - 1, "wm8775"); 173 172 174 173 wm8775_info("chip found @ 0x%x (%s)\n", address << 1, adapter->name); ··· 232 233 233 234 /* i2c implementation */ 234 235 static struct i2c_driver i2c_driver = { 235 - .name = "wm8775", 236 + .driver = { 237 + .name = "wm8775", 238 + }, 236 239 237 240 .id = I2C_DRIVERID_WM8775, 238 - .flags = I2C_DF_NOTIFY, 239 241 240 242 .attach_adapter = wm8775_probe, 241 243 .detach_client = wm8775_detach, 242 244 .command = wm8775_command, 243 - .owner = THIS_MODULE, 244 245 }; 245 246 246 247
+7 -7
drivers/media/video/zoran_driver.c
··· 1311 1311 res = -ENODEV; 1312 1312 goto open_unlock_and_return; 1313 1313 } 1314 - if (!try_module_get(zr->decoder->driver->owner)) { 1314 + if (!try_module_get(zr->decoder->driver->driver.owner)) { 1315 1315 dprintk(1, 1316 1316 KERN_ERR 1317 1317 "%s: failed to grab ownership of i2c decoder\n", ··· 1321 1321 goto open_unlock_and_return; 1322 1322 } 1323 1323 if (zr->encoder && 1324 - !try_module_get(zr->encoder->driver->owner)) { 1324 + !try_module_get(zr->encoder->driver->driver.owner)) { 1325 1325 dprintk(1, 1326 1326 KERN_ERR 1327 1327 "%s: failed to grab ownership of i2c encoder\n", 1328 1328 ZR_DEVNAME(zr)); 1329 1329 res = -EIO; 1330 - module_put(zr->decoder->driver->owner); 1330 + module_put(zr->decoder->driver->driver.owner); 1331 1331 module_put(THIS_MODULE); 1332 1332 goto open_unlock_and_return; 1333 1333 } ··· 1393 1393 open_unlock_and_return: 1394 1394 /* if we grabbed locks, release them accordingly */ 1395 1395 if (have_module_locks) { 1396 - module_put(zr->decoder->driver->owner); 1396 + module_put(zr->decoder->driver->driver.owner); 1397 1397 if (zr->encoder) { 1398 - module_put(zr->encoder->driver->owner); 1398 + module_put(zr->encoder->driver->driver.owner); 1399 1399 } 1400 1400 module_put(THIS_MODULE); 1401 1401 } ··· 1461 1461 kfree(fh); 1462 1462 1463 1463 /* release locks on the i2c modules */ 1464 - module_put(zr->decoder->driver->owner); 1464 + module_put(zr->decoder->driver->driver.owner); 1465 1465 if (zr->encoder) { 1466 - module_put(zr->encoder->driver->owner); 1466 + module_put(zr->encoder->driver->driver.owner); 1467 1467 } 1468 1468 module_put(THIS_MODULE); 1469 1469
+2 -2
drivers/usb/media/w9968cf.c
··· 1533 1533 } 1534 1534 } else { 1535 1535 DBG(4, "Rejected client [%s] with driver [%s]", 1536 - client->name, client->driver->name) 1536 + client->name, client->driver->driver.name) 1537 1537 return -EINVAL; 1538 1538 } 1539 1539 1540 1540 DBG(5, "I2C attach client [%s] with driver [%s]", 1541 - client->name, client->driver->name) 1541 + client->name, client->driver->driver.name) 1542 1542 1543 1543 return 0; 1544 1544 }
+3 -8
drivers/video/matrox/matroxfb_maven.c
··· 1288 1288 return 0; 1289 1289 } 1290 1290 1291 - static int maven_command(struct i2c_client* client, unsigned int cmd, void* arg) { 1292 - return -ENOIOCTLCMD; /* or -EINVAL, depends on who will call this */ 1293 - } 1294 - 1295 1291 static struct i2c_driver maven_driver={ 1296 - .owner = THIS_MODULE, 1297 - .name = "maven", 1292 + .driver = { 1293 + .name = "maven", 1294 + }, 1298 1295 .id = I2C_DRIVERID_MGATVO, 1299 - .flags = I2C_DF_NOTIFY, 1300 1296 .attach_adapter = maven_attach_adapter, 1301 1297 .detach_client = maven_detach_client, 1302 - .command = maven_command, 1303 1298 }; 1304 1299 1305 1300 /* ************************** */
+22 -19
fs/lockd/clntproc.c
··· 26 26 static int nlmclnt_test(struct nlm_rqst *, struct file_lock *); 27 27 static int nlmclnt_lock(struct nlm_rqst *, struct file_lock *); 28 28 static int nlmclnt_unlock(struct nlm_rqst *, struct file_lock *); 29 - static void nlmclnt_unlock_callback(struct rpc_task *); 30 - static void nlmclnt_cancel_callback(struct rpc_task *); 31 29 static int nlm_stat_to_errno(u32 stat); 32 30 static void nlmclnt_locks_init_private(struct file_lock *fl, struct nlm_host *host); 31 + 32 + static const struct rpc_call_ops nlmclnt_unlock_ops; 33 + static const struct rpc_call_ops nlmclnt_cancel_ops; 33 34 34 35 /* 35 36 * Cookie counter for NLM requests ··· 222 221 goto done; 223 222 } 224 223 clnt->cl_softrtry = nfssrv->client->cl_softrtry; 225 - clnt->cl_intr = nfssrv->client->cl_intr; 226 - clnt->cl_chatty = nfssrv->client->cl_chatty; 224 + clnt->cl_intr = nfssrv->client->cl_intr; 227 225 } 228 226 229 227 /* Keep the old signal mask */ ··· 399 399 /* 400 400 * Generic NLM call, async version. 401 401 */ 402 - int 403 - nlmsvc_async_call(struct nlm_rqst *req, u32 proc, rpc_action callback) 402 + int nlmsvc_async_call(struct nlm_rqst *req, u32 proc, const struct rpc_call_ops *tk_ops) 404 403 { 405 404 struct nlm_host *host = req->a_host; 406 405 struct rpc_clnt *clnt; ··· 418 419 msg.rpc_proc = &clnt->cl_procinfo[proc]; 419 420 420 421 /* bootstrap and kick off the async RPC call */ 421 - status = rpc_call_async(clnt, &msg, RPC_TASK_ASYNC, callback, req); 422 + status = rpc_call_async(clnt, &msg, RPC_TASK_ASYNC, tk_ops, req); 422 423 423 424 return status; 424 425 } 425 426 426 - static int 427 - nlmclnt_async_call(struct nlm_rqst *req, u32 proc, rpc_action callback) 427 + static int nlmclnt_async_call(struct nlm_rqst *req, u32 proc, const struct rpc_call_ops *tk_ops) 428 428 { 429 429 struct nlm_host *host = req->a_host; 430 430 struct rpc_clnt *clnt; ··· 446 448 /* Increment host refcount */ 447 449 nlm_get_host(host); 448 450 /* bootstrap and kick off the async RPC call */ 449 - status = rpc_call_async(clnt, &msg, RPC_TASK_ASYNC, callback, req); 451 + status = rpc_call_async(clnt, &msg, RPC_TASK_ASYNC, tk_ops, req); 450 452 if (status < 0) 451 453 nlm_release_host(host); 452 454 return status; ··· 662 664 663 665 if (req->a_flags & RPC_TASK_ASYNC) { 664 666 status = nlmclnt_async_call(req, NLMPROC_UNLOCK, 665 - nlmclnt_unlock_callback); 667 + &nlmclnt_unlock_ops); 666 668 /* Hrmf... Do the unlock early since locks_remove_posix() 667 669 * really expects us to free the lock synchronously */ 668 670 do_vfs_lock(fl); ··· 690 692 return -ENOLCK; 691 693 } 692 694 693 - static void 694 - nlmclnt_unlock_callback(struct rpc_task *task) 695 + static void nlmclnt_unlock_callback(struct rpc_task *task, void *data) 695 696 { 696 - struct nlm_rqst *req = (struct nlm_rqst *) task->tk_calldata; 697 + struct nlm_rqst *req = data; 697 698 int status = req->a_res.status; 698 699 699 700 if (RPC_ASSASSINATED(task)) ··· 718 721 retry_unlock: 719 722 rpc_restart_call(task); 720 723 } 724 + 725 + static const struct rpc_call_ops nlmclnt_unlock_ops = { 726 + .rpc_call_done = nlmclnt_unlock_callback, 727 + }; 721 728 722 729 /* 723 730 * Cancel a blocked lock request. ··· 751 750 752 751 nlmclnt_setlockargs(req, fl); 753 752 754 - status = nlmclnt_async_call(req, NLMPROC_CANCEL, 755 - nlmclnt_cancel_callback); 753 + status = nlmclnt_async_call(req, NLMPROC_CANCEL, &nlmclnt_cancel_ops); 756 754 if (status < 0) { 757 755 nlmclnt_release_lockargs(req); 758 756 kfree(req); ··· 765 765 return status; 766 766 } 767 767 768 - static void 769 - nlmclnt_cancel_callback(struct rpc_task *task) 768 + static void nlmclnt_cancel_callback(struct rpc_task *task, void *data) 770 769 { 771 - struct nlm_rqst *req = (struct nlm_rqst *) task->tk_calldata; 770 + struct nlm_rqst *req = data; 772 771 773 772 if (RPC_ASSASSINATED(task)) 774 773 goto die; ··· 805 806 rpc_restart_call(task); 806 807 rpc_delay(task, 30 * HZ); 807 808 } 809 + 810 + static const struct rpc_call_ops nlmclnt_cancel_ops = { 811 + .rpc_call_done = nlmclnt_cancel_callback, 812 + }; 808 813 809 814 /* 810 815 * Convert an NLM status code to a generic kernel errno
+2 -2
fs/lockd/host.c
··· 177 177 if ((clnt = host->h_rpcclnt) != NULL) { 178 178 xprt = clnt->cl_xprt; 179 179 if (time_after_eq(jiffies, host->h_nextrebind)) { 180 - clnt->cl_port = 0; 180 + rpc_force_rebind(clnt); 181 181 host->h_nextrebind = jiffies + NLM_HOST_REBIND; 182 182 dprintk("lockd: next rebind in %ld jiffies\n", 183 183 host->h_nextrebind - jiffies); ··· 217 217 { 218 218 dprintk("lockd: rebind host %s\n", host->h_name); 219 219 if (host->h_rpcclnt && time_after_eq(jiffies, host->h_nextrebind)) { 220 - host->h_rpcclnt->cl_port = 0; 220 + rpc_force_rebind(host->h_rpcclnt); 221 221 host->h_nextrebind = jiffies + NLM_HOST_REBIND; 222 222 } 223 223 }
-1
fs/lockd/mon.c
··· 123 123 if (IS_ERR(clnt)) 124 124 goto out_err; 125 125 clnt->cl_softrtry = 1; 126 - clnt->cl_chatty = 1; 127 126 clnt->cl_oneshot = 1; 128 127 return clnt; 129 128
+2 -2
fs/lockd/svc.c
··· 178 178 179 179 } 180 180 181 + flush_signals(current); 182 + 181 183 /* 182 184 * Check whether there's a new lockd process before 183 185 * shutting down the hosts and clearing the slot. ··· 193 191 printk(KERN_DEBUG 194 192 "lockd: new process, skipping host shutdown\n"); 195 193 wake_up(&lockd_exit); 196 - 197 - flush_signals(current); 198 194 199 195 /* Exit the RPC thread */ 200 196 svc_exit_thread(rqstp);
+9 -6
fs/lockd/svc4proc.c
··· 22 22 #define NLMDBG_FACILITY NLMDBG_CLIENT 23 23 24 24 static u32 nlm4svc_callback(struct svc_rqst *, u32, struct nlm_res *); 25 - static void nlm4svc_callback_exit(struct rpc_task *); 25 + 26 + static const struct rpc_call_ops nlm4svc_callback_ops; 26 27 27 28 /* 28 29 * Obtain client and file from arguments ··· 471 470 } 472 471 473 472 474 - 475 473 /* 476 474 * This is the generic lockd callback for async RPC calls 477 475 */ ··· 494 494 call->a_host = host; 495 495 memcpy(&call->a_args, resp, sizeof(*resp)); 496 496 497 - if (nlmsvc_async_call(call, proc, nlm4svc_callback_exit) < 0) 497 + if (nlmsvc_async_call(call, proc, &nlm4svc_callback_ops) < 0) 498 498 goto error; 499 499 500 500 return rpc_success; ··· 504 504 return rpc_system_err; 505 505 } 506 506 507 - static void 508 - nlm4svc_callback_exit(struct rpc_task *task) 507 + static void nlm4svc_callback_exit(struct rpc_task *task, void *data) 509 508 { 510 - struct nlm_rqst *call = (struct nlm_rqst *) task->tk_calldata; 509 + struct nlm_rqst *call = data; 511 510 512 511 if (task->tk_status < 0) { 513 512 dprintk("lockd: %4d callback failed (errno = %d)\n", ··· 515 516 nlm_release_host(call->a_host); 516 517 kfree(call); 517 518 } 519 + 520 + static const struct rpc_call_ops nlm4svc_callback_ops = { 521 + .rpc_call_done = nlm4svc_callback_exit, 522 + }; 518 523 519 524 /* 520 525 * NLM Server procedures.
+22 -20
fs/lockd/svclock.c
··· 41 41 42 42 static void nlmsvc_insert_block(struct nlm_block *block, unsigned long); 43 43 static int nlmsvc_remove_block(struct nlm_block *block); 44 - static void nlmsvc_grant_callback(struct rpc_task *task); 44 + 45 + static const struct rpc_call_ops nlmsvc_grant_ops; 45 46 46 47 /* 47 48 * The list of blocked locks to retry ··· 227 226 * It is the caller's responsibility to check whether the file 228 227 * can be closed hereafter. 229 228 */ 230 - static void 229 + static int 231 230 nlmsvc_delete_block(struct nlm_block *block, int unlock) 232 231 { 233 232 struct file_lock *fl = &block->b_call.a_args.lock.fl; 234 233 struct nlm_file *file = block->b_file; 235 234 struct nlm_block **bp; 235 + int status = 0; 236 236 237 237 dprintk("lockd: deleting block %p...\n", block); 238 238 239 239 /* Remove block from list */ 240 240 nlmsvc_remove_block(block); 241 - if (fl->fl_next) 242 - posix_unblock_lock(file->f_file, fl); 243 - if (unlock) { 244 - fl->fl_type = F_UNLCK; 245 - posix_lock_file(file->f_file, fl); 246 - block->b_granted = 0; 247 - } 241 + if (unlock) 242 + status = posix_unblock_lock(file->f_file, fl); 248 243 249 244 /* If the block is in the middle of a GRANT callback, 250 245 * don't kill it yet. */ 251 246 if (block->b_incall) { 252 247 nlmsvc_insert_block(block, NLM_NEVER); 253 248 block->b_done = 1; 254 - return; 249 + return status; 255 250 } 256 251 257 252 /* Remove block from file's list of blocks */ ··· 262 265 nlm_release_host(block->b_host); 263 266 nlmclnt_freegrantargs(&block->b_call); 264 267 kfree(block); 268 + return status; 265 269 } 266 270 267 271 /* ··· 273 275 nlmsvc_traverse_blocks(struct nlm_host *host, struct nlm_file *file, int action) 274 276 { 275 277 struct nlm_block *block, *next; 278 + /* XXX: Will everything get cleaned up if we don't unlock here? */ 276 279 277 280 down(&file->f_sema); 278 281 for (block = file->f_blocks; block; block = next) { ··· 443 444 nlmsvc_cancel_blocked(struct nlm_file *file, struct nlm_lock *lock) 444 445 { 445 446 struct nlm_block *block; 447 + int status = 0; 446 448 447 449 dprintk("lockd: nlmsvc_cancel(%s/%ld, pi=%d, %Ld-%Ld)\n", 448 450 file->f_file->f_dentry->d_inode->i_sb->s_id, ··· 454 454 455 455 down(&file->f_sema); 456 456 if ((block = nlmsvc_lookup_block(file, lock, 1)) != NULL) 457 - nlmsvc_delete_block(block, 1); 457 + status = nlmsvc_delete_block(block, 1); 458 458 up(&file->f_sema); 459 - return nlm_granted; 459 + return status ? nlm_lck_denied : nlm_granted; 460 460 } 461 461 462 462 /* ··· 562 562 /* Call the client */ 563 563 nlm_get_host(block->b_call.a_host); 564 564 if (nlmsvc_async_call(&block->b_call, NLMPROC_GRANTED_MSG, 565 - nlmsvc_grant_callback) < 0) 565 + &nlmsvc_grant_ops) < 0) 566 566 nlm_release_host(block->b_call.a_host); 567 567 up(&file->f_sema); 568 568 } ··· 575 575 * chain once more in order to have it removed by lockd itself (which can 576 576 * then sleep on the file semaphore without disrupting e.g. the nfs client). 577 577 */ 578 - static void 579 - nlmsvc_grant_callback(struct rpc_task *task) 578 + static void nlmsvc_grant_callback(struct rpc_task *task, void *data) 580 579 { 581 - struct nlm_rqst *call = (struct nlm_rqst *) task->tk_calldata; 580 + struct nlm_rqst *call = data; 582 581 struct nlm_block *block; 583 582 unsigned long timeout; 584 583 struct sockaddr_in *peer_addr = RPC_PEERADDR(task->tk_client); ··· 613 614 nlm_release_host(call->a_host); 614 615 } 615 616 617 + static const struct rpc_call_ops nlmsvc_grant_ops = { 618 + .rpc_call_done = nlmsvc_grant_callback, 619 + }; 620 + 616 621 /* 617 622 * We received a GRANT_RES callback. Try to find the corresponding 618 623 * block. ··· 636 633 637 634 file->f_count++; 638 635 down(&file->f_sema); 639 - if ((block = nlmsvc_find_block(cookie,&rqstp->rq_addr)) != NULL) { 636 + block = nlmsvc_find_block(cookie, &rqstp->rq_addr); 637 + if (block) { 640 638 if (status == NLM_LCK_DENIED_GRACE_PERIOD) { 641 639 /* Try again in a couple of seconds */ 642 640 nlmsvc_insert_block(block, 10 * HZ); 643 - block = NULL; 641 + up(&file->f_sema); 644 642 } else { 645 643 /* Lock is now held by client, or has been rejected. 646 644 * In both cases, the block should be removed. */ ··· 652 648 nlmsvc_delete_block(block, 1); 653 649 } 654 650 } 655 - if (!block) 656 - up(&file->f_sema); 657 651 nlm_release_file(file); 658 652 } 659 653
+9 -5
fs/lockd/svcproc.c
··· 23 23 #define NLMDBG_FACILITY NLMDBG_CLIENT 24 24 25 25 static u32 nlmsvc_callback(struct svc_rqst *, u32, struct nlm_res *); 26 - static void nlmsvc_callback_exit(struct rpc_task *); 26 + 27 + static const struct rpc_call_ops nlmsvc_callback_ops; 27 28 28 29 #ifdef CONFIG_LOCKD_V4 29 30 static u32 ··· 519 518 call->a_host = host; 520 519 memcpy(&call->a_args, resp, sizeof(*resp)); 521 520 522 - if (nlmsvc_async_call(call, proc, nlmsvc_callback_exit) < 0) 521 + if (nlmsvc_async_call(call, proc, &nlmsvc_callback_ops) < 0) 523 522 goto error; 524 523 525 524 return rpc_success; ··· 529 528 return rpc_system_err; 530 529 } 531 530 532 - static void 533 - nlmsvc_callback_exit(struct rpc_task *task) 531 + static void nlmsvc_callback_exit(struct rpc_task *task, void *data) 534 532 { 535 - struct nlm_rqst *call = (struct nlm_rqst *) task->tk_calldata; 533 + struct nlm_rqst *call = data; 536 534 537 535 if (task->tk_status < 0) { 538 536 dprintk("lockd: %4d callback failed (errno = %d)\n", ··· 540 540 nlm_release_host(call->a_host); 541 541 kfree(call); 542 542 } 543 + 544 + static const struct rpc_call_ops nlmsvc_callback_ops = { 545 + .rpc_call_done = nlmsvc_callback_exit, 546 + }; 543 547 544 548 /* 545 549 * NLM Server procedures.
+3 -1
fs/lockd/xdr4.c
··· 354 354 return 0; 355 355 argp->state = ntohl(*p++); 356 356 /* Preserve the address in network byte order */ 357 - argp->addr = *p++; 357 + argp->addr = *p++; 358 + argp->vers = *p++; 359 + argp->proto = *p++; 358 360 return xdr_argsize_check(rqstp, p); 359 361 } 360 362
+8 -12
fs/locks.c
··· 1958 1958 * 1959 1959 * lockd needs to block waiting for locks. 1960 1960 */ 1961 - void 1961 + int 1962 1962 posix_unblock_lock(struct file *filp, struct file_lock *waiter) 1963 1963 { 1964 - /* 1965 - * A remote machine may cancel the lock request after it's been 1966 - * granted locally. If that happens, we need to delete the lock. 1967 - */ 1964 + int status = 0; 1965 + 1968 1966 lock_kernel(); 1969 - if (waiter->fl_next) { 1967 + if (waiter->fl_next) 1970 1968 __locks_delete_block(waiter); 1971 - unlock_kernel(); 1972 - } else { 1973 - unlock_kernel(); 1974 - waiter->fl_type = F_UNLCK; 1975 - posix_lock_file(filp, waiter); 1976 - } 1969 + else 1970 + status = -ENOENT; 1971 + unlock_kernel(); 1972 + return status; 1977 1973 } 1978 1974 1979 1975 EXPORT_SYMBOL(posix_unblock_lock);
+1
fs/nfs/Makefile
··· 13 13 delegation.o idmap.o \ 14 14 callback.o callback_xdr.o callback_proc.o 15 15 nfs-$(CONFIG_NFS_DIRECTIO) += direct.o 16 + nfs-$(CONFIG_SYSCTL) += sysctl.o 16 17 nfs-objs := $(nfs-y)
+2 -1
fs/nfs/callback.c
··· 34 34 static DECLARE_MUTEX(nfs_callback_sema); 35 35 static struct svc_program nfs4_callback_program; 36 36 37 + unsigned int nfs_callback_set_tcpport; 37 38 unsigned short nfs_callback_tcpport; 38 39 39 40 /* ··· 99 98 if (!serv) 100 99 goto out_err; 101 100 /* FIXME: We don't want to register this socket with the portmapper */ 102 - ret = svc_makesock(serv, IPPROTO_TCP, 0); 101 + ret = svc_makesock(serv, IPPROTO_TCP, nfs_callback_set_tcpport); 103 102 if (ret < 0) 104 103 goto out_destroy; 105 104 if (!list_empty(&serv->sv_permsocks)) {
+1
fs/nfs/callback.h
··· 65 65 extern int nfs_callback_up(void); 66 66 extern int nfs_callback_down(void); 67 67 68 + extern unsigned int nfs_callback_set_tcpport; 68 69 extern unsigned short nfs_callback_tcpport; 69 70 70 71 #endif /* __LINUX_FS_NFS_CALLBACK_H */
+3 -1
fs/nfs/callback_proc.c
··· 35 35 if (delegation == NULL || (delegation->type & FMODE_WRITE) == 0) 36 36 goto out_iput; 37 37 res->size = i_size_read(inode); 38 - res->change_attr = NFS_CHANGE_ATTR(inode); 38 + res->change_attr = delegation->change_attr; 39 + if (nfsi->npages != 0) 40 + res->change_attr++; 39 41 res->ctime = inode->i_ctime; 40 42 res->mtime = inode->i_mtime; 41 43 res->bitmap[0] = (FATTR4_WORD0_CHANGE|FATTR4_WORD0_SIZE) &
+45 -2
fs/nfs/delegation.c
··· 8 8 */ 9 9 #include <linux/config.h> 10 10 #include <linux/completion.h> 11 + #include <linux/kthread.h> 11 12 #include <linux/module.h> 12 13 #include <linux/sched.h> 13 14 #include <linux/spinlock.h> ··· 131 130 sizeof(delegation->stateid.data)); 132 131 delegation->type = res->delegation_type; 133 132 delegation->maxsize = res->maxsize; 133 + delegation->change_attr = nfsi->change_attr; 134 134 delegation->cred = get_rpccred(cred); 135 135 delegation->inode = inode; 136 136 ··· 158 156 static int nfs_do_return_delegation(struct inode *inode, struct nfs_delegation *delegation) 159 157 { 160 158 int res = 0; 161 - 162 - __nfs_revalidate_inode(NFS_SERVER(inode), inode); 163 159 164 160 res = nfs4_proc_delegreturn(inode, delegation->cred, &delegation->stateid); 165 161 nfs_free_delegation(delegation); ··· 229 229 goto restart; 230 230 } 231 231 spin_unlock(&clp->cl_lock); 232 + } 233 + 234 + int nfs_do_expire_all_delegations(void *ptr) 235 + { 236 + struct nfs4_client *clp = ptr; 237 + struct nfs_delegation *delegation; 238 + struct inode *inode; 239 + 240 + allow_signal(SIGKILL); 241 + restart: 242 + spin_lock(&clp->cl_lock); 243 + if (test_bit(NFS4CLNT_STATE_RECOVER, &clp->cl_state) != 0) 244 + goto out; 245 + if (test_bit(NFS4CLNT_LEASE_EXPIRED, &clp->cl_state) == 0) 246 + goto out; 247 + list_for_each_entry(delegation, &clp->cl_delegations, super_list) { 248 + inode = igrab(delegation->inode); 249 + if (inode == NULL) 250 + continue; 251 + spin_unlock(&clp->cl_lock); 252 + nfs_inode_return_delegation(inode); 253 + iput(inode); 254 + goto restart; 255 + } 256 + out: 257 + spin_unlock(&clp->cl_lock); 258 + nfs4_put_client(clp); 259 + module_put_and_exit(0); 260 + } 261 + 262 + void nfs_expire_all_delegations(struct nfs4_client *clp) 263 + { 264 + struct task_struct *task; 265 + 266 + __module_get(THIS_MODULE); 267 + atomic_inc(&clp->cl_count); 268 + task = kthread_run(nfs_do_expire_all_delegations, clp, 269 + "%u.%u.%u.%u-delegreturn", 270 + NIPQUAD(clp->cl_addr)); 271 + if (!IS_ERR(task)) 272 + return; 273 + nfs4_put_client(clp); 274 + module_put(THIS_MODULE); 232 275 } 233 276 234 277 /*
+2
fs/nfs/delegation.h
··· 21 21 #define NFS_DELEGATION_NEED_RECLAIM 1 22 22 long flags; 23 23 loff_t maxsize; 24 + __u64 change_attr; 24 25 }; 25 26 26 27 int nfs_inode_set_delegation(struct inode *inode, struct rpc_cred *cred, struct nfs_openres *res); ··· 31 30 32 31 struct inode *nfs_delegation_find_inode(struct nfs4_client *clp, const struct nfs_fh *fhandle); 33 32 void nfs_return_all_delegations(struct super_block *sb); 33 + void nfs_expire_all_delegations(struct nfs4_client *clp); 34 34 void nfs_handle_cb_pathdown(struct nfs4_client *clp); 35 35 36 36 void nfs_delegation_mark_reclaim(struct nfs4_client *clp);
+3 -1
fs/nfs/dir.c
··· 1550 1550 } 1551 1551 nfs_inode_return_delegation(old_inode); 1552 1552 1553 - if (new_inode) 1553 + if (new_inode != NULL) { 1554 + nfs_inode_return_delegation(new_inode); 1554 1555 d_delete(new_dentry); 1556 + } 1555 1557 1556 1558 nfs_begin_data_update(old_dir); 1557 1559 nfs_begin_data_update(new_dir);
+26 -31
fs/nfs/direct.c
··· 122 122 { 123 123 int i; 124 124 for (i = 0; i < npages; i++) { 125 - if (do_dirty) 126 - set_page_dirty_lock(pages[i]); 127 - page_cache_release(pages[i]); 125 + struct page *page = pages[i]; 126 + if (do_dirty && !PageCompound(page)) 127 + set_page_dirty_lock(page); 128 + page_cache_release(page); 128 129 } 129 130 kfree(pages); 130 131 } ··· 155 154 struct list_head *list; 156 155 struct nfs_direct_req *dreq; 157 156 unsigned int reads = 0; 157 + unsigned int rpages = (rsize + PAGE_CACHE_SIZE - 1) >> PAGE_CACHE_SHIFT; 158 158 159 159 dreq = kmem_cache_alloc(nfs_direct_cachep, SLAB_KERNEL); 160 160 if (!dreq) ··· 169 167 170 168 list = &dreq->list; 171 169 for(;;) { 172 - struct nfs_read_data *data = nfs_readdata_alloc(); 170 + struct nfs_read_data *data = nfs_readdata_alloc(rpages); 173 171 174 172 if (unlikely(!data)) { 175 173 while (!list_empty(list)) { ··· 270 268 NFS_PROTO(inode)->read_setup(data); 271 269 272 270 data->task.tk_cookie = (unsigned long) inode; 273 - data->task.tk_calldata = data; 274 - data->task.tk_release = nfs_readdata_release; 275 271 data->complete = nfs_direct_read_result; 276 272 277 273 lock_kernel(); ··· 433 433 struct nfs_writeverf first_verf; 434 434 struct nfs_write_data *wdata; 435 435 436 - wdata = nfs_writedata_alloc(); 436 + wdata = nfs_writedata_alloc(NFS_SERVER(inode)->wpages); 437 437 if (!wdata) 438 438 return -ENOMEM; 439 439 ··· 662 662 .iov_len = count, 663 663 }; 664 664 665 - dprintk("nfs: direct read(%s/%s, %lu@%lu)\n", 665 + dprintk("nfs: direct read(%s/%s, %lu@%Ld)\n", 666 666 file->f_dentry->d_parent->d_name.name, 667 667 file->f_dentry->d_name.name, 668 - (unsigned long) count, (unsigned long) pos); 668 + (unsigned long) count, (long long) pos); 669 669 670 670 if (!is_sync_kiocb(iocb)) 671 671 goto out; ··· 718 718 ssize_t 719 719 nfs_file_direct_write(struct kiocb *iocb, const char __user *buf, size_t count, loff_t pos) 720 720 { 721 - ssize_t retval = -EINVAL; 722 - loff_t *ppos = &iocb->ki_pos; 723 - unsigned long limit = current->signal->rlim[RLIMIT_FSIZE].rlim_cur; 721 + ssize_t retval; 724 722 struct file *file = iocb->ki_filp; 725 723 struct nfs_open_context *ctx = 726 724 (struct nfs_open_context *) file->private_data; ··· 726 728 struct inode *inode = mapping->host; 727 729 struct iovec iov = { 728 730 .iov_base = (char __user *)buf, 729 - .iov_len = count, 730 731 }; 731 732 732 - dfprintk(VFS, "nfs: direct write(%s/%s(%ld), %lu@%lu)\n", 733 + dfprintk(VFS, "nfs: direct write(%s/%s, %lu@%Ld)\n", 733 734 file->f_dentry->d_parent->d_name.name, 734 - file->f_dentry->d_name.name, inode->i_ino, 735 - (unsigned long) count, (unsigned long) pos); 735 + file->f_dentry->d_name.name, 736 + (unsigned long) count, (long long) pos); 736 737 738 + retval = -EINVAL; 737 739 if (!is_sync_kiocb(iocb)) 738 740 goto out; 739 - if (count < 0) 741 + 742 + retval = generic_write_checks(file, &pos, &count, 0); 743 + if (retval) 740 744 goto out; 741 - if (pos < 0) 745 + 746 + retval = -EINVAL; 747 + if ((ssize_t) count < 0) 742 748 goto out; 743 - retval = -EFAULT; 744 - if (!access_ok(VERIFY_READ, iov.iov_base, iov.iov_len)) 745 - goto out; 746 - retval = -EFBIG; 747 - if (limit != RLIM_INFINITY) { 748 - if (pos >= limit) { 749 - send_sig(SIGXFSZ, current, 0); 750 - goto out; 751 - } 752 - if (count > limit - (unsigned long) pos) 753 - count = limit - (unsigned long) pos; 754 - } 755 749 retval = 0; 756 750 if (!count) 751 + goto out; 752 + iov.iov_len = count, 753 + 754 + retval = -EFAULT; 755 + if (!access_ok(VERIFY_READ, iov.iov_base, iov.iov_len)) 757 756 goto out; 758 757 759 758 retval = nfs_sync_mapping(mapping); ··· 761 766 if (mapping->nrpages) 762 767 invalidate_inode_pages2(mapping); 763 768 if (retval > 0) 764 - *ppos = pos + retval; 769 + iocb->ki_pos = pos + retval; 765 770 766 771 out: 767 772 return retval;
+9
fs/nfs/idmap.c
··· 54 54 55 55 #define IDMAP_HASH_SZ 128 56 56 57 + /* Default cache timeout is 10 minutes */ 58 + unsigned int nfs_idmap_cache_timeout = 600 * HZ; 59 + 57 60 struct idmap_hashent { 61 + unsigned long ih_expires; 58 62 __u32 ih_id; 59 63 int ih_namelen; 60 64 char ih_name[IDMAP_NAMESZ]; ··· 153 149 154 150 if (he->ih_namelen != len || memcmp(he->ih_name, name, len) != 0) 155 151 return NULL; 152 + if (time_after(jiffies, he->ih_expires)) 153 + return NULL; 156 154 return he; 157 155 } 158 156 ··· 169 163 { 170 164 struct idmap_hashent *he = idmap_id_hash(h, id); 171 165 if (he->ih_id != id || he->ih_namelen == 0) 166 + return NULL; 167 + if (time_after(jiffies, he->ih_expires)) 172 168 return NULL; 173 169 return he; 174 170 } ··· 200 192 memcpy(he->ih_name, name, namelen); 201 193 he->ih_name[namelen] = '\0'; 202 194 he->ih_namelen = namelen; 195 + he->ih_expires = jiffies + nfs_idmap_cache_timeout; 203 196 } 204 197 205 198 /*
+113 -65
fs/nfs/inode.c
··· 40 40 #include <asm/uaccess.h> 41 41 42 42 #include "nfs4_fs.h" 43 + #include "callback.h" 43 44 #include "delegation.h" 44 45 45 46 #define NFSDBG_FACILITY NFSDBG_VFS ··· 222 221 static inline unsigned long 223 222 nfs_block_size(unsigned long bsize, unsigned char *nrbitsp) 224 223 { 225 - if (bsize < 1024) 226 - bsize = NFS_DEF_FILE_IO_BUFFER_SIZE; 227 - else if (bsize >= NFS_MAX_FILE_IO_BUFFER_SIZE) 228 - bsize = NFS_MAX_FILE_IO_BUFFER_SIZE; 224 + if (bsize < NFS_MIN_FILE_IO_SIZE) 225 + bsize = NFS_DEF_FILE_IO_SIZE; 226 + else if (bsize >= NFS_MAX_FILE_IO_SIZE) 227 + bsize = NFS_MAX_FILE_IO_SIZE; 229 228 230 229 return nfs_block_bits(bsize, nrbitsp); 231 230 } ··· 308 307 max_rpc_payload = nfs_block_size(rpc_max_payload(server->client), NULL); 309 308 if (server->rsize > max_rpc_payload) 310 309 server->rsize = max_rpc_payload; 310 + if (server->rsize > NFS_MAX_FILE_IO_SIZE) 311 + server->rsize = NFS_MAX_FILE_IO_SIZE; 312 + server->rpages = (server->rsize + PAGE_CACHE_SIZE - 1) >> PAGE_CACHE_SHIFT; 313 + 311 314 if (server->wsize > max_rpc_payload) 312 315 server->wsize = max_rpc_payload; 313 - 314 - server->rpages = (server->rsize + PAGE_CACHE_SIZE - 1) >> PAGE_CACHE_SHIFT; 315 - if (server->rpages > NFS_READ_MAXIOV) { 316 - server->rpages = NFS_READ_MAXIOV; 317 - server->rsize = server->rpages << PAGE_CACHE_SHIFT; 318 - } 319 - 316 + if (server->wsize > NFS_MAX_FILE_IO_SIZE) 317 + server->wsize = NFS_MAX_FILE_IO_SIZE; 320 318 server->wpages = (server->wsize + PAGE_CACHE_SIZE - 1) >> PAGE_CACHE_SHIFT; 321 - if (server->wpages > NFS_WRITE_MAXIOV) { 322 - server->wpages = NFS_WRITE_MAXIOV; 323 - server->wsize = server->wpages << PAGE_CACHE_SHIFT; 324 - } 325 319 326 320 if (sb->s_blocksize == 0) 327 321 sb->s_blocksize = nfs_block_bits(server->wsize, ··· 413 417 414 418 clnt->cl_intr = 1; 415 419 clnt->cl_softrtry = 1; 416 - clnt->cl_chatty = 1; 417 420 418 421 return clnt; 419 422 ··· 570 575 buf->f_namelen = server->namelen; 571 576 out: 572 577 unlock_kernel(); 573 - 574 578 return 0; 575 579 576 580 out_err: 577 - printk(KERN_WARNING "nfs_statfs: statfs error = %d\n", -error); 581 + dprintk("%s: statfs error = %d\n", __FUNCTION__, -error); 578 582 buf->f_bsize = buf->f_blocks = buf->f_bfree = buf->f_bavail = -1; 579 583 goto out; 580 584 ··· 952 958 int need_atime = NFS_I(inode)->cache_validity & NFS_INO_INVALID_ATIME; 953 959 int err; 954 960 961 + /* Flush out writes to the server in order to update c/mtime */ 962 + nfs_sync_inode(inode, 0, 0, FLUSH_WAIT|FLUSH_NOCOMMIT); 955 963 if (__IS_FLG(inode, MS_NOATIME)) 956 964 need_atime = 0; 957 965 else if (__IS_FLG(inode, MS_NODIRATIME) && S_ISDIR(inode->i_mode)) ··· 1248 1252 atomic_dec(&nfsi->data_updates); 1249 1253 } 1250 1254 1255 + static void nfs_wcc_update_inode(struct inode *inode, struct nfs_fattr *fattr) 1256 + { 1257 + struct nfs_inode *nfsi = NFS_I(inode); 1258 + 1259 + if ((fattr->valid & NFS_ATTR_PRE_CHANGE) != 0 1260 + && nfsi->change_attr == fattr->pre_change_attr) { 1261 + nfsi->change_attr = fattr->change_attr; 1262 + nfsi->cache_change_attribute = jiffies; 1263 + } 1264 + 1265 + /* If we have atomic WCC data, we may update some attributes */ 1266 + if ((fattr->valid & NFS_ATTR_WCC) != 0) { 1267 + if (timespec_equal(&inode->i_ctime, &fattr->pre_ctime)) { 1268 + memcpy(&inode->i_ctime, &fattr->ctime, sizeof(inode->i_ctime)); 1269 + nfsi->cache_change_attribute = jiffies; 1270 + } 1271 + if (timespec_equal(&inode->i_mtime, &fattr->pre_mtime)) { 1272 + memcpy(&inode->i_mtime, &fattr->mtime, sizeof(inode->i_mtime)); 1273 + nfsi->cache_change_attribute = jiffies; 1274 + } 1275 + if (inode->i_size == fattr->pre_size && nfsi->npages == 0) { 1276 + inode->i_size = fattr->size; 1277 + nfsi->cache_change_attribute = jiffies; 1278 + } 1279 + } 1280 + } 1281 + 1251 1282 /** 1252 1283 * nfs_check_inode_attributes - verify consistency of the inode attribute cache 1253 1284 * @inode - pointer to inode ··· 1291 1268 int data_unstable; 1292 1269 1293 1270 1271 + if ((fattr->valid & NFS_ATTR_FATTR) == 0) 1272 + return 0; 1273 + 1294 1274 /* Are we in the process of updating data on the server? */ 1295 1275 data_unstable = nfs_caches_unstable(inode); 1296 1276 1297 - if (fattr->valid & NFS_ATTR_FATTR_V4) { 1298 - if ((fattr->valid & NFS_ATTR_PRE_CHANGE) != 0 1299 - && nfsi->change_attr == fattr->pre_change_attr) 1300 - nfsi->change_attr = fattr->change_attr; 1301 - if (nfsi->change_attr != fattr->change_attr) { 1302 - nfsi->cache_validity |= NFS_INO_INVALID_ATTR; 1303 - if (!data_unstable) 1304 - nfsi->cache_validity |= NFS_INO_REVAL_PAGECACHE; 1305 - } 1306 - } 1277 + /* Do atomic weak cache consistency updates */ 1278 + nfs_wcc_update_inode(inode, fattr); 1307 1279 1308 - if ((fattr->valid & NFS_ATTR_FATTR) == 0) { 1309 - return 0; 1280 + if ((fattr->valid & NFS_ATTR_FATTR_V4) != 0 && 1281 + nfsi->change_attr != fattr->change_attr) { 1282 + nfsi->cache_validity |= NFS_INO_INVALID_ATTR; 1283 + if (!data_unstable) 1284 + nfsi->cache_validity |= NFS_INO_REVAL_PAGECACHE; 1310 1285 } 1311 1286 1312 1287 /* Has the inode gone and changed behind our back? */ ··· 1315 1294 1316 1295 cur_size = i_size_read(inode); 1317 1296 new_isize = nfs_size_to_loff_t(fattr->size); 1318 - 1319 - /* If we have atomic WCC data, we may update some attributes */ 1320 - if ((fattr->valid & NFS_ATTR_WCC) != 0) { 1321 - if (timespec_equal(&inode->i_ctime, &fattr->pre_ctime)) 1322 - memcpy(&inode->i_ctime, &fattr->ctime, sizeof(inode->i_ctime)); 1323 - if (timespec_equal(&inode->i_mtime, &fattr->pre_mtime)) 1324 - memcpy(&inode->i_mtime, &fattr->mtime, sizeof(inode->i_mtime)); 1325 - } 1326 1297 1327 1298 /* Verify a few of the more important attributes */ 1328 1299 if (!timespec_equal(&inode->i_mtime, &fattr->mtime)) { ··· 1423 1410 if ((fattr->valid & NFS_ATTR_FATTR) == 0) 1424 1411 return 0; 1425 1412 1426 - if (nfsi->fileid != fattr->fileid) { 1427 - printk(KERN_ERR "%s: inode number mismatch\n" 1428 - "expected (%s/0x%Lx), got (%s/0x%Lx)\n", 1429 - __FUNCTION__, 1430 - inode->i_sb->s_id, (long long)nfsi->fileid, 1431 - inode->i_sb->s_id, (long long)fattr->fileid); 1432 - goto out_err; 1433 - } 1413 + if (nfsi->fileid != fattr->fileid) 1414 + goto out_fileid; 1434 1415 1435 1416 /* 1436 1417 * Make sure the inode's type hasn't changed. ··· 1442 1435 data_stable = nfs_verify_change_attribute(inode, fattr->time_start); 1443 1436 if (data_stable) 1444 1437 nfsi->cache_validity &= ~(NFS_INO_INVALID_ATTR|NFS_INO_INVALID_ATIME); 1438 + 1439 + /* Do atomic weak cache consistency updates */ 1440 + nfs_wcc_update_inode(inode, fattr); 1445 1441 1446 1442 /* Check if our cached file size is stale */ 1447 1443 new_isize = nfs_size_to_loff_t(fattr->size); ··· 1549 1539 */ 1550 1540 nfs_invalidate_inode(inode); 1551 1541 return -ESTALE; 1542 + 1543 + out_fileid: 1544 + printk(KERN_ERR "NFS: server %s error: fileid changed\n" 1545 + "fsid %s: expected fileid 0x%Lx, got 0x%Lx\n", 1546 + NFS_SERVER(inode)->hostname, inode->i_sb->s_id, 1547 + (long long)nfsi->fileid, (long long)fattr->fileid); 1548 + goto out_err; 1552 1549 } 1553 1550 1554 1551 /* ··· 1837 1820 } 1838 1821 clnt->cl_intr = 1; 1839 1822 clnt->cl_softrtry = 1; 1840 - clnt->cl_chatty = 1; 1841 1823 clp->cl_rpcclient = clnt; 1842 - clp->cl_cred = rpcauth_lookupcred(clnt->cl_auth, 0); 1843 - if (IS_ERR(clp->cl_cred)) { 1844 - up_write(&clp->cl_sem); 1845 - err = PTR_ERR(clp->cl_cred); 1846 - clp->cl_cred = NULL; 1847 - goto out_fail; 1848 - } 1849 1824 memcpy(clp->cl_ipaddr, server->ip_addr, sizeof(clp->cl_ipaddr)); 1850 1825 nfs_idmap_new(clp); 1851 - } 1852 - if (list_empty(&clp->cl_superblocks)) { 1853 - err = nfs4_init_client(clp); 1854 - if (err != 0) { 1855 - up_write(&clp->cl_sem); 1856 - goto out_fail; 1857 - } 1858 1826 } 1859 1827 list_add_tail(&server->nfs4_siblings, &clp->cl_superblocks); 1860 1828 clnt = rpc_clone_client(clp->cl_rpcclient); ··· 2035 2033 .fs_flags = FS_ODD_RENAME|FS_REVAL_DOT|FS_BINARY_MOUNTDATA, 2036 2034 }; 2037 2035 2036 + static const int nfs_set_port_min = 0; 2037 + static const int nfs_set_port_max = 65535; 2038 + static int param_set_port(const char *val, struct kernel_param *kp) 2039 + { 2040 + char *endp; 2041 + int num = simple_strtol(val, &endp, 0); 2042 + if (endp == val || *endp || num < nfs_set_port_min || num > nfs_set_port_max) 2043 + return -EINVAL; 2044 + *((int *)kp->arg) = num; 2045 + return 0; 2046 + } 2047 + 2048 + module_param_call(callback_tcpport, param_set_port, param_get_int, 2049 + &nfs_callback_set_tcpport, 0644); 2050 + 2051 + static int param_set_idmap_timeout(const char *val, struct kernel_param *kp) 2052 + { 2053 + char *endp; 2054 + int num = simple_strtol(val, &endp, 0); 2055 + int jif = num * HZ; 2056 + if (endp == val || *endp || num < 0 || jif < num) 2057 + return -EINVAL; 2058 + *((int *)kp->arg) = jif; 2059 + return 0; 2060 + } 2061 + 2062 + module_param_call(idmap_cache_timeout, param_set_idmap_timeout, param_get_int, 2063 + &nfs_idmap_cache_timeout, 0644); 2064 + 2038 2065 #define nfs4_init_once(nfsi) \ 2039 2066 do { \ 2040 2067 INIT_LIST_HEAD(&(nfsi)->open_states); \ ··· 2071 2040 nfsi->delegation_state = 0; \ 2072 2041 init_rwsem(&nfsi->rwsem); \ 2073 2042 } while(0) 2074 - #define register_nfs4fs() register_filesystem(&nfs4_fs_type) 2075 - #define unregister_nfs4fs() unregister_filesystem(&nfs4_fs_type) 2043 + 2044 + static inline int register_nfs4fs(void) 2045 + { 2046 + int ret; 2047 + 2048 + ret = nfs_register_sysctl(); 2049 + if (ret != 0) 2050 + return ret; 2051 + ret = register_filesystem(&nfs4_fs_type); 2052 + if (ret != 0) 2053 + nfs_unregister_sysctl(); 2054 + return ret; 2055 + } 2056 + 2057 + static inline void unregister_nfs4fs(void) 2058 + { 2059 + unregister_filesystem(&nfs4_fs_type); 2060 + nfs_unregister_sysctl(); 2061 + } 2076 2062 #else 2077 2063 #define nfs4_init_once(nfsi) \ 2078 2064 do { } while (0) ··· 2214 2166 #ifdef CONFIG_PROC_FS 2215 2167 rpc_proc_unregister("nfs"); 2216 2168 #endif 2217 - nfs_destroy_writepagecache(); 2218 2169 #ifdef CONFIG_NFS_DIRECTIO 2219 - out0: 2220 2170 nfs_destroy_directcache(); 2171 + out0: 2221 2172 #endif 2173 + nfs_destroy_writepagecache(); 2222 2174 out1: 2223 2175 nfs_destroy_readpagecache(); 2224 2176 out2:
-1
fs/nfs/mount_clnt.c
··· 82 82 RPC_AUTH_UNIX); 83 83 if (!IS_ERR(clnt)) { 84 84 clnt->cl_softrtry = 1; 85 - clnt->cl_chatty = 1; 86 85 clnt->cl_oneshot = 1; 87 86 clnt->cl_intr = 1; 88 87 }
+10 -11
fs/nfs/nfs2xdr.c
··· 146 146 return p; 147 147 } 148 148 149 - #define SATTR(p, attr, flag, field) \ 150 - *p++ = (attr->ia_valid & flag) ? htonl(attr->field) : ~(u32) 0 151 149 static inline u32 * 152 150 xdr_encode_sattr(u32 *p, struct iattr *attr) 153 151 { 154 - SATTR(p, attr, ATTR_MODE, ia_mode); 155 - SATTR(p, attr, ATTR_UID, ia_uid); 156 - SATTR(p, attr, ATTR_GID, ia_gid); 157 - SATTR(p, attr, ATTR_SIZE, ia_size); 152 + const u32 not_set = __constant_htonl(0xFFFFFFFF); 153 + 154 + *p++ = (attr->ia_valid & ATTR_MODE) ? htonl(attr->ia_mode) : not_set; 155 + *p++ = (attr->ia_valid & ATTR_UID) ? htonl(attr->ia_uid) : not_set; 156 + *p++ = (attr->ia_valid & ATTR_GID) ? htonl(attr->ia_gid) : not_set; 157 + *p++ = (attr->ia_valid & ATTR_SIZE) ? htonl(attr->ia_size) : not_set; 158 158 159 159 if (attr->ia_valid & ATTR_ATIME_SET) { 160 160 p = xdr_encode_time(p, &attr->ia_atime); 161 161 } else if (attr->ia_valid & ATTR_ATIME) { 162 162 p = xdr_encode_current_server_time(p, &attr->ia_atime); 163 163 } else { 164 - *p++ = ~(u32) 0; 165 - *p++ = ~(u32) 0; 164 + *p++ = not_set; 165 + *p++ = not_set; 166 166 } 167 167 168 168 if (attr->ia_valid & ATTR_MTIME_SET) { ··· 170 170 } else if (attr->ia_valid & ATTR_MTIME) { 171 171 p = xdr_encode_current_server_time(p, &attr->ia_mtime); 172 172 } else { 173 - *p++ = ~(u32) 0; 174 - *p++ = ~(u32) 0; 173 + *p++ = not_set; 174 + *p++ = not_set; 175 175 } 176 176 return p; 177 177 } 178 - #undef SATTR 179 178 180 179 /* 181 180 * NFS encode functions
+47 -25
fs/nfs/nfs3proc.c
··· 68 68 return 1; 69 69 } 70 70 71 + static int 72 + do_proc_get_root(struct rpc_clnt *client, struct nfs_fh *fhandle, 73 + struct nfs_fsinfo *info) 74 + { 75 + int status; 76 + 77 + dprintk("%s: call fsinfo\n", __FUNCTION__); 78 + nfs_fattr_init(info->fattr); 79 + status = rpc_call(client, NFS3PROC_FSINFO, fhandle, info, 0); 80 + dprintk("%s: reply fsinfo: %d\n", __FUNCTION__, status); 81 + if (!(info->fattr->valid & NFS_ATTR_FATTR)) { 82 + status = rpc_call(client, NFS3PROC_GETATTR, fhandle, info->fattr, 0); 83 + dprintk("%s: reply getattr: %d\n", __FUNCTION__, status); 84 + } 85 + return status; 86 + } 87 + 71 88 /* 72 89 * Bare-bones access to getattr: this is for nfs_read_super. 73 90 */ ··· 94 77 { 95 78 int status; 96 79 97 - dprintk("%s: call fsinfo\n", __FUNCTION__); 98 - nfs_fattr_init(info->fattr); 99 - status = rpc_call(server->client_sys, NFS3PROC_FSINFO, fhandle, info, 0); 100 - dprintk("%s: reply fsinfo: %d\n", __FUNCTION__, status); 101 - if (!(info->fattr->valid & NFS_ATTR_FATTR)) { 102 - status = rpc_call(server->client_sys, NFS3PROC_GETATTR, fhandle, info->fattr, 0); 103 - dprintk("%s: reply getattr: %d\n", __FUNCTION__, status); 104 - } 80 + status = do_proc_get_root(server->client, fhandle, info); 81 + if (status && server->client_sys != server->client) 82 + status = do_proc_get_root(server->client_sys, fhandle, info); 105 83 return status; 106 84 } 107 85 ··· 744 732 745 733 extern u32 *nfs3_decode_dirent(u32 *, struct nfs_entry *, int); 746 734 747 - static void 748 - nfs3_read_done(struct rpc_task *task) 735 + static void nfs3_read_done(struct rpc_task *task, void *calldata) 749 736 { 750 - struct nfs_read_data *data = (struct nfs_read_data *) task->tk_calldata; 737 + struct nfs_read_data *data = calldata; 751 738 752 739 if (nfs3_async_handle_jukebox(task)) 753 740 return; 754 741 /* Call back common NFS readpage processing */ 755 742 if (task->tk_status >= 0) 756 743 nfs_refresh_inode(data->inode, &data->fattr); 757 - nfs_readpage_result(task); 744 + nfs_readpage_result(task, calldata); 758 745 } 746 + 747 + static const struct rpc_call_ops nfs3_read_ops = { 748 + .rpc_call_done = nfs3_read_done, 749 + .rpc_release = nfs_readdata_release, 750 + }; 759 751 760 752 static void 761 753 nfs3_proc_read_setup(struct nfs_read_data *data) ··· 778 762 flags = RPC_TASK_ASYNC | (IS_SWAPFILE(inode)? NFS_RPC_SWAPFLAGS : 0); 779 763 780 764 /* Finalize the task. */ 781 - rpc_init_task(task, NFS_CLIENT(inode), nfs3_read_done, flags); 765 + rpc_init_task(task, NFS_CLIENT(inode), flags, &nfs3_read_ops, data); 782 766 rpc_call_setup(task, &msg, 0); 783 767 } 784 768 785 - static void 786 - nfs3_write_done(struct rpc_task *task) 769 + static void nfs3_write_done(struct rpc_task *task, void *calldata) 787 770 { 788 - struct nfs_write_data *data; 771 + struct nfs_write_data *data = calldata; 789 772 790 773 if (nfs3_async_handle_jukebox(task)) 791 774 return; 792 - data = (struct nfs_write_data *)task->tk_calldata; 793 775 if (task->tk_status >= 0) 794 776 nfs_post_op_update_inode(data->inode, data->res.fattr); 795 - nfs_writeback_done(task); 777 + nfs_writeback_done(task, calldata); 796 778 } 779 + 780 + static const struct rpc_call_ops nfs3_write_ops = { 781 + .rpc_call_done = nfs3_write_done, 782 + .rpc_release = nfs_writedata_release, 783 + }; 797 784 798 785 static void 799 786 nfs3_proc_write_setup(struct nfs_write_data *data, int how) ··· 825 806 flags = (how & FLUSH_SYNC) ? 0 : RPC_TASK_ASYNC; 826 807 827 808 /* Finalize the task. */ 828 - rpc_init_task(task, NFS_CLIENT(inode), nfs3_write_done, flags); 809 + rpc_init_task(task, NFS_CLIENT(inode), flags, &nfs3_write_ops, data); 829 810 rpc_call_setup(task, &msg, 0); 830 811 } 831 812 832 - static void 833 - nfs3_commit_done(struct rpc_task *task) 813 + static void nfs3_commit_done(struct rpc_task *task, void *calldata) 834 814 { 835 - struct nfs_write_data *data; 815 + struct nfs_write_data *data = calldata; 836 816 837 817 if (nfs3_async_handle_jukebox(task)) 838 818 return; 839 - data = (struct nfs_write_data *)task->tk_calldata; 840 819 if (task->tk_status >= 0) 841 820 nfs_post_op_update_inode(data->inode, data->res.fattr); 842 - nfs_commit_done(task); 821 + nfs_commit_done(task, calldata); 843 822 } 823 + 824 + static const struct rpc_call_ops nfs3_commit_ops = { 825 + .rpc_call_done = nfs3_commit_done, 826 + .rpc_release = nfs_commit_release, 827 + }; 844 828 845 829 static void 846 830 nfs3_proc_commit_setup(struct nfs_write_data *data, int how) ··· 862 840 flags = (how & FLUSH_SYNC) ? 0 : RPC_TASK_ASYNC; 863 841 864 842 /* Finalize the task. */ 865 - rpc_init_task(task, NFS_CLIENT(inode), nfs3_commit_done, flags); 843 + rpc_init_task(task, NFS_CLIENT(inode), flags, &nfs3_commit_ops, data); 866 844 rpc_call_setup(task, &msg, 0); 867 845 } 868 846
+1 -1
fs/nfs/nfs3xdr.c
··· 182 182 { 183 183 if (attr->ia_valid & ATTR_MODE) { 184 184 *p++ = xdr_one; 185 - *p++ = htonl(attr->ia_mode); 185 + *p++ = htonl(attr->ia_mode & S_IALLUGO); 186 186 } else { 187 187 *p++ = xdr_zero; 188 188 }
+10 -10
fs/nfs/nfs4_fs.h
··· 38 38 ((err) != NFSERR_NOFILEHANDLE)) 39 39 40 40 enum nfs4_client_state { 41 - NFS4CLNT_OK = 0, 41 + NFS4CLNT_STATE_RECOVER = 0, 42 + NFS4CLNT_LEASE_EXPIRED, 42 43 }; 43 44 44 45 /* ··· 68 67 atomic_t cl_count; 69 68 70 69 struct rpc_clnt * cl_rpcclient; 71 - struct rpc_cred * cl_cred; 72 70 73 71 struct list_head cl_superblocks; /* List of nfs_server structs */ 74 72 ··· 76 76 struct work_struct cl_renewd; 77 77 struct work_struct cl_recoverd; 78 78 79 - wait_queue_head_t cl_waitq; 80 79 struct rpc_wait_queue cl_rpcwaitq; 81 80 82 81 /* used for the setclientid verifier */ ··· 181 182 182 183 nfs4_stateid stateid; 183 184 184 - unsigned int nreaders; 185 - unsigned int nwriters; 185 + unsigned int n_rdonly; 186 + unsigned int n_wronly; 187 + unsigned int n_rdwr; 186 188 int state; /* State on the server (R,W, or RW) */ 187 189 atomic_t count; 188 190 }; ··· 210 210 211 211 /* nfs4proc.c */ 212 212 extern int nfs4_map_errors(int err); 213 - extern int nfs4_proc_setclientid(struct nfs4_client *, u32, unsigned short); 214 - extern int nfs4_proc_setclientid_confirm(struct nfs4_client *); 215 - extern int nfs4_proc_async_renew(struct nfs4_client *); 216 - extern int nfs4_proc_renew(struct nfs4_client *); 213 + extern int nfs4_proc_setclientid(struct nfs4_client *, u32, unsigned short, struct rpc_cred *); 214 + extern int nfs4_proc_setclientid_confirm(struct nfs4_client *, struct rpc_cred *); 215 + extern int nfs4_proc_async_renew(struct nfs4_client *, struct rpc_cred *); 216 + extern int nfs4_proc_renew(struct nfs4_client *, struct rpc_cred *); 217 217 extern int nfs4_do_close(struct inode *inode, struct nfs4_state *state); 218 218 extern struct dentry *nfs4_atomic_open(struct inode *, struct dentry *, struct nameidata *); 219 219 extern int nfs4_open_revalidate(struct inode *, struct dentry *, int, struct nameidata *); ··· 237 237 extern void destroy_nfsv4_state(struct nfs_server *); 238 238 extern struct nfs4_client *nfs4_get_client(struct in_addr *); 239 239 extern void nfs4_put_client(struct nfs4_client *clp); 240 - extern int nfs4_init_client(struct nfs4_client *clp); 241 240 extern struct nfs4_client *nfs4_find_client(struct in_addr *); 241 + struct rpc_cred *nfs4_get_renew_cred(struct nfs4_client *clp); 242 242 extern u32 nfs4_alloc_lockowner_id(struct nfs4_client *); 243 243 244 244 extern struct nfs4_state_owner * nfs4_get_state_owner(struct nfs_server *, struct rpc_cred *);
+930 -550
fs/nfs/nfs4proc.c
··· 57 57 #define NFS4_POLL_RETRY_MIN (1*HZ) 58 58 #define NFS4_POLL_RETRY_MAX (15*HZ) 59 59 60 - static int _nfs4_proc_open_confirm(struct rpc_clnt *clnt, const struct nfs_fh *fh, struct nfs4_state_owner *sp, nfs4_stateid *stateid, struct nfs_seqid *seqid); 60 + struct nfs4_opendata; 61 + static int _nfs4_proc_open(struct nfs4_opendata *data); 61 62 static int nfs4_do_fsinfo(struct nfs_server *, struct nfs_fh *, struct nfs_fsinfo *); 62 63 static int nfs4_async_handle_error(struct rpc_task *, const struct nfs_server *); 63 64 static int _nfs4_proc_access(struct inode *inode, struct nfs_access_entry *entry); 64 65 static int nfs4_handle_exception(const struct nfs_server *server, int errorcode, struct nfs4_exception *exception); 66 + static int nfs4_wait_clnt_recover(struct rpc_clnt *clnt, struct nfs4_client *clp); 65 67 extern u32 *nfs4_decode_dirent(u32 *p, struct nfs_entry *entry, int plus); 66 68 extern struct rpc_procinfo nfs4_procedures[]; 67 69 ··· 175 173 kunmap_atomic(start, KM_USER0); 176 174 } 177 175 178 - static void 179 - renew_lease(struct nfs_server *server, unsigned long timestamp) 176 + static void renew_lease(const struct nfs_server *server, unsigned long timestamp) 180 177 { 181 178 struct nfs4_client *clp = server->nfs4_state; 182 179 spin_lock(&clp->cl_lock); ··· 195 194 spin_unlock(&inode->i_lock); 196 195 } 197 196 197 + struct nfs4_opendata { 198 + atomic_t count; 199 + struct nfs_openargs o_arg; 200 + struct nfs_openres o_res; 201 + struct nfs_open_confirmargs c_arg; 202 + struct nfs_open_confirmres c_res; 203 + struct nfs_fattr f_attr; 204 + struct nfs_fattr dir_attr; 205 + struct dentry *dentry; 206 + struct dentry *dir; 207 + struct nfs4_state_owner *owner; 208 + struct iattr attrs; 209 + unsigned long timestamp; 210 + int rpc_status; 211 + int cancelled; 212 + }; 213 + 214 + static struct nfs4_opendata *nfs4_opendata_alloc(struct dentry *dentry, 215 + struct nfs4_state_owner *sp, int flags, 216 + const struct iattr *attrs) 217 + { 218 + struct dentry *parent = dget_parent(dentry); 219 + struct inode *dir = parent->d_inode; 220 + struct nfs_server *server = NFS_SERVER(dir); 221 + struct nfs4_opendata *p; 222 + 223 + p = kzalloc(sizeof(*p), GFP_KERNEL); 224 + if (p == NULL) 225 + goto err; 226 + p->o_arg.seqid = nfs_alloc_seqid(&sp->so_seqid); 227 + if (p->o_arg.seqid == NULL) 228 + goto err_free; 229 + atomic_set(&p->count, 1); 230 + p->dentry = dget(dentry); 231 + p->dir = parent; 232 + p->owner = sp; 233 + atomic_inc(&sp->so_count); 234 + p->o_arg.fh = NFS_FH(dir); 235 + p->o_arg.open_flags = flags, 236 + p->o_arg.clientid = server->nfs4_state->cl_clientid; 237 + p->o_arg.id = sp->so_id; 238 + p->o_arg.name = &dentry->d_name; 239 + p->o_arg.server = server; 240 + p->o_arg.bitmask = server->attr_bitmask; 241 + p->o_arg.claim = NFS4_OPEN_CLAIM_NULL; 242 + p->o_res.f_attr = &p->f_attr; 243 + p->o_res.dir_attr = &p->dir_attr; 244 + p->o_res.server = server; 245 + nfs_fattr_init(&p->f_attr); 246 + nfs_fattr_init(&p->dir_attr); 247 + if (flags & O_EXCL) { 248 + u32 *s = (u32 *) p->o_arg.u.verifier.data; 249 + s[0] = jiffies; 250 + s[1] = current->pid; 251 + } else if (flags & O_CREAT) { 252 + p->o_arg.u.attrs = &p->attrs; 253 + memcpy(&p->attrs, attrs, sizeof(p->attrs)); 254 + } 255 + p->c_arg.fh = &p->o_res.fh; 256 + p->c_arg.stateid = &p->o_res.stateid; 257 + p->c_arg.seqid = p->o_arg.seqid; 258 + return p; 259 + err_free: 260 + kfree(p); 261 + err: 262 + dput(parent); 263 + return NULL; 264 + } 265 + 266 + static void nfs4_opendata_free(struct nfs4_opendata *p) 267 + { 268 + if (p != NULL && atomic_dec_and_test(&p->count)) { 269 + nfs_free_seqid(p->o_arg.seqid); 270 + nfs4_put_state_owner(p->owner); 271 + dput(p->dir); 272 + dput(p->dentry); 273 + kfree(p); 274 + } 275 + } 276 + 198 277 /* Helper for asynchronous RPC calls */ 199 - static int nfs4_call_async(struct rpc_clnt *clnt, rpc_action tk_begin, 200 - rpc_action tk_exit, void *calldata) 278 + static int nfs4_call_async(struct rpc_clnt *clnt, 279 + const struct rpc_call_ops *tk_ops, void *calldata) 201 280 { 202 281 struct rpc_task *task; 203 282 204 - if (!(task = rpc_new_task(clnt, tk_exit, RPC_TASK_ASYNC))) 283 + if (!(task = rpc_new_task(clnt, RPC_TASK_ASYNC, tk_ops, calldata))) 205 284 return -ENOMEM; 206 - 207 - task->tk_calldata = calldata; 208 - task->tk_action = tk_begin; 209 285 rpc_execute(task); 210 286 return 0; 287 + } 288 + 289 + static int nfs4_wait_for_completion_rpc_task(struct rpc_task *task) 290 + { 291 + sigset_t oldset; 292 + int ret; 293 + 294 + rpc_clnt_sigmask(task->tk_client, &oldset); 295 + ret = rpc_wait_for_completion_task(task); 296 + rpc_clnt_sigunmask(task->tk_client, &oldset); 297 + return ret; 298 + } 299 + 300 + static inline void update_open_stateflags(struct nfs4_state *state, mode_t open_flags) 301 + { 302 + switch (open_flags) { 303 + case FMODE_WRITE: 304 + state->n_wronly++; 305 + break; 306 + case FMODE_READ: 307 + state->n_rdonly++; 308 + break; 309 + case FMODE_READ|FMODE_WRITE: 310 + state->n_rdwr++; 311 + } 211 312 } 212 313 213 314 static void update_open_stateid(struct nfs4_state *state, nfs4_stateid *stateid, int open_flags) ··· 321 218 spin_lock(&state->owner->so_lock); 322 219 spin_lock(&inode->i_lock); 323 220 memcpy(&state->stateid, stateid, sizeof(state->stateid)); 324 - if ((open_flags & FMODE_WRITE)) 325 - state->nwriters++; 326 - if (open_flags & FMODE_READ) 327 - state->nreaders++; 221 + update_open_stateflags(state, open_flags); 328 222 nfs4_state_set_mode_locked(state, state->state | open_flags); 329 223 spin_unlock(&inode->i_lock); 330 224 spin_unlock(&state->owner->so_lock); 225 + } 226 + 227 + static struct nfs4_state *nfs4_opendata_to_nfs4_state(struct nfs4_opendata *data) 228 + { 229 + struct inode *inode; 230 + struct nfs4_state *state = NULL; 231 + 232 + if (!(data->f_attr.valid & NFS_ATTR_FATTR)) 233 + goto out; 234 + inode = nfs_fhget(data->dir->d_sb, &data->o_res.fh, &data->f_attr); 235 + if (inode == NULL) 236 + goto out; 237 + state = nfs4_get_open_state(inode, data->owner); 238 + if (state == NULL) 239 + goto put_inode; 240 + update_open_stateid(state, &data->o_res.stateid, data->o_arg.open_flags); 241 + put_inode: 242 + iput(inode); 243 + out: 244 + return state; 245 + } 246 + 247 + static struct nfs_open_context *nfs4_state_find_open_context(struct nfs4_state *state) 248 + { 249 + struct nfs_inode *nfsi = NFS_I(state->inode); 250 + struct nfs_open_context *ctx; 251 + 252 + spin_lock(&state->inode->i_lock); 253 + list_for_each_entry(ctx, &nfsi->open_files, list) { 254 + if (ctx->state != state) 255 + continue; 256 + get_nfs_open_context(ctx); 257 + spin_unlock(&state->inode->i_lock); 258 + return ctx; 259 + } 260 + spin_unlock(&state->inode->i_lock); 261 + return ERR_PTR(-ENOENT); 262 + } 263 + 264 + static int nfs4_open_recover_helper(struct nfs4_opendata *opendata, mode_t openflags, nfs4_stateid *stateid) 265 + { 266 + int ret; 267 + 268 + opendata->o_arg.open_flags = openflags; 269 + ret = _nfs4_proc_open(opendata); 270 + if (ret != 0) 271 + return ret; 272 + memcpy(stateid->data, opendata->o_res.stateid.data, 273 + sizeof(stateid->data)); 274 + return 0; 275 + } 276 + 277 + static int nfs4_open_recover(struct nfs4_opendata *opendata, struct nfs4_state *state) 278 + { 279 + nfs4_stateid stateid; 280 + struct nfs4_state *newstate; 281 + int mode = 0; 282 + int delegation = 0; 283 + int ret; 284 + 285 + /* memory barrier prior to reading state->n_* */ 286 + smp_rmb(); 287 + if (state->n_rdwr != 0) { 288 + ret = nfs4_open_recover_helper(opendata, FMODE_READ|FMODE_WRITE, &stateid); 289 + if (ret != 0) 290 + return ret; 291 + mode |= FMODE_READ|FMODE_WRITE; 292 + if (opendata->o_res.delegation_type != 0) 293 + delegation = opendata->o_res.delegation_type; 294 + smp_rmb(); 295 + } 296 + if (state->n_wronly != 0) { 297 + ret = nfs4_open_recover_helper(opendata, FMODE_WRITE, &stateid); 298 + if (ret != 0) 299 + return ret; 300 + mode |= FMODE_WRITE; 301 + if (opendata->o_res.delegation_type != 0) 302 + delegation = opendata->o_res.delegation_type; 303 + smp_rmb(); 304 + } 305 + if (state->n_rdonly != 0) { 306 + ret = nfs4_open_recover_helper(opendata, FMODE_READ, &stateid); 307 + if (ret != 0) 308 + return ret; 309 + mode |= FMODE_READ; 310 + } 311 + clear_bit(NFS_DELEGATED_STATE, &state->flags); 312 + if (mode == 0) 313 + return 0; 314 + if (opendata->o_res.delegation_type == 0) 315 + opendata->o_res.delegation_type = delegation; 316 + opendata->o_arg.open_flags |= mode; 317 + newstate = nfs4_opendata_to_nfs4_state(opendata); 318 + if (newstate != NULL) { 319 + if (opendata->o_res.delegation_type != 0) { 320 + struct nfs_inode *nfsi = NFS_I(newstate->inode); 321 + int delegation_flags = 0; 322 + if (nfsi->delegation) 323 + delegation_flags = nfsi->delegation->flags; 324 + if (!(delegation_flags & NFS_DELEGATION_NEED_RECLAIM)) 325 + nfs_inode_set_delegation(newstate->inode, 326 + opendata->owner->so_cred, 327 + &opendata->o_res); 328 + else 329 + nfs_inode_reclaim_delegation(newstate->inode, 330 + opendata->owner->so_cred, 331 + &opendata->o_res); 332 + } 333 + nfs4_close_state(newstate, opendata->o_arg.open_flags); 334 + } 335 + if (newstate != state) 336 + return -ESTALE; 337 + return 0; 331 338 } 332 339 333 340 /* 334 341 * OPEN_RECLAIM: 335 342 * reclaim state on the server after a reboot. 336 343 */ 337 - static int _nfs4_open_reclaim(struct nfs4_state_owner *sp, struct nfs4_state *state) 344 + static int _nfs4_do_open_reclaim(struct nfs4_state_owner *sp, struct nfs4_state *state, struct dentry *dentry) 338 345 { 339 - struct inode *inode = state->inode; 340 - struct nfs_server *server = NFS_SERVER(inode); 341 - struct nfs_delegation *delegation = NFS_I(inode)->delegation; 342 - struct nfs_openargs o_arg = { 343 - .fh = NFS_FH(inode), 344 - .id = sp->so_id, 345 - .open_flags = state->state, 346 - .clientid = server->nfs4_state->cl_clientid, 347 - .claim = NFS4_OPEN_CLAIM_PREVIOUS, 348 - .bitmask = server->attr_bitmask, 349 - }; 350 - struct nfs_openres o_res = { 351 - .server = server, /* Grrr */ 352 - }; 353 - struct rpc_message msg = { 354 - .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_OPEN_NOATTR], 355 - .rpc_argp = &o_arg, 356 - .rpc_resp = &o_res, 357 - .rpc_cred = sp->so_cred, 358 - }; 346 + struct nfs_delegation *delegation = NFS_I(state->inode)->delegation; 347 + struct nfs4_opendata *opendata; 348 + int delegation_type = 0; 359 349 int status; 360 350 361 351 if (delegation != NULL) { ··· 458 262 set_bit(NFS_DELEGATED_STATE, &state->flags); 459 263 return 0; 460 264 } 461 - o_arg.u.delegation_type = delegation->type; 265 + delegation_type = delegation->type; 462 266 } 463 - o_arg.seqid = nfs_alloc_seqid(&sp->so_seqid); 464 - if (o_arg.seqid == NULL) 267 + opendata = nfs4_opendata_alloc(dentry, sp, 0, NULL); 268 + if (opendata == NULL) 465 269 return -ENOMEM; 466 - status = rpc_call_sync(server->client, &msg, RPC_TASK_NOINTR); 467 - /* Confirm the sequence as being established */ 468 - nfs_confirm_seqid(&sp->so_seqid, status); 469 - nfs_increment_open_seqid(status, o_arg.seqid); 470 - if (status == 0) { 471 - memcpy(&state->stateid, &o_res.stateid, sizeof(state->stateid)); 472 - if (o_res.delegation_type != 0) { 473 - nfs_inode_reclaim_delegation(inode, sp->so_cred, &o_res); 474 - /* Did the server issue an immediate delegation recall? */ 475 - if (o_res.do_recall) 476 - nfs_async_inode_return_delegation(inode, &o_res.stateid); 477 - } 478 - } 479 - nfs_free_seqid(o_arg.seqid); 480 - clear_bit(NFS_DELEGATED_STATE, &state->flags); 481 - /* Ensure we update the inode attributes */ 482 - NFS_CACHEINV(inode); 270 + opendata->o_arg.claim = NFS4_OPEN_CLAIM_PREVIOUS; 271 + opendata->o_arg.fh = NFS_FH(state->inode); 272 + nfs_copy_fh(&opendata->o_res.fh, opendata->o_arg.fh); 273 + opendata->o_arg.u.delegation_type = delegation_type; 274 + status = nfs4_open_recover(opendata, state); 275 + nfs4_opendata_free(opendata); 483 276 return status; 484 277 } 485 278 486 - static int nfs4_open_reclaim(struct nfs4_state_owner *sp, struct nfs4_state *state) 279 + static int nfs4_do_open_reclaim(struct nfs4_state_owner *sp, struct nfs4_state *state, struct dentry *dentry) 487 280 { 488 281 struct nfs_server *server = NFS_SERVER(state->inode); 489 282 struct nfs4_exception exception = { }; 490 283 int err; 491 284 do { 492 - err = _nfs4_open_reclaim(sp, state); 285 + err = _nfs4_do_open_reclaim(sp, state, dentry); 493 286 if (err != -NFS4ERR_DELAY) 494 287 break; 495 288 nfs4_handle_exception(server, err, &exception); ··· 486 301 return err; 487 302 } 488 303 304 + static int nfs4_open_reclaim(struct nfs4_state_owner *sp, struct nfs4_state *state) 305 + { 306 + struct nfs_open_context *ctx; 307 + int ret; 308 + 309 + ctx = nfs4_state_find_open_context(state); 310 + if (IS_ERR(ctx)) 311 + return PTR_ERR(ctx); 312 + ret = nfs4_do_open_reclaim(sp, state, ctx->dentry); 313 + put_nfs_open_context(ctx); 314 + return ret; 315 + } 316 + 489 317 static int _nfs4_open_delegation_recall(struct dentry *dentry, struct nfs4_state *state) 490 318 { 491 319 struct nfs4_state_owner *sp = state->owner; 492 - struct inode *inode = dentry->d_inode; 493 - struct nfs_server *server = NFS_SERVER(inode); 494 - struct dentry *parent = dget_parent(dentry); 495 - struct nfs_openargs arg = { 496 - .fh = NFS_FH(parent->d_inode), 497 - .clientid = server->nfs4_state->cl_clientid, 498 - .name = &dentry->d_name, 499 - .id = sp->so_id, 500 - .server = server, 501 - .bitmask = server->attr_bitmask, 502 - .claim = NFS4_OPEN_CLAIM_DELEGATE_CUR, 503 - }; 504 - struct nfs_openres res = { 505 - .server = server, 506 - }; 507 - struct rpc_message msg = { 508 - .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_OPEN_NOATTR], 509 - .rpc_argp = &arg, 510 - .rpc_resp = &res, 511 - .rpc_cred = sp->so_cred, 512 - }; 513 - int status = 0; 320 + struct nfs4_opendata *opendata; 321 + int ret; 514 322 515 323 if (!test_bit(NFS_DELEGATED_STATE, &state->flags)) 516 - goto out; 517 - if (state->state == 0) 518 - goto out; 519 - arg.seqid = nfs_alloc_seqid(&sp->so_seqid); 520 - status = -ENOMEM; 521 - if (arg.seqid == NULL) 522 - goto out; 523 - arg.open_flags = state->state; 524 - memcpy(arg.u.delegation.data, state->stateid.data, sizeof(arg.u.delegation.data)); 525 - status = rpc_call_sync(server->client, &msg, RPC_TASK_NOINTR); 526 - nfs_increment_open_seqid(status, arg.seqid); 527 - if (status != 0) 528 - goto out_free; 529 - if(res.rflags & NFS4_OPEN_RESULT_CONFIRM) { 530 - status = _nfs4_proc_open_confirm(server->client, NFS_FH(inode), 531 - sp, &res.stateid, arg.seqid); 532 - if (status != 0) 533 - goto out_free; 534 - } 535 - nfs_confirm_seqid(&sp->so_seqid, 0); 536 - if (status >= 0) { 537 - memcpy(state->stateid.data, res.stateid.data, 538 - sizeof(state->stateid.data)); 539 - clear_bit(NFS_DELEGATED_STATE, &state->flags); 540 - } 541 - out_free: 542 - nfs_free_seqid(arg.seqid); 543 - out: 544 - dput(parent); 545 - return status; 324 + return 0; 325 + opendata = nfs4_opendata_alloc(dentry, sp, 0, NULL); 326 + if (opendata == NULL) 327 + return -ENOMEM; 328 + opendata->o_arg.claim = NFS4_OPEN_CLAIM_DELEGATE_CUR; 329 + memcpy(opendata->o_arg.u.delegation.data, state->stateid.data, 330 + sizeof(opendata->o_arg.u.delegation.data)); 331 + ret = nfs4_open_recover(opendata, state); 332 + nfs4_opendata_free(opendata); 333 + return ret; 546 334 } 547 335 548 336 int nfs4_open_delegation_recall(struct dentry *dentry, struct nfs4_state *state) ··· 540 382 return err; 541 383 } 542 384 543 - static int _nfs4_proc_open_confirm(struct rpc_clnt *clnt, const struct nfs_fh *fh, struct nfs4_state_owner *sp, nfs4_stateid *stateid, struct nfs_seqid *seqid) 385 + static void nfs4_open_confirm_prepare(struct rpc_task *task, void *calldata) 544 386 { 545 - struct nfs_open_confirmargs arg = { 546 - .fh = fh, 547 - .seqid = seqid, 548 - .stateid = *stateid, 387 + struct nfs4_opendata *data = calldata; 388 + struct rpc_message msg = { 389 + .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_OPEN_CONFIRM], 390 + .rpc_argp = &data->c_arg, 391 + .rpc_resp = &data->c_res, 392 + .rpc_cred = data->owner->so_cred, 549 393 }; 550 - struct nfs_open_confirmres res; 551 - struct rpc_message msg = { 552 - .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_OPEN_CONFIRM], 553 - .rpc_argp = &arg, 554 - .rpc_resp = &res, 555 - .rpc_cred = sp->so_cred, 556 - }; 394 + data->timestamp = jiffies; 395 + rpc_call_setup(task, &msg, 0); 396 + } 397 + 398 + static void nfs4_open_confirm_done(struct rpc_task *task, void *calldata) 399 + { 400 + struct nfs4_opendata *data = calldata; 401 + 402 + data->rpc_status = task->tk_status; 403 + if (RPC_ASSASSINATED(task)) 404 + return; 405 + if (data->rpc_status == 0) { 406 + memcpy(data->o_res.stateid.data, data->c_res.stateid.data, 407 + sizeof(data->o_res.stateid.data)); 408 + renew_lease(data->o_res.server, data->timestamp); 409 + } 410 + nfs_increment_open_seqid(data->rpc_status, data->c_arg.seqid); 411 + nfs_confirm_seqid(&data->owner->so_seqid, data->rpc_status); 412 + } 413 + 414 + static void nfs4_open_confirm_release(void *calldata) 415 + { 416 + struct nfs4_opendata *data = calldata; 417 + struct nfs4_state *state = NULL; 418 + 419 + /* If this request hasn't been cancelled, do nothing */ 420 + if (data->cancelled == 0) 421 + goto out_free; 422 + /* In case of error, no cleanup! */ 423 + if (data->rpc_status != 0) 424 + goto out_free; 425 + nfs_confirm_seqid(&data->owner->so_seqid, 0); 426 + state = nfs4_opendata_to_nfs4_state(data); 427 + if (state != NULL) 428 + nfs4_close_state(state, data->o_arg.open_flags); 429 + out_free: 430 + nfs4_opendata_free(data); 431 + } 432 + 433 + static const struct rpc_call_ops nfs4_open_confirm_ops = { 434 + .rpc_call_prepare = nfs4_open_confirm_prepare, 435 + .rpc_call_done = nfs4_open_confirm_done, 436 + .rpc_release = nfs4_open_confirm_release, 437 + }; 438 + 439 + /* 440 + * Note: On error, nfs4_proc_open_confirm will free the struct nfs4_opendata 441 + */ 442 + static int _nfs4_proc_open_confirm(struct nfs4_opendata *data) 443 + { 444 + struct nfs_server *server = NFS_SERVER(data->dir->d_inode); 445 + struct rpc_task *task; 557 446 int status; 558 447 559 - status = rpc_call_sync(clnt, &msg, RPC_TASK_NOINTR); 560 - /* Confirm the sequence as being established */ 561 - nfs_confirm_seqid(&sp->so_seqid, status); 562 - nfs_increment_open_seqid(status, seqid); 563 - if (status >= 0) 564 - memcpy(stateid, &res.stateid, sizeof(*stateid)); 448 + atomic_inc(&data->count); 449 + task = rpc_run_task(server->client, RPC_TASK_ASYNC, &nfs4_open_confirm_ops, data); 450 + if (IS_ERR(task)) { 451 + nfs4_opendata_free(data); 452 + return PTR_ERR(task); 453 + } 454 + status = nfs4_wait_for_completion_rpc_task(task); 455 + if (status != 0) { 456 + data->cancelled = 1; 457 + smp_wmb(); 458 + } else 459 + status = data->rpc_status; 460 + rpc_release_task(task); 565 461 return status; 566 462 } 567 463 568 - static int _nfs4_proc_open(struct inode *dir, struct nfs4_state_owner *sp, struct nfs_openargs *o_arg, struct nfs_openres *o_res) 464 + static void nfs4_open_prepare(struct rpc_task *task, void *calldata) 569 465 { 570 - struct nfs_server *server = NFS_SERVER(dir); 466 + struct nfs4_opendata *data = calldata; 467 + struct nfs4_state_owner *sp = data->owner; 571 468 struct rpc_message msg = { 572 469 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_OPEN], 573 - .rpc_argp = o_arg, 574 - .rpc_resp = o_res, 470 + .rpc_argp = &data->o_arg, 471 + .rpc_resp = &data->o_res, 575 472 .rpc_cred = sp->so_cred, 576 473 }; 577 - int status; 474 + 475 + if (nfs_wait_on_sequence(data->o_arg.seqid, task) != 0) 476 + return; 477 + /* Update sequence id. */ 478 + data->o_arg.id = sp->so_id; 479 + data->o_arg.clientid = sp->so_client->cl_clientid; 480 + if (data->o_arg.claim == NFS4_OPEN_CLAIM_PREVIOUS) 481 + msg.rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_OPEN_NOATTR]; 482 + data->timestamp = jiffies; 483 + rpc_call_setup(task, &msg, 0); 484 + } 578 485 579 - /* Update sequence id. The caller must serialize! */ 580 - o_arg->id = sp->so_id; 581 - o_arg->clientid = sp->so_client->cl_clientid; 486 + static void nfs4_open_done(struct rpc_task *task, void *calldata) 487 + { 488 + struct nfs4_opendata *data = calldata; 582 489 583 - status = rpc_call_sync(server->client, &msg, RPC_TASK_NOINTR); 584 - if (status == 0) { 585 - /* OPEN on anything except a regular file is disallowed in NFSv4 */ 586 - switch (o_res->f_attr->mode & S_IFMT) { 490 + data->rpc_status = task->tk_status; 491 + if (RPC_ASSASSINATED(task)) 492 + return; 493 + if (task->tk_status == 0) { 494 + switch (data->o_res.f_attr->mode & S_IFMT) { 587 495 case S_IFREG: 588 496 break; 589 497 case S_IFLNK: 590 - status = -ELOOP; 498 + data->rpc_status = -ELOOP; 591 499 break; 592 500 case S_IFDIR: 593 - status = -EISDIR; 501 + data->rpc_status = -EISDIR; 594 502 break; 595 503 default: 596 - status = -ENOTDIR; 504 + data->rpc_status = -ENOTDIR; 597 505 } 506 + renew_lease(data->o_res.server, data->timestamp); 598 507 } 508 + nfs_increment_open_seqid(data->rpc_status, data->o_arg.seqid); 509 + } 599 510 600 - nfs_increment_open_seqid(status, o_arg->seqid); 511 + static void nfs4_open_release(void *calldata) 512 + { 513 + struct nfs4_opendata *data = calldata; 514 + struct nfs4_state *state = NULL; 515 + 516 + /* If this request hasn't been cancelled, do nothing */ 517 + if (data->cancelled == 0) 518 + goto out_free; 519 + /* In case of error, no cleanup! */ 520 + if (data->rpc_status != 0) 521 + goto out_free; 522 + /* In case we need an open_confirm, no cleanup! */ 523 + if (data->o_res.rflags & NFS4_OPEN_RESULT_CONFIRM) 524 + goto out_free; 525 + nfs_confirm_seqid(&data->owner->so_seqid, 0); 526 + state = nfs4_opendata_to_nfs4_state(data); 527 + if (state != NULL) 528 + nfs4_close_state(state, data->o_arg.open_flags); 529 + out_free: 530 + nfs4_opendata_free(data); 531 + } 532 + 533 + static const struct rpc_call_ops nfs4_open_ops = { 534 + .rpc_call_prepare = nfs4_open_prepare, 535 + .rpc_call_done = nfs4_open_done, 536 + .rpc_release = nfs4_open_release, 537 + }; 538 + 539 + /* 540 + * Note: On error, nfs4_proc_open will free the struct nfs4_opendata 541 + */ 542 + static int _nfs4_proc_open(struct nfs4_opendata *data) 543 + { 544 + struct inode *dir = data->dir->d_inode; 545 + struct nfs_server *server = NFS_SERVER(dir); 546 + struct nfs_openargs *o_arg = &data->o_arg; 547 + struct nfs_openres *o_res = &data->o_res; 548 + struct rpc_task *task; 549 + int status; 550 + 551 + atomic_inc(&data->count); 552 + task = rpc_run_task(server->client, RPC_TASK_ASYNC, &nfs4_open_ops, data); 553 + if (IS_ERR(task)) { 554 + nfs4_opendata_free(data); 555 + return PTR_ERR(task); 556 + } 557 + status = nfs4_wait_for_completion_rpc_task(task); 558 + if (status != 0) { 559 + data->cancelled = 1; 560 + smp_wmb(); 561 + } else 562 + status = data->rpc_status; 563 + rpc_release_task(task); 601 564 if (status != 0) 602 - goto out; 565 + return status; 566 + 603 567 if (o_arg->open_flags & O_CREAT) { 604 568 update_changeattr(dir, &o_res->cinfo); 605 569 nfs_post_op_update_inode(dir, o_res->dir_attr); 606 570 } else 607 571 nfs_refresh_inode(dir, o_res->dir_attr); 608 572 if(o_res->rflags & NFS4_OPEN_RESULT_CONFIRM) { 609 - status = _nfs4_proc_open_confirm(server->client, &o_res->fh, 610 - sp, &o_res->stateid, o_arg->seqid); 573 + status = _nfs4_proc_open_confirm(data); 611 574 if (status != 0) 612 - goto out; 575 + return status; 613 576 } 614 - nfs_confirm_seqid(&sp->so_seqid, 0); 577 + nfs_confirm_seqid(&data->owner->so_seqid, 0); 615 578 if (!(o_res->f_attr->valid & NFS_ATTR_FATTR)) 616 - status = server->rpc_ops->getattr(server, &o_res->fh, o_res->f_attr); 617 - out: 618 - return status; 579 + return server->rpc_ops->getattr(server, &o_res->fh, o_res->f_attr); 580 + return 0; 619 581 } 620 582 621 583 static int _nfs4_do_access(struct inode *inode, struct rpc_cred *cred, int openflags) ··· 766 488 return -EACCES; 767 489 } 768 490 491 + int nfs4_recover_expired_lease(struct nfs_server *server) 492 + { 493 + struct nfs4_client *clp = server->nfs4_state; 494 + 495 + if (test_and_clear_bit(NFS4CLNT_LEASE_EXPIRED, &clp->cl_state)) 496 + nfs4_schedule_state_recovery(clp); 497 + return nfs4_wait_clnt_recover(server->client, clp); 498 + } 499 + 769 500 /* 770 501 * OPEN_EXPIRED: 771 502 * reclaim state on the server after a network partition. ··· 782 495 */ 783 496 static int _nfs4_open_expired(struct nfs4_state_owner *sp, struct nfs4_state *state, struct dentry *dentry) 784 497 { 785 - struct dentry *parent = dget_parent(dentry); 786 - struct inode *dir = parent->d_inode; 787 498 struct inode *inode = state->inode; 788 - struct nfs_server *server = NFS_SERVER(dir); 789 499 struct nfs_delegation *delegation = NFS_I(inode)->delegation; 790 - struct nfs_fattr f_attr, dir_attr; 791 - struct nfs_openargs o_arg = { 792 - .fh = NFS_FH(dir), 793 - .open_flags = state->state, 794 - .name = &dentry->d_name, 795 - .bitmask = server->attr_bitmask, 796 - .claim = NFS4_OPEN_CLAIM_NULL, 797 - }; 798 - struct nfs_openres o_res = { 799 - .f_attr = &f_attr, 800 - .dir_attr = &dir_attr, 801 - .server = server, 802 - }; 803 - int status = 0; 500 + struct nfs4_opendata *opendata; 501 + int openflags = state->state & (FMODE_READ|FMODE_WRITE); 502 + int ret; 804 503 805 504 if (delegation != NULL && !(delegation->flags & NFS_DELEGATION_NEED_RECLAIM)) { 806 - status = _nfs4_do_access(inode, sp->so_cred, state->state); 807 - if (status < 0) 808 - goto out; 505 + ret = _nfs4_do_access(inode, sp->so_cred, openflags); 506 + if (ret < 0) 507 + return ret; 809 508 memcpy(&state->stateid, &delegation->stateid, sizeof(state->stateid)); 810 509 set_bit(NFS_DELEGATED_STATE, &state->flags); 811 - goto out; 510 + return 0; 812 511 } 813 - o_arg.seqid = nfs_alloc_seqid(&sp->so_seqid); 814 - status = -ENOMEM; 815 - if (o_arg.seqid == NULL) 816 - goto out; 817 - nfs_fattr_init(&f_attr); 818 - nfs_fattr_init(&dir_attr); 819 - status = _nfs4_proc_open(dir, sp, &o_arg, &o_res); 820 - if (status != 0) 821 - goto out_nodeleg; 822 - /* Check if files differ */ 823 - if ((f_attr.mode & S_IFMT) != (inode->i_mode & S_IFMT)) 824 - goto out_stale; 825 - /* Has the file handle changed? */ 826 - if (nfs_compare_fh(&o_res.fh, NFS_FH(inode)) != 0) { 827 - /* Verify if the change attributes are the same */ 828 - if (f_attr.change_attr != NFS_I(inode)->change_attr) 829 - goto out_stale; 830 - if (nfs_size_to_loff_t(f_attr.size) != inode->i_size) 831 - goto out_stale; 832 - /* Lets just pretend that this is the same file */ 833 - nfs_copy_fh(NFS_FH(inode), &o_res.fh); 834 - NFS_I(inode)->fileid = f_attr.fileid; 512 + opendata = nfs4_opendata_alloc(dentry, sp, openflags, NULL); 513 + if (opendata == NULL) 514 + return -ENOMEM; 515 + ret = nfs4_open_recover(opendata, state); 516 + if (ret == -ESTALE) { 517 + /* Invalidate the state owner so we don't ever use it again */ 518 + nfs4_drop_state_owner(sp); 519 + d_drop(dentry); 835 520 } 836 - memcpy(&state->stateid, &o_res.stateid, sizeof(state->stateid)); 837 - if (o_res.delegation_type != 0) { 838 - if (!(delegation->flags & NFS_DELEGATION_NEED_RECLAIM)) 839 - nfs_inode_set_delegation(inode, sp->so_cred, &o_res); 840 - else 841 - nfs_inode_reclaim_delegation(inode, sp->so_cred, &o_res); 842 - } 843 - out_nodeleg: 844 - nfs_free_seqid(o_arg.seqid); 845 - clear_bit(NFS_DELEGATED_STATE, &state->flags); 846 - out: 847 - dput(parent); 848 - return status; 849 - out_stale: 850 - status = -ESTALE; 851 - /* Invalidate the state owner so we don't ever use it again */ 852 - nfs4_drop_state_owner(sp); 853 - d_drop(dentry); 854 - /* Should we be trying to close that stateid? */ 855 - goto out_nodeleg; 521 + nfs4_opendata_free(opendata); 522 + return ret; 856 523 } 857 524 858 525 static inline int nfs4_do_open_expired(struct nfs4_state_owner *sp, struct nfs4_state *state, struct dentry *dentry) ··· 825 584 826 585 static int nfs4_open_expired(struct nfs4_state_owner *sp, struct nfs4_state *state) 827 586 { 828 - struct nfs_inode *nfsi = NFS_I(state->inode); 829 587 struct nfs_open_context *ctx; 830 - int status; 588 + int ret; 831 589 832 - spin_lock(&state->inode->i_lock); 833 - list_for_each_entry(ctx, &nfsi->open_files, list) { 834 - if (ctx->state != state) 835 - continue; 836 - get_nfs_open_context(ctx); 837 - spin_unlock(&state->inode->i_lock); 838 - status = nfs4_do_open_expired(sp, state, ctx->dentry); 839 - put_nfs_open_context(ctx); 840 - return status; 841 - } 842 - spin_unlock(&state->inode->i_lock); 843 - return -ENOENT; 590 + ctx = nfs4_state_find_open_context(state); 591 + if (IS_ERR(ctx)) 592 + return PTR_ERR(ctx); 593 + ret = nfs4_do_open_expired(sp, state, ctx->dentry); 594 + put_nfs_open_context(ctx); 595 + return ret; 844 596 } 845 597 846 598 /* 847 - * Returns an nfs4_state + an extra reference to the inode 599 + * Returns a referenced nfs4_state if there is an open delegation on the file 848 600 */ 849 601 static int _nfs4_open_delegated(struct inode *inode, int flags, struct rpc_cred *cred, struct nfs4_state **res) 850 602 { ··· 850 616 int open_flags = flags & (FMODE_READ|FMODE_WRITE); 851 617 int err; 852 618 619 + err = -ENOMEM; 620 + if (!(sp = nfs4_get_state_owner(server, cred))) { 621 + dprintk("%s: nfs4_get_state_owner failed!\n", __FUNCTION__); 622 + return err; 623 + } 624 + err = nfs4_recover_expired_lease(server); 625 + if (err != 0) 626 + goto out_put_state_owner; 853 627 /* Protect against reboot recovery - NOTE ORDER! */ 854 628 down_read(&clp->cl_sem); 855 629 /* Protect against delegation recall */ ··· 867 625 if (delegation == NULL || (delegation->type & open_flags) != open_flags) 868 626 goto out_err; 869 627 err = -ENOMEM; 870 - if (!(sp = nfs4_get_state_owner(server, cred))) { 871 - dprintk("%s: nfs4_get_state_owner failed!\n", __FUNCTION__); 872 - goto out_err; 873 - } 874 628 state = nfs4_get_open_state(inode, sp); 875 629 if (state == NULL) 876 630 goto out_err; ··· 874 636 err = -ENOENT; 875 637 if ((state->state & open_flags) == open_flags) { 876 638 spin_lock(&inode->i_lock); 877 - if (open_flags & FMODE_READ) 878 - state->nreaders++; 879 - if (open_flags & FMODE_WRITE) 880 - state->nwriters++; 639 + update_open_stateflags(state, open_flags); 881 640 spin_unlock(&inode->i_lock); 882 641 goto out_ok; 883 642 } else if (state->state != 0) 884 - goto out_err; 643 + goto out_put_open_state; 885 644 886 645 lock_kernel(); 887 646 err = _nfs4_do_access(inode, cred, open_flags); 888 647 unlock_kernel(); 889 648 if (err != 0) 890 - goto out_err; 649 + goto out_put_open_state; 891 650 set_bit(NFS_DELEGATED_STATE, &state->flags); 892 651 update_open_stateid(state, &delegation->stateid, open_flags); 893 652 out_ok: 894 653 nfs4_put_state_owner(sp); 895 654 up_read(&nfsi->rwsem); 896 655 up_read(&clp->cl_sem); 897 - igrab(inode); 898 656 *res = state; 899 - return 0; 657 + return 0; 658 + out_put_open_state: 659 + nfs4_put_open_state(state); 900 660 out_err: 901 - if (sp != NULL) { 902 - if (state != NULL) 903 - nfs4_put_open_state(state); 904 - nfs4_put_state_owner(sp); 905 - } 906 661 up_read(&nfsi->rwsem); 907 662 up_read(&clp->cl_sem); 908 663 if (err != -EACCES) 909 664 nfs_inode_return_delegation(inode); 665 + out_put_state_owner: 666 + nfs4_put_state_owner(sp); 910 667 return err; 911 668 } 912 669 ··· 922 689 } 923 690 924 691 /* 925 - * Returns an nfs4_state + an referenced inode 692 + * Returns a referenced nfs4_state 926 693 */ 927 694 static int _nfs4_do_open(struct inode *dir, struct dentry *dentry, int flags, struct iattr *sattr, struct rpc_cred *cred, struct nfs4_state **res) 928 695 { ··· 930 697 struct nfs4_state *state = NULL; 931 698 struct nfs_server *server = NFS_SERVER(dir); 932 699 struct nfs4_client *clp = server->nfs4_state; 933 - struct inode *inode = NULL; 700 + struct nfs4_opendata *opendata; 934 701 int status; 935 - struct nfs_fattr f_attr, dir_attr; 936 - struct nfs_openargs o_arg = { 937 - .fh = NFS_FH(dir), 938 - .open_flags = flags, 939 - .name = &dentry->d_name, 940 - .server = server, 941 - .bitmask = server->attr_bitmask, 942 - .claim = NFS4_OPEN_CLAIM_NULL, 943 - }; 944 - struct nfs_openres o_res = { 945 - .f_attr = &f_attr, 946 - .dir_attr = &dir_attr, 947 - .server = server, 948 - }; 949 702 950 703 /* Protect against reboot recovery conflicts */ 951 - down_read(&clp->cl_sem); 952 704 status = -ENOMEM; 953 705 if (!(sp = nfs4_get_state_owner(server, cred))) { 954 706 dprintk("nfs4_do_open: nfs4_get_state_owner failed!\n"); 955 707 goto out_err; 956 708 } 957 - if (flags & O_EXCL) { 958 - u32 *p = (u32 *) o_arg.u.verifier.data; 959 - p[0] = jiffies; 960 - p[1] = current->pid; 961 - } else 962 - o_arg.u.attrs = sattr; 963 - /* Serialization for the sequence id */ 964 - 965 - o_arg.seqid = nfs_alloc_seqid(&sp->so_seqid); 966 - if (o_arg.seqid == NULL) 967 - return -ENOMEM; 968 - nfs_fattr_init(&f_attr); 969 - nfs_fattr_init(&dir_attr); 970 - status = _nfs4_proc_open(dir, sp, &o_arg, &o_res); 709 + status = nfs4_recover_expired_lease(server); 971 710 if (status != 0) 972 - goto out_err; 711 + goto err_put_state_owner; 712 + down_read(&clp->cl_sem); 713 + status = -ENOMEM; 714 + opendata = nfs4_opendata_alloc(dentry, sp, flags, sattr); 715 + if (opendata == NULL) 716 + goto err_put_state_owner; 717 + 718 + status = _nfs4_proc_open(opendata); 719 + if (status != 0) 720 + goto err_opendata_free; 973 721 974 722 status = -ENOMEM; 975 - inode = nfs_fhget(dir->i_sb, &o_res.fh, &f_attr); 976 - if (!inode) 977 - goto out_err; 978 - state = nfs4_get_open_state(inode, sp); 979 - if (!state) 980 - goto out_err; 981 - update_open_stateid(state, &o_res.stateid, flags); 982 - if (o_res.delegation_type != 0) 983 - nfs_inode_set_delegation(inode, cred, &o_res); 984 - nfs_free_seqid(o_arg.seqid); 723 + state = nfs4_opendata_to_nfs4_state(opendata); 724 + if (state == NULL) 725 + goto err_opendata_free; 726 + if (opendata->o_res.delegation_type != 0) 727 + nfs_inode_set_delegation(state->inode, cred, &opendata->o_res); 728 + nfs4_opendata_free(opendata); 985 729 nfs4_put_state_owner(sp); 986 730 up_read(&clp->cl_sem); 987 731 *res = state; 988 732 return 0; 733 + err_opendata_free: 734 + nfs4_opendata_free(opendata); 735 + err_put_state_owner: 736 + nfs4_put_state_owner(sp); 989 737 out_err: 990 - if (sp != NULL) { 991 - if (state != NULL) 992 - nfs4_put_open_state(state); 993 - nfs_free_seqid(o_arg.seqid); 994 - nfs4_put_state_owner(sp); 995 - } 996 738 /* Note: clp->cl_sem must be released before nfs4_put_open_state()! */ 997 739 up_read(&clp->cl_sem); 998 - if (inode != NULL) 999 - iput(inode); 1000 740 *res = NULL; 1001 741 return status; 1002 742 } ··· 1036 830 .rpc_argp = &arg, 1037 831 .rpc_resp = &res, 1038 832 }; 833 + unsigned long timestamp = jiffies; 1039 834 int status; 1040 835 1041 836 nfs_fattr_init(fattr); ··· 1048 841 memcpy(&arg.stateid, &zero_stateid, sizeof(arg.stateid)); 1049 842 1050 843 status = rpc_call_sync(server->client, &msg, 0); 844 + if (status == 0 && state != NULL) 845 + renew_lease(server, timestamp); 1051 846 return status; 1052 847 } 1053 848 ··· 1074 865 struct nfs_closeargs arg; 1075 866 struct nfs_closeres res; 1076 867 struct nfs_fattr fattr; 868 + unsigned long timestamp; 1077 869 }; 1078 870 1079 - static void nfs4_free_closedata(struct nfs4_closedata *calldata) 871 + static void nfs4_free_closedata(void *data) 1080 872 { 1081 - struct nfs4_state *state = calldata->state; 1082 - struct nfs4_state_owner *sp = state->owner; 873 + struct nfs4_closedata *calldata = data; 874 + struct nfs4_state_owner *sp = calldata->state->owner; 1083 875 1084 876 nfs4_put_open_state(calldata->state); 1085 877 nfs_free_seqid(calldata->arg.seqid); ··· 1088 878 kfree(calldata); 1089 879 } 1090 880 1091 - static void nfs4_close_done(struct rpc_task *task) 881 + static void nfs4_close_done(struct rpc_task *task, void *data) 1092 882 { 1093 - struct nfs4_closedata *calldata = (struct nfs4_closedata *)task->tk_calldata; 883 + struct nfs4_closedata *calldata = data; 1094 884 struct nfs4_state *state = calldata->state; 1095 885 struct nfs_server *server = NFS_SERVER(calldata->inode); 1096 886 887 + if (RPC_ASSASSINATED(task)) 888 + return; 1097 889 /* hmm. we are done with the inode, and in the process of freeing 1098 890 * the state_owner. we keep this around to process errors 1099 891 */ ··· 1104 892 case 0: 1105 893 memcpy(&state->stateid, &calldata->res.stateid, 1106 894 sizeof(state->stateid)); 895 + renew_lease(server, calldata->timestamp); 1107 896 break; 1108 897 case -NFS4ERR_STALE_STATEID: 1109 898 case -NFS4ERR_EXPIRED: ··· 1117 904 } 1118 905 } 1119 906 nfs_refresh_inode(calldata->inode, calldata->res.fattr); 1120 - nfs4_free_closedata(calldata); 1121 907 } 1122 908 1123 - static void nfs4_close_begin(struct rpc_task *task) 909 + static void nfs4_close_prepare(struct rpc_task *task, void *data) 1124 910 { 1125 - struct nfs4_closedata *calldata = (struct nfs4_closedata *)task->tk_calldata; 911 + struct nfs4_closedata *calldata = data; 1126 912 struct nfs4_state *state = calldata->state; 1127 913 struct rpc_message msg = { 1128 914 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_CLOSE], ··· 1130 918 .rpc_cred = state->owner->so_cred, 1131 919 }; 1132 920 int mode = 0, old_mode; 1133 - int status; 1134 921 1135 - status = nfs_wait_on_sequence(calldata->arg.seqid, task); 1136 - if (status != 0) 922 + if (nfs_wait_on_sequence(calldata->arg.seqid, task) != 0) 1137 923 return; 1138 924 /* Recalculate the new open mode in case someone reopened the file 1139 925 * while we were waiting in line to be scheduled. ··· 1139 929 spin_lock(&state->owner->so_lock); 1140 930 spin_lock(&calldata->inode->i_lock); 1141 931 mode = old_mode = state->state; 1142 - if (state->nreaders == 0) 1143 - mode &= ~FMODE_READ; 1144 - if (state->nwriters == 0) 1145 - mode &= ~FMODE_WRITE; 932 + if (state->n_rdwr == 0) { 933 + if (state->n_rdonly == 0) 934 + mode &= ~FMODE_READ; 935 + if (state->n_wronly == 0) 936 + mode &= ~FMODE_WRITE; 937 + } 1146 938 nfs4_state_set_mode_locked(state, mode); 1147 939 spin_unlock(&calldata->inode->i_lock); 1148 940 spin_unlock(&state->owner->so_lock); 1149 941 if (mode == old_mode || test_bit(NFS_DELEGATED_STATE, &state->flags)) { 1150 - nfs4_free_closedata(calldata); 1151 - task->tk_exit = NULL; 1152 - rpc_exit(task, 0); 942 + /* Note: exit _without_ calling nfs4_close_done */ 943 + task->tk_action = NULL; 1153 944 return; 1154 945 } 1155 946 nfs_fattr_init(calldata->res.fattr); 1156 947 if (mode != 0) 1157 948 msg.rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_OPEN_DOWNGRADE]; 1158 949 calldata->arg.open_flags = mode; 950 + calldata->timestamp = jiffies; 1159 951 rpc_call_setup(task, &msg, 0); 1160 952 } 953 + 954 + static const struct rpc_call_ops nfs4_close_ops = { 955 + .rpc_call_prepare = nfs4_close_prepare, 956 + .rpc_call_done = nfs4_close_done, 957 + .rpc_release = nfs4_free_closedata, 958 + }; 1161 959 1162 960 /* 1163 961 * It is possible for data to be read/written from a mem-mapped file ··· 1199 981 calldata->res.fattr = &calldata->fattr; 1200 982 calldata->res.server = server; 1201 983 1202 - status = nfs4_call_async(server->client, nfs4_close_begin, 1203 - nfs4_close_done, calldata); 984 + status = nfs4_call_async(server->client, &nfs4_close_ops, calldata); 1204 985 if (status == 0) 1205 986 goto out; 1206 987 ··· 1251 1034 d_add(dentry, NULL); 1252 1035 return (struct dentry *)state; 1253 1036 } 1254 - res = d_add_unique(dentry, state->inode); 1037 + res = d_add_unique(dentry, igrab(state->inode)); 1255 1038 if (res != NULL) 1256 1039 dentry = res; 1257 1040 nfs4_intent_set_file(nd, dentry, state); ··· 1263 1046 { 1264 1047 struct rpc_cred *cred; 1265 1048 struct nfs4_state *state; 1266 - struct inode *inode; 1267 1049 1268 1050 cred = rpcauth_lookupcred(NFS_SERVER(dir)->client->cl_auth, 0); 1269 1051 if (IS_ERR(cred)) ··· 1286 1070 } 1287 1071 goto out_drop; 1288 1072 } 1289 - inode = state->inode; 1290 - iput(inode); 1291 - if (inode == dentry->d_inode) { 1073 + if (state->inode == dentry->d_inode) { 1292 1074 nfs4_intent_set_file(nd, dentry, state); 1293 1075 return 1; 1294 1076 } ··· 1722 1508 1723 1509 wdata->args.bitmask = server->attr_bitmask; 1724 1510 wdata->res.server = server; 1511 + wdata->timestamp = jiffies; 1725 1512 nfs_fattr_init(fattr); 1726 1513 status = rpc_call_sync(server->client, &msg, rpcflags); 1727 1514 dprintk("NFS reply write: %d\n", status); 1728 1515 if (status < 0) 1729 1516 return status; 1517 + renew_lease(server, wdata->timestamp); 1730 1518 nfs_post_op_update_inode(inode, fattr); 1731 1519 return wdata->res.count; 1732 1520 } ··· 1763 1547 1764 1548 cdata->args.bitmask = server->attr_bitmask; 1765 1549 cdata->res.server = server; 1550 + cdata->timestamp = jiffies; 1766 1551 nfs_fattr_init(fattr); 1767 1552 status = rpc_call_sync(server->client, &msg, 0); 1553 + if (status >= 0) 1554 + renew_lease(server, cdata->timestamp); 1768 1555 dprintk("NFS reply commit: %d\n", status); 1769 1556 if (status >= 0) 1770 1557 nfs_post_op_update_inode(inode, fattr); ··· 1820 1601 status = PTR_ERR(state); 1821 1602 goto out; 1822 1603 } 1823 - d_instantiate(dentry, state->inode); 1604 + d_instantiate(dentry, igrab(state->inode)); 1824 1605 if (flags & O_EXCL) { 1825 1606 struct nfs_fattr fattr; 1826 1607 status = nfs4_do_setattr(NFS_SERVER(dir), &fattr, ··· 2344 2125 return err; 2345 2126 } 2346 2127 2347 - static void 2348 - nfs4_read_done(struct rpc_task *task) 2128 + static void nfs4_read_done(struct rpc_task *task, void *calldata) 2349 2129 { 2350 - struct nfs_read_data *data = (struct nfs_read_data *) task->tk_calldata; 2130 + struct nfs_read_data *data = calldata; 2351 2131 struct inode *inode = data->inode; 2352 2132 2353 2133 if (nfs4_async_handle_error(task, NFS_SERVER(inode)) == -EAGAIN) { ··· 2356 2138 if (task->tk_status > 0) 2357 2139 renew_lease(NFS_SERVER(inode), data->timestamp); 2358 2140 /* Call back common NFS readpage processing */ 2359 - nfs_readpage_result(task); 2141 + nfs_readpage_result(task, calldata); 2360 2142 } 2143 + 2144 + static const struct rpc_call_ops nfs4_read_ops = { 2145 + .rpc_call_done = nfs4_read_done, 2146 + .rpc_release = nfs_readdata_release, 2147 + }; 2361 2148 2362 2149 static void 2363 2150 nfs4_proc_read_setup(struct nfs_read_data *data) ··· 2383 2160 flags = RPC_TASK_ASYNC | (IS_SWAPFILE(inode)? NFS_RPC_SWAPFLAGS : 0); 2384 2161 2385 2162 /* Finalize the task. */ 2386 - rpc_init_task(task, NFS_CLIENT(inode), nfs4_read_done, flags); 2163 + rpc_init_task(task, NFS_CLIENT(inode), flags, &nfs4_read_ops, data); 2387 2164 rpc_call_setup(task, &msg, 0); 2388 2165 } 2389 2166 2390 - static void 2391 - nfs4_write_done(struct rpc_task *task) 2167 + static void nfs4_write_done(struct rpc_task *task, void *calldata) 2392 2168 { 2393 - struct nfs_write_data *data = (struct nfs_write_data *) task->tk_calldata; 2169 + struct nfs_write_data *data = calldata; 2394 2170 struct inode *inode = data->inode; 2395 2171 2396 2172 if (nfs4_async_handle_error(task, NFS_SERVER(inode)) == -EAGAIN) { ··· 2401 2179 nfs_post_op_update_inode(inode, data->res.fattr); 2402 2180 } 2403 2181 /* Call back common NFS writeback processing */ 2404 - nfs_writeback_done(task); 2182 + nfs_writeback_done(task, calldata); 2405 2183 } 2184 + 2185 + static const struct rpc_call_ops nfs4_write_ops = { 2186 + .rpc_call_done = nfs4_write_done, 2187 + .rpc_release = nfs_writedata_release, 2188 + }; 2406 2189 2407 2190 static void 2408 2191 nfs4_proc_write_setup(struct nfs_write_data *data, int how) ··· 2441 2214 flags = (how & FLUSH_SYNC) ? 0 : RPC_TASK_ASYNC; 2442 2215 2443 2216 /* Finalize the task. */ 2444 - rpc_init_task(task, NFS_CLIENT(inode), nfs4_write_done, flags); 2217 + rpc_init_task(task, NFS_CLIENT(inode), flags, &nfs4_write_ops, data); 2445 2218 rpc_call_setup(task, &msg, 0); 2446 2219 } 2447 2220 2448 - static void 2449 - nfs4_commit_done(struct rpc_task *task) 2221 + static void nfs4_commit_done(struct rpc_task *task, void *calldata) 2450 2222 { 2451 - struct nfs_write_data *data = (struct nfs_write_data *) task->tk_calldata; 2223 + struct nfs_write_data *data = calldata; 2452 2224 struct inode *inode = data->inode; 2453 2225 2454 2226 if (nfs4_async_handle_error(task, NFS_SERVER(inode)) == -EAGAIN) { ··· 2457 2231 if (task->tk_status >= 0) 2458 2232 nfs_post_op_update_inode(inode, data->res.fattr); 2459 2233 /* Call back common NFS writeback processing */ 2460 - nfs_commit_done(task); 2234 + nfs_commit_done(task, calldata); 2461 2235 } 2236 + 2237 + static const struct rpc_call_ops nfs4_commit_ops = { 2238 + .rpc_call_done = nfs4_commit_done, 2239 + .rpc_release = nfs_commit_release, 2240 + }; 2462 2241 2463 2242 static void 2464 2243 nfs4_proc_commit_setup(struct nfs_write_data *data, int how) ··· 2486 2255 flags = (how & FLUSH_SYNC) ? 0 : RPC_TASK_ASYNC; 2487 2256 2488 2257 /* Finalize the task. */ 2489 - rpc_init_task(task, NFS_CLIENT(inode), nfs4_commit_done, flags); 2258 + rpc_init_task(task, NFS_CLIENT(inode), flags, &nfs4_commit_ops, data); 2490 2259 rpc_call_setup(task, &msg, 0); 2491 2260 } 2492 2261 ··· 2494 2263 * nfs4_proc_async_renew(): This is not one of the nfs_rpc_ops; it is a special 2495 2264 * standalone procedure for queueing an asynchronous RENEW. 2496 2265 */ 2497 - static void 2498 - renew_done(struct rpc_task *task) 2266 + static void nfs4_renew_done(struct rpc_task *task, void *data) 2499 2267 { 2500 2268 struct nfs4_client *clp = (struct nfs4_client *)task->tk_msg.rpc_argp; 2501 - unsigned long timestamp = (unsigned long)task->tk_calldata; 2269 + unsigned long timestamp = (unsigned long)data; 2502 2270 2503 2271 if (task->tk_status < 0) { 2504 2272 switch (task->tk_status) { ··· 2514 2284 spin_unlock(&clp->cl_lock); 2515 2285 } 2516 2286 2517 - int 2518 - nfs4_proc_async_renew(struct nfs4_client *clp) 2287 + static const struct rpc_call_ops nfs4_renew_ops = { 2288 + .rpc_call_done = nfs4_renew_done, 2289 + }; 2290 + 2291 + int nfs4_proc_async_renew(struct nfs4_client *clp, struct rpc_cred *cred) 2519 2292 { 2520 2293 struct rpc_message msg = { 2521 2294 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_RENEW], 2522 2295 .rpc_argp = clp, 2523 - .rpc_cred = clp->cl_cred, 2296 + .rpc_cred = cred, 2524 2297 }; 2525 2298 2526 2299 return rpc_call_async(clp->cl_rpcclient, &msg, RPC_TASK_SOFT, 2527 - renew_done, (void *)jiffies); 2300 + &nfs4_renew_ops, (void *)jiffies); 2528 2301 } 2529 2302 2530 - int 2531 - nfs4_proc_renew(struct nfs4_client *clp) 2303 + int nfs4_proc_renew(struct nfs4_client *clp, struct rpc_cred *cred) 2532 2304 { 2533 2305 struct rpc_message msg = { 2534 2306 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_RENEW], 2535 2307 .rpc_argp = clp, 2536 - .rpc_cred = clp->cl_cred, 2308 + .rpc_cred = cred, 2537 2309 }; 2538 2310 unsigned long now = jiffies; 2539 2311 int status; ··· 2751 2519 case -NFS4ERR_EXPIRED: 2752 2520 rpc_sleep_on(&clp->cl_rpcwaitq, task, NULL, NULL); 2753 2521 nfs4_schedule_state_recovery(clp); 2754 - if (test_bit(NFS4CLNT_OK, &clp->cl_state)) 2522 + if (test_bit(NFS4CLNT_STATE_RECOVER, &clp->cl_state) == 0) 2755 2523 rpc_wake_up_task(task); 2756 2524 task->tk_status = 0; 2757 2525 return -EAGAIN; ··· 2768 2536 return 0; 2769 2537 } 2770 2538 2539 + static int nfs4_wait_bit_interruptible(void *word) 2540 + { 2541 + if (signal_pending(current)) 2542 + return -ERESTARTSYS; 2543 + schedule(); 2544 + return 0; 2545 + } 2546 + 2771 2547 static int nfs4_wait_clnt_recover(struct rpc_clnt *clnt, struct nfs4_client *clp) 2772 2548 { 2773 - DEFINE_WAIT(wait); 2774 2549 sigset_t oldset; 2775 - int interruptible, res = 0; 2550 + int res; 2776 2551 2777 2552 might_sleep(); 2778 2553 2779 2554 rpc_clnt_sigmask(clnt, &oldset); 2780 - interruptible = TASK_UNINTERRUPTIBLE; 2781 - if (clnt->cl_intr) 2782 - interruptible = TASK_INTERRUPTIBLE; 2783 - prepare_to_wait(&clp->cl_waitq, &wait, interruptible); 2784 - nfs4_schedule_state_recovery(clp); 2785 - if (clnt->cl_intr && signalled()) 2786 - res = -ERESTARTSYS; 2787 - else if (!test_bit(NFS4CLNT_OK, &clp->cl_state)) 2788 - schedule(); 2789 - finish_wait(&clp->cl_waitq, &wait); 2555 + res = wait_on_bit(&clp->cl_state, NFS4CLNT_STATE_RECOVER, 2556 + nfs4_wait_bit_interruptible, 2557 + TASK_INTERRUPTIBLE); 2790 2558 rpc_clnt_sigunmask(clnt, &oldset); 2791 2559 return res; 2792 2560 } ··· 2829 2597 case -NFS4ERR_STALE_CLIENTID: 2830 2598 case -NFS4ERR_STALE_STATEID: 2831 2599 case -NFS4ERR_EXPIRED: 2600 + nfs4_schedule_state_recovery(clp); 2832 2601 ret = nfs4_wait_clnt_recover(server->client, clp); 2833 2602 if (ret == 0) 2834 2603 exception->retry = 1; ··· 2846 2613 return nfs4_map_errors(ret); 2847 2614 } 2848 2615 2849 - int nfs4_proc_setclientid(struct nfs4_client *clp, u32 program, unsigned short port) 2616 + int nfs4_proc_setclientid(struct nfs4_client *clp, u32 program, unsigned short port, struct rpc_cred *cred) 2850 2617 { 2851 2618 nfs4_verifier sc_verifier; 2852 2619 struct nfs4_setclientid setclientid = { ··· 2857 2624 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_SETCLIENTID], 2858 2625 .rpc_argp = &setclientid, 2859 2626 .rpc_resp = clp, 2860 - .rpc_cred = clp->cl_cred, 2627 + .rpc_cred = cred, 2861 2628 }; 2862 2629 u32 *p; 2863 2630 int loop = 0; ··· 2871 2638 setclientid.sc_name_len = scnprintf(setclientid.sc_name, 2872 2639 sizeof(setclientid.sc_name), "%s/%u.%u.%u.%u %s %u", 2873 2640 clp->cl_ipaddr, NIPQUAD(clp->cl_addr.s_addr), 2874 - clp->cl_cred->cr_ops->cr_name, 2641 + cred->cr_ops->cr_name, 2875 2642 clp->cl_id_uniquifier); 2876 2643 setclientid.sc_netid_len = scnprintf(setclientid.sc_netid, 2877 2644 sizeof(setclientid.sc_netid), "tcp"); ··· 2894 2661 } 2895 2662 2896 2663 int 2897 - nfs4_proc_setclientid_confirm(struct nfs4_client *clp) 2664 + nfs4_proc_setclientid_confirm(struct nfs4_client *clp, struct rpc_cred *cred) 2898 2665 { 2899 2666 struct nfs_fsinfo fsinfo; 2900 2667 struct rpc_message msg = { 2901 2668 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_SETCLIENTID_CONFIRM], 2902 2669 .rpc_argp = clp, 2903 2670 .rpc_resp = &fsinfo, 2904 - .rpc_cred = clp->cl_cred, 2671 + .rpc_cred = cred, 2905 2672 }; 2906 2673 unsigned long now; 2907 2674 int status; ··· 2912 2679 spin_lock(&clp->cl_lock); 2913 2680 clp->cl_lease_time = fsinfo.lease_time * HZ; 2914 2681 clp->cl_last_renewal = now; 2682 + clear_bit(NFS4CLNT_LEASE_EXPIRED, &clp->cl_state); 2915 2683 spin_unlock(&clp->cl_lock); 2916 2684 } 2917 2685 return status; 2918 2686 } 2919 2687 2920 - static int _nfs4_proc_delegreturn(struct inode *inode, struct rpc_cred *cred, const nfs4_stateid *stateid) 2688 + struct nfs4_delegreturndata { 2689 + struct nfs4_delegreturnargs args; 2690 + struct nfs4_delegreturnres res; 2691 + struct nfs_fh fh; 2692 + nfs4_stateid stateid; 2693 + struct rpc_cred *cred; 2694 + unsigned long timestamp; 2695 + struct nfs_fattr fattr; 2696 + int rpc_status; 2697 + }; 2698 + 2699 + static void nfs4_delegreturn_prepare(struct rpc_task *task, void *calldata) 2921 2700 { 2922 - struct nfs4_delegreturnargs args = { 2923 - .fhandle = NFS_FH(inode), 2924 - .stateid = stateid, 2925 - }; 2701 + struct nfs4_delegreturndata *data = calldata; 2926 2702 struct rpc_message msg = { 2927 2703 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_DELEGRETURN], 2928 - .rpc_argp = &args, 2929 - .rpc_cred = cred, 2704 + .rpc_argp = &data->args, 2705 + .rpc_resp = &data->res, 2706 + .rpc_cred = data->cred, 2930 2707 }; 2708 + nfs_fattr_init(data->res.fattr); 2709 + rpc_call_setup(task, &msg, 0); 2710 + } 2931 2711 2932 - return rpc_call_sync(NFS_CLIENT(inode), &msg, 0); 2712 + static void nfs4_delegreturn_done(struct rpc_task *task, void *calldata) 2713 + { 2714 + struct nfs4_delegreturndata *data = calldata; 2715 + data->rpc_status = task->tk_status; 2716 + if (data->rpc_status == 0) 2717 + renew_lease(data->res.server, data->timestamp); 2718 + } 2719 + 2720 + static void nfs4_delegreturn_release(void *calldata) 2721 + { 2722 + struct nfs4_delegreturndata *data = calldata; 2723 + 2724 + put_rpccred(data->cred); 2725 + kfree(calldata); 2726 + } 2727 + 2728 + const static struct rpc_call_ops nfs4_delegreturn_ops = { 2729 + .rpc_call_prepare = nfs4_delegreturn_prepare, 2730 + .rpc_call_done = nfs4_delegreturn_done, 2731 + .rpc_release = nfs4_delegreturn_release, 2732 + }; 2733 + 2734 + static int _nfs4_proc_delegreturn(struct inode *inode, struct rpc_cred *cred, const nfs4_stateid *stateid) 2735 + { 2736 + struct nfs4_delegreturndata *data; 2737 + struct nfs_server *server = NFS_SERVER(inode); 2738 + struct rpc_task *task; 2739 + int status; 2740 + 2741 + data = kmalloc(sizeof(*data), GFP_KERNEL); 2742 + if (data == NULL) 2743 + return -ENOMEM; 2744 + data->args.fhandle = &data->fh; 2745 + data->args.stateid = &data->stateid; 2746 + data->args.bitmask = server->attr_bitmask; 2747 + nfs_copy_fh(&data->fh, NFS_FH(inode)); 2748 + memcpy(&data->stateid, stateid, sizeof(data->stateid)); 2749 + data->res.fattr = &data->fattr; 2750 + data->res.server = server; 2751 + data->cred = get_rpccred(cred); 2752 + data->timestamp = jiffies; 2753 + data->rpc_status = 0; 2754 + 2755 + task = rpc_run_task(NFS_CLIENT(inode), RPC_TASK_ASYNC, &nfs4_delegreturn_ops, data); 2756 + if (IS_ERR(task)) { 2757 + nfs4_delegreturn_release(data); 2758 + return PTR_ERR(task); 2759 + } 2760 + status = nfs4_wait_for_completion_rpc_task(task); 2761 + if (status == 0) { 2762 + status = data->rpc_status; 2763 + if (status == 0) 2764 + nfs_post_op_update_inode(inode, &data->fattr); 2765 + } 2766 + rpc_release_task(task); 2767 + return status; 2933 2768 } 2934 2769 2935 2770 int nfs4_proc_delegreturn(struct inode *inode, struct rpc_cred *cred, const nfs4_stateid *stateid) ··· 3035 2734 return timeout; 3036 2735 } 3037 2736 3038 - static inline int 3039 - nfs4_lck_type(int cmd, struct file_lock *request) 3040 - { 3041 - /* set lock type */ 3042 - switch (request->fl_type) { 3043 - case F_RDLCK: 3044 - return IS_SETLKW(cmd) ? NFS4_READW_LT : NFS4_READ_LT; 3045 - case F_WRLCK: 3046 - return IS_SETLKW(cmd) ? NFS4_WRITEW_LT : NFS4_WRITE_LT; 3047 - case F_UNLCK: 3048 - return NFS4_WRITE_LT; 3049 - } 3050 - BUG(); 3051 - return 0; 3052 - } 3053 - 3054 - static inline uint64_t 3055 - nfs4_lck_length(struct file_lock *request) 3056 - { 3057 - if (request->fl_end == OFFSET_MAX) 3058 - return ~(uint64_t)0; 3059 - return request->fl_end - request->fl_start + 1; 3060 - } 3061 - 3062 2737 static int _nfs4_proc_getlk(struct nfs4_state *state, int cmd, struct file_lock *request) 3063 2738 { 3064 2739 struct inode *inode = state->inode; 3065 2740 struct nfs_server *server = NFS_SERVER(inode); 3066 2741 struct nfs4_client *clp = server->nfs4_state; 3067 - struct nfs_lockargs arg = { 2742 + struct nfs_lockt_args arg = { 3068 2743 .fh = NFS_FH(inode), 3069 - .type = nfs4_lck_type(cmd, request), 3070 - .offset = request->fl_start, 3071 - .length = nfs4_lck_length(request), 2744 + .fl = request, 3072 2745 }; 3073 - struct nfs_lockres res = { 3074 - .server = server, 2746 + struct nfs_lockt_res res = { 2747 + .denied = request, 3075 2748 }; 3076 2749 struct rpc_message msg = { 3077 2750 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_LOCKT], ··· 3053 2778 .rpc_resp = &res, 3054 2779 .rpc_cred = state->owner->so_cred, 3055 2780 }; 3056 - struct nfs_lowner nlo; 3057 2781 struct nfs4_lock_state *lsp; 3058 2782 int status; 3059 2783 3060 2784 down_read(&clp->cl_sem); 3061 - nlo.clientid = clp->cl_clientid; 2785 + arg.lock_owner.clientid = clp->cl_clientid; 3062 2786 status = nfs4_set_lock_state(state, request); 3063 2787 if (status != 0) 3064 2788 goto out; 3065 2789 lsp = request->fl_u.nfs4_fl.owner; 3066 - nlo.id = lsp->ls_id; 3067 - arg.u.lockt = &nlo; 2790 + arg.lock_owner.id = lsp->ls_id; 3068 2791 status = rpc_call_sync(server->client, &msg, 0); 3069 - if (!status) { 3070 - request->fl_type = F_UNLCK; 3071 - } else if (status == -NFS4ERR_DENIED) { 3072 - int64_t len, start, end; 3073 - start = res.u.denied.offset; 3074 - len = res.u.denied.length; 3075 - end = start + len - 1; 3076 - if (end < 0 || len == 0) 3077 - request->fl_end = OFFSET_MAX; 3078 - else 3079 - request->fl_end = (loff_t)end; 3080 - request->fl_start = (loff_t)start; 3081 - request->fl_type = F_WRLCK; 3082 - if (res.u.denied.type & 1) 3083 - request->fl_type = F_RDLCK; 3084 - request->fl_pid = 0; 3085 - status = 0; 2792 + switch (status) { 2793 + case 0: 2794 + request->fl_type = F_UNLCK; 2795 + break; 2796 + case -NFS4ERR_DENIED: 2797 + status = 0; 3086 2798 } 3087 2799 out: 3088 2800 up_read(&clp->cl_sem); ··· 3109 2847 } 3110 2848 3111 2849 struct nfs4_unlockdata { 3112 - struct nfs_lockargs arg; 3113 - struct nfs_locku_opargs luargs; 3114 - struct nfs_lockres res; 2850 + struct nfs_locku_args arg; 2851 + struct nfs_locku_res res; 3115 2852 struct nfs4_lock_state *lsp; 3116 2853 struct nfs_open_context *ctx; 3117 - atomic_t refcount; 3118 - struct completion completion; 2854 + struct file_lock fl; 2855 + const struct nfs_server *server; 2856 + unsigned long timestamp; 3119 2857 }; 3120 2858 3121 - static void nfs4_locku_release_calldata(struct nfs4_unlockdata *calldata) 2859 + static struct nfs4_unlockdata *nfs4_alloc_unlockdata(struct file_lock *fl, 2860 + struct nfs_open_context *ctx, 2861 + struct nfs4_lock_state *lsp, 2862 + struct nfs_seqid *seqid) 3122 2863 { 3123 - if (atomic_dec_and_test(&calldata->refcount)) { 3124 - nfs_free_seqid(calldata->luargs.seqid); 3125 - nfs4_put_lock_state(calldata->lsp); 3126 - put_nfs_open_context(calldata->ctx); 3127 - kfree(calldata); 3128 - } 2864 + struct nfs4_unlockdata *p; 2865 + struct inode *inode = lsp->ls_state->inode; 2866 + 2867 + p = kmalloc(sizeof(*p), GFP_KERNEL); 2868 + if (p == NULL) 2869 + return NULL; 2870 + p->arg.fh = NFS_FH(inode); 2871 + p->arg.fl = &p->fl; 2872 + p->arg.seqid = seqid; 2873 + p->arg.stateid = &lsp->ls_stateid; 2874 + p->lsp = lsp; 2875 + atomic_inc(&lsp->ls_count); 2876 + /* Ensure we don't close file until we're done freeing locks! */ 2877 + p->ctx = get_nfs_open_context(ctx); 2878 + memcpy(&p->fl, fl, sizeof(p->fl)); 2879 + p->server = NFS_SERVER(inode); 2880 + return p; 3129 2881 } 3130 2882 3131 - static void nfs4_locku_complete(struct nfs4_unlockdata *calldata) 2883 + static void nfs4_locku_release_calldata(void *data) 3132 2884 { 3133 - complete(&calldata->completion); 3134 - nfs4_locku_release_calldata(calldata); 2885 + struct nfs4_unlockdata *calldata = data; 2886 + nfs_free_seqid(calldata->arg.seqid); 2887 + nfs4_put_lock_state(calldata->lsp); 2888 + put_nfs_open_context(calldata->ctx); 2889 + kfree(calldata); 3135 2890 } 3136 2891 3137 - static void nfs4_locku_done(struct rpc_task *task) 2892 + static void nfs4_locku_done(struct rpc_task *task, void *data) 3138 2893 { 3139 - struct nfs4_unlockdata *calldata = (struct nfs4_unlockdata *)task->tk_calldata; 2894 + struct nfs4_unlockdata *calldata = data; 3140 2895 3141 - nfs_increment_lock_seqid(task->tk_status, calldata->luargs.seqid); 2896 + if (RPC_ASSASSINATED(task)) 2897 + return; 2898 + nfs_increment_lock_seqid(task->tk_status, calldata->arg.seqid); 3142 2899 switch (task->tk_status) { 3143 2900 case 0: 3144 2901 memcpy(calldata->lsp->ls_stateid.data, 3145 - calldata->res.u.stateid.data, 2902 + calldata->res.stateid.data, 3146 2903 sizeof(calldata->lsp->ls_stateid.data)); 2904 + renew_lease(calldata->server, calldata->timestamp); 3147 2905 break; 3148 2906 case -NFS4ERR_STALE_STATEID: 3149 2907 case -NFS4ERR_EXPIRED: 3150 - nfs4_schedule_state_recovery(calldata->res.server->nfs4_state); 2908 + nfs4_schedule_state_recovery(calldata->server->nfs4_state); 3151 2909 break; 3152 2910 default: 3153 - if (nfs4_async_handle_error(task, calldata->res.server) == -EAGAIN) { 2911 + if (nfs4_async_handle_error(task, calldata->server) == -EAGAIN) { 3154 2912 rpc_restart_call(task); 3155 - return; 3156 2913 } 3157 2914 } 3158 - nfs4_locku_complete(calldata); 3159 2915 } 3160 2916 3161 - static void nfs4_locku_begin(struct rpc_task *task) 2917 + static void nfs4_locku_prepare(struct rpc_task *task, void *data) 3162 2918 { 3163 - struct nfs4_unlockdata *calldata = (struct nfs4_unlockdata *)task->tk_calldata; 2919 + struct nfs4_unlockdata *calldata = data; 3164 2920 struct rpc_message msg = { 3165 2921 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_LOCKU], 3166 2922 .rpc_argp = &calldata->arg, 3167 2923 .rpc_resp = &calldata->res, 3168 2924 .rpc_cred = calldata->lsp->ls_state->owner->so_cred, 3169 2925 }; 3170 - int status; 3171 2926 3172 - status = nfs_wait_on_sequence(calldata->luargs.seqid, task); 3173 - if (status != 0) 2927 + if (nfs_wait_on_sequence(calldata->arg.seqid, task) != 0) 3174 2928 return; 3175 2929 if ((calldata->lsp->ls_flags & NFS_LOCK_INITIALIZED) == 0) { 3176 - nfs4_locku_complete(calldata); 3177 - task->tk_exit = NULL; 3178 - rpc_exit(task, 0); 2930 + /* Note: exit _without_ running nfs4_locku_done */ 2931 + task->tk_action = NULL; 3179 2932 return; 3180 2933 } 2934 + calldata->timestamp = jiffies; 3181 2935 rpc_call_setup(task, &msg, 0); 2936 + } 2937 + 2938 + static const struct rpc_call_ops nfs4_locku_ops = { 2939 + .rpc_call_prepare = nfs4_locku_prepare, 2940 + .rpc_call_done = nfs4_locku_done, 2941 + .rpc_release = nfs4_locku_release_calldata, 2942 + }; 2943 + 2944 + static struct rpc_task *nfs4_do_unlck(struct file_lock *fl, 2945 + struct nfs_open_context *ctx, 2946 + struct nfs4_lock_state *lsp, 2947 + struct nfs_seqid *seqid) 2948 + { 2949 + struct nfs4_unlockdata *data; 2950 + struct rpc_task *task; 2951 + 2952 + data = nfs4_alloc_unlockdata(fl, ctx, lsp, seqid); 2953 + if (data == NULL) { 2954 + nfs_free_seqid(seqid); 2955 + return ERR_PTR(-ENOMEM); 2956 + } 2957 + 2958 + /* Unlock _before_ we do the RPC call */ 2959 + do_vfs_lock(fl->fl_file, fl); 2960 + task = rpc_run_task(NFS_CLIENT(lsp->ls_state->inode), RPC_TASK_ASYNC, &nfs4_locku_ops, data); 2961 + if (IS_ERR(task)) 2962 + nfs4_locku_release_calldata(data); 2963 + return task; 3182 2964 } 3183 2965 3184 2966 static int nfs4_proc_unlck(struct nfs4_state *state, int cmd, struct file_lock *request) 3185 2967 { 3186 - struct nfs4_unlockdata *calldata; 3187 - struct inode *inode = state->inode; 3188 - struct nfs_server *server = NFS_SERVER(inode); 2968 + struct nfs_seqid *seqid; 3189 2969 struct nfs4_lock_state *lsp; 3190 - int status; 2970 + struct rpc_task *task; 2971 + int status = 0; 3191 2972 3192 2973 /* Is this a delegated lock? */ 3193 2974 if (test_bit(NFS_DELEGATED_STATE, &state->flags)) 3194 - return do_vfs_lock(request->fl_file, request); 2975 + goto out_unlock; 2976 + /* Is this open_owner holding any locks on the server? */ 2977 + if (test_bit(LK_STATE_IN_USE, &state->flags) == 0) 2978 + goto out_unlock; 3195 2979 3196 2980 status = nfs4_set_lock_state(state, request); 3197 2981 if (status != 0) 3198 - return status; 2982 + goto out_unlock; 3199 2983 lsp = request->fl_u.nfs4_fl.owner; 3200 - /* We might have lost the locks! */ 3201 - if ((lsp->ls_flags & NFS_LOCK_INITIALIZED) == 0) 3202 - return 0; 3203 - calldata = kmalloc(sizeof(*calldata), GFP_KERNEL); 3204 - if (calldata == NULL) 3205 - return -ENOMEM; 3206 - calldata->luargs.seqid = nfs_alloc_seqid(&lsp->ls_seqid); 3207 - if (calldata->luargs.seqid == NULL) { 3208 - kfree(calldata); 3209 - return -ENOMEM; 3210 - } 3211 - calldata->luargs.stateid = &lsp->ls_stateid; 3212 - calldata->arg.fh = NFS_FH(inode); 3213 - calldata->arg.type = nfs4_lck_type(cmd, request); 3214 - calldata->arg.offset = request->fl_start; 3215 - calldata->arg.length = nfs4_lck_length(request); 3216 - calldata->arg.u.locku = &calldata->luargs; 3217 - calldata->res.server = server; 3218 - calldata->lsp = lsp; 3219 - atomic_inc(&lsp->ls_count); 3220 - 3221 - /* Ensure we don't close file until we're done freeing locks! */ 3222 - calldata->ctx = get_nfs_open_context((struct nfs_open_context*)request->fl_file->private_data); 3223 - 3224 - atomic_set(&calldata->refcount, 2); 3225 - init_completion(&calldata->completion); 3226 - 3227 - status = nfs4_call_async(NFS_SERVER(inode)->client, nfs4_locku_begin, 3228 - nfs4_locku_done, calldata); 3229 - if (status == 0) 3230 - wait_for_completion_interruptible(&calldata->completion); 2984 + status = -ENOMEM; 2985 + seqid = nfs_alloc_seqid(&lsp->ls_seqid); 2986 + if (seqid == NULL) 2987 + goto out_unlock; 2988 + task = nfs4_do_unlck(request, request->fl_file->private_data, lsp, seqid); 2989 + status = PTR_ERR(task); 2990 + if (IS_ERR(task)) 2991 + goto out_unlock; 2992 + status = nfs4_wait_for_completion_rpc_task(task); 2993 + rpc_release_task(task); 2994 + return status; 2995 + out_unlock: 3231 2996 do_vfs_lock(request->fl_file, request); 3232 - nfs4_locku_release_calldata(calldata); 3233 2997 return status; 3234 2998 } 3235 2999 3236 - static int _nfs4_do_setlk(struct nfs4_state *state, int cmd, struct file_lock *request, int reclaim) 3000 + struct nfs4_lockdata { 3001 + struct nfs_lock_args arg; 3002 + struct nfs_lock_res res; 3003 + struct nfs4_lock_state *lsp; 3004 + struct nfs_open_context *ctx; 3005 + struct file_lock fl; 3006 + unsigned long timestamp; 3007 + int rpc_status; 3008 + int cancelled; 3009 + }; 3010 + 3011 + static struct nfs4_lockdata *nfs4_alloc_lockdata(struct file_lock *fl, 3012 + struct nfs_open_context *ctx, struct nfs4_lock_state *lsp) 3237 3013 { 3238 - struct inode *inode = state->inode; 3014 + struct nfs4_lockdata *p; 3015 + struct inode *inode = lsp->ls_state->inode; 3239 3016 struct nfs_server *server = NFS_SERVER(inode); 3240 - struct nfs4_lock_state *lsp = request->fl_u.nfs4_fl.owner; 3241 - struct nfs_lock_opargs largs = { 3242 - .lock_stateid = &lsp->ls_stateid, 3243 - .open_stateid = &state->stateid, 3244 - .lock_owner = { 3245 - .clientid = server->nfs4_state->cl_clientid, 3246 - .id = lsp->ls_id, 3247 - }, 3248 - .reclaim = reclaim, 3249 - }; 3250 - struct nfs_lockargs arg = { 3251 - .fh = NFS_FH(inode), 3252 - .type = nfs4_lck_type(cmd, request), 3253 - .offset = request->fl_start, 3254 - .length = nfs4_lck_length(request), 3255 - .u = { 3256 - .lock = &largs, 3257 - }, 3258 - }; 3259 - struct nfs_lockres res = { 3260 - .server = server, 3261 - }; 3017 + 3018 + p = kzalloc(sizeof(*p), GFP_KERNEL); 3019 + if (p == NULL) 3020 + return NULL; 3021 + 3022 + p->arg.fh = NFS_FH(inode); 3023 + p->arg.fl = &p->fl; 3024 + p->arg.lock_seqid = nfs_alloc_seqid(&lsp->ls_seqid); 3025 + if (p->arg.lock_seqid == NULL) 3026 + goto out_free; 3027 + p->arg.lock_stateid = &lsp->ls_stateid; 3028 + p->arg.lock_owner.clientid = server->nfs4_state->cl_clientid; 3029 + p->arg.lock_owner.id = lsp->ls_id; 3030 + p->lsp = lsp; 3031 + atomic_inc(&lsp->ls_count); 3032 + p->ctx = get_nfs_open_context(ctx); 3033 + memcpy(&p->fl, fl, sizeof(p->fl)); 3034 + return p; 3035 + out_free: 3036 + kfree(p); 3037 + return NULL; 3038 + } 3039 + 3040 + static void nfs4_lock_prepare(struct rpc_task *task, void *calldata) 3041 + { 3042 + struct nfs4_lockdata *data = calldata; 3043 + struct nfs4_state *state = data->lsp->ls_state; 3044 + struct nfs4_state_owner *sp = state->owner; 3262 3045 struct rpc_message msg = { 3263 - .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_LOCK], 3264 - .rpc_argp = &arg, 3265 - .rpc_resp = &res, 3266 - .rpc_cred = state->owner->so_cred, 3046 + .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_LOCK], 3047 + .rpc_argp = &data->arg, 3048 + .rpc_resp = &data->res, 3049 + .rpc_cred = sp->so_cred, 3267 3050 }; 3268 - int status = -ENOMEM; 3269 3051 3270 - largs.lock_seqid = nfs_alloc_seqid(&lsp->ls_seqid); 3271 - if (largs.lock_seqid == NULL) 3272 - return -ENOMEM; 3273 - if (!(lsp->ls_seqid.flags & NFS_SEQID_CONFIRMED)) { 3274 - struct nfs4_state_owner *owner = state->owner; 3275 - 3276 - largs.open_seqid = nfs_alloc_seqid(&owner->so_seqid); 3277 - if (largs.open_seqid == NULL) 3052 + if (nfs_wait_on_sequence(data->arg.lock_seqid, task) != 0) 3053 + return; 3054 + dprintk("%s: begin!\n", __FUNCTION__); 3055 + /* Do we need to do an open_to_lock_owner? */ 3056 + if (!(data->arg.lock_seqid->sequence->flags & NFS_SEQID_CONFIRMED)) { 3057 + data->arg.open_seqid = nfs_alloc_seqid(&sp->so_seqid); 3058 + if (data->arg.open_seqid == NULL) { 3059 + data->rpc_status = -ENOMEM; 3060 + task->tk_action = NULL; 3278 3061 goto out; 3279 - largs.new_lock_owner = 1; 3280 - status = rpc_call_sync(server->client, &msg, RPC_TASK_NOINTR); 3281 - /* increment open seqid on success, and seqid mutating errors */ 3282 - if (largs.new_lock_owner != 0) { 3283 - nfs_increment_open_seqid(status, largs.open_seqid); 3284 - if (status == 0) 3285 - nfs_confirm_seqid(&lsp->ls_seqid, 0); 3286 3062 } 3287 - nfs_free_seqid(largs.open_seqid); 3288 - } else 3289 - status = rpc_call_sync(server->client, &msg, RPC_TASK_NOINTR); 3290 - /* increment lock seqid on success, and seqid mutating errors*/ 3291 - nfs_increment_lock_seqid(status, largs.lock_seqid); 3292 - /* save the returned stateid. */ 3293 - if (status == 0) { 3294 - memcpy(lsp->ls_stateid.data, res.u.stateid.data, 3295 - sizeof(lsp->ls_stateid.data)); 3296 - lsp->ls_flags |= NFS_LOCK_INITIALIZED; 3297 - } else if (status == -NFS4ERR_DENIED) 3298 - status = -EAGAIN; 3063 + data->arg.open_stateid = &state->stateid; 3064 + data->arg.new_lock_owner = 1; 3065 + } 3066 + data->timestamp = jiffies; 3067 + rpc_call_setup(task, &msg, 0); 3299 3068 out: 3300 - nfs_free_seqid(largs.lock_seqid); 3301 - return status; 3069 + dprintk("%s: done!, ret = %d\n", __FUNCTION__, data->rpc_status); 3070 + } 3071 + 3072 + static void nfs4_lock_done(struct rpc_task *task, void *calldata) 3073 + { 3074 + struct nfs4_lockdata *data = calldata; 3075 + 3076 + dprintk("%s: begin!\n", __FUNCTION__); 3077 + 3078 + data->rpc_status = task->tk_status; 3079 + if (RPC_ASSASSINATED(task)) 3080 + goto out; 3081 + if (data->arg.new_lock_owner != 0) { 3082 + nfs_increment_open_seqid(data->rpc_status, data->arg.open_seqid); 3083 + if (data->rpc_status == 0) 3084 + nfs_confirm_seqid(&data->lsp->ls_seqid, 0); 3085 + else 3086 + goto out; 3087 + } 3088 + if (data->rpc_status == 0) { 3089 + memcpy(data->lsp->ls_stateid.data, data->res.stateid.data, 3090 + sizeof(data->lsp->ls_stateid.data)); 3091 + data->lsp->ls_flags |= NFS_LOCK_INITIALIZED; 3092 + renew_lease(NFS_SERVER(data->ctx->dentry->d_inode), data->timestamp); 3093 + } 3094 + nfs_increment_lock_seqid(data->rpc_status, data->arg.lock_seqid); 3095 + out: 3096 + dprintk("%s: done, ret = %d!\n", __FUNCTION__, data->rpc_status); 3097 + } 3098 + 3099 + static void nfs4_lock_release(void *calldata) 3100 + { 3101 + struct nfs4_lockdata *data = calldata; 3102 + 3103 + dprintk("%s: begin!\n", __FUNCTION__); 3104 + if (data->arg.open_seqid != NULL) 3105 + nfs_free_seqid(data->arg.open_seqid); 3106 + if (data->cancelled != 0) { 3107 + struct rpc_task *task; 3108 + task = nfs4_do_unlck(&data->fl, data->ctx, data->lsp, 3109 + data->arg.lock_seqid); 3110 + if (!IS_ERR(task)) 3111 + rpc_release_task(task); 3112 + dprintk("%s: cancelling lock!\n", __FUNCTION__); 3113 + } else 3114 + nfs_free_seqid(data->arg.lock_seqid); 3115 + nfs4_put_lock_state(data->lsp); 3116 + put_nfs_open_context(data->ctx); 3117 + kfree(data); 3118 + dprintk("%s: done!\n", __FUNCTION__); 3119 + } 3120 + 3121 + static const struct rpc_call_ops nfs4_lock_ops = { 3122 + .rpc_call_prepare = nfs4_lock_prepare, 3123 + .rpc_call_done = nfs4_lock_done, 3124 + .rpc_release = nfs4_lock_release, 3125 + }; 3126 + 3127 + static int _nfs4_do_setlk(struct nfs4_state *state, int cmd, struct file_lock *fl, int reclaim) 3128 + { 3129 + struct nfs4_lockdata *data; 3130 + struct rpc_task *task; 3131 + int ret; 3132 + 3133 + dprintk("%s: begin!\n", __FUNCTION__); 3134 + data = nfs4_alloc_lockdata(fl, fl->fl_file->private_data, 3135 + fl->fl_u.nfs4_fl.owner); 3136 + if (data == NULL) 3137 + return -ENOMEM; 3138 + if (IS_SETLKW(cmd)) 3139 + data->arg.block = 1; 3140 + if (reclaim != 0) 3141 + data->arg.reclaim = 1; 3142 + task = rpc_run_task(NFS_CLIENT(state->inode), RPC_TASK_ASYNC, 3143 + &nfs4_lock_ops, data); 3144 + if (IS_ERR(task)) { 3145 + nfs4_lock_release(data); 3146 + return PTR_ERR(task); 3147 + } 3148 + ret = nfs4_wait_for_completion_rpc_task(task); 3149 + if (ret == 0) { 3150 + ret = data->rpc_status; 3151 + if (ret == -NFS4ERR_DENIED) 3152 + ret = -EAGAIN; 3153 + } else 3154 + data->cancelled = 1; 3155 + rpc_release_task(task); 3156 + dprintk("%s: done, ret = %d!\n", __FUNCTION__, ret); 3157 + return ret; 3302 3158 } 3303 3159 3304 3160 static int nfs4_lock_reclaim(struct nfs4_state *state, struct file_lock *request)
+12 -2
fs/nfs/nfs4renewd.c
··· 54 54 #include <linux/nfs4.h> 55 55 #include <linux/nfs_fs.h> 56 56 #include "nfs4_fs.h" 57 + #include "delegation.h" 57 58 58 59 #define NFSDBG_FACILITY NFSDBG_PROC 59 60 ··· 62 61 nfs4_renew_state(void *data) 63 62 { 64 63 struct nfs4_client *clp = (struct nfs4_client *)data; 64 + struct rpc_cred *cred; 65 65 long lease, timeout; 66 66 unsigned long last, now; 67 67 ··· 70 68 dprintk("%s: start\n", __FUNCTION__); 71 69 /* Are there any active superblocks? */ 72 70 if (list_empty(&clp->cl_superblocks)) 73 - goto out; 71 + goto out; 74 72 spin_lock(&clp->cl_lock); 75 73 lease = clp->cl_lease_time; 76 74 last = clp->cl_last_renewal; ··· 78 76 timeout = (2 * lease) / 3 + (long)last - (long)now; 79 77 /* Are we close to a lease timeout? */ 80 78 if (time_after(now, last + lease/3)) { 79 + cred = nfs4_get_renew_cred(clp); 80 + if (cred == NULL) { 81 + set_bit(NFS4CLNT_LEASE_EXPIRED, &clp->cl_state); 82 + spin_unlock(&clp->cl_lock); 83 + nfs_expire_all_delegations(clp); 84 + goto out; 85 + } 81 86 spin_unlock(&clp->cl_lock); 82 87 /* Queue an asynchronous RENEW. */ 83 - nfs4_proc_async_renew(clp); 88 + nfs4_proc_async_renew(clp, cred); 89 + put_rpccred(cred); 84 90 timeout = (2 * lease) / 3; 85 91 spin_lock(&clp->cl_lock); 86 92 } else
+104 -79
fs/nfs/nfs4state.c
··· 43 43 #include <linux/smp_lock.h> 44 44 #include <linux/nfs_fs.h> 45 45 #include <linux/nfs_idmap.h> 46 + #include <linux/kthread.h> 47 + #include <linux/module.h> 46 48 #include <linux/workqueue.h> 47 49 #include <linux/bitops.h> 48 50 ··· 58 56 59 57 static DEFINE_SPINLOCK(state_spinlock); 60 58 static LIST_HEAD(nfs4_clientid_list); 61 - 62 - static void nfs4_recover_state(void *); 63 59 64 60 void 65 61 init_nfsv4_state(struct nfs_server *server) ··· 91 91 92 92 if (nfs_callback_up() < 0) 93 93 return NULL; 94 - if ((clp = kmalloc(sizeof(*clp), GFP_KERNEL)) == NULL) { 94 + if ((clp = kzalloc(sizeof(*clp), GFP_KERNEL)) == NULL) { 95 95 nfs_callback_down(); 96 96 return NULL; 97 97 } 98 - memset(clp, 0, sizeof(*clp)); 99 98 memcpy(&clp->cl_addr, addr, sizeof(clp->cl_addr)); 100 99 init_rwsem(&clp->cl_sem); 101 100 INIT_LIST_HEAD(&clp->cl_delegations); ··· 102 103 INIT_LIST_HEAD(&clp->cl_unused); 103 104 spin_lock_init(&clp->cl_lock); 104 105 atomic_set(&clp->cl_count, 1); 105 - INIT_WORK(&clp->cl_recoverd, nfs4_recover_state, clp); 106 106 INIT_WORK(&clp->cl_renewd, nfs4_renew_state, clp); 107 107 INIT_LIST_HEAD(&clp->cl_superblocks); 108 - init_waitqueue_head(&clp->cl_waitq); 109 108 rpc_init_wait_queue(&clp->cl_rpcwaitq, "NFS4 client"); 110 109 clp->cl_rpcclient = ERR_PTR(-EINVAL); 111 110 clp->cl_boot_time = CURRENT_TIME; 112 - clp->cl_state = 1 << NFS4CLNT_OK; 111 + clp->cl_state = 1 << NFS4CLNT_LEASE_EXPIRED; 113 112 return clp; 114 113 } 115 114 ··· 124 127 kfree(sp); 125 128 } 126 129 BUG_ON(!list_empty(&clp->cl_state_owners)); 127 - if (clp->cl_cred) 128 - put_rpccred(clp->cl_cred); 129 130 nfs_idmap_delete(clp); 130 131 if (!IS_ERR(clp->cl_rpcclient)) 131 132 rpc_shutdown_client(clp->cl_rpcclient); ··· 188 193 list_del(&clp->cl_servers); 189 194 spin_unlock(&state_spinlock); 190 195 BUG_ON(!list_empty(&clp->cl_superblocks)); 191 - wake_up_all(&clp->cl_waitq); 192 196 rpc_wake_up(&clp->cl_rpcwaitq); 193 197 nfs4_kill_renewd(clp); 194 198 nfs4_free_client(clp); 195 199 } 196 200 197 - static int __nfs4_init_client(struct nfs4_client *clp) 201 + static int nfs4_init_client(struct nfs4_client *clp, struct rpc_cred *cred) 198 202 { 199 - int status = nfs4_proc_setclientid(clp, NFS4_CALLBACK, nfs_callback_tcpport); 203 + int status = nfs4_proc_setclientid(clp, NFS4_CALLBACK, 204 + nfs_callback_tcpport, cred); 200 205 if (status == 0) 201 - status = nfs4_proc_setclientid_confirm(clp); 206 + status = nfs4_proc_setclientid_confirm(clp, cred); 202 207 if (status == 0) 203 208 nfs4_schedule_state_renewal(clp); 204 209 return status; 205 - } 206 - 207 - int nfs4_init_client(struct nfs4_client *clp) 208 - { 209 - return nfs4_map_errors(__nfs4_init_client(clp)); 210 210 } 211 211 212 212 u32 ··· 223 233 clp->cl_nunused--; 224 234 } 225 235 return sp; 236 + } 237 + 238 + struct rpc_cred *nfs4_get_renew_cred(struct nfs4_client *clp) 239 + { 240 + struct nfs4_state_owner *sp; 241 + struct rpc_cred *cred = NULL; 242 + 243 + list_for_each_entry(sp, &clp->cl_state_owners, so_list) { 244 + if (list_empty(&sp->so_states)) 245 + continue; 246 + cred = get_rpccred(sp->so_cred); 247 + break; 248 + } 249 + return cred; 250 + } 251 + 252 + struct rpc_cred *nfs4_get_setclientid_cred(struct nfs4_client *clp) 253 + { 254 + struct nfs4_state_owner *sp; 255 + 256 + if (!list_empty(&clp->cl_state_owners)) { 257 + sp = list_entry(clp->cl_state_owners.next, 258 + struct nfs4_state_owner, so_list); 259 + return get_rpccred(sp->so_cred); 260 + } 261 + return NULL; 226 262 } 227 263 228 264 static struct nfs4_state_owner * ··· 365 349 { 366 350 struct nfs4_state *state; 367 351 368 - state = kmalloc(sizeof(*state), GFP_KERNEL); 352 + state = kzalloc(sizeof(*state), GFP_KERNEL); 369 353 if (!state) 370 354 return NULL; 371 - state->state = 0; 372 - state->nreaders = 0; 373 - state->nwriters = 0; 374 - state->flags = 0; 375 - memset(state->stateid.data, 0, sizeof(state->stateid.data)); 376 355 atomic_set(&state->count, 1); 377 356 INIT_LIST_HEAD(&state->lock_states); 378 357 spin_lock_init(&state->state_lock); ··· 486 475 /* Protect against nfs4_find_state() */ 487 476 spin_lock(&owner->so_lock); 488 477 spin_lock(&inode->i_lock); 489 - if (mode & FMODE_READ) 490 - state->nreaders--; 491 - if (mode & FMODE_WRITE) 492 - state->nwriters--; 478 + switch (mode & (FMODE_READ | FMODE_WRITE)) { 479 + case FMODE_READ: 480 + state->n_rdonly--; 481 + break; 482 + case FMODE_WRITE: 483 + state->n_wronly--; 484 + break; 485 + case FMODE_READ|FMODE_WRITE: 486 + state->n_rdwr--; 487 + } 493 488 oldstate = newstate = state->state; 494 - if (state->nreaders == 0) 495 - newstate &= ~FMODE_READ; 496 - if (state->nwriters == 0) 497 - newstate &= ~FMODE_WRITE; 489 + if (state->n_rdwr == 0) { 490 + if (state->n_rdonly == 0) 491 + newstate &= ~FMODE_READ; 492 + if (state->n_wronly == 0) 493 + newstate &= ~FMODE_WRITE; 494 + } 498 495 if (test_bit(NFS_DELEGATED_STATE, &state->flags)) { 499 496 nfs4_state_set_mode_locked(state, newstate); 500 497 oldstate = newstate; ··· 752 733 } 753 734 754 735 static int reclaimer(void *); 755 - struct reclaimer_args { 756 - struct nfs4_client *clp; 757 - struct completion complete; 758 - }; 736 + 737 + static inline void nfs4_clear_recover_bit(struct nfs4_client *clp) 738 + { 739 + smp_mb__before_clear_bit(); 740 + clear_bit(NFS4CLNT_STATE_RECOVER, &clp->cl_state); 741 + smp_mb__after_clear_bit(); 742 + wake_up_bit(&clp->cl_state, NFS4CLNT_STATE_RECOVER); 743 + rpc_wake_up(&clp->cl_rpcwaitq); 744 + } 759 745 760 746 /* 761 747 * State recovery routine 762 748 */ 763 - void 764 - nfs4_recover_state(void *data) 749 + static void nfs4_recover_state(struct nfs4_client *clp) 765 750 { 766 - struct nfs4_client *clp = (struct nfs4_client *)data; 767 - struct reclaimer_args args = { 768 - .clp = clp, 769 - }; 770 - might_sleep(); 751 + struct task_struct *task; 771 752 772 - init_completion(&args.complete); 773 - 774 - if (kernel_thread(reclaimer, &args, CLONE_KERNEL) < 0) 775 - goto out_failed_clear; 776 - wait_for_completion(&args.complete); 777 - return; 778 - out_failed_clear: 779 - set_bit(NFS4CLNT_OK, &clp->cl_state); 780 - wake_up_all(&clp->cl_waitq); 781 - rpc_wake_up(&clp->cl_rpcwaitq); 753 + __module_get(THIS_MODULE); 754 + atomic_inc(&clp->cl_count); 755 + task = kthread_run(reclaimer, clp, "%u.%u.%u.%u-reclaim", 756 + NIPQUAD(clp->cl_addr)); 757 + if (!IS_ERR(task)) 758 + return; 759 + nfs4_clear_recover_bit(clp); 760 + nfs4_put_client(clp); 761 + module_put(THIS_MODULE); 782 762 } 783 763 784 764 /* 785 765 * Schedule a state recovery attempt 786 766 */ 787 - void 788 - nfs4_schedule_state_recovery(struct nfs4_client *clp) 767 + void nfs4_schedule_state_recovery(struct nfs4_client *clp) 789 768 { 790 769 if (!clp) 791 770 return; 792 - if (test_and_clear_bit(NFS4CLNT_OK, &clp->cl_state)) 793 - schedule_work(&clp->cl_recoverd); 771 + if (test_and_set_bit(NFS4CLNT_STATE_RECOVER, &clp->cl_state) == 0) 772 + nfs4_recover_state(clp); 794 773 } 795 774 796 775 static int nfs4_reclaim_locks(struct nfs4_state_recovery_ops *ops, struct nfs4_state *state) ··· 904 887 905 888 static int reclaimer(void *ptr) 906 889 { 907 - struct reclaimer_args *args = (struct reclaimer_args *)ptr; 908 - struct nfs4_client *clp = args->clp; 890 + struct nfs4_client *clp = ptr; 909 891 struct nfs4_state_owner *sp; 910 892 struct nfs4_state_recovery_ops *ops; 893 + struct rpc_cred *cred; 911 894 int status = 0; 912 895 913 - daemonize("%u.%u.%u.%u-reclaim", NIPQUAD(clp->cl_addr)); 914 896 allow_signal(SIGKILL); 915 - 916 - atomic_inc(&clp->cl_count); 917 - complete(&args->complete); 918 897 919 898 /* Ensure exclusive access to NFSv4 state */ 920 899 lock_kernel(); ··· 919 906 if (list_empty(&clp->cl_superblocks)) 920 907 goto out; 921 908 restart_loop: 922 - status = nfs4_proc_renew(clp); 923 - switch (status) { 924 - case 0: 925 - case -NFS4ERR_CB_PATH_DOWN: 926 - goto out; 927 - case -NFS4ERR_STALE_CLIENTID: 928 - case -NFS4ERR_LEASE_MOVED: 929 - ops = &nfs4_reboot_recovery_ops; 930 - break; 931 - default: 932 - ops = &nfs4_network_partition_recovery_ops; 933 - }; 909 + ops = &nfs4_network_partition_recovery_ops; 910 + /* Are there any open files on this volume? */ 911 + cred = nfs4_get_renew_cred(clp); 912 + if (cred != NULL) { 913 + /* Yes there are: try to renew the old lease */ 914 + status = nfs4_proc_renew(clp, cred); 915 + switch (status) { 916 + case 0: 917 + case -NFS4ERR_CB_PATH_DOWN: 918 + put_rpccred(cred); 919 + goto out; 920 + case -NFS4ERR_STALE_CLIENTID: 921 + case -NFS4ERR_LEASE_MOVED: 922 + ops = &nfs4_reboot_recovery_ops; 923 + } 924 + } else { 925 + /* "reboot" to ensure we clear all state on the server */ 926 + clp->cl_boot_time = CURRENT_TIME; 927 + cred = nfs4_get_setclientid_cred(clp); 928 + } 929 + /* We're going to have to re-establish a clientid */ 934 930 nfs4_state_mark_reclaim(clp); 935 - status = __nfs4_init_client(clp); 931 + status = -ENOENT; 932 + if (cred != NULL) { 933 + status = nfs4_init_client(clp, cred); 934 + put_rpccred(cred); 935 + } 936 936 if (status) 937 937 goto out_error; 938 938 /* Mark all delegations for reclaim */ ··· 966 940 } 967 941 nfs_delegation_reap_unclaimed(clp); 968 942 out: 969 - set_bit(NFS4CLNT_OK, &clp->cl_state); 970 943 up_write(&clp->cl_sem); 971 944 unlock_kernel(); 972 - wake_up_all(&clp->cl_waitq); 973 - rpc_wake_up(&clp->cl_rpcwaitq); 974 945 if (status == -NFS4ERR_CB_PATH_DOWN) 975 946 nfs_handle_cb_pathdown(clp); 947 + nfs4_clear_recover_bit(clp); 976 948 nfs4_put_client(clp); 949 + module_put_and_exit(0); 977 950 return 0; 978 951 out_error: 979 952 printk(KERN_WARNING "Error: state recovery failed on NFSv4 server %u.%u.%u.%u with error %d\n",
+104 -83
fs/nfs/nfs4xdr.c
··· 392 392 decode_getattr_maxsz) 393 393 #define NFS4_enc_delegreturn_sz (compound_encode_hdr_maxsz + \ 394 394 encode_putfh_maxsz + \ 395 - encode_delegreturn_maxsz) 395 + encode_delegreturn_maxsz + \ 396 + encode_getattr_maxsz) 396 397 #define NFS4_dec_delegreturn_sz (compound_decode_hdr_maxsz + \ 397 - decode_delegreturn_maxsz) 398 + decode_delegreturn_maxsz + \ 399 + decode_getattr_maxsz) 398 400 #define NFS4_enc_getacl_sz (compound_encode_hdr_maxsz + \ 399 401 encode_putfh_maxsz + \ 400 402 encode_getattr_maxsz) ··· 566 564 } 567 565 if (iap->ia_valid & ATTR_MODE) { 568 566 bmval1 |= FATTR4_WORD1_MODE; 569 - WRITE32(iap->ia_mode); 567 + WRITE32(iap->ia_mode & S_IALLUGO); 570 568 } 571 569 if (iap->ia_valid & ATTR_UID) { 572 570 bmval1 |= FATTR4_WORD1_OWNER; ··· 744 742 return 0; 745 743 } 746 744 745 + static inline int nfs4_lock_type(struct file_lock *fl, int block) 746 + { 747 + if ((fl->fl_type & (F_RDLCK|F_WRLCK|F_UNLCK)) == F_RDLCK) 748 + return block ? NFS4_READW_LT : NFS4_READ_LT; 749 + return block ? NFS4_WRITEW_LT : NFS4_WRITE_LT; 750 + } 751 + 752 + static inline uint64_t nfs4_lock_length(struct file_lock *fl) 753 + { 754 + if (fl->fl_end == OFFSET_MAX) 755 + return ~(uint64_t)0; 756 + return fl->fl_end - fl->fl_start + 1; 757 + } 758 + 747 759 /* 748 760 * opcode,type,reclaim,offset,length,new_lock_owner = 32 749 761 * open_seqid,open_stateid,lock_seqid,lock_owner.clientid, lock_owner.id = 40 750 762 */ 751 - static int encode_lock(struct xdr_stream *xdr, const struct nfs_lockargs *arg) 763 + static int encode_lock(struct xdr_stream *xdr, const struct nfs_lock_args *args) 752 764 { 753 765 uint32_t *p; 754 - struct nfs_lock_opargs *opargs = arg->u.lock; 755 766 756 767 RESERVE_SPACE(32); 757 768 WRITE32(OP_LOCK); 758 - WRITE32(arg->type); 759 - WRITE32(opargs->reclaim); 760 - WRITE64(arg->offset); 761 - WRITE64(arg->length); 762 - WRITE32(opargs->new_lock_owner); 763 - if (opargs->new_lock_owner){ 769 + WRITE32(nfs4_lock_type(args->fl, args->block)); 770 + WRITE32(args->reclaim); 771 + WRITE64(args->fl->fl_start); 772 + WRITE64(nfs4_lock_length(args->fl)); 773 + WRITE32(args->new_lock_owner); 774 + if (args->new_lock_owner){ 764 775 RESERVE_SPACE(40); 765 - WRITE32(opargs->open_seqid->sequence->counter); 766 - WRITEMEM(opargs->open_stateid->data, sizeof(opargs->open_stateid->data)); 767 - WRITE32(opargs->lock_seqid->sequence->counter); 768 - WRITE64(opargs->lock_owner.clientid); 776 + WRITE32(args->open_seqid->sequence->counter); 777 + WRITEMEM(args->open_stateid->data, sizeof(args->open_stateid->data)); 778 + WRITE32(args->lock_seqid->sequence->counter); 779 + WRITE64(args->lock_owner.clientid); 769 780 WRITE32(4); 770 - WRITE32(opargs->lock_owner.id); 781 + WRITE32(args->lock_owner.id); 771 782 } 772 783 else { 773 784 RESERVE_SPACE(20); 774 - WRITEMEM(opargs->lock_stateid->data, sizeof(opargs->lock_stateid->data)); 775 - WRITE32(opargs->lock_seqid->sequence->counter); 785 + WRITEMEM(args->lock_stateid->data, sizeof(args->lock_stateid->data)); 786 + WRITE32(args->lock_seqid->sequence->counter); 776 787 } 777 788 778 789 return 0; 779 790 } 780 791 781 - static int encode_lockt(struct xdr_stream *xdr, const struct nfs_lockargs *arg) 792 + static int encode_lockt(struct xdr_stream *xdr, const struct nfs_lockt_args *args) 782 793 { 783 794 uint32_t *p; 784 - struct nfs_lowner *opargs = arg->u.lockt; 785 795 786 796 RESERVE_SPACE(40); 787 797 WRITE32(OP_LOCKT); 788 - WRITE32(arg->type); 789 - WRITE64(arg->offset); 790 - WRITE64(arg->length); 791 - WRITE64(opargs->clientid); 798 + WRITE32(nfs4_lock_type(args->fl, 0)); 799 + WRITE64(args->fl->fl_start); 800 + WRITE64(nfs4_lock_length(args->fl)); 801 + WRITE64(args->lock_owner.clientid); 792 802 WRITE32(4); 793 - WRITE32(opargs->id); 803 + WRITE32(args->lock_owner.id); 794 804 795 805 return 0; 796 806 } 797 807 798 - static int encode_locku(struct xdr_stream *xdr, const struct nfs_lockargs *arg) 808 + static int encode_locku(struct xdr_stream *xdr, const struct nfs_locku_args *args) 799 809 { 800 810 uint32_t *p; 801 - struct nfs_locku_opargs *opargs = arg->u.locku; 802 811 803 812 RESERVE_SPACE(44); 804 813 WRITE32(OP_LOCKU); 805 - WRITE32(arg->type); 806 - WRITE32(opargs->seqid->sequence->counter); 807 - WRITEMEM(opargs->stateid->data, sizeof(opargs->stateid->data)); 808 - WRITE64(arg->offset); 809 - WRITE64(arg->length); 814 + WRITE32(nfs4_lock_type(args->fl, 0)); 815 + WRITE32(args->seqid->sequence->counter); 816 + WRITEMEM(args->stateid->data, sizeof(args->stateid->data)); 817 + WRITE64(args->fl->fl_start); 818 + WRITE64(nfs4_lock_length(args->fl)); 810 819 811 820 return 0; 812 821 } ··· 977 964 { 978 965 uint32_t *p; 979 966 980 - RESERVE_SPACE(8+sizeof(arg->stateid.data)); 967 + RESERVE_SPACE(8+sizeof(arg->stateid->data)); 981 968 WRITE32(OP_OPEN_CONFIRM); 982 - WRITEMEM(arg->stateid.data, sizeof(arg->stateid.data)); 969 + WRITEMEM(arg->stateid->data, sizeof(arg->stateid->data)); 983 970 WRITE32(arg->seqid->sequence->counter); 984 971 985 972 return 0; ··· 1512 1499 }; 1513 1500 int status; 1514 1501 1515 - status = nfs_wait_on_sequence(args->seqid, req->rq_task); 1516 - if (status != 0) 1517 - goto out; 1518 1502 xdr_init_encode(&xdr, &req->rq_snd_buf, p); 1519 1503 encode_compound_hdr(&xdr, &hdr); 1520 1504 status = encode_putfh(&xdr, args->fh); ··· 1548 1538 }; 1549 1539 int status; 1550 1540 1551 - status = nfs_wait_on_sequence(args->seqid, req->rq_task); 1552 - if (status != 0) 1553 - goto out; 1554 1541 xdr_init_encode(&xdr, &req->rq_snd_buf, p); 1555 1542 encode_compound_hdr(&xdr, &hdr); 1556 1543 status = encode_putfh(&xdr, args->fh); ··· 1565 1558 { 1566 1559 struct xdr_stream xdr; 1567 1560 struct compound_hdr hdr = { 1568 - .nops = 2, 1561 + .nops = 3, 1569 1562 }; 1570 1563 int status; 1571 1564 1572 - status = nfs_wait_on_sequence(args->seqid, req->rq_task); 1573 - if (status != 0) 1574 - goto out; 1575 1565 xdr_init_encode(&xdr, &req->rq_snd_buf, p); 1576 1566 encode_compound_hdr(&xdr, &hdr); 1577 1567 status = encode_putfh(&xdr, args->fh); 1578 1568 if (status) 1579 1569 goto out; 1580 1570 status = encode_open(&xdr, args); 1571 + if (status) 1572 + goto out; 1573 + status = encode_getfattr(&xdr, args->bitmask); 1581 1574 out: 1582 1575 return status; 1583 1576 } ··· 1609 1602 /* 1610 1603 * Encode a LOCK request 1611 1604 */ 1612 - static int nfs4_xdr_enc_lock(struct rpc_rqst *req, uint32_t *p, struct nfs_lockargs *args) 1605 + static int nfs4_xdr_enc_lock(struct rpc_rqst *req, uint32_t *p, struct nfs_lock_args *args) 1613 1606 { 1614 1607 struct xdr_stream xdr; 1615 1608 struct compound_hdr hdr = { 1616 1609 .nops = 2, 1617 1610 }; 1618 - struct nfs_lock_opargs *opargs = args->u.lock; 1619 1611 int status; 1620 1612 1621 - status = nfs_wait_on_sequence(opargs->lock_seqid, req->rq_task); 1622 - if (status != 0) 1623 - goto out; 1624 - /* Do we need to do an open_to_lock_owner? */ 1625 - if (opargs->lock_seqid->sequence->flags & NFS_SEQID_CONFIRMED) 1626 - opargs->new_lock_owner = 0; 1627 1613 xdr_init_encode(&xdr, &req->rq_snd_buf, p); 1628 1614 encode_compound_hdr(&xdr, &hdr); 1629 1615 status = encode_putfh(&xdr, args->fh); ··· 1630 1630 /* 1631 1631 * Encode a LOCKT request 1632 1632 */ 1633 - static int nfs4_xdr_enc_lockt(struct rpc_rqst *req, uint32_t *p, struct nfs_lockargs *args) 1633 + static int nfs4_xdr_enc_lockt(struct rpc_rqst *req, uint32_t *p, struct nfs_lockt_args *args) 1634 1634 { 1635 1635 struct xdr_stream xdr; 1636 1636 struct compound_hdr hdr = { ··· 1651 1651 /* 1652 1652 * Encode a LOCKU request 1653 1653 */ 1654 - static int nfs4_xdr_enc_locku(struct rpc_rqst *req, uint32_t *p, struct nfs_lockargs *args) 1654 + static int nfs4_xdr_enc_locku(struct rpc_rqst *req, uint32_t *p, struct nfs_locku_args *args) 1655 1655 { 1656 1656 struct xdr_stream xdr; 1657 1657 struct compound_hdr hdr = { ··· 1985 1985 { 1986 1986 struct xdr_stream xdr; 1987 1987 struct compound_hdr hdr = { 1988 - .nops = 2, 1988 + .nops = 3, 1989 1989 }; 1990 1990 int status; 1991 1991 1992 1992 xdr_init_encode(&xdr, &req->rq_snd_buf, p); 1993 1993 encode_compound_hdr(&xdr, &hdr); 1994 - if ((status = encode_putfh(&xdr, args->fhandle)) == 0) 1995 - status = encode_delegreturn(&xdr, args->stateid); 1994 + status = encode_putfh(&xdr, args->fhandle); 1995 + if (status != 0) 1996 + goto out; 1997 + status = encode_delegreturn(&xdr, args->stateid); 1998 + if (status != 0) 1999 + goto out; 2000 + status = encode_getfattr(&xdr, args->bitmask); 2001 + out: 1996 2002 return status; 1997 2003 } 1998 2004 ··· 2961 2955 /* 2962 2956 * We create the owner, so we know a proper owner.id length is 4. 2963 2957 */ 2964 - static int decode_lock_denied (struct xdr_stream *xdr, struct nfs_lock_denied *denied) 2958 + static int decode_lock_denied (struct xdr_stream *xdr, struct file_lock *fl) 2965 2959 { 2960 + uint64_t offset, length, clientid; 2966 2961 uint32_t *p; 2967 - uint32_t namelen; 2962 + uint32_t namelen, type; 2968 2963 2969 2964 READ_BUF(32); 2970 - READ64(denied->offset); 2971 - READ64(denied->length); 2972 - READ32(denied->type); 2973 - READ64(denied->owner.clientid); 2965 + READ64(offset); 2966 + READ64(length); 2967 + READ32(type); 2968 + if (fl != NULL) { 2969 + fl->fl_start = (loff_t)offset; 2970 + fl->fl_end = fl->fl_start + (loff_t)length - 1; 2971 + if (length == ~(uint64_t)0) 2972 + fl->fl_end = OFFSET_MAX; 2973 + fl->fl_type = F_WRLCK; 2974 + if (type & 1) 2975 + fl->fl_type = F_RDLCK; 2976 + fl->fl_pid = 0; 2977 + } 2978 + READ64(clientid); 2974 2979 READ32(namelen); 2975 2980 READ_BUF(namelen); 2976 - if (namelen == 4) 2977 - READ32(denied->owner.id); 2978 2981 return -NFS4ERR_DENIED; 2979 2982 } 2980 2983 2981 - static int decode_lock(struct xdr_stream *xdr, struct nfs_lockres *res) 2984 + static int decode_lock(struct xdr_stream *xdr, struct nfs_lock_res *res) 2982 2985 { 2983 2986 uint32_t *p; 2984 2987 int status; 2985 2988 2986 2989 status = decode_op_hdr(xdr, OP_LOCK); 2987 2990 if (status == 0) { 2988 - READ_BUF(sizeof(res->u.stateid.data)); 2989 - COPYMEM(res->u.stateid.data, sizeof(res->u.stateid.data)); 2991 + READ_BUF(sizeof(res->stateid.data)); 2992 + COPYMEM(res->stateid.data, sizeof(res->stateid.data)); 2990 2993 } else if (status == -NFS4ERR_DENIED) 2991 - return decode_lock_denied(xdr, &res->u.denied); 2994 + return decode_lock_denied(xdr, NULL); 2992 2995 return status; 2993 2996 } 2994 2997 2995 - static int decode_lockt(struct xdr_stream *xdr, struct nfs_lockres *res) 2998 + static int decode_lockt(struct xdr_stream *xdr, struct nfs_lockt_res *res) 2996 2999 { 2997 3000 int status; 2998 3001 status = decode_op_hdr(xdr, OP_LOCKT); 2999 3002 if (status == -NFS4ERR_DENIED) 3000 - return decode_lock_denied(xdr, &res->u.denied); 3003 + return decode_lock_denied(xdr, res->denied); 3001 3004 return status; 3002 3005 } 3003 3006 3004 - static int decode_locku(struct xdr_stream *xdr, struct nfs_lockres *res) 3007 + static int decode_locku(struct xdr_stream *xdr, struct nfs_locku_res *res) 3005 3008 { 3006 3009 uint32_t *p; 3007 3010 int status; 3008 3011 3009 3012 status = decode_op_hdr(xdr, OP_LOCKU); 3010 3013 if (status == 0) { 3011 - READ_BUF(sizeof(res->u.stateid.data)); 3012 - COPYMEM(res->u.stateid.data, sizeof(res->u.stateid.data)); 3014 + READ_BUF(sizeof(res->stateid.data)); 3015 + COPYMEM(res->stateid.data, sizeof(res->stateid.data)); 3013 3016 } 3014 3017 return status; 3015 3018 } ··· 3846 3831 if (status) 3847 3832 goto out; 3848 3833 status = decode_open(&xdr, res); 3834 + if (status) 3835 + goto out; 3836 + decode_getfattr(&xdr, res->f_attr, res->server); 3849 3837 out: 3850 3838 return status; 3851 3839 } ··· 3882 3864 /* 3883 3865 * Decode LOCK response 3884 3866 */ 3885 - static int nfs4_xdr_dec_lock(struct rpc_rqst *rqstp, uint32_t *p, struct nfs_lockres *res) 3867 + static int nfs4_xdr_dec_lock(struct rpc_rqst *rqstp, uint32_t *p, struct nfs_lock_res *res) 3886 3868 { 3887 3869 struct xdr_stream xdr; 3888 3870 struct compound_hdr hdr; ··· 3903 3885 /* 3904 3886 * Decode LOCKT response 3905 3887 */ 3906 - static int nfs4_xdr_dec_lockt(struct rpc_rqst *rqstp, uint32_t *p, struct nfs_lockres *res) 3888 + static int nfs4_xdr_dec_lockt(struct rpc_rqst *rqstp, uint32_t *p, struct nfs_lockt_res *res) 3907 3889 { 3908 3890 struct xdr_stream xdr; 3909 3891 struct compound_hdr hdr; ··· 3924 3906 /* 3925 3907 * Decode LOCKU response 3926 3908 */ 3927 - static int nfs4_xdr_dec_locku(struct rpc_rqst *rqstp, uint32_t *p, struct nfs_lockres *res) 3909 + static int nfs4_xdr_dec_locku(struct rpc_rqst *rqstp, uint32_t *p, struct nfs_locku_res *res) 3928 3910 { 3929 3911 struct xdr_stream xdr; 3930 3912 struct compound_hdr hdr; ··· 4192 4174 /* 4193 4175 * DELEGRETURN request 4194 4176 */ 4195 - static int nfs4_xdr_dec_delegreturn(struct rpc_rqst *rqstp, uint32_t *p, void *dummy) 4177 + static int nfs4_xdr_dec_delegreturn(struct rpc_rqst *rqstp, uint32_t *p, struct nfs4_delegreturnres *res) 4196 4178 { 4197 4179 struct xdr_stream xdr; 4198 4180 struct compound_hdr hdr; ··· 4200 4182 4201 4183 xdr_init_decode(&xdr, &rqstp->rq_rcv_buf, p); 4202 4184 status = decode_compound_hdr(&xdr, &hdr); 4203 - if (status == 0) { 4204 - status = decode_putfh(&xdr); 4205 - if (status == 0) 4206 - status = decode_delegreturn(&xdr); 4207 - } 4185 + if (status != 0) 4186 + goto out; 4187 + status = decode_putfh(&xdr); 4188 + if (status != 0) 4189 + goto out; 4190 + status = decode_delegreturn(&xdr); 4191 + decode_getfattr(&xdr, res->fattr, res->server); 4192 + out: 4208 4193 return status; 4209 4194 } 4210 4195
+2 -2
fs/nfs/nfsroot.c
··· 296 296 nfs_port = -1; 297 297 nfs_data.version = NFS_MOUNT_VERSION; 298 298 nfs_data.flags = NFS_MOUNT_NONLM; /* No lockd in nfs root yet */ 299 - nfs_data.rsize = NFS_DEF_FILE_IO_BUFFER_SIZE; 300 - nfs_data.wsize = NFS_DEF_FILE_IO_BUFFER_SIZE; 299 + nfs_data.rsize = NFS_DEF_FILE_IO_SIZE; 300 + nfs_data.wsize = NFS_DEF_FILE_IO_SIZE; 301 301 nfs_data.acregmin = 3; 302 302 nfs_data.acregmax = 60; 303 303 nfs_data.acdirmin = 30;
+21 -10
fs/nfs/proc.c
··· 111 111 }; 112 112 int status; 113 113 114 + /* Mask out the non-modebit related stuff from attr->ia_mode */ 115 + sattr->ia_mode &= S_IALLUGO; 116 + 114 117 dprintk("NFS call setattr\n"); 115 118 nfs_fattr_init(fattr); 116 119 status = rpc_call(NFS_CLIENT(inode), NFSPROC_SETATTR, &arg, fattr, 0); ··· 550 547 551 548 extern u32 * nfs_decode_dirent(u32 *, struct nfs_entry *, int); 552 549 553 - static void 554 - nfs_read_done(struct rpc_task *task) 550 + static void nfs_read_done(struct rpc_task *task, void *calldata) 555 551 { 556 - struct nfs_read_data *data = (struct nfs_read_data *) task->tk_calldata; 552 + struct nfs_read_data *data = calldata; 557 553 558 554 if (task->tk_status >= 0) { 559 555 nfs_refresh_inode(data->inode, data->res.fattr); ··· 562 560 if (data->args.offset + data->args.count >= data->res.fattr->size) 563 561 data->res.eof = 1; 564 562 } 565 - nfs_readpage_result(task); 563 + nfs_readpage_result(task, calldata); 566 564 } 565 + 566 + static const struct rpc_call_ops nfs_read_ops = { 567 + .rpc_call_done = nfs_read_done, 568 + .rpc_release = nfs_readdata_release, 569 + }; 567 570 568 571 static void 569 572 nfs_proc_read_setup(struct nfs_read_data *data) ··· 587 580 flags = RPC_TASK_ASYNC | (IS_SWAPFILE(inode)? NFS_RPC_SWAPFLAGS : 0); 588 581 589 582 /* Finalize the task. */ 590 - rpc_init_task(task, NFS_CLIENT(inode), nfs_read_done, flags); 583 + rpc_init_task(task, NFS_CLIENT(inode), flags, &nfs_read_ops, data); 591 584 rpc_call_setup(task, &msg, 0); 592 585 } 593 586 594 - static void 595 - nfs_write_done(struct rpc_task *task) 587 + static void nfs_write_done(struct rpc_task *task, void *calldata) 596 588 { 597 - struct nfs_write_data *data = (struct nfs_write_data *) task->tk_calldata; 589 + struct nfs_write_data *data = calldata; 598 590 599 591 if (task->tk_status >= 0) 600 592 nfs_post_op_update_inode(data->inode, data->res.fattr); 601 - nfs_writeback_done(task); 593 + nfs_writeback_done(task, calldata); 602 594 } 595 + 596 + static const struct rpc_call_ops nfs_write_ops = { 597 + .rpc_call_done = nfs_write_done, 598 + .rpc_release = nfs_writedata_release, 599 + }; 603 600 604 601 static void 605 602 nfs_proc_write_setup(struct nfs_write_data *data, int how) ··· 625 614 flags = (how & FLUSH_SYNC) ? 0 : RPC_TASK_ASYNC; 626 615 627 616 /* Finalize the task. */ 628 - rpc_init_task(task, NFS_CLIENT(inode), nfs_write_done, flags); 617 + rpc_init_task(task, NFS_CLIENT(inode), flags, &nfs_write_ops, data); 629 618 rpc_call_setup(task, &msg, 0); 630 619 } 631 620
+6 -10
fs/nfs/read.c
··· 42 42 43 43 #define MIN_POOL_READ (32) 44 44 45 - void nfs_readdata_release(struct rpc_task *task) 45 + void nfs_readdata_release(void *data) 46 46 { 47 - struct nfs_read_data *data = (struct nfs_read_data *)task->tk_calldata; 48 47 nfs_readdata_free(data); 49 48 } 50 49 ··· 83 84 int result; 84 85 struct nfs_read_data *rdata; 85 86 86 - rdata = nfs_readdata_alloc(); 87 + rdata = nfs_readdata_alloc(1); 87 88 if (!rdata) 88 89 return -ENOMEM; 89 90 ··· 219 220 NFS_PROTO(inode)->read_setup(data); 220 221 221 222 data->task.tk_cookie = (unsigned long)inode; 222 - data->task.tk_calldata = data; 223 - /* Release requests */ 224 - data->task.tk_release = nfs_readdata_release; 225 223 226 224 dprintk("NFS: %4d initiated read call (req %s/%Ld, %u bytes @ offset %Lu)\n", 227 225 data->task.tk_pid, ··· 283 287 284 288 nbytes = req->wb_bytes; 285 289 for(;;) { 286 - data = nfs_readdata_alloc(); 290 + data = nfs_readdata_alloc(1); 287 291 if (!data) 288 292 goto out_bad; 289 293 INIT_LIST_HEAD(&data->pages); ··· 339 343 if (NFS_SERVER(inode)->rsize < PAGE_CACHE_SIZE) 340 344 return nfs_pagein_multi(head, inode); 341 345 342 - data = nfs_readdata_alloc(); 346 + data = nfs_readdata_alloc(NFS_SERVER(inode)->rpages); 343 347 if (!data) 344 348 goto out_bad; 345 349 ··· 448 452 * This is the callback from RPC telling us whether a reply was 449 453 * received or some error occurred (timeout or socket shutdown). 450 454 */ 451 - void nfs_readpage_result(struct rpc_task *task) 455 + void nfs_readpage_result(struct rpc_task *task, void *calldata) 452 456 { 453 - struct nfs_read_data *data = (struct nfs_read_data *)task->tk_calldata; 457 + struct nfs_read_data *data = calldata; 454 458 struct nfs_readargs *argp = &data->args; 455 459 struct nfs_readres *resp = &data->res; 456 460 int status = task->tk_status;
+84
fs/nfs/sysctl.c
··· 1 + /* 2 + * linux/fs/nfs/sysctl.c 3 + * 4 + * Sysctl interface to NFS parameters 5 + */ 6 + #include <linux/config.h> 7 + #include <linux/types.h> 8 + #include <linux/linkage.h> 9 + #include <linux/ctype.h> 10 + #include <linux/fs.h> 11 + #include <linux/sysctl.h> 12 + #include <linux/module.h> 13 + #include <linux/nfs4.h> 14 + #include <linux/nfs_idmap.h> 15 + 16 + #include "callback.h" 17 + 18 + static const int nfs_set_port_min = 0; 19 + static const int nfs_set_port_max = 65535; 20 + static struct ctl_table_header *nfs_callback_sysctl_table; 21 + /* 22 + * Something that isn't CTL_ANY, CTL_NONE or a value that may clash. 23 + * Use the same values as fs/lockd/svc.c 24 + */ 25 + #define CTL_UNNUMBERED -2 26 + 27 + static ctl_table nfs_cb_sysctls[] = { 28 + #ifdef CONFIG_NFS_V4 29 + { 30 + .ctl_name = CTL_UNNUMBERED, 31 + .procname = "nfs_callback_tcpport", 32 + .data = &nfs_callback_set_tcpport, 33 + .maxlen = sizeof(int), 34 + .mode = 0644, 35 + .proc_handler = &proc_dointvec_minmax, 36 + .extra1 = (int *)&nfs_set_port_min, 37 + .extra2 = (int *)&nfs_set_port_max, 38 + }, 39 + { 40 + .ctl_name = CTL_UNNUMBERED, 41 + .procname = "idmap_cache_timeout", 42 + .data = &nfs_idmap_cache_timeout, 43 + .maxlen = sizeof(int), 44 + .mode = 0644, 45 + .proc_handler = &proc_dointvec_jiffies, 46 + .strategy = &sysctl_jiffies, 47 + }, 48 + #endif 49 + { .ctl_name = 0 } 50 + }; 51 + 52 + static ctl_table nfs_cb_sysctl_dir[] = { 53 + { 54 + .ctl_name = CTL_UNNUMBERED, 55 + .procname = "nfs", 56 + .mode = 0555, 57 + .child = nfs_cb_sysctls, 58 + }, 59 + { .ctl_name = 0 } 60 + }; 61 + 62 + static ctl_table nfs_cb_sysctl_root[] = { 63 + { 64 + .ctl_name = CTL_FS, 65 + .procname = "fs", 66 + .mode = 0555, 67 + .child = nfs_cb_sysctl_dir, 68 + }, 69 + { .ctl_name = 0 } 70 + }; 71 + 72 + int nfs_register_sysctl(void) 73 + { 74 + nfs_callback_sysctl_table = register_sysctl_table(nfs_cb_sysctl_root, 0); 75 + if (nfs_callback_sysctl_table == NULL) 76 + return -ENOMEM; 77 + return 0; 78 + } 79 + 80 + void nfs_unregister_sysctl(void) 81 + { 82 + unregister_sysctl_table(nfs_callback_sysctl_table); 83 + nfs_callback_sysctl_table = NULL; 84 + }
+14 -16
fs/nfs/unlink.c
··· 87 87 * We delay initializing RPC info until after the call to dentry_iput() 88 88 * in order to minimize races against rename(). 89 89 */ 90 - static void 91 - nfs_async_unlink_init(struct rpc_task *task) 90 + static void nfs_async_unlink_init(struct rpc_task *task, void *calldata) 92 91 { 93 - struct nfs_unlinkdata *data = (struct nfs_unlinkdata *)task->tk_calldata; 92 + struct nfs_unlinkdata *data = calldata; 94 93 struct dentry *dir = data->dir; 95 94 struct rpc_message msg = { 96 95 .rpc_cred = data->cred, ··· 115 116 * 116 117 * Do the directory attribute update. 117 118 */ 118 - static void 119 - nfs_async_unlink_done(struct rpc_task *task) 119 + static void nfs_async_unlink_done(struct rpc_task *task, void *calldata) 120 120 { 121 - struct nfs_unlinkdata *data = (struct nfs_unlinkdata *)task->tk_calldata; 121 + struct nfs_unlinkdata *data = calldata; 122 122 struct dentry *dir = data->dir; 123 123 struct inode *dir_i; 124 124 ··· 139 141 * We need to call nfs_put_unlinkdata as a 'tk_release' task since the 140 142 * rpc_task would be freed too. 141 143 */ 142 - static void 143 - nfs_async_unlink_release(struct rpc_task *task) 144 + static void nfs_async_unlink_release(void *calldata) 144 145 { 145 - struct nfs_unlinkdata *data = (struct nfs_unlinkdata *)task->tk_calldata; 146 + struct nfs_unlinkdata *data = calldata; 146 147 nfs_put_unlinkdata(data); 147 148 } 149 + 150 + static const struct rpc_call_ops nfs_unlink_ops = { 151 + .rpc_call_prepare = nfs_async_unlink_init, 152 + .rpc_call_done = nfs_async_unlink_done, 153 + .rpc_release = nfs_async_unlink_release, 154 + }; 148 155 149 156 /** 150 157 * nfs_async_unlink - asynchronous unlinking of a file ··· 160 157 { 161 158 struct dentry *dir = dentry->d_parent; 162 159 struct nfs_unlinkdata *data; 163 - struct rpc_task *task; 164 160 struct rpc_clnt *clnt = NFS_CLIENT(dir->d_inode); 165 161 int status = -ENOMEM; 166 162 ··· 180 178 nfs_deletes = data; 181 179 data->count = 1; 182 180 183 - task = &data->task; 184 - rpc_init_task(task, clnt, nfs_async_unlink_done , RPC_TASK_ASYNC); 185 - task->tk_calldata = data; 186 - task->tk_action = nfs_async_unlink_init; 187 - task->tk_release = nfs_async_unlink_release; 181 + rpc_init_task(&data->task, clnt, RPC_TASK_ASYNC, &nfs_unlink_ops, data); 188 182 189 183 spin_lock(&dentry->d_lock); 190 184 dentry->d_flags |= DCACHE_NFSFS_RENAMED; 191 185 spin_unlock(&dentry->d_lock); 192 186 193 - rpc_sleep_on(&nfs_delete_queue, task, NULL, NULL); 187 + rpc_sleep_on(&nfs_delete_queue, &data->task, NULL, NULL); 194 188 status = 0; 195 189 out: 196 190 return status;
+45 -44
fs/nfs/write.c
··· 89 89 90 90 static DECLARE_WAIT_QUEUE_HEAD(nfs_write_congestion); 91 91 92 - static inline struct nfs_write_data *nfs_commit_alloc(void) 92 + static inline struct nfs_write_data *nfs_commit_alloc(unsigned int pagecount) 93 93 { 94 94 struct nfs_write_data *p = mempool_alloc(nfs_commit_mempool, SLAB_NOFS); 95 + 95 96 if (p) { 96 97 memset(p, 0, sizeof(*p)); 97 98 INIT_LIST_HEAD(&p->pages); 99 + if (pagecount < NFS_PAGEVEC_SIZE) 100 + p->pagevec = &p->page_array[0]; 101 + else { 102 + size_t size = ++pagecount * sizeof(struct page *); 103 + p->pagevec = kmalloc(size, GFP_NOFS); 104 + if (p->pagevec) { 105 + memset(p->pagevec, 0, size); 106 + } else { 107 + mempool_free(p, nfs_commit_mempool); 108 + p = NULL; 109 + } 110 + } 98 111 } 99 112 return p; 100 113 } 101 114 102 115 static inline void nfs_commit_free(struct nfs_write_data *p) 103 116 { 117 + if (p && (p->pagevec != &p->page_array[0])) 118 + kfree(p->pagevec); 104 119 mempool_free(p, nfs_commit_mempool); 105 120 } 106 121 107 - static void nfs_writedata_release(struct rpc_task *task) 122 + void nfs_writedata_release(void *wdata) 108 123 { 109 - struct nfs_write_data *wdata = (struct nfs_write_data *)task->tk_calldata; 110 124 nfs_writedata_free(wdata); 111 125 } 112 126 ··· 182 168 int result, written = 0; 183 169 struct nfs_write_data *wdata; 184 170 185 - wdata = nfs_writedata_alloc(); 171 + wdata = nfs_writedata_alloc(1); 186 172 if (!wdata) 187 173 return -ENOMEM; 188 174 ··· 246 232 unsigned int offset, unsigned int count) 247 233 { 248 234 struct nfs_page *req; 249 - int status; 250 235 251 236 req = nfs_update_request(ctx, inode, page, offset, count); 252 - status = (IS_ERR(req)) ? PTR_ERR(req) : 0; 253 - if (status < 0) 254 - goto out; 237 + if (IS_ERR(req)) 238 + return PTR_ERR(req); 255 239 /* Update file length */ 256 240 nfs_grow_file(page, offset, count); 257 241 /* Set the PG_uptodate flag? */ 258 242 nfs_mark_uptodate(page, offset, count); 259 243 nfs_unlock_request(req); 260 - out: 261 - return status; 244 + return 0; 262 245 } 263 246 264 247 static int wb_priority(struct writeback_control *wbc) ··· 315 304 lock_kernel(); 316 305 if (!IS_SYNC(inode) && inode_referenced) { 317 306 err = nfs_writepage_async(ctx, inode, page, 0, offset); 318 - if (err >= 0) { 319 - err = 0; 320 - if (wbc->for_reclaim) 321 - nfs_flush_inode(inode, 0, 0, FLUSH_STABLE); 322 - } 307 + if (!wbc->for_writepages) 308 + nfs_flush_inode(inode, 0, 0, wb_priority(wbc)); 323 309 } else { 324 310 err = nfs_writepage_sync(ctx, inode, page, 0, 325 311 offset, priority); ··· 885 877 886 878 data->task.tk_priority = flush_task_priority(how); 887 879 data->task.tk_cookie = (unsigned long)inode; 888 - data->task.tk_calldata = data; 889 - /* Release requests */ 890 - data->task.tk_release = nfs_writedata_release; 891 880 892 881 dprintk("NFS: %4d initiated write call (req %s/%Ld, %u bytes @ offset %Lu)\n", 893 882 data->task.tk_pid, ··· 924 919 925 920 nbytes = req->wb_bytes; 926 921 for (;;) { 927 - data = nfs_writedata_alloc(); 922 + data = nfs_writedata_alloc(1); 928 923 if (!data) 929 924 goto out_bad; 930 925 list_add(&data->pages, &list); ··· 988 983 if (NFS_SERVER(inode)->wsize < PAGE_CACHE_SIZE) 989 984 return nfs_flush_multi(head, inode, how); 990 985 991 - data = nfs_writedata_alloc(); 986 + data = nfs_writedata_alloc(NFS_SERVER(inode)->wpages); 992 987 if (!data) 993 988 goto out_bad; 994 989 ··· 1142 1137 /* 1143 1138 * This function is called when the WRITE call is complete. 1144 1139 */ 1145 - void nfs_writeback_done(struct rpc_task *task) 1140 + void nfs_writeback_done(struct rpc_task *task, void *calldata) 1146 1141 { 1147 - struct nfs_write_data *data = (struct nfs_write_data *) task->tk_calldata; 1142 + struct nfs_write_data *data = calldata; 1148 1143 struct nfs_writeargs *argp = &data->args; 1149 1144 struct nfs_writeres *resp = &data->res; 1150 1145 ··· 1211 1206 1212 1207 1213 1208 #if defined(CONFIG_NFS_V3) || defined(CONFIG_NFS_V4) 1214 - static void nfs_commit_release(struct rpc_task *task) 1209 + void nfs_commit_release(void *wdata) 1215 1210 { 1216 - struct nfs_write_data *wdata = (struct nfs_write_data *)task->tk_calldata; 1217 1211 nfs_commit_free(wdata); 1218 1212 } 1219 1213 ··· 1248 1244 1249 1245 data->task.tk_priority = flush_task_priority(how); 1250 1246 data->task.tk_cookie = (unsigned long)inode; 1251 - data->task.tk_calldata = data; 1252 - /* Release requests */ 1253 - data->task.tk_release = nfs_commit_release; 1254 1247 1255 1248 dprintk("NFS: %4d initiated commit call\n", data->task.tk_pid); 1256 1249 } ··· 1256 1255 * Commit dirty pages 1257 1256 */ 1258 1257 static int 1259 - nfs_commit_list(struct list_head *head, int how) 1258 + nfs_commit_list(struct inode *inode, struct list_head *head, int how) 1260 1259 { 1261 1260 struct nfs_write_data *data; 1262 1261 struct nfs_page *req; 1263 1262 1264 - data = nfs_commit_alloc(); 1263 + data = nfs_commit_alloc(NFS_SERVER(inode)->wpages); 1265 1264 1266 1265 if (!data) 1267 1266 goto out_bad; ··· 1284 1283 /* 1285 1284 * COMMIT call returned 1286 1285 */ 1287 - void 1288 - nfs_commit_done(struct rpc_task *task) 1286 + void nfs_commit_done(struct rpc_task *task, void *calldata) 1289 1287 { 1290 - struct nfs_write_data *data = (struct nfs_write_data *)task->tk_calldata; 1288 + struct nfs_write_data *data = calldata; 1291 1289 struct nfs_page *req; 1292 1290 int res = 0; 1293 1291 ··· 1366 1366 res = nfs_scan_commit(inode, &head, 0, 0); 1367 1367 spin_unlock(&nfsi->req_lock); 1368 1368 if (res) { 1369 - error = nfs_commit_list(&head, how); 1369 + error = nfs_commit_list(inode, &head, how); 1370 1370 if (error < 0) 1371 1371 return error; 1372 1372 } ··· 1377 1377 int nfs_sync_inode(struct inode *inode, unsigned long idx_start, 1378 1378 unsigned int npages, int how) 1379 1379 { 1380 - int error, 1381 - wait; 1380 + int nocommit = how & FLUSH_NOCOMMIT; 1381 + int wait = how & FLUSH_WAIT; 1382 + int error; 1382 1383 1383 - wait = how & FLUSH_WAIT; 1384 - how &= ~FLUSH_WAIT; 1384 + how &= ~(FLUSH_WAIT|FLUSH_NOCOMMIT); 1385 1385 1386 1386 do { 1387 - error = 0; 1388 - if (wait) 1387 + if (wait) { 1389 1388 error = nfs_wait_on_requests(inode, idx_start, npages); 1390 - if (error == 0) 1391 - error = nfs_flush_inode(inode, idx_start, npages, how); 1392 - #if defined(CONFIG_NFS_V3) || defined(CONFIG_NFS_V4) 1393 - if (error == 0) 1389 + if (error != 0) 1390 + continue; 1391 + } 1392 + error = nfs_flush_inode(inode, idx_start, npages, how); 1393 + if (error != 0) 1394 + continue; 1395 + if (!nocommit) 1394 1396 error = nfs_commit_inode(inode, how); 1395 - #endif 1396 1397 } while (error > 0); 1397 1398 return error; 1398 1399 }
+7 -4
fs/nfsd/nfs4callback.c
··· 53 53 #define NFSPROC4_CB_COMPOUND 1 54 54 55 55 /* declarations */ 56 - static void nfs4_cb_null(struct rpc_task *task); 56 + static const struct rpc_call_ops nfs4_cb_null_ops; 57 57 58 58 /* Index of predefined Linux callback client operations */ 59 59 ··· 431 431 } 432 432 clnt->cl_intr = 0; 433 433 clnt->cl_softrtry = 1; 434 - clnt->cl_chatty = 1; 435 434 436 435 /* Kick rpciod, put the call on the wire. */ 437 436 ··· 446 447 msg.rpc_cred = nfsd4_lookupcred(clp,0); 447 448 if (IS_ERR(msg.rpc_cred)) 448 449 goto out_rpciod; 449 - status = rpc_call_async(clnt, &msg, RPC_TASK_ASYNC, nfs4_cb_null, NULL); 450 + status = rpc_call_async(clnt, &msg, RPC_TASK_ASYNC, &nfs4_cb_null_ops, NULL); 450 451 put_rpccred(msg.rpc_cred); 451 452 452 453 if (status != 0) { ··· 468 469 } 469 470 470 471 static void 471 - nfs4_cb_null(struct rpc_task *task) 472 + nfs4_cb_null(struct rpc_task *task, void *dummy) 472 473 { 473 474 struct nfs4_client *clp = (struct nfs4_client *)task->tk_msg.rpc_argp; 474 475 struct nfs4_callback *cb = &clp->cl_callback; ··· 486 487 out: 487 488 put_nfs4_client(clp); 488 489 } 490 + 491 + static const struct rpc_call_ops nfs4_cb_null_ops = { 492 + .rpc_call_done = nfs4_cb_null, 493 + }; 489 494 490 495 /* 491 496 * called with dp->dl_count inc'ed.
+1 -1
fs/ufs/dir.c
··· 491 491 492 492 UFSD(("ino %u, reclen %u, namlen %u, name %s\n", 493 493 fs32_to_cpu(sb, de->d_ino), 494 - fs16to_cpu(sb, de->d_reclen), 494 + fs16_to_cpu(sb, de->d_reclen), 495 495 ufs_get_de_namlen(sb, de), de->d_name)) 496 496 497 497 while (i < bh->b_size) {
+1 -1
include/linux/filter.h
··· 143 143 struct sk_buff; 144 144 struct sock; 145 145 146 - extern int sk_run_filter(struct sk_buff *skb, struct sock_filter *filter, int flen); 146 + extern unsigned int sk_run_filter(struct sk_buff *skb, struct sock_filter *filter, int flen); 147 147 extern int sk_attach_filter(struct sock_fprog *fprog, struct sock *sk); 148 148 extern int sk_chk_filter(struct sock_filter *filter, int flen); 149 149 #endif /* __KERNEL__ */
+1 -1
include/linux/fs.h
··· 760 760 extern int posix_lock_file(struct file *, struct file_lock *); 761 761 extern int posix_lock_file_wait(struct file *, struct file_lock *); 762 762 extern void posix_block_lock(struct file_lock *, struct file_lock *); 763 - extern void posix_unblock_lock(struct file *, struct file_lock *); 763 + extern int posix_unblock_lock(struct file *, struct file_lock *); 764 764 extern int posix_locks_deadlock(struct file_lock *, struct file_lock *); 765 765 extern int flock_lock_file_wait(struct file *filp, struct file_lock *fl); 766 766 extern int __break_lease(struct inode *inode, unsigned int flags);
+3 -3
include/linux/hwmon-vid.h
··· 23 23 #ifndef _LINUX_HWMON_VID_H 24 24 #define _LINUX_HWMON_VID_H 25 25 26 - int vid_from_reg(int val, int vrm); 27 - int vid_which_vrm(void); 26 + int vid_from_reg(int val, u8 vrm); 27 + u8 vid_which_vrm(void); 28 28 29 29 /* vrm is the VRM/VRD document version multiplied by 10. 30 30 val is in mV to avoid floating point in the kernel. 31 31 Returned value is the 4-, 5- or 6-bit VID code. 32 32 Note that only VRM 9.x is supported for now. */ 33 - static inline int vid_to_reg(int val, int vrm) 33 + static inline int vid_to_reg(int val, u8 vrm) 34 34 { 35 35 switch (vrm) { 36 36 case 91: /* VRM 9.1 */
-20
include/linux/i2c-id.h
··· 25 25 26 26 /* 27 27 * ---- Driver types ----------------------------------------------------- 28 - * device id name + number function description, i2c address(es) 29 - * 30 - * Range 1000-1999 range is defined in sensors/sensors.h 31 - * Range 0x100 - 0x1ff is for V4L2 Common Components 32 - * Range 0xf000 - 0xffff is reserved for local experimentation, and should 33 - * never be used in official drivers 34 28 */ 35 29 36 30 #define I2C_DRIVERID_MSP3400 1 ··· 104 110 #define I2C_DRIVERID_AKITAIOEXP 74 /* IO Expander on Sharp SL-C1000 */ 105 111 #define I2C_DRIVERID_INFRARED 75 /* I2C InfraRed on Video boards */ 106 112 107 - #define I2C_DRIVERID_EXP0 0xF0 /* experimental use id's */ 108 - #define I2C_DRIVERID_EXP1 0xF1 109 - #define I2C_DRIVERID_EXP2 0xF2 110 - #define I2C_DRIVERID_EXP3 0xF3 111 - 112 113 #define I2C_DRIVERID_I2CDEV 900 113 - #define I2C_DRIVERID_I2CPROC 901 114 114 #define I2C_DRIVERID_ARP 902 /* SMBus ARP Client */ 115 115 #define I2C_DRIVERID_ALERT 903 /* SMBus Alert Responder Client */ 116 116 ··· 119 131 #define I2C_DRIVERID_ADM1021 1008 120 132 #define I2C_DRIVERID_ADM9240 1009 121 133 #define I2C_DRIVERID_LTC1710 1010 122 - #define I2C_DRIVERID_SIS5595 1011 123 134 #define I2C_DRIVERID_ICSPLL 1012 124 135 #define I2C_DRIVERID_BT869 1013 125 136 #define I2C_DRIVERID_MAXILIFE 1014 126 137 #define I2C_DRIVERID_MATORB 1015 127 138 #define I2C_DRIVERID_GL520 1016 128 139 #define I2C_DRIVERID_THMC50 1017 129 - #define I2C_DRIVERID_DDCMON 1018 130 - #define I2C_DRIVERID_VIA686A 1019 131 140 #define I2C_DRIVERID_ADM1025 1020 132 141 #define I2C_DRIVERID_LM87 1021 133 142 #define I2C_DRIVERID_PCF8574 1022 ··· 136 151 #define I2C_DRIVERID_FSCPOS 1028 137 152 #define I2C_DRIVERID_FSCSCY 1029 138 153 #define I2C_DRIVERID_PCF8591 1030 139 - #define I2C_DRIVERID_SMSC47M1 1031 140 - #define I2C_DRIVERID_VT1211 1032 141 154 #define I2C_DRIVERID_LM92 1033 142 - #define I2C_DRIVERID_VT8231 1034 143 155 #define I2C_DRIVERID_SMARTBATT 1035 144 156 #define I2C_DRIVERID_BMCSENSORS 1036 145 157 #define I2C_DRIVERID_FS451 1037 146 - #define I2C_DRIVERID_W83627HF 1038 147 158 #define I2C_DRIVERID_LM85 1039 148 159 #define I2C_DRIVERID_LM83 1040 149 160 #define I2C_DRIVERID_LM90 1042 150 161 #define I2C_DRIVERID_ASB100 1043 151 162 #define I2C_DRIVERID_FSCHER 1046 152 163 #define I2C_DRIVERID_W83L785TS 1047 153 - #define I2C_DRIVERID_SMSC47B397 1050 154 164 155 165 /* 156 166 * ---- Adapter types ----------------------------------------------------
+12 -29
include/linux/i2c.h
··· 105 105 * A driver is capable of handling one or more physical devices present on 106 106 * I2C adapters. This information is used to inform the driver of adapter 107 107 * events. 108 + * 109 + * The driver.owner field should be set to the module owner of this driver. 110 + * The driver.name field should be set to the name of this driver. 108 111 */ 109 112 110 113 struct i2c_driver { 111 - struct module *owner; 112 - char name[32]; 113 114 int id; 114 115 unsigned int class; 115 - unsigned int flags; /* div., see below */ 116 116 117 117 /* Notifies the driver that a new bus has appeared. This routine 118 118 * can be used by the driver to test if the bus meets its conditions ··· 250 250 dev_set_drvdata (&dev->dev, data); 251 251 } 252 252 253 - /*flags for the driver struct: */ 254 - #define I2C_DF_NOTIFY 0x01 /* notify on bus (de/a)ttaches */ 255 - #if 0 256 - /* this flag is gone -- there is a (optional) driver->detach_adapter 257 - * callback now which can be used instead */ 258 - # define I2C_DF_DUMMY 0x02 259 - #endif 260 - 261 253 /*flags for the client struct: */ 262 - #define I2C_CLIENT_ALLOW_USE 0x01 /* Client allows access */ 263 - #define I2C_CLIENT_ALLOW_MULTIPLE_USE 0x02 /* Allow multiple access-locks */ 264 - /* on an i2c_client */ 265 254 #define I2C_CLIENT_PEC 0x04 /* Use Packet Error Checking */ 266 255 #define I2C_CLIENT_TEN 0x10 /* we have a ten bit chip address */ 267 256 /* Must equal I2C_M_TEN below */ ··· 291 302 extern int i2c_add_adapter(struct i2c_adapter *); 292 303 extern int i2c_del_adapter(struct i2c_adapter *); 293 304 294 - extern int i2c_add_driver(struct i2c_driver *); 305 + extern int i2c_register_driver(struct module *, struct i2c_driver *); 295 306 extern int i2c_del_driver(struct i2c_driver *); 307 + 308 + static inline int i2c_add_driver(struct i2c_driver *driver) 309 + { 310 + return i2c_register_driver(THIS_MODULE, driver); 311 + } 296 312 297 313 extern int i2c_attach_client(struct i2c_client *); 298 314 extern int i2c_detach_client(struct i2c_client *); 299 315 300 - /* New function: This is to get an i2c_client-struct for controlling the 301 - client either by using i2c_control-function or having the 302 - client-module export functions that can be used with the i2c_client 303 - -struct. */ 304 - extern struct i2c_client *i2c_get_client(int driver_id, int adapter_id, 305 - struct i2c_client *prev); 306 - 307 - /* Should be used with new function 308 - extern struct i2c_client *i2c_get_client(int,int,struct i2c_client *); 309 - to make sure that client-struct is valid and that it is okay to access 310 - the i2c-client. 311 - returns -EACCES if client doesn't allow use (default) 312 - returns -EBUSY if client doesn't allow multiple use (default) and 313 - usage_count >0 */ 316 + /* Should be used to make sure that client-struct is valid and that it 317 + is okay to access the i2c-client. 318 + returns -ENODEV if client has gone in the meantime */ 314 319 extern int i2c_use_client(struct i2c_client *); 315 320 extern int i2c_release_client(struct i2c_client *); 316 321
+1 -1
include/linux/inet.h
··· 45 45 #ifdef __KERNEL__ 46 46 #include <linux/types.h> 47 47 48 - extern __u32 in_aton(const char *str); 48 + extern __be32 in_aton(const char *str); 49 49 #endif 50 50 #endif /* _LINUX_INET_H */
+5 -5
include/linux/ip.h
··· 90 90 #error "Please fix <asm/byteorder.h>" 91 91 #endif 92 92 __u8 tos; 93 - __u16 tot_len; 94 - __u16 id; 95 - __u16 frag_off; 93 + __be16 tot_len; 94 + __be16 id; 95 + __be16 frag_off; 96 96 __u8 ttl; 97 97 __u8 protocol; 98 98 __u16 check; 99 - __u32 saddr; 100 - __u32 daddr; 99 + __be32 saddr; 100 + __be32 daddr; 101 101 /*The options start here. */ 102 102 }; 103 103
+1 -1
include/linux/lockd/lockd.h
··· 172 172 /* 173 173 * Server-side lock handling 174 174 */ 175 - int nlmsvc_async_call(struct nlm_rqst *, u32, rpc_action); 175 + int nlmsvc_async_call(struct nlm_rqst *, u32, const struct rpc_call_ops *); 176 176 u32 nlmsvc_lock(struct svc_rqst *, struct nlm_file *, 177 177 struct nlm_lock *, int, struct nlm_cookie *); 178 178 u32 nlmsvc_unlock(struct nlm_file *, struct nlm_lock *);
+1 -1
include/linux/moduleparam.h
··· 10 10 #ifdef MODULE 11 11 #define MODULE_PARAM_PREFIX /* empty */ 12 12 #else 13 - #define MODULE_PARAM_PREFIX __stringify(KBUILD_MODNAME) "." 13 + #define MODULE_PARAM_PREFIX KBUILD_MODNAME "." 14 14 #endif 15 15 16 16 #ifdef MODULE
+54 -11
include/linux/nfs_fs.h
··· 38 38 # define NFS_DEBUG 39 39 #endif 40 40 41 - #define NFS_MAX_FILE_IO_BUFFER_SIZE 32768 42 - #define NFS_DEF_FILE_IO_BUFFER_SIZE 4096 43 - 44 41 /* Default timeout values */ 45 42 #define NFS_MAX_UDP_TIMEOUT (60*HZ) 46 43 #define NFS_MAX_TCP_TIMEOUT (600*HZ) ··· 62 65 #define FLUSH_STABLE 4 /* commit to stable storage */ 63 66 #define FLUSH_LOWPRI 8 /* low priority background flush */ 64 67 #define FLUSH_HIGHPRI 16 /* high priority memory reclaim flush */ 68 + #define FLUSH_NOCOMMIT 32 /* Don't send the NFSv3/v4 COMMIT */ 65 69 66 70 #ifdef __KERNEL__ 67 71 ··· 392 394 extern struct inode_operations nfs_symlink_inode_operations; 393 395 394 396 /* 397 + * linux/fs/nfs/sysctl.c 398 + */ 399 + #ifdef CONFIG_SYSCTL 400 + extern int nfs_register_sysctl(void); 401 + extern void nfs_unregister_sysctl(void); 402 + #else 403 + #define nfs_register_sysctl() do { } while(0) 404 + #define nfs_unregister_sysctl() do { } while(0) 405 + #endif 406 + 407 + /* 395 408 * linux/fs/nfs/unlink.c 396 409 */ 397 410 extern int nfs_async_unlink(struct dentry *); ··· 415 406 extern int nfs_writepages(struct address_space *, struct writeback_control *); 416 407 extern int nfs_flush_incompatible(struct file *file, struct page *page); 417 408 extern int nfs_updatepage(struct file *, struct page *, unsigned int, unsigned int); 418 - extern void nfs_writeback_done(struct rpc_task *task); 409 + extern void nfs_writeback_done(struct rpc_task *task, void *data); 410 + extern void nfs_writedata_release(void *data); 419 411 420 412 #if defined(CONFIG_NFS_V3) || defined(CONFIG_NFS_V4) 421 - extern void nfs_commit_done(struct rpc_task *); 413 + extern void nfs_commit_done(struct rpc_task *, void *data); 414 + extern void nfs_commit_release(void *data); 422 415 #endif 423 416 424 417 /* ··· 471 460 */ 472 461 extern mempool_t *nfs_wdata_mempool; 473 462 474 - static inline struct nfs_write_data *nfs_writedata_alloc(void) 463 + static inline struct nfs_write_data *nfs_writedata_alloc(unsigned int pagecount) 475 464 { 476 465 struct nfs_write_data *p = mempool_alloc(nfs_wdata_mempool, SLAB_NOFS); 466 + 477 467 if (p) { 478 468 memset(p, 0, sizeof(*p)); 479 469 INIT_LIST_HEAD(&p->pages); 470 + if (pagecount < NFS_PAGEVEC_SIZE) 471 + p->pagevec = &p->page_array[0]; 472 + else { 473 + size_t size = ++pagecount * sizeof(struct page *); 474 + p->pagevec = kmalloc(size, GFP_NOFS); 475 + if (p->pagevec) { 476 + memset(p->pagevec, 0, size); 477 + } else { 478 + mempool_free(p, nfs_wdata_mempool); 479 + p = NULL; 480 + } 481 + } 480 482 } 481 483 return p; 482 484 } 483 485 484 486 static inline void nfs_writedata_free(struct nfs_write_data *p) 485 487 { 488 + if (p && (p->pagevec != &p->page_array[0])) 489 + kfree(p->pagevec); 486 490 mempool_free(p, nfs_wdata_mempool); 487 491 } 488 492 ··· 507 481 extern int nfs_readpage(struct file *, struct page *); 508 482 extern int nfs_readpages(struct file *, struct address_space *, 509 483 struct list_head *, unsigned); 510 - extern void nfs_readpage_result(struct rpc_task *); 484 + extern void nfs_readpage_result(struct rpc_task *, void *); 485 + extern void nfs_readdata_release(void *data); 486 + 511 487 512 488 /* 513 489 * Allocate and free nfs_read_data structures 514 490 */ 515 491 extern mempool_t *nfs_rdata_mempool; 516 492 517 - static inline struct nfs_read_data *nfs_readdata_alloc(void) 493 + static inline struct nfs_read_data *nfs_readdata_alloc(unsigned int pagecount) 518 494 { 519 495 struct nfs_read_data *p = mempool_alloc(nfs_rdata_mempool, SLAB_NOFS); 520 - if (p) 496 + 497 + if (p) { 521 498 memset(p, 0, sizeof(*p)); 499 + INIT_LIST_HEAD(&p->pages); 500 + if (pagecount < NFS_PAGEVEC_SIZE) 501 + p->pagevec = &p->page_array[0]; 502 + else { 503 + size_t size = ++pagecount * sizeof(struct page *); 504 + p->pagevec = kmalloc(size, GFP_NOFS); 505 + if (p->pagevec) { 506 + memset(p->pagevec, 0, size); 507 + } else { 508 + mempool_free(p, nfs_rdata_mempool); 509 + p = NULL; 510 + } 511 + } 512 + } 522 513 return p; 523 514 } 524 515 525 516 static inline void nfs_readdata_free(struct nfs_read_data *p) 526 517 { 518 + if (p && (p->pagevec != &p->page_array[0])) 519 + kfree(p->pagevec); 527 520 mempool_free(p, nfs_rdata_mempool); 528 521 } 529 - 530 - extern void nfs_readdata_release(struct rpc_task *task); 531 522 532 523 /* 533 524 * linux/fs/nfs3proc.c
+2
include/linux/nfs_idmap.h
··· 71 71 int nfs_map_group_to_gid(struct nfs4_client *, const char *, size_t, __u32 *); 72 72 int nfs_map_uid_to_name(struct nfs4_client *, __u32, char *); 73 73 int nfs_map_gid_to_group(struct nfs4_client *, __u32, char *); 74 + 75 + extern unsigned int nfs_idmap_cache_timeout; 74 76 #endif /* __KERNEL__ */ 75 77 76 78 #endif /* NFS_IDMAP_H */
+3 -9
include/linux/nfs_page.h
··· 79 79 static inline int 80 80 nfs_lock_request_dontget(struct nfs_page *req) 81 81 { 82 - if (test_and_set_bit(PG_BUSY, &req->wb_flags)) 83 - return 0; 84 - return 1; 82 + return !test_and_set_bit(PG_BUSY, &req->wb_flags); 85 83 } 86 84 87 85 /* ··· 123 125 static inline int 124 126 nfs_defer_commit(struct nfs_page *req) 125 127 { 126 - if (test_and_set_bit(PG_NEED_COMMIT, &req->wb_flags)) 127 - return 0; 128 - return 1; 128 + return !test_and_set_bit(PG_NEED_COMMIT, &req->wb_flags); 129 129 } 130 130 131 131 static inline void ··· 137 141 static inline int 138 142 nfs_defer_reschedule(struct nfs_page *req) 139 143 { 140 - if (test_and_set_bit(PG_NEED_RESCHED, &req->wb_flags)) 141 - return 0; 142 - return 1; 144 + return !test_and_set_bit(PG_NEED_RESCHED, &req->wb_flags); 143 145 } 144 146 145 147 static inline void
+47 -42
include/linux/nfs_xdr.h
··· 4 4 #include <linux/sunrpc/xprt.h> 5 5 #include <linux/nfsacl.h> 6 6 7 + /* 8 + * To change the maximum rsize and wsize supported by the NFS client, adjust 9 + * NFS_MAX_FILE_IO_SIZE. 64KB is a typical maximum, but some servers can 10 + * support a megabyte or more. The default is left at 4096 bytes, which is 11 + * reasonable for NFS over UDP. 12 + */ 13 + #define NFS_MAX_FILE_IO_SIZE (1048576U) 14 + #define NFS_DEF_FILE_IO_SIZE (4096U) 15 + #define NFS_MIN_FILE_IO_SIZE (1024U) 16 + 7 17 struct nfs4_fsid { 8 18 __u64 major; 9 19 __u64 minor; ··· 147 137 */ 148 138 struct nfs_open_confirmargs { 149 139 const struct nfs_fh * fh; 150 - nfs4_stateid stateid; 140 + nfs4_stateid * stateid; 151 141 struct nfs_seqid * seqid; 152 142 }; 153 143 ··· 175 165 * * Arguments to the lock,lockt, and locku call. 176 166 * */ 177 167 struct nfs_lowner { 178 - __u64 clientid; 179 - u32 id; 168 + __u64 clientid; 169 + u32 id; 180 170 }; 181 171 182 - struct nfs_lock_opargs { 172 + struct nfs_lock_args { 173 + struct nfs_fh * fh; 174 + struct file_lock * fl; 183 175 struct nfs_seqid * lock_seqid; 184 176 nfs4_stateid * lock_stateid; 185 177 struct nfs_seqid * open_seqid; 186 178 nfs4_stateid * open_stateid; 187 - struct nfs_lowner lock_owner; 188 - __u32 reclaim; 189 - __u32 new_lock_owner; 179 + struct nfs_lowner lock_owner; 180 + unsigned char block : 1; 181 + unsigned char reclaim : 1; 182 + unsigned char new_lock_owner : 1; 190 183 }; 191 184 192 - struct nfs_locku_opargs { 185 + struct nfs_lock_res { 186 + nfs4_stateid stateid; 187 + }; 188 + 189 + struct nfs_locku_args { 190 + struct nfs_fh * fh; 191 + struct file_lock * fl; 193 192 struct nfs_seqid * seqid; 194 193 nfs4_stateid * stateid; 195 194 }; 196 195 197 - struct nfs_lockargs { 198 - struct nfs_fh * fh; 199 - __u32 type; 200 - __u64 offset; 201 - __u64 length; 202 - union { 203 - struct nfs_lock_opargs *lock; /* LOCK */ 204 - struct nfs_lowner *lockt; /* LOCKT */ 205 - struct nfs_locku_opargs *locku; /* LOCKU */ 206 - } u; 196 + struct nfs_locku_res { 197 + nfs4_stateid stateid; 207 198 }; 208 199 209 - struct nfs_lock_denied { 210 - __u64 offset; 211 - __u64 length; 212 - __u32 type; 213 - struct nfs_lowner owner; 200 + struct nfs_lockt_args { 201 + struct nfs_fh * fh; 202 + struct file_lock * fl; 203 + struct nfs_lowner lock_owner; 214 204 }; 215 205 216 - struct nfs_lockres { 217 - union { 218 - nfs4_stateid stateid;/* LOCK success, LOCKU */ 219 - struct nfs_lock_denied denied; /* LOCK failed, LOCKT success */ 220 - } u; 221 - const struct nfs_server * server; 206 + struct nfs_lockt_res { 207 + struct file_lock * denied; /* LOCK, LOCKT failed */ 222 208 }; 223 209 224 210 struct nfs4_delegreturnargs { 225 211 const struct nfs_fh *fhandle; 226 212 const nfs4_stateid *stateid; 213 + const u32 * bitmask; 214 + }; 215 + 216 + struct nfs4_delegreturnres { 217 + struct nfs_fattr * fattr; 218 + const struct nfs_server *server; 227 219 }; 228 220 229 221 /* 230 222 * Arguments to the read call. 231 223 */ 232 - 233 - #define NFS_READ_MAXIOV (9U) 234 - #if (NFS_READ_MAXIOV > (MAX_IOVEC -2)) 235 - #error "NFS_READ_MAXIOV is too large" 236 - #endif 237 - 238 224 struct nfs_readargs { 239 225 struct nfs_fh * fh; 240 226 struct nfs_open_context *context; ··· 249 243 /* 250 244 * Arguments to the write call. 251 245 */ 252 - #define NFS_WRITE_MAXIOV (9U) 253 - #if (NFS_WRITE_MAXIOV > (MAX_IOVEC -2)) 254 - #error "NFS_WRITE_MAXIOV is too large" 255 - #endif 256 - 257 246 struct nfs_writeargs { 258 247 struct nfs_fh * fh; 259 248 struct nfs_open_context *context; ··· 679 678 680 679 struct nfs_page; 681 680 681 + #define NFS_PAGEVEC_SIZE (8U) 682 + 682 683 struct nfs_read_data { 683 684 int flags; 684 685 struct rpc_task task; ··· 689 686 struct nfs_fattr fattr; /* fattr storage */ 690 687 struct list_head pages; /* Coalesced read requests */ 691 688 struct nfs_page *req; /* multi ops per nfs_page */ 692 - struct page *pagevec[NFS_READ_MAXIOV]; 689 + struct page **pagevec; 693 690 struct nfs_readargs args; 694 691 struct nfs_readres res; 695 692 #ifdef CONFIG_NFS_V4 696 693 unsigned long timestamp; /* For lease renewal */ 697 694 #endif 698 695 void (*complete) (struct nfs_read_data *, int); 696 + struct page *page_array[NFS_PAGEVEC_SIZE + 1]; 699 697 }; 700 698 701 699 struct nfs_write_data { ··· 708 704 struct nfs_writeverf verf; 709 705 struct list_head pages; /* Coalesced requests we wish to flush */ 710 706 struct nfs_page *req; /* multi ops per nfs_page */ 711 - struct page *pagevec[NFS_WRITE_MAXIOV]; 707 + struct page **pagevec; 712 708 struct nfs_writeargs args; /* argument struct */ 713 709 struct nfs_writeres res; /* result struct */ 714 710 #ifdef CONFIG_NFS_V4 715 711 unsigned long timestamp; /* For lease renewal */ 716 712 #endif 717 713 void (*complete) (struct nfs_write_data *, int); 714 + struct page *page_array[NFS_PAGEVEC_SIZE + 1]; 718 715 }; 719 716 720 717 struct nfs_access_entry;
+1
include/linux/pci_ids.h
··· 986 986 #define PCI_DEVICE_ID_NVIDIA_TNT_UNKNOWN 0x002a 987 987 #define PCI_DEVICE_ID_NVIDIA_VTNT2 0x002C 988 988 #define PCI_DEVICE_ID_NVIDIA_UVTNT2 0x002D 989 + #define PCI_DEVICE_ID_NVIDIA_NFORCE_MCP04_SMBUS 0x0034 989 990 #define PCI_DEVICE_ID_NVIDIA_NFORCE_MCP04_IDE 0x0035 990 991 #define PCI_DEVICE_ID_NVIDIA_NFORCE_MCP04_SATA 0x0036 991 992 #define PCI_DEVICE_ID_NVIDIA_NVENET_10 0x0037
+3 -2
include/linux/sunrpc/clnt.h
··· 49 49 50 50 unsigned int cl_softrtry : 1,/* soft timeouts */ 51 51 cl_intr : 1,/* interruptible */ 52 - cl_chatty : 1,/* be verbose */ 53 52 cl_autobind : 1,/* use getport() */ 54 53 cl_oneshot : 1,/* dispose after use */ 55 54 cl_dead : 1;/* abandoned */ ··· 125 126 void rpc_call_setup(struct rpc_task *, struct rpc_message *, int); 126 127 127 128 int rpc_call_async(struct rpc_clnt *clnt, struct rpc_message *msg, 128 - int flags, rpc_action callback, void *clntdata); 129 + int flags, const struct rpc_call_ops *tk_ops, 130 + void *calldata); 129 131 int rpc_call_sync(struct rpc_clnt *clnt, struct rpc_message *msg, 130 132 int flags); 131 133 void rpc_restart_call(struct rpc_task *); ··· 134 134 void rpc_clnt_sigunmask(struct rpc_clnt *clnt, sigset_t *oldset); 135 135 void rpc_setbufsize(struct rpc_clnt *, unsigned int, unsigned int); 136 136 size_t rpc_max_payload(struct rpc_clnt *); 137 + void rpc_force_rebind(struct rpc_clnt *); 137 138 int rpc_ping(struct rpc_clnt *clnt, int flags); 138 139 139 140 static __inline__
+1 -1
include/linux/sunrpc/gss_spkm3.h
··· 48 48 #define CKSUMTYPE_RSA_MD5 0x0007 49 49 50 50 s32 make_checksum(s32 cksumtype, char *header, int hdrlen, struct xdr_buf *body, 51 - struct xdr_netobj *cksum); 51 + int body_offset, struct xdr_netobj *cksum); 52 52 void asn1_bitstring_len(struct xdr_netobj *in, int *enclen, int *zerobits); 53 53 int decode_asn1_bitstring(struct xdr_netobj *out, char *in, int enclen, 54 54 int explen);
+37 -11
include/linux/sunrpc/sched.h
··· 27 27 struct rpc_cred * rpc_cred; /* Credentials */ 28 28 }; 29 29 30 + struct rpc_call_ops; 30 31 struct rpc_wait_queue; 31 32 struct rpc_wait { 32 33 struct list_head list; /* wait queue links */ ··· 42 41 #ifdef RPC_DEBUG 43 42 unsigned long tk_magic; /* 0xf00baa */ 44 43 #endif 44 + atomic_t tk_count; /* Reference count */ 45 45 struct list_head tk_task; /* global list of tasks */ 46 46 struct rpc_clnt * tk_client; /* RPC client */ 47 47 struct rpc_rqst * tk_rqstp; /* RPC request */ ··· 52 50 * RPC call state 53 51 */ 54 52 struct rpc_message tk_msg; /* RPC call info */ 55 - __u32 * tk_buffer; /* XDR buffer */ 56 - size_t tk_bufsize; 57 53 __u8 tk_garb_retry; 58 54 __u8 tk_cred_retry; 59 55 ··· 61 61 * timeout_fn to be executed by timer bottom half 62 62 * callback to be executed after waking up 63 63 * action next procedure for async tasks 64 - * exit exit async task and report to caller 64 + * tk_ops caller callbacks 65 65 */ 66 66 void (*tk_timeout_fn)(struct rpc_task *); 67 67 void (*tk_callback)(struct rpc_task *); 68 68 void (*tk_action)(struct rpc_task *); 69 - void (*tk_exit)(struct rpc_task *); 70 - void (*tk_release)(struct rpc_task *); 69 + const struct rpc_call_ops *tk_ops; 71 70 void * tk_calldata; 72 71 73 72 /* ··· 77 78 struct timer_list tk_timer; /* kernel timer */ 78 79 unsigned long tk_timeout; /* timeout for rpc_sleep() */ 79 80 unsigned short tk_flags; /* misc flags */ 80 - unsigned char tk_active : 1;/* Task has been activated */ 81 81 unsigned char tk_priority : 2;/* Task priority */ 82 82 unsigned long tk_runstate; /* Task run status */ 83 83 struct workqueue_struct *tk_workqueue; /* Normally rpciod, but could ··· 109 111 110 112 typedef void (*rpc_action)(struct rpc_task *); 111 113 114 + struct rpc_call_ops { 115 + void (*rpc_call_prepare)(struct rpc_task *, void *); 116 + void (*rpc_call_done)(struct rpc_task *, void *); 117 + void (*rpc_release)(void *); 118 + }; 119 + 120 + 112 121 /* 113 122 * RPC task flags 114 123 */ ··· 134 129 #define RPC_IS_SWAPPER(t) ((t)->tk_flags & RPC_TASK_SWAPPER) 135 130 #define RPC_DO_ROOTOVERRIDE(t) ((t)->tk_flags & RPC_TASK_ROOTCREDS) 136 131 #define RPC_ASSASSINATED(t) ((t)->tk_flags & RPC_TASK_KILLED) 137 - #define RPC_IS_ACTIVATED(t) ((t)->tk_active) 138 132 #define RPC_DO_CALLBACK(t) ((t)->tk_callback != NULL) 139 133 #define RPC_IS_SOFT(t) ((t)->tk_flags & RPC_TASK_SOFT) 140 134 #define RPC_TASK_UNINTERRUPTIBLE(t) ((t)->tk_flags & RPC_TASK_NOINTR) ··· 142 138 #define RPC_TASK_QUEUED 1 143 139 #define RPC_TASK_WAKEUP 2 144 140 #define RPC_TASK_HAS_TIMER 3 141 + #define RPC_TASK_ACTIVE 4 145 142 146 143 #define RPC_IS_RUNNING(t) (test_bit(RPC_TASK_RUNNING, &(t)->tk_runstate)) 147 144 #define rpc_set_running(t) (set_bit(RPC_TASK_RUNNING, &(t)->tk_runstate)) ··· 172 167 clear_bit(RPC_TASK_WAKEUP, &(t)->tk_runstate); \ 173 168 smp_mb__after_clear_bit(); \ 174 169 } while (0) 170 + 171 + #define RPC_IS_ACTIVATED(t) (test_bit(RPC_TASK_ACTIVE, &(t)->tk_runstate)) 172 + #define rpc_set_active(t) (set_bit(RPC_TASK_ACTIVE, &(t)->tk_runstate)) 173 + #define rpc_clear_active(t) \ 174 + do { \ 175 + smp_mb__before_clear_bit(); \ 176 + clear_bit(RPC_TASK_ACTIVE, &(t)->tk_runstate); \ 177 + smp_mb__after_clear_bit(); \ 178 + } while(0) 175 179 176 180 /* 177 181 * Task priorities. ··· 242 228 /* 243 229 * Function prototypes 244 230 */ 245 - struct rpc_task *rpc_new_task(struct rpc_clnt *, rpc_action, int flags); 231 + struct rpc_task *rpc_new_task(struct rpc_clnt *, int flags, 232 + const struct rpc_call_ops *ops, void *data); 233 + struct rpc_task *rpc_run_task(struct rpc_clnt *clnt, int flags, 234 + const struct rpc_call_ops *ops, void *data); 246 235 struct rpc_task *rpc_new_child(struct rpc_clnt *, struct rpc_task *parent); 247 - void rpc_init_task(struct rpc_task *, struct rpc_clnt *, 248 - rpc_action exitfunc, int flags); 236 + void rpc_init_task(struct rpc_task *task, struct rpc_clnt *clnt, 237 + int flags, const struct rpc_call_ops *ops, 238 + void *data); 249 239 void rpc_release_task(struct rpc_task *); 240 + void rpc_exit_task(struct rpc_task *); 250 241 void rpc_killall_tasks(struct rpc_clnt *); 251 242 int rpc_execute(struct rpc_task *); 252 243 void rpc_run_child(struct rpc_task *parent, struct rpc_task *child, ··· 266 247 void rpc_wake_up_status(struct rpc_wait_queue *, int); 267 248 void rpc_delay(struct rpc_task *, unsigned long); 268 249 void * rpc_malloc(struct rpc_task *, size_t); 250 + void rpc_free(struct rpc_task *); 269 251 int rpciod_up(void); 270 252 void rpciod_down(void); 271 253 void rpciod_wake_up(void); 254 + int __rpc_wait_for_completion_task(struct rpc_task *task, int (*)(void *)); 272 255 #ifdef RPC_DEBUG 273 256 void rpc_show_tasks(void); 274 257 #endif ··· 280 259 static inline void rpc_exit(struct rpc_task *task, int status) 281 260 { 282 261 task->tk_status = status; 283 - task->tk_action = NULL; 262 + task->tk_action = rpc_exit_task; 263 + } 264 + 265 + static inline int rpc_wait_for_completion_task(struct rpc_task *task) 266 + { 267 + return __rpc_wait_for_completion_task(task, NULL); 284 268 } 285 269 286 270 #ifdef RPC_DEBUG
-6
include/linux/sunrpc/xdr.h
··· 91 91 u32 * xdr_encode_opaque_fixed(u32 *p, const void *ptr, unsigned int len); 92 92 u32 * xdr_encode_opaque(u32 *p, const void *ptr, unsigned int len); 93 93 u32 * xdr_encode_string(u32 *p, const char *s); 94 - u32 * xdr_decode_string(u32 *p, char **sp, int *lenp, int maxlen); 95 94 u32 * xdr_decode_string_inplace(u32 *p, char **sp, int *lenp, int maxlen); 96 95 u32 * xdr_encode_netobj(u32 *p, const struct xdr_netobj *); 97 96 u32 * xdr_decode_netobj(u32 *p, struct xdr_netobj *); ··· 132 133 { 133 134 return iov->iov_len = ((u8 *) p - (u8 *) iov->iov_base); 134 135 } 135 - 136 - /* 137 - * Maximum number of iov's we use. 138 - */ 139 - #define MAX_IOVEC (12) 140 136 141 137 /* 142 138 * XDR buffer helper functions
+7 -5
include/linux/sunrpc/xprt.h
··· 79 79 void (*rq_release_snd_buf)(struct rpc_rqst *); /* release rq_enc_pages */ 80 80 struct list_head rq_list; 81 81 82 + __u32 * rq_buffer; /* XDR encode buffer */ 83 + size_t rq_bufsize; 84 + 82 85 struct xdr_buf rq_private_buf; /* The receive buffer 83 86 * used in the softirq. 84 87 */ 85 88 unsigned long rq_majortimeo; /* major timeout alarm */ 86 89 unsigned long rq_timeout; /* Current timeout value */ 87 90 unsigned int rq_retries; /* # of retries */ 88 - /* 89 - * For authentication (e.g. auth_des) 90 - */ 91 - u32 rq_creddata[2]; 92 91 93 92 /* 94 93 * Partial send handling 95 94 */ 96 - 97 95 u32 rq_bytes_sent; /* Bytes we have sent */ 98 96 99 97 unsigned long rq_xtime; /* when transmitted */ ··· 104 106 void (*set_buffer_size)(struct rpc_xprt *xprt, size_t sndsize, size_t rcvsize); 105 107 int (*reserve_xprt)(struct rpc_task *task); 106 108 void (*release_xprt)(struct rpc_xprt *xprt, struct rpc_task *task); 109 + void (*set_port)(struct rpc_xprt *xprt, unsigned short port); 107 110 void (*connect)(struct rpc_task *task); 111 + void * (*buf_alloc)(struct rpc_task *task, size_t size); 112 + void (*buf_free)(struct rpc_task *task); 108 113 int (*send_request)(struct rpc_task *task); 109 114 void (*set_retrans_timeout)(struct rpc_task *task); 110 115 void (*timer)(struct rpc_task *task); ··· 254 253 #define XPRT_LOCKED (0) 255 254 #define XPRT_CONNECTED (1) 256 255 #define XPRT_CONNECTING (2) 256 + #define XPRT_CLOSE_WAIT (3) 257 257 258 258 static inline void xprt_set_connected(struct rpc_xprt *xprt) 259 259 {
+5 -4
include/linux/writeback.h
··· 53 53 loff_t start; 54 54 loff_t end; 55 55 56 - unsigned nonblocking:1; /* Don't get stuck on request queues */ 57 - unsigned encountered_congestion:1; /* An output: a queue is full */ 58 - unsigned for_kupdate:1; /* A kupdate writeback */ 59 - unsigned for_reclaim:1; /* Invoked from the page allocator */ 56 + unsigned nonblocking:1; /* Don't get stuck on request queues */ 57 + unsigned encountered_congestion:1; /* An output: a queue is full */ 58 + unsigned for_kupdate:1; /* A kupdate writeback */ 59 + unsigned for_reclaim:1; /* Invoked from the page allocator */ 60 + unsigned for_writepages:1; /* This is a writepages() call */ 60 61 }; 61 62 62 63 /*
+3 -3
include/media/saa7146.h
··· 21 21 22 22 extern unsigned int saa7146_debug; 23 23 24 - //#define DEBUG_PROLOG printk("(0x%08x)(0x%08x) %s: %s(): ",(dev==0?-1:(dev->mem==0?-1:saa7146_read(dev,RPS_ADDR0))),(dev==0?-1:(dev->mem==0?-1:saa7146_read(dev,IER))),__stringify(KBUILD_MODNAME),__FUNCTION__) 24 + //#define DEBUG_PROLOG printk("(0x%08x)(0x%08x) %s: %s(): ",(dev==0?-1:(dev->mem==0?-1:saa7146_read(dev,RPS_ADDR0))),(dev==0?-1:(dev->mem==0?-1:saa7146_read(dev,IER))),KBUILD_MODNAME,__FUNCTION__) 25 25 26 26 #ifndef DEBUG_VARIABLE 27 27 #define DEBUG_VARIABLE saa7146_debug 28 28 #endif 29 29 30 - #define DEBUG_PROLOG printk("%s: %s(): ",__stringify(KBUILD_MODNAME),__FUNCTION__) 31 - #define INFO(x) { printk("%s: ",__stringify(KBUILD_MODNAME)); printk x; } 30 + #define DEBUG_PROLOG printk("%s: %s(): ",KBUILD_MODNAME,__FUNCTION__) 31 + #define INFO(x) { printk("%s: ",KBUILD_MODNAME); printk x; } 32 32 33 33 #define ERR(x) { DEBUG_PROLOG; printk x; } 34 34
+4 -3
include/media/tuner.h
··· 218 218 extern int tea5767_autodetection(struct i2c_client *c); 219 219 220 220 #define tuner_warn(fmt, arg...) do {\ 221 - printk(KERN_WARNING "%s %d-%04x: " fmt, t->i2c.driver->name, \ 221 + printk(KERN_WARNING "%s %d-%04x: " fmt, t->i2c.driver->driver.name, \ 222 222 t->i2c.adapter->nr, t->i2c.addr , ##arg); } while (0) 223 223 #define tuner_info(fmt, arg...) do {\ 224 - printk(KERN_INFO "%s %d-%04x: " fmt, t->i2c.driver->name, \ 224 + printk(KERN_INFO "%s %d-%04x: " fmt, t->i2c.driver->driver.name, \ 225 225 t->i2c.adapter->nr, t->i2c.addr , ##arg); } while (0) 226 226 #define tuner_dbg(fmt, arg...) do {\ 227 227 if (tuner_debug) \ 228 - printk(KERN_DEBUG "%s %d-%04x: " fmt, t->i2c.driver->name, \ 228 + printk(KERN_DEBUG "%s %d-%04x: " fmt, \ 229 + t->i2c.driver->driver.name, \ 229 230 t->i2c.adapter->nr, t->i2c.addr , ##arg); } while (0) 230 231 231 232 #endif /* __KERNEL__ */
+2 -2
include/net/sock.h
··· 856 856 857 857 filter = sk->sk_filter; 858 858 if (filter) { 859 - int pkt_len = sk_run_filter(skb, filter->insns, 860 - filter->len); 859 + unsigned int pkt_len = sk_run_filter(skb, filter->insns, 860 + filter->len); 861 861 if (!pkt_len) 862 862 err = -EPERM; 863 863 else
+1 -12
kernel/posix-cpu-timers.c
··· 238 238 while ((t = next_thread(t)) != p) { 239 239 cpu->sched += t->sched_time; 240 240 } 241 - if (p->tgid == current->tgid) { 242 - /* 243 - * We're sampling ourselves, so include the 244 - * cycles not yet banked. We still omit 245 - * other threads running on other CPUs, 246 - * so the total can always be behind as 247 - * much as max(nthreads-1,ncpus) * (NSEC_PER_SEC/HZ). 248 - */ 249 - cpu->sched += current_sched_time(current); 250 - } else { 251 - cpu->sched += p->sched_time; 252 - } 241 + cpu->sched += sched_ns(p); 253 242 break; 254 243 } 255 244 return 0;
+8 -2
mm/page-writeback.c
··· 550 550 551 551 int do_writepages(struct address_space *mapping, struct writeback_control *wbc) 552 552 { 553 + int ret; 554 + 553 555 if (wbc->nr_to_write <= 0) 554 556 return 0; 557 + wbc->for_writepages = 1; 555 558 if (mapping->a_ops->writepages) 556 - return mapping->a_ops->writepages(mapping, wbc); 557 - return generic_writepages(mapping, wbc); 559 + ret = mapping->a_ops->writepages(mapping, wbc); 560 + else 561 + ret = generic_writepages(mapping, wbc); 562 + wbc->for_writepages = 0; 563 + return ret; 558 564 } 559 565 560 566 /**
+1 -1
net/atm/br2684.c
··· 295 295 unsigned char *rawp; 296 296 eth = eth_hdr(skb); 297 297 298 - if (*eth->h_dest & 1) { 298 + if (is_multicast_ether_addr(eth->h_dest)) { 299 299 if (memcmp(eth->h_dest, dev->broadcast, ETH_ALEN) == 0) 300 300 skb->pkt_type = PACKET_BROADCAST; 301 301 else
+1 -1
net/bridge/br_input.c
··· 68 68 } 69 69 } 70 70 71 - if (dest[0] & 1) { 71 + if (is_multicast_ether_addr(dest)) { 72 72 br_flood_forward(br, skb, !passedup); 73 73 if (!passedup) 74 74 br_pass_frame_up(br, skb);
+9 -4
net/bridge/br_netfilter.c
··· 394 394 * target in particular. Save the original destination IP 395 395 * address to be able to detect DNAT afterwards. */ 396 396 static unsigned int br_nf_pre_routing(unsigned int hook, struct sk_buff **pskb, 397 - const struct net_device *in, const struct net_device *out, 398 - int (*okfn)(struct sk_buff *)) 397 + const struct net_device *in, 398 + const struct net_device *out, 399 + int (*okfn)(struct sk_buff *)) 399 400 { 400 401 struct iphdr *iph; 401 402 __u32 len; ··· 413 412 goto out; 414 413 415 414 if (skb->protocol == __constant_htons(ETH_P_8021Q)) { 415 + u8 *vhdr = skb->data; 416 416 skb_pull(skb, VLAN_HLEN); 417 - (skb)->nh.raw += VLAN_HLEN; 417 + skb_postpull_rcsum(skb, vhdr, VLAN_HLEN); 418 + skb->nh.raw += VLAN_HLEN; 418 419 } 419 420 return br_nf_pre_routing_ipv6(hook, skb, in, out, okfn); 420 421 } ··· 432 429 goto out; 433 430 434 431 if (skb->protocol == __constant_htons(ETH_P_8021Q)) { 432 + u8 *vhdr = skb->data; 435 433 skb_pull(skb, VLAN_HLEN); 436 - (skb)->nh.raw += VLAN_HLEN; 434 + skb_postpull_rcsum(skb, vhdr, VLAN_HLEN); 435 + skb->nh.raw += VLAN_HLEN; 437 436 } 438 437 439 438 if (!pskb_may_pull(skb, sizeof(struct iphdr)))
+3 -3
net/core/filter.c
··· 75 75 * len is the number of filter blocks in the array. 76 76 */ 77 77 78 - int sk_run_filter(struct sk_buff *skb, struct sock_filter *filter, int flen) 78 + unsigned int sk_run_filter(struct sk_buff *skb, struct sock_filter *filter, int flen) 79 79 { 80 80 struct sock_filter *fentry; /* We walk down these */ 81 81 void *ptr; ··· 241 241 A = X; 242 242 continue; 243 243 case BPF_RET|BPF_K: 244 - return ((unsigned int)fentry->k); 244 + return fentry->k; 245 245 case BPF_RET|BPF_A: 246 - return ((unsigned int)A); 246 + return A; 247 247 case BPF_ST: 248 248 mem[fentry->k] = A; 249 249 continue;
+2 -3
net/core/pktgen.c
··· 473 473 474 474 static int pktgen_remove_device(struct pktgen_thread* t, struct pktgen_dev *i); 475 475 static int pktgen_add_device(struct pktgen_thread* t, const char* ifname); 476 - static struct pktgen_thread* pktgen_find_thread(const char* name); 477 476 static struct pktgen_dev *pktgen_find_dev(struct pktgen_thread* t, const char* ifname); 478 477 static int pktgen_device_event(struct notifier_block *, unsigned long, void *); 479 478 static void pktgen_run_all_threads(void); ··· 2882 2883 return add_dev_to_thread(t, pkt_dev); 2883 2884 } 2884 2885 2885 - static struct pktgen_thread *pktgen_find_thread(const char* name) 2886 + static struct pktgen_thread * __init pktgen_find_thread(const char* name) 2886 2887 { 2887 2888 struct pktgen_thread *t = NULL; 2888 2889 ··· 2899 2900 return t; 2900 2901 } 2901 2902 2902 - static int pktgen_create_thread(const char* name, int cpu) 2903 + static int __init pktgen_create_thread(const char* name, int cpu) 2903 2904 { 2904 2905 struct pktgen_thread *t = NULL; 2905 2906 struct proc_dir_entry *pe;
+1 -1
net/core/utils.c
··· 162 162 * is otherwise not dependent on the TCP/IP stack. 163 163 */ 164 164 165 - __u32 in_aton(const char *str) 165 + __be32 in_aton(const char *str) 166 166 { 167 167 unsigned long l; 168 168 unsigned int val;
+1 -1
net/ethernet/eth.c
··· 163 163 skb_pull(skb,ETH_HLEN); 164 164 eth = eth_hdr(skb); 165 165 166 - if (*eth->h_dest&1) { 166 + if (is_multicast_ether_addr(eth->h_dest)) { 167 167 if (!compare_ether_addr(eth->h_dest, dev->broadcast)) 168 168 skb->pkt_type = PACKET_BROADCAST; 169 169 else
+1 -1
net/ipv4/ip_fragment.c
··· 383 383 */ 384 384 static inline struct ipq *ip_find(struct iphdr *iph, u32 user) 385 385 { 386 - __u16 id = iph->id; 386 + __be16 id = iph->id; 387 387 __u32 saddr = iph->saddr; 388 388 __u32 daddr = iph->daddr; 389 389 __u8 protocol = iph->protocol;
+2 -2
net/ipv4/ip_output.c
··· 418 418 struct sk_buff *skb2; 419 419 unsigned int mtu, hlen, left, len, ll_rs; 420 420 int offset; 421 - int not_last_frag; 421 + __be16 not_last_frag; 422 422 struct rtable *rt = (struct rtable*)skb->dst; 423 423 int err = 0; 424 424 ··· 1180 1180 struct ip_options *opt = NULL; 1181 1181 struct rtable *rt = inet->cork.rt; 1182 1182 struct iphdr *iph; 1183 - int df = 0; 1183 + __be16 df = 0; 1184 1184 __u8 ttl; 1185 1185 int err = 0; 1186 1186
+1 -1
net/ipv4/ipvs/ip_vs_xmit.c
··· 322 322 struct net_device *tdev; /* Device to other host */ 323 323 struct iphdr *old_iph = skb->nh.iph; 324 324 u8 tos = old_iph->tos; 325 - u16 df = old_iph->frag_off; 325 + __be16 df = old_iph->frag_off; 326 326 struct iphdr *iph; /* Our new IP header */ 327 327 int max_headroom; /* The extra header space needed */ 328 328 int mtu;
+1 -1
net/ipv4/netfilter/ip_nat_ftp.c
··· 171 171 /* Prior to 2.6.11, we had a ports param. No longer, but don't break users. */ 172 172 static int warn_set(const char *val, struct kernel_param *kp) 173 173 { 174 - printk(KERN_INFO __stringify(KBUILD_MODNAME) 174 + printk(KERN_INFO KBUILD_MODNAME 175 175 ": kernel >= 2.6.10 only uses 'ports' for conntrack modules\n"); 176 176 return 0; 177 177 }
+1 -1
net/ipv4/netfilter/ip_nat_irc.c
··· 113 113 /* Prior to 2.6.11, we had a ports param. No longer, but don't break users. */ 114 114 static int warn_set(const char *val, struct kernel_param *kp) 115 115 { 116 - printk(KERN_INFO __stringify(KBUILD_MODNAME) 116 + printk(KERN_INFO KBUILD_MODNAME 117 117 ": kernel >= 2.6.10 only uses 'ports' for conntrack modules\n"); 118 118 return 0; 119 119 }
+1
net/ipv4/netfilter/ipt_helper.c
··· 13 13 #include <linux/module.h> 14 14 #include <linux/skbuff.h> 15 15 #include <linux/netfilter.h> 16 + #include <linux/interrupt.h> 16 17 #if defined(CONFIG_IP_NF_CONNTRACK) || defined(CONFIG_IP_NF_CONNTRACK_MODULE) 17 18 #include <linux/netfilter_ipv4/ip_conntrack.h> 18 19 #include <linux/netfilter_ipv4/ip_conntrack_core.h>
+7 -3
net/sunrpc/auth_gss/gss_krb5_mech.c
··· 97 97 alg_mode = CRYPTO_TFM_MODE_CBC; 98 98 break; 99 99 default: 100 - dprintk("RPC: get_key: unsupported algorithm %d\n", alg); 100 + printk("gss_kerberos_mech: unsupported algorithm %d\n", alg); 101 101 goto out_err_free_key; 102 102 } 103 - if (!(*res = crypto_alloc_tfm(alg_name, alg_mode))) 103 + if (!(*res = crypto_alloc_tfm(alg_name, alg_mode))) { 104 + printk("gss_kerberos_mech: unable to initialize crypto algorithm %s\n", alg_name); 104 105 goto out_err_free_key; 105 - if (crypto_cipher_setkey(*res, key.data, key.len)) 106 + } 107 + if (crypto_cipher_setkey(*res, key.data, key.len)) { 108 + printk("gss_kerberos_mech: error setting key for crypto algorithm %s\n", alg_name); 106 109 goto out_err_free_tfm; 110 + } 107 111 108 112 kfree(key.data); 109 113 return p;
+7 -3
net/sunrpc/auth_gss/gss_spkm3_mech.c
··· 111 111 setkey = 0; 112 112 break; 113 113 default: 114 - dprintk("RPC: SPKM3 get_key: unsupported algorithm %d", *resalg); 114 + dprintk("gss_spkm3_mech: unsupported algorithm %d\n", *resalg); 115 115 goto out_err_free_key; 116 116 } 117 - if (!(*res = crypto_alloc_tfm(alg_name, alg_mode))) 117 + if (!(*res = crypto_alloc_tfm(alg_name, alg_mode))) { 118 + printk("gss_spkm3_mech: unable to initialize crypto algorthm %s\n", alg_name); 118 119 goto out_err_free_key; 120 + } 119 121 if (setkey) { 120 - if (crypto_cipher_setkey(*res, key.data, key.len)) 122 + if (crypto_cipher_setkey(*res, key.data, key.len)) { 123 + printk("gss_spkm3_mech: error setting key for crypto algorthm %s\n", alg_name); 121 124 goto out_err_free_tfm; 125 + } 122 126 } 123 127 124 128 if(key.len > 0)
+5 -6
net/sunrpc/auth_gss/gss_spkm3_seal.c
··· 59 59 char tokhdrbuf[25]; 60 60 struct xdr_netobj md5cksum = {.len = 0, .data = NULL}; 61 61 struct xdr_netobj mic_hdr = {.len = 0, .data = tokhdrbuf}; 62 - int tmsglen, tokenlen = 0; 62 + int tokenlen = 0; 63 63 unsigned char *ptr; 64 64 s32 now; 65 65 int ctxelen = 0, ctxzbit = 0; ··· 92 92 } 93 93 94 94 if (toktype == SPKM_MIC_TOK) { 95 - tmsglen = 0; 96 95 /* Calculate checksum over the mic-header */ 97 96 asn1_bitstring_len(&ctx->ctx_id, &ctxelen, &ctxzbit); 98 97 spkm3_mic_header(&mic_hdr.data, &mic_hdr.len, ctx->ctx_id.data, 99 98 ctxelen, ctxzbit); 100 99 101 100 if (make_checksum(checksum_type, mic_hdr.data, mic_hdr.len, 102 - text, &md5cksum)) 101 + text, 0, &md5cksum)) 103 102 goto out_err; 104 103 105 104 asn1_bitstring_len(&md5cksum, &md5elen, &md5zbit); 106 - tokenlen = 10 + ctxelen + 1 + 2 + md5elen + 1; 105 + tokenlen = 10 + ctxelen + 1 + md5elen + 1; 107 106 108 107 /* Create token header using generic routines */ 109 - token->len = g_token_size(&ctx->mech_used, tokenlen + tmsglen); 108 + token->len = g_token_size(&ctx->mech_used, tokenlen); 110 109 111 110 ptr = token->data; 112 - g_make_token_header(&ctx->mech_used, tokenlen + tmsglen, &ptr); 111 + g_make_token_header(&ctx->mech_used, tokenlen, &ptr); 113 112 114 113 spkm3_make_mic_token(&ptr, tokenlen, &mic_hdr, &md5cksum, md5elen, md5zbit); 115 114 } else if (toktype == SPKM_WRAP_TOK) { /* Not Supported */
+2 -1
net/sunrpc/auth_gss/gss_spkm3_token.c
··· 182 182 * *tokp points to the beginning of the SPKM_MIC token described 183 183 * in rfc 2025, section 3.2.1: 184 184 * 185 + * toklen is the inner token length 185 186 */ 186 187 void 187 188 spkm3_make_mic_token(unsigned char **tokp, int toklen, struct xdr_netobj *mic_hdr, struct xdr_netobj *md5cksum, int md5elen, int md5zbit) ··· 190 189 unsigned char *ict = *tokp; 191 190 192 191 *(u8 *)ict++ = 0xa4; 193 - *(u8 *)ict++ = toklen - 2; 192 + *(u8 *)ict++ = toklen; 194 193 memcpy(ict, mic_hdr->data, mic_hdr->len); 195 194 ict += mic_hdr->len; 196 195
+1 -1
net/sunrpc/auth_gss/gss_spkm3_unseal.c
··· 95 95 ret = GSS_S_DEFECTIVE_TOKEN; 96 96 code = make_checksum(CKSUMTYPE_RSA_MD5, ptr + 2, 97 97 mic_hdrlen + 2, 98 - message_buffer, &md5cksum); 98 + message_buffer, 0, &md5cksum); 99 99 100 100 if (code) 101 101 goto out;
+60 -47
net/sunrpc/clnt.c
··· 374 374 * Default callback for async RPC calls 375 375 */ 376 376 static void 377 - rpc_default_callback(struct rpc_task *task) 377 + rpc_default_callback(struct rpc_task *task, void *data) 378 378 { 379 379 } 380 + 381 + static const struct rpc_call_ops rpc_default_ops = { 382 + .rpc_call_done = rpc_default_callback, 383 + }; 380 384 381 385 /* 382 386 * Export the signal mask handling for synchronous code that 383 387 * sleeps on RPC calls 384 388 */ 385 - #define RPC_INTR_SIGNALS (sigmask(SIGINT) | sigmask(SIGQUIT) | sigmask(SIGKILL)) 389 + #define RPC_INTR_SIGNALS (sigmask(SIGHUP) | sigmask(SIGINT) | sigmask(SIGQUIT) | sigmask(SIGTERM)) 386 390 387 391 static void rpc_save_sigmask(sigset_t *oldset, int intr) 388 392 { 389 - unsigned long sigallow = 0; 393 + unsigned long sigallow = sigmask(SIGKILL); 390 394 sigset_t sigmask; 391 395 392 396 /* Block all signals except those listed in sigallow */ ··· 436 432 BUG_ON(flags & RPC_TASK_ASYNC); 437 433 438 434 status = -ENOMEM; 439 - task = rpc_new_task(clnt, NULL, flags); 435 + task = rpc_new_task(clnt, flags, &rpc_default_ops, NULL); 440 436 if (task == NULL) 441 437 goto out; 442 438 ··· 446 442 rpc_call_setup(task, msg, 0); 447 443 448 444 /* Set up the call info struct and execute the task */ 449 - if (task->tk_status == 0) { 445 + status = task->tk_status; 446 + if (status == 0) { 447 + atomic_inc(&task->tk_count); 450 448 status = rpc_execute(task); 451 - } else { 452 - status = task->tk_status; 453 - rpc_release_task(task); 449 + if (status == 0) 450 + status = task->tk_status; 454 451 } 455 - 456 452 rpc_restore_sigmask(&oldset); 453 + rpc_release_task(task); 457 454 out: 458 455 return status; 459 456 } ··· 464 459 */ 465 460 int 466 461 rpc_call_async(struct rpc_clnt *clnt, struct rpc_message *msg, int flags, 467 - rpc_action callback, void *data) 462 + const struct rpc_call_ops *tk_ops, void *data) 468 463 { 469 464 struct rpc_task *task; 470 465 sigset_t oldset; ··· 477 472 flags |= RPC_TASK_ASYNC; 478 473 479 474 /* Create/initialize a new RPC task */ 480 - if (!callback) 481 - callback = rpc_default_callback; 482 475 status = -ENOMEM; 483 - if (!(task = rpc_new_task(clnt, callback, flags))) 476 + if (!(task = rpc_new_task(clnt, flags, tk_ops, data))) 484 477 goto out; 485 - task->tk_calldata = data; 486 478 487 479 /* Mask signals on GSS_AUTH upcalls */ 488 480 rpc_task_sigmask(task, &oldset); ··· 513 511 if (task->tk_status == 0) 514 512 task->tk_action = call_start; 515 513 else 516 - task->tk_action = NULL; 514 + task->tk_action = rpc_exit_task; 517 515 } 518 516 519 517 void ··· 537 535 return clnt->cl_xprt->max_payload; 538 536 } 539 537 EXPORT_SYMBOL(rpc_max_payload); 538 + 539 + /** 540 + * rpc_force_rebind - force transport to check that remote port is unchanged 541 + * @clnt: client to rebind 542 + * 543 + */ 544 + void rpc_force_rebind(struct rpc_clnt *clnt) 545 + { 546 + if (clnt->cl_autobind) 547 + clnt->cl_port = 0; 548 + } 549 + EXPORT_SYMBOL(rpc_force_rebind); 540 550 541 551 /* 542 552 * Restart an (async) RPC call. Usually called from within the ··· 656 642 657 643 /* 658 644 * 2. Allocate the buffer. For details, see sched.c:rpc_malloc. 659 - * (Note: buffer memory is freed in rpc_task_release). 645 + * (Note: buffer memory is freed in xprt_release). 660 646 */ 661 647 static void 662 648 call_allocate(struct rpc_task *task) 663 649 { 650 + struct rpc_rqst *req = task->tk_rqstp; 651 + struct rpc_xprt *xprt = task->tk_xprt; 664 652 unsigned int bufsiz; 665 653 666 654 dprintk("RPC: %4d call_allocate (status %d)\n", 667 655 task->tk_pid, task->tk_status); 668 656 task->tk_action = call_bind; 669 - if (task->tk_buffer) 657 + if (req->rq_buffer) 670 658 return; 671 659 672 660 /* FIXME: compute buffer requirements more exactly using 673 661 * auth->au_wslack */ 674 662 bufsiz = task->tk_msg.rpc_proc->p_bufsiz + RPC_SLACK_SPACE; 675 663 676 - if (rpc_malloc(task, bufsiz << 1) != NULL) 664 + if (xprt->ops->buf_alloc(task, bufsiz << 1) != NULL) 677 665 return; 678 666 printk(KERN_INFO "RPC: buffer allocation failed for task %p\n", task); 679 667 ··· 718 702 task->tk_pid, task->tk_status); 719 703 720 704 /* Default buffer setup */ 721 - bufsiz = task->tk_bufsize >> 1; 722 - sndbuf->head[0].iov_base = (void *)task->tk_buffer; 705 + bufsiz = req->rq_bufsize >> 1; 706 + sndbuf->head[0].iov_base = (void *)req->rq_buffer; 723 707 sndbuf->head[0].iov_len = bufsiz; 724 708 sndbuf->tail[0].iov_len = 0; 725 709 sndbuf->page_len = 0; 726 710 sndbuf->len = 0; 727 711 sndbuf->buflen = bufsiz; 728 - rcvbuf->head[0].iov_base = (void *)((char *)task->tk_buffer + bufsiz); 712 + rcvbuf->head[0].iov_base = (void *)((char *)req->rq_buffer + bufsiz); 729 713 rcvbuf->head[0].iov_len = bufsiz; 730 714 rcvbuf->tail[0].iov_len = 0; 731 715 rcvbuf->page_len = 0; ··· 865 849 } 866 850 867 851 /* Something failed: remote service port may have changed */ 868 - if (clnt->cl_autobind) 869 - clnt->cl_port = 0; 852 + rpc_force_rebind(clnt); 870 853 871 854 switch (status) { 872 855 case -ENOTCONN: ··· 907 892 if (task->tk_status < 0) 908 893 return; 909 894 if (!task->tk_msg.rpc_proc->p_decode) { 910 - task->tk_action = NULL; 895 + task->tk_action = rpc_exit_task; 911 896 rpc_wake_up_task(task); 912 897 } 913 898 return; ··· 946 931 break; 947 932 case -ECONNREFUSED: 948 933 case -ENOTCONN: 949 - if (clnt->cl_autobind) 950 - clnt->cl_port = 0; 934 + rpc_force_rebind(clnt); 951 935 task->tk_action = call_bind; 952 936 break; 953 937 case -EAGAIN: ··· 957 943 rpc_exit(task, status); 958 944 break; 959 945 default: 960 - if (clnt->cl_chatty) 961 - printk("%s: RPC call returned error %d\n", 946 + printk("%s: RPC call returned error %d\n", 962 947 clnt->cl_protname, -status); 963 948 rpc_exit(task, status); 964 949 break; ··· 992 979 993 980 dprintk("RPC: %4d call_timeout (major)\n", task->tk_pid); 994 981 if (RPC_IS_SOFT(task)) { 995 - if (clnt->cl_chatty) 996 - printk(KERN_NOTICE "%s: server %s not responding, timed out\n", 982 + printk(KERN_NOTICE "%s: server %s not responding, timed out\n", 997 983 clnt->cl_protname, clnt->cl_server); 998 984 rpc_exit(task, -EIO); 999 985 return; 1000 986 } 1001 987 1002 - if (clnt->cl_chatty && !(task->tk_flags & RPC_CALL_MAJORSEEN)) { 988 + if (!(task->tk_flags & RPC_CALL_MAJORSEEN)) { 1003 989 task->tk_flags |= RPC_CALL_MAJORSEEN; 1004 990 printk(KERN_NOTICE "%s: server %s not responding, still trying\n", 1005 991 clnt->cl_protname, clnt->cl_server); 1006 992 } 1007 - if (clnt->cl_autobind) 1008 - clnt->cl_port = 0; 993 + rpc_force_rebind(clnt); 1009 994 1010 995 retry: 1011 996 clnt->cl_stats->rpcretrans++; ··· 1025 1014 dprintk("RPC: %4d call_decode (status %d)\n", 1026 1015 task->tk_pid, task->tk_status); 1027 1016 1028 - if (clnt->cl_chatty && (task->tk_flags & RPC_CALL_MAJORSEEN)) { 1017 + if (task->tk_flags & RPC_CALL_MAJORSEEN) { 1029 1018 printk(KERN_NOTICE "%s: server %s OK\n", 1030 1019 clnt->cl_protname, clnt->cl_server); 1031 1020 task->tk_flags &= ~RPC_CALL_MAJORSEEN; ··· 1050 1039 sizeof(req->rq_rcv_buf)) != 0); 1051 1040 1052 1041 /* Verify the RPC header */ 1053 - if (!(p = call_verify(task))) { 1054 - if (task->tk_action == NULL) 1055 - return; 1056 - goto out_retry; 1042 + p = call_verify(task); 1043 + if (IS_ERR(p)) { 1044 + if (p == ERR_PTR(-EAGAIN)) 1045 + goto out_retry; 1046 + return; 1057 1047 } 1058 1048 1059 - task->tk_action = NULL; 1049 + task->tk_action = rpc_exit_task; 1060 1050 1061 1051 if (decode) 1062 1052 task->tk_status = rpcauth_unwrap_resp(task, decode, req, p, ··· 1150 1138 1151 1139 if ((n = ntohl(*p++)) != RPC_REPLY) { 1152 1140 printk(KERN_WARNING "call_verify: not an RPC reply: %x\n", n); 1153 - goto out_retry; 1141 + goto out_garbage; 1154 1142 } 1155 1143 if ((n = ntohl(*p++)) != RPC_MSG_ACCEPTED) { 1156 1144 if (--len < 0) ··· 1180 1168 task->tk_pid); 1181 1169 rpcauth_invalcred(task); 1182 1170 task->tk_action = call_refresh; 1183 - return NULL; 1171 + goto out_retry; 1184 1172 case RPC_AUTH_BADCRED: 1185 1173 case RPC_AUTH_BADVERF: 1186 1174 /* possibly garbled cred/verf? */ ··· 1190 1178 dprintk("RPC: %4d call_verify: retry garbled creds\n", 1191 1179 task->tk_pid); 1192 1180 task->tk_action = call_bind; 1193 - return NULL; 1181 + goto out_retry; 1194 1182 case RPC_AUTH_TOOWEAK: 1195 1183 printk(KERN_NOTICE "call_verify: server requires stronger " 1196 1184 "authentication.\n"); ··· 1205 1193 } 1206 1194 if (!(p = rpcauth_checkverf(task, p))) { 1207 1195 printk(KERN_WARNING "call_verify: auth check failed\n"); 1208 - goto out_retry; /* bad verifier, retry */ 1196 + goto out_garbage; /* bad verifier, retry */ 1209 1197 } 1210 1198 len = p - (u32 *)iov->iov_base - 1; 1211 1199 if (len < 0) ··· 1242 1230 /* Also retry */ 1243 1231 } 1244 1232 1245 - out_retry: 1233 + out_garbage: 1246 1234 task->tk_client->cl_stats->rpcgarbage++; 1247 1235 if (task->tk_garb_retry) { 1248 1236 task->tk_garb_retry--; 1249 1237 dprintk("RPC %s: retrying %4d\n", __FUNCTION__, task->tk_pid); 1250 1238 task->tk_action = call_bind; 1251 - return NULL; 1239 + out_retry: 1240 + return ERR_PTR(-EAGAIN); 1252 1241 } 1253 1242 printk(KERN_WARNING "RPC %s: retry failed, exit EIO\n", __FUNCTION__); 1254 1243 out_eio: 1255 1244 error = -EIO; 1256 1245 out_err: 1257 1246 rpc_exit(task, error); 1258 - return NULL; 1247 + return ERR_PTR(error); 1259 1248 out_overflow: 1260 1249 printk(KERN_WARNING "RPC %s: server reply was truncated.\n", __FUNCTION__); 1261 - goto out_retry; 1250 + goto out_garbage; 1262 1251 } 1263 1252 1264 1253 static int rpcproc_encode_null(void *rqstp, u32 *data, void *obj)
+8 -9
net/sunrpc/pmap_clnt.c
··· 90 90 map->pm_binding = 0; 91 91 rpc_wake_up(&map->pm_bindwait); 92 92 spin_unlock(&pmap_lock); 93 - task->tk_status = -EIO; 94 - task->tk_action = NULL; 93 + rpc_exit(task, -EIO); 95 94 } 96 95 97 96 #ifdef CONFIG_ROOT_NFS ··· 131 132 pmap_getport_done(struct rpc_task *task) 132 133 { 133 134 struct rpc_clnt *clnt = task->tk_client; 135 + struct rpc_xprt *xprt = task->tk_xprt; 134 136 struct rpc_portmap *map = clnt->cl_pmap; 135 137 136 138 dprintk("RPC: %4d pmap_getport_done(status %d, port %d)\n", 137 139 task->tk_pid, task->tk_status, clnt->cl_port); 140 + 141 + xprt->ops->set_port(xprt, 0); 138 142 if (task->tk_status < 0) { 139 143 /* Make the calling task exit with an error */ 140 - task->tk_action = NULL; 144 + task->tk_action = rpc_exit_task; 141 145 } else if (clnt->cl_port == 0) { 142 146 /* Program not registered */ 143 - task->tk_status = -EACCES; 144 - task->tk_action = NULL; 147 + rpc_exit(task, -EACCES); 145 148 } else { 146 - /* byte-swap port number first */ 149 + xprt->ops->set_port(xprt, clnt->cl_port); 147 150 clnt->cl_port = htons(clnt->cl_port); 148 - clnt->cl_xprt->addr.sin_port = clnt->cl_port; 149 151 } 150 152 spin_lock(&pmap_lock); 151 153 map->pm_binding = 0; ··· 207 207 xprt = xprt_create_proto(proto, srvaddr, NULL); 208 208 if (IS_ERR(xprt)) 209 209 return (struct rpc_clnt *)xprt; 210 - xprt->addr.sin_port = htons(RPC_PMAP_PORT); 210 + xprt->ops->set_port(xprt, RPC_PMAP_PORT); 211 211 if (!privileged) 212 212 xprt->resvport = 0; 213 213 ··· 217 217 RPC_AUTH_UNIX); 218 218 if (!IS_ERR(clnt)) { 219 219 clnt->cl_softrtry = 1; 220 - clnt->cl_chatty = 1; 221 220 clnt->cl_oneshot = 1; 222 221 } 223 222 return clnt;
+6 -3
net/sunrpc/rpc_pipe.c
··· 70 70 struct inode *inode = &rpci->vfs_inode; 71 71 72 72 down(&inode->i_sem); 73 + if (rpci->ops == NULL) 74 + goto out; 73 75 if (rpci->nreaders == 0 && !list_empty(&rpci->pipe)) 74 76 __rpc_purge_upcall(inode, -ETIMEDOUT); 77 + out: 75 78 up(&inode->i_sem); 76 79 } 77 80 ··· 116 113 { 117 114 struct rpc_inode *rpci = RPC_I(inode); 118 115 119 - cancel_delayed_work(&rpci->queue_timeout); 120 - flush_scheduled_work(); 121 116 down(&inode->i_sem); 122 117 if (rpci->ops != NULL) { 123 118 rpci->nreaders = 0; ··· 128 127 } 129 128 rpc_inode_setowner(inode, NULL); 130 129 up(&inode->i_sem); 130 + cancel_delayed_work(&rpci->queue_timeout); 131 + flush_scheduled_work(); 131 132 } 132 133 133 134 static struct inode * ··· 169 166 static int 170 167 rpc_pipe_release(struct inode *inode, struct file *filp) 171 168 { 172 - struct rpc_inode *rpci = RPC_I(filp->f_dentry->d_inode); 169 + struct rpc_inode *rpci = RPC_I(inode); 173 170 struct rpc_pipe_msg *msg; 174 171 175 172 down(&inode->i_sem);
+135 -87
net/sunrpc/sched.c
··· 41 41 42 42 static void __rpc_default_timer(struct rpc_task *task); 43 43 static void rpciod_killall(void); 44 - static void rpc_free(struct rpc_task *task); 45 - 46 44 static void rpc_async_schedule(void *); 47 45 48 46 /* ··· 262 264 } 263 265 EXPORT_SYMBOL(rpc_init_wait_queue); 264 266 267 + static int rpc_wait_bit_interruptible(void *word) 268 + { 269 + if (signal_pending(current)) 270 + return -ERESTARTSYS; 271 + schedule(); 272 + return 0; 273 + } 274 + 275 + /* 276 + * Mark an RPC call as having completed by clearing the 'active' bit 277 + */ 278 + static inline void rpc_mark_complete_task(struct rpc_task *task) 279 + { 280 + rpc_clear_active(task); 281 + wake_up_bit(&task->tk_runstate, RPC_TASK_ACTIVE); 282 + } 283 + 284 + /* 285 + * Allow callers to wait for completion of an RPC call 286 + */ 287 + int __rpc_wait_for_completion_task(struct rpc_task *task, int (*action)(void *)) 288 + { 289 + if (action == NULL) 290 + action = rpc_wait_bit_interruptible; 291 + return wait_on_bit(&task->tk_runstate, RPC_TASK_ACTIVE, 292 + action, TASK_INTERRUPTIBLE); 293 + } 294 + EXPORT_SYMBOL(__rpc_wait_for_completion_task); 295 + 265 296 /* 266 297 * Make an RPC task runnable. 267 298 * ··· 326 299 static inline void 327 300 rpc_schedule_run(struct rpc_task *task) 328 301 { 329 - /* Don't run a child twice! */ 330 - if (RPC_IS_ACTIVATED(task)) 331 - return; 332 - task->tk_active = 1; 302 + rpc_set_active(task); 333 303 rpc_make_runnable(task); 334 304 } 335 305 ··· 348 324 } 349 325 350 326 /* Mark the task as being activated if so needed */ 351 - if (!RPC_IS_ACTIVATED(task)) 352 - task->tk_active = 1; 327 + rpc_set_active(task); 353 328 354 329 __rpc_add_wait_queue(q, task); 355 330 ··· 578 555 } 579 556 580 557 /* 581 - * Helper that calls task->tk_exit if it exists and then returns 582 - * true if we should exit __rpc_execute. 558 + * Helper to call task->tk_ops->rpc_call_prepare 583 559 */ 584 - static inline int __rpc_do_exit(struct rpc_task *task) 560 + static void rpc_prepare_task(struct rpc_task *task) 585 561 { 586 - if (task->tk_exit != NULL) { 587 - lock_kernel(); 588 - task->tk_exit(task); 589 - unlock_kernel(); 590 - /* If tk_action is non-null, we should restart the call */ 591 - if (task->tk_action != NULL) { 592 - if (!RPC_ASSASSINATED(task)) { 593 - /* Release RPC slot and buffer memory */ 594 - xprt_release(task); 595 - rpc_free(task); 596 - return 0; 597 - } 598 - printk(KERN_ERR "RPC: dead task tried to walk away.\n"); 599 - } 600 - } 601 - return 1; 562 + task->tk_ops->rpc_call_prepare(task, task->tk_calldata); 602 563 } 603 564 604 - static int rpc_wait_bit_interruptible(void *word) 565 + /* 566 + * Helper that calls task->tk_ops->rpc_call_done if it exists 567 + */ 568 + void rpc_exit_task(struct rpc_task *task) 605 569 { 606 - if (signal_pending(current)) 607 - return -ERESTARTSYS; 608 - schedule(); 609 - return 0; 570 + task->tk_action = NULL; 571 + if (task->tk_ops->rpc_call_done != NULL) { 572 + task->tk_ops->rpc_call_done(task, task->tk_calldata); 573 + if (task->tk_action != NULL) { 574 + WARN_ON(RPC_ASSASSINATED(task)); 575 + /* Always release the RPC slot and buffer memory */ 576 + xprt_release(task); 577 + } 578 + } 610 579 } 580 + EXPORT_SYMBOL(rpc_exit_task); 611 581 612 582 /* 613 583 * This is the RPC `scheduler' (or rather, the finite state machine). ··· 647 631 * by someone else. 648 632 */ 649 633 if (!RPC_IS_QUEUED(task)) { 650 - if (task->tk_action != NULL) { 651 - lock_kernel(); 652 - task->tk_action(task); 653 - unlock_kernel(); 654 - } else if (__rpc_do_exit(task)) 634 + if (task->tk_action == NULL) 655 635 break; 636 + lock_kernel(); 637 + task->tk_action(task); 638 + unlock_kernel(); 656 639 } 657 640 658 641 /* ··· 691 676 dprintk("RPC: %4d sync task resuming\n", task->tk_pid); 692 677 } 693 678 694 - dprintk("RPC: %4d exit() = %d\n", task->tk_pid, task->tk_status); 695 - status = task->tk_status; 696 - 679 + dprintk("RPC: %4d, return %d, status %d\n", task->tk_pid, status, task->tk_status); 680 + /* Wake up anyone who is waiting for task completion */ 681 + rpc_mark_complete_task(task); 697 682 /* Release all resources associated with the task */ 698 683 rpc_release_task(task); 699 684 return status; ··· 711 696 int 712 697 rpc_execute(struct rpc_task *task) 713 698 { 714 - BUG_ON(task->tk_active); 715 - 716 - task->tk_active = 1; 699 + rpc_set_active(task); 717 700 rpc_set_running(task); 718 701 return __rpc_execute(task); 719 702 } ··· 721 708 __rpc_execute((struct rpc_task *)arg); 722 709 } 723 710 724 - /* 725 - * Allocate memory for RPC purposes. 711 + /** 712 + * rpc_malloc - allocate an RPC buffer 713 + * @task: RPC task that will use this buffer 714 + * @size: requested byte size 726 715 * 727 716 * We try to ensure that some NFS reads and writes can always proceed 728 717 * by using a mempool when allocating 'small' buffers. 729 718 * In order to avoid memory starvation triggering more writebacks of 730 719 * NFS requests, we use GFP_NOFS rather than GFP_KERNEL. 731 720 */ 732 - void * 733 - rpc_malloc(struct rpc_task *task, size_t size) 721 + void * rpc_malloc(struct rpc_task *task, size_t size) 734 722 { 723 + struct rpc_rqst *req = task->tk_rqstp; 735 724 gfp_t gfp; 736 725 737 726 if (task->tk_flags & RPC_TASK_SWAPPER) ··· 742 727 gfp = GFP_NOFS; 743 728 744 729 if (size > RPC_BUFFER_MAXSIZE) { 745 - task->tk_buffer = kmalloc(size, gfp); 746 - if (task->tk_buffer) 747 - task->tk_bufsize = size; 730 + req->rq_buffer = kmalloc(size, gfp); 731 + if (req->rq_buffer) 732 + req->rq_bufsize = size; 748 733 } else { 749 - task->tk_buffer = mempool_alloc(rpc_buffer_mempool, gfp); 750 - if (task->tk_buffer) 751 - task->tk_bufsize = RPC_BUFFER_MAXSIZE; 734 + req->rq_buffer = mempool_alloc(rpc_buffer_mempool, gfp); 735 + if (req->rq_buffer) 736 + req->rq_bufsize = RPC_BUFFER_MAXSIZE; 752 737 } 753 - return task->tk_buffer; 738 + return req->rq_buffer; 754 739 } 755 740 756 - static void 757 - rpc_free(struct rpc_task *task) 741 + /** 742 + * rpc_free - free buffer allocated via rpc_malloc 743 + * @task: RPC task with a buffer to be freed 744 + * 745 + */ 746 + void rpc_free(struct rpc_task *task) 758 747 { 759 - if (task->tk_buffer) { 760 - if (task->tk_bufsize == RPC_BUFFER_MAXSIZE) 761 - mempool_free(task->tk_buffer, rpc_buffer_mempool); 748 + struct rpc_rqst *req = task->tk_rqstp; 749 + 750 + if (req->rq_buffer) { 751 + if (req->rq_bufsize == RPC_BUFFER_MAXSIZE) 752 + mempool_free(req->rq_buffer, rpc_buffer_mempool); 762 753 else 763 - kfree(task->tk_buffer); 764 - task->tk_buffer = NULL; 765 - task->tk_bufsize = 0; 754 + kfree(req->rq_buffer); 755 + req->rq_buffer = NULL; 756 + req->rq_bufsize = 0; 766 757 } 767 758 } 768 759 769 760 /* 770 761 * Creation and deletion of RPC task structures 771 762 */ 772 - void rpc_init_task(struct rpc_task *task, struct rpc_clnt *clnt, rpc_action callback, int flags) 763 + void rpc_init_task(struct rpc_task *task, struct rpc_clnt *clnt, int flags, const struct rpc_call_ops *tk_ops, void *calldata) 773 764 { 774 765 memset(task, 0, sizeof(*task)); 775 766 init_timer(&task->tk_timer); 776 767 task->tk_timer.data = (unsigned long) task; 777 768 task->tk_timer.function = (void (*)(unsigned long)) rpc_run_timer; 769 + atomic_set(&task->tk_count, 1); 778 770 task->tk_client = clnt; 779 771 task->tk_flags = flags; 780 - task->tk_exit = callback; 772 + task->tk_ops = tk_ops; 773 + if (tk_ops->rpc_call_prepare != NULL) 774 + task->tk_action = rpc_prepare_task; 775 + task->tk_calldata = calldata; 781 776 782 777 /* Initialize retry counters */ 783 778 task->tk_garb_retry = 2; ··· 816 791 list_add_tail(&task->tk_task, &all_tasks); 817 792 spin_unlock(&rpc_sched_lock); 818 793 794 + BUG_ON(task->tk_ops == NULL); 795 + 819 796 dprintk("RPC: %4d new task procpid %d\n", task->tk_pid, 820 797 current->pid); 821 798 } ··· 828 801 return (struct rpc_task *)mempool_alloc(rpc_task_mempool, GFP_NOFS); 829 802 } 830 803 831 - static void 832 - rpc_default_free_task(struct rpc_task *task) 804 + static void rpc_free_task(struct rpc_task *task) 833 805 { 834 806 dprintk("RPC: %4d freeing task\n", task->tk_pid); 835 807 mempool_free(task, rpc_task_mempool); ··· 839 813 * clean up after an allocation failure, as the client may 840 814 * have specified "oneshot". 841 815 */ 842 - struct rpc_task * 843 - rpc_new_task(struct rpc_clnt *clnt, rpc_action callback, int flags) 816 + struct rpc_task *rpc_new_task(struct rpc_clnt *clnt, int flags, const struct rpc_call_ops *tk_ops, void *calldata) 844 817 { 845 818 struct rpc_task *task; 846 819 ··· 847 822 if (!task) 848 823 goto cleanup; 849 824 850 - rpc_init_task(task, clnt, callback, flags); 851 - 852 - /* Replace tk_release */ 853 - task->tk_release = rpc_default_free_task; 825 + rpc_init_task(task, clnt, flags, tk_ops, calldata); 854 826 855 827 dprintk("RPC: %4d allocated task\n", task->tk_pid); 856 828 task->tk_flags |= RPC_TASK_DYNAMIC; ··· 867 845 868 846 void rpc_release_task(struct rpc_task *task) 869 847 { 870 - dprintk("RPC: %4d release task\n", task->tk_pid); 848 + const struct rpc_call_ops *tk_ops = task->tk_ops; 849 + void *calldata = task->tk_calldata; 871 850 872 851 #ifdef RPC_DEBUG 873 852 BUG_ON(task->tk_magic != RPC_TASK_MAGIC_ID); 874 853 #endif 854 + if (!atomic_dec_and_test(&task->tk_count)) 855 + return; 856 + dprintk("RPC: %4d release task\n", task->tk_pid); 875 857 876 858 /* Remove from global task list */ 877 859 spin_lock(&rpc_sched_lock); ··· 883 857 spin_unlock(&rpc_sched_lock); 884 858 885 859 BUG_ON (RPC_IS_QUEUED(task)); 886 - task->tk_active = 0; 887 860 888 861 /* Synchronously delete any running timer */ 889 862 rpc_delete_timer(task); ··· 892 867 xprt_release(task); 893 868 if (task->tk_msg.rpc_cred) 894 869 rpcauth_unbindcred(task); 895 - rpc_free(task); 896 870 if (task->tk_client) { 897 871 rpc_release_client(task->tk_client); 898 872 task->tk_client = NULL; ··· 900 876 #ifdef RPC_DEBUG 901 877 task->tk_magic = 0; 902 878 #endif 903 - if (task->tk_release) 904 - task->tk_release(task); 879 + if (task->tk_flags & RPC_TASK_DYNAMIC) 880 + rpc_free_task(task); 881 + if (tk_ops->rpc_release) 882 + tk_ops->rpc_release(calldata); 905 883 } 884 + 885 + /** 886 + * rpc_run_task - Allocate a new RPC task, then run rpc_execute against it 887 + * @clnt - pointer to RPC client 888 + * @flags - RPC flags 889 + * @ops - RPC call ops 890 + * @data - user call data 891 + */ 892 + struct rpc_task *rpc_run_task(struct rpc_clnt *clnt, int flags, 893 + const struct rpc_call_ops *ops, 894 + void *data) 895 + { 896 + struct rpc_task *task; 897 + task = rpc_new_task(clnt, flags, ops, data); 898 + if (task == NULL) 899 + return ERR_PTR(-ENOMEM); 900 + atomic_inc(&task->tk_count); 901 + rpc_execute(task); 902 + return task; 903 + } 904 + EXPORT_SYMBOL(rpc_run_task); 906 905 907 906 /** 908 907 * rpc_find_parent - find the parent of a child task. ··· 937 890 * 938 891 * Caller must hold childq.lock 939 892 */ 940 - static inline struct rpc_task *rpc_find_parent(struct rpc_task *child) 893 + static inline struct rpc_task *rpc_find_parent(struct rpc_task *child, struct rpc_task *parent) 941 894 { 942 - struct rpc_task *task, *parent; 895 + struct rpc_task *task; 943 896 struct list_head *le; 944 897 945 - parent = (struct rpc_task *) child->tk_calldata; 946 898 task_for_each(task, le, &childq.tasks[0]) 947 899 if (task == parent) 948 900 return parent; ··· 949 903 return NULL; 950 904 } 951 905 952 - static void rpc_child_exit(struct rpc_task *child) 906 + static void rpc_child_exit(struct rpc_task *child, void *calldata) 953 907 { 954 908 struct rpc_task *parent; 955 909 956 910 spin_lock_bh(&childq.lock); 957 - if ((parent = rpc_find_parent(child)) != NULL) { 911 + if ((parent = rpc_find_parent(child, calldata)) != NULL) { 958 912 parent->tk_status = child->tk_status; 959 913 __rpc_wake_up_task(parent); 960 914 } 961 915 spin_unlock_bh(&childq.lock); 962 916 } 917 + 918 + static const struct rpc_call_ops rpc_child_ops = { 919 + .rpc_call_done = rpc_child_exit, 920 + }; 963 921 964 922 /* 965 923 * Note: rpc_new_task releases the client after a failure. ··· 973 923 { 974 924 struct rpc_task *task; 975 925 976 - task = rpc_new_task(clnt, NULL, RPC_TASK_ASYNC | RPC_TASK_CHILD); 926 + task = rpc_new_task(clnt, RPC_TASK_ASYNC | RPC_TASK_CHILD, &rpc_child_ops, parent); 977 927 if (!task) 978 928 goto fail; 979 - task->tk_exit = rpc_child_exit; 980 - task->tk_calldata = parent; 981 929 return task; 982 930 983 931 fail: ··· 1111 1063 return; 1112 1064 } 1113 1065 printk("-pid- proc flgs status -client- -prog- --rqstp- -timeout " 1114 - "-rpcwait -action- --exit--\n"); 1066 + "-rpcwait -action- ---ops--\n"); 1115 1067 alltask_for_each(t, le, &all_tasks) { 1116 1068 const char *rpc_waitq = "none"; 1117 1069 ··· 1126 1078 (t->tk_client ? t->tk_client->cl_prog : 0), 1127 1079 t->tk_rqstp, t->tk_timeout, 1128 1080 rpc_waitq, 1129 - t->tk_action, t->tk_exit); 1081 + t->tk_action, t->tk_ops); 1130 1082 } 1131 1083 spin_unlock(&rpc_sched_lock); 1132 1084 }
-4
net/sunrpc/sunrpc_syms.c
··· 30 30 EXPORT_SYMBOL(rpc_sleep_on); 31 31 EXPORT_SYMBOL(rpc_wake_up_next); 32 32 EXPORT_SYMBOL(rpc_wake_up_task); 33 - EXPORT_SYMBOL(rpc_new_child); 34 - EXPORT_SYMBOL(rpc_run_child); 35 33 EXPORT_SYMBOL(rpciod_down); 36 34 EXPORT_SYMBOL(rpciod_up); 37 35 EXPORT_SYMBOL(rpc_new_task); ··· 43 45 EXPORT_SYMBOL(rpc_bind_new_program); 44 46 EXPORT_SYMBOL(rpc_destroy_client); 45 47 EXPORT_SYMBOL(rpc_shutdown_client); 46 - EXPORT_SYMBOL(rpc_release_client); 47 48 EXPORT_SYMBOL(rpc_killall_tasks); 48 49 EXPORT_SYMBOL(rpc_call_sync); 49 50 EXPORT_SYMBOL(rpc_call_async); ··· 117 120 118 121 /* Generic XDR */ 119 122 EXPORT_SYMBOL(xdr_encode_string); 120 - EXPORT_SYMBOL(xdr_decode_string); 121 123 EXPORT_SYMBOL(xdr_decode_string_inplace); 122 124 EXPORT_SYMBOL(xdr_decode_netobj); 123 125 EXPORT_SYMBOL(xdr_encode_netobj);
-21
net/sunrpc/xdr.c
··· 93 93 } 94 94 95 95 u32 * 96 - xdr_decode_string(u32 *p, char **sp, int *lenp, int maxlen) 97 - { 98 - unsigned int len; 99 - char *string; 100 - 101 - if ((len = ntohl(*p++)) > maxlen) 102 - return NULL; 103 - if (lenp) 104 - *lenp = len; 105 - if ((len % 4) != 0) { 106 - string = (char *) p; 107 - } else { 108 - string = (char *) (p - 1); 109 - memmove(string, p, len); 110 - } 111 - string[len] = '\0'; 112 - *sp = string; 113 - return p + XDR_QUADLEN(len); 114 - } 115 - 116 - u32 * 117 96 xdr_decode_string_inplace(u32 *p, char **sp, int *lenp, int maxlen) 118 97 { 119 98 unsigned int len;
+25 -41
net/sunrpc/xprt.c
··· 119 119 return 0; 120 120 } 121 121 122 + static void xprt_clear_locked(struct rpc_xprt *xprt) 123 + { 124 + xprt->snd_task = NULL; 125 + if (!test_bit(XPRT_CLOSE_WAIT, &xprt->state) || xprt->shutdown) { 126 + smp_mb__before_clear_bit(); 127 + clear_bit(XPRT_LOCKED, &xprt->state); 128 + smp_mb__after_clear_bit(); 129 + } else 130 + schedule_work(&xprt->task_cleanup); 131 + } 132 + 122 133 /* 123 134 * xprt_reserve_xprt_cong - serialize write access to transports 124 135 * @task: task that is requesting access to the transport ··· 156 145 } 157 146 return 1; 158 147 } 159 - smp_mb__before_clear_bit(); 160 - clear_bit(XPRT_LOCKED, &xprt->state); 161 - smp_mb__after_clear_bit(); 148 + xprt_clear_locked(xprt); 162 149 out_sleep: 163 150 dprintk("RPC: %4d failed to lock transport %p\n", task->tk_pid, xprt); 164 151 task->tk_timeout = 0; ··· 202 193 return; 203 194 204 195 out_unlock: 205 - smp_mb__before_clear_bit(); 206 - clear_bit(XPRT_LOCKED, &xprt->state); 207 - smp_mb__after_clear_bit(); 196 + xprt_clear_locked(xprt); 208 197 } 209 198 210 199 static void __xprt_lock_write_next_cong(struct rpc_xprt *xprt) ··· 229 222 return; 230 223 } 231 224 out_unlock: 232 - smp_mb__before_clear_bit(); 233 - clear_bit(XPRT_LOCKED, &xprt->state); 234 - smp_mb__after_clear_bit(); 225 + xprt_clear_locked(xprt); 235 226 } 236 227 237 228 /** ··· 242 237 void xprt_release_xprt(struct rpc_xprt *xprt, struct rpc_task *task) 243 238 { 244 239 if (xprt->snd_task == task) { 245 - xprt->snd_task = NULL; 246 - smp_mb__before_clear_bit(); 247 - clear_bit(XPRT_LOCKED, &xprt->state); 248 - smp_mb__after_clear_bit(); 240 + xprt_clear_locked(xprt); 249 241 __xprt_lock_write_next(xprt); 250 242 } 251 243 } ··· 258 256 void xprt_release_xprt_cong(struct rpc_xprt *xprt, struct rpc_task *task) 259 257 { 260 258 if (xprt->snd_task == task) { 261 - xprt->snd_task = NULL; 262 - smp_mb__before_clear_bit(); 263 - clear_bit(XPRT_LOCKED, &xprt->state); 264 - smp_mb__after_clear_bit(); 259 + xprt_clear_locked(xprt); 265 260 __xprt_lock_write_next_cong(xprt); 266 261 } 267 262 } ··· 534 535 dprintk("RPC: %4d xprt_connect xprt %p %s connected\n", task->tk_pid, 535 536 xprt, (xprt_connected(xprt) ? "is" : "is not")); 536 537 537 - if (xprt->shutdown) { 538 - task->tk_status = -EIO; 539 - return; 540 - } 541 538 if (!xprt->addr.sin_port) { 542 539 task->tk_status = -EIO; 543 540 return; ··· 682 687 683 688 dprintk("RPC: %4d xprt_prepare_transmit\n", task->tk_pid); 684 689 685 - if (xprt->shutdown) 686 - return -EIO; 687 - 688 690 spin_lock_bh(&xprt->transport_lock); 689 691 if (req->rq_received && !req->rq_bytes_sent) { 690 692 err = req->rq_received; ··· 806 814 struct rpc_xprt *xprt = task->tk_xprt; 807 815 808 816 task->tk_status = -EIO; 809 - if (!xprt->shutdown) { 810 - spin_lock(&xprt->reserve_lock); 811 - do_xprt_reserve(task); 812 - spin_unlock(&xprt->reserve_lock); 813 - } 817 + spin_lock(&xprt->reserve_lock); 818 + do_xprt_reserve(task); 819 + spin_unlock(&xprt->reserve_lock); 814 820 } 815 821 816 822 static inline u32 xprt_alloc_xid(struct rpc_xprt *xprt) ··· 828 838 req->rq_timeout = xprt->timeout.to_initval; 829 839 req->rq_task = task; 830 840 req->rq_xprt = xprt; 841 + req->rq_buffer = NULL; 842 + req->rq_bufsize = 0; 831 843 req->rq_xid = xprt_alloc_xid(xprt); 832 844 req->rq_release_snd_buf = NULL; 833 845 dprintk("RPC: %4d reserved req %p xid %08x\n", task->tk_pid, ··· 855 863 if (!list_empty(&req->rq_list)) 856 864 list_del(&req->rq_list); 857 865 xprt->last_used = jiffies; 858 - if (list_empty(&xprt->recv) && !xprt->shutdown) 866 + if (list_empty(&xprt->recv)) 859 867 mod_timer(&xprt->timer, 860 868 xprt->last_used + xprt->idle_timeout); 861 869 spin_unlock_bh(&xprt->transport_lock); 870 + xprt->ops->buf_free(task); 862 871 task->tk_rqstp = NULL; 863 872 if (req->rq_release_snd_buf) 864 873 req->rq_release_snd_buf(req); ··· 967 974 return xprt; 968 975 } 969 976 970 - static void xprt_shutdown(struct rpc_xprt *xprt) 971 - { 972 - xprt->shutdown = 1; 973 - rpc_wake_up(&xprt->sending); 974 - rpc_wake_up(&xprt->resend); 975 - xprt_wake_pending_tasks(xprt, -EIO); 976 - rpc_wake_up(&xprt->backlog); 977 - del_timer_sync(&xprt->timer); 978 - } 979 - 980 977 /** 981 978 * xprt_destroy - destroy an RPC transport, killing off all requests. 982 979 * @xprt: transport to destroy ··· 975 992 int xprt_destroy(struct rpc_xprt *xprt) 976 993 { 977 994 dprintk("RPC: destroying transport %p\n", xprt); 978 - xprt_shutdown(xprt); 995 + xprt->shutdown = 1; 996 + del_timer_sync(&xprt->timer); 979 997 xprt->ops->destroy(xprt); 980 998 kfree(xprt); 981 999
+29 -2
net/sunrpc/xprtsock.c
··· 28 28 #include <linux/udp.h> 29 29 #include <linux/tcp.h> 30 30 #include <linux/sunrpc/clnt.h> 31 + #include <linux/sunrpc/sched.h> 31 32 #include <linux/file.h> 32 33 33 34 #include <net/sock.h> ··· 425 424 struct sock *sk = xprt->inet; 426 425 427 426 if (!sk) 428 - return; 427 + goto clear_close_wait; 429 428 430 429 dprintk("RPC: xs_close xprt %p\n", xprt); 431 430 ··· 442 441 sk->sk_no_check = 0; 443 442 444 443 sock_release(sock); 444 + clear_close_wait: 445 + smp_mb__before_clear_bit(); 446 + clear_bit(XPRT_CLOSE_WAIT, &xprt->state); 447 + smp_mb__after_clear_bit(); 445 448 } 446 449 447 450 /** ··· 805 800 case TCP_SYN_SENT: 806 801 case TCP_SYN_RECV: 807 802 break; 803 + case TCP_CLOSE_WAIT: 804 + /* Try to schedule an autoclose RPC calls */ 805 + set_bit(XPRT_CLOSE_WAIT, &xprt->state); 806 + if (test_and_set_bit(XPRT_LOCKED, &xprt->state) == 0) 807 + schedule_work(&xprt->task_cleanup); 808 808 default: 809 809 xprt_disconnect(xprt); 810 - break; 811 810 } 812 811 out: 813 812 read_unlock(&sk->sk_callback_lock); ··· 927 918 static void xs_udp_timer(struct rpc_task *task) 928 919 { 929 920 xprt_adjust_cwnd(task, -ETIMEDOUT); 921 + } 922 + 923 + /** 924 + * xs_set_port - reset the port number in the remote endpoint address 925 + * @xprt: generic transport 926 + * @port: new port number 927 + * 928 + */ 929 + static void xs_set_port(struct rpc_xprt *xprt, unsigned short port) 930 + { 931 + dprintk("RPC: setting port for xprt %p to %u\n", xprt, port); 932 + xprt->addr.sin_port = htons(port); 930 933 } 931 934 932 935 static int xs_bindresvport(struct rpc_xprt *xprt, struct socket *sock) ··· 1181 1160 .set_buffer_size = xs_udp_set_buffer_size, 1182 1161 .reserve_xprt = xprt_reserve_xprt_cong, 1183 1162 .release_xprt = xprt_release_xprt_cong, 1163 + .set_port = xs_set_port, 1184 1164 .connect = xs_connect, 1165 + .buf_alloc = rpc_malloc, 1166 + .buf_free = rpc_free, 1185 1167 .send_request = xs_udp_send_request, 1186 1168 .set_retrans_timeout = xprt_set_retrans_timeout_rtt, 1187 1169 .timer = xs_udp_timer, ··· 1196 1172 static struct rpc_xprt_ops xs_tcp_ops = { 1197 1173 .reserve_xprt = xprt_reserve_xprt, 1198 1174 .release_xprt = xprt_release_xprt, 1175 + .set_port = xs_set_port, 1199 1176 .connect = xs_connect, 1177 + .buf_alloc = rpc_malloc, 1178 + .buf_free = rpc_free, 1200 1179 .send_request = xs_tcp_send_request, 1201 1180 .set_retrans_timeout = xprt_set_retrans_timeout_def, 1202 1181 .close = xs_close,
+1 -6
net/x25/af_x25.c
··· 540 540 sk->sk_state = TCP_ESTABLISHED; 541 541 sk->sk_sleep = osk->sk_sleep; 542 542 sk->sk_backlog_rcv = osk->sk_backlog_rcv; 543 - 544 - if (sock_flag(osk, SOCK_ZAPPED)) 545 - sock_set_flag(sk, SOCK_ZAPPED); 546 - 547 - if (sock_flag(osk, SOCK_DBG)) 548 - sock_set_flag(sk, SOCK_DBG); 543 + sock_copy_flags(sk, osk); 549 544 550 545 ox25 = x25_sk(osk); 551 546 x25->t21 = ox25->t21;
+1
net/xfrm/xfrm_user.c
··· 802 802 excl = nlh->nlmsg_type == XFRM_MSG_NEWPOLICY; 803 803 err = xfrm_policy_insert(p->dir, xp, excl); 804 804 if (err) { 805 + security_xfrm_policy_free(xp); 805 806 kfree(xp); 806 807 return err; 807 808 }
+4 -4
scripts/kconfig/Makefile
··· 133 133 HOSTLOADLIBES_qconf = $(KC_QT_LIBS) -ldl 134 134 HOSTCXXFLAGS_qconf.o = $(KC_QT_CFLAGS) -D LKC_DIRECT_LINK 135 135 136 - HOSTLOADLIBES_gconf = `pkg-config gtk+-2.0 gmodule-2.0 libglade-2.0 --libs` 137 - HOSTCFLAGS_gconf.o = `pkg-config gtk+-2.0 gmodule-2.0 libglade-2.0 --cflags` \ 136 + HOSTLOADLIBES_gconf = `pkg-config --libs gtk+-2.0 gmodule-2.0 libglade-2.0` 137 + HOSTCFLAGS_gconf.o = `pkg-config --cflags gtk+-2.0 gmodule-2.0 libglade-2.0` \ 138 138 -D LKC_DIRECT_LINK 139 139 140 140 $(obj)/qconf.o: $(obj)/.tmp_qtcheck ··· 193 193 194 194 # GTK needs some extra effort, too... 195 195 $(obj)/.tmp_gtkcheck: 196 - @if `pkg-config gtk+-2.0 gmodule-2.0 libglade-2.0 --exists`; then \ 197 - if `pkg-config gtk+-2.0 --atleast-version=2.0.0`; then \ 196 + @if `pkg-config --exists gtk+-2.0 gmodule-2.0 libglade-2.0`; then \ 197 + if `pkg-config --atleast-version=2.0.0 gtk+-2.0`; then \ 198 198 touch $@; \ 199 199 else \ 200 200 echo "*"; \
+17 -51
scripts/setlocalversion
··· 1 - #!/usr/bin/perl 2 - # Copyright 2004 - Ryan Anderson <ryan@michonline.com> GPL v2 1 + #!/bin/sh 2 + # Print additional version information for non-release trees. 3 3 4 - use strict; 5 - use warnings; 6 - use Digest::MD5; 7 - require 5.006; 8 - 9 - if (@ARGV != 1) { 10 - print <<EOT; 11 - Usage: setlocalversion <srctree> 12 - EOT 13 - exit(1); 4 + usage() { 5 + echo "Usage: $0 [srctree]" >&2 6 + exit 1 14 7 } 15 8 16 - my ($srctree) = @ARGV; 17 - chdir($srctree); 9 + cd "${1:-.}" || usage 18 10 19 - my @LOCALVERSIONS = (); 11 + # Check for git and a git repo. 12 + if head=`git rev-parse --verify HEAD 2>/dev/null`; then 13 + # Do we have an untagged version? 14 + if [ "`git name-rev --tags HEAD`" = "HEAD undefined" ]; then 15 + printf '%s%s' -g `echo "$head" | cut -c1-8` 16 + fi 20 17 21 - # We are going to use the following commands to try and determine if this 22 - # repository is at a Version boundary (i.e, 2.6.10 vs 2.6.10 + some patches) We 23 - # currently assume that all meaningful version boundaries are marked by a tag. 24 - # We don't care what the tag is, just that something exists. 25 - 26 - # Git/Cogito store the top-of-tree "commit" in .git/HEAD 27 - # A list of known tags sits in .git/refs/tags/ 28 - # 29 - # The simple trick here is to just compare the two of these, and if we get a 30 - # match, return nothing, otherwise, return a subset of the SHA-1 hash in 31 - # .git/HEAD 32 - 33 - sub do_git_checks { 34 - open(H,"<.git/HEAD") or return; 35 - my $head = <H>; 36 - chomp $head; 37 - close(H); 38 - 39 - opendir(D,".git/refs/tags") or return; 40 - foreach my $tagfile (grep !/^\.{1,2}$/, readdir(D)) { 41 - open(F,"<.git/refs/tags/" . $tagfile) or return; 42 - my $tag = <F>; 43 - chomp $tag; 44 - close(F); 45 - return if ($tag eq $head); 46 - } 47 - closedir(D); 48 - 49 - push @LOCALVERSIONS, "g" . substr($head,0,8); 50 - } 51 - 52 - if ( -d ".git") { 53 - do_git_checks(); 54 - } 55 - 56 - printf "-%s\n", join("-",@LOCALVERSIONS) if (scalar @LOCALVERSIONS > 0); 18 + # Are there uncommitted changes? 19 + if git diff-files | read dummy; then 20 + printf '%s' -git_dirty 21 + fi 22 + fi
+2 -4
security/capability.c
··· 49 49 .vm_enough_memory = cap_vm_enough_memory, 50 50 }; 51 51 52 - #define MY_NAME __stringify(KBUILD_MODNAME) 53 - 54 52 /* flag to keep track of how we were registered */ 55 53 static int secondary; 56 54 ··· 65 67 /* register ourselves with the security framework */ 66 68 if (register_security (&capability_ops)) { 67 69 /* try registering with primary module */ 68 - if (mod_reg_security (MY_NAME, &capability_ops)) { 70 + if (mod_reg_security (KBUILD_MODNAME, &capability_ops)) { 69 71 printk (KERN_INFO "Failure registering capabilities " 70 72 "with primary security module.\n"); 71 73 return -EINVAL; ··· 83 85 return; 84 86 /* remove ourselves from the security framework */ 85 87 if (secondary) { 86 - if (mod_unreg_security (MY_NAME, &capability_ops)) 88 + if (mod_unreg_security (KBUILD_MODNAME, &capability_ops)) 87 89 printk (KERN_INFO "Failure unregistering capabilities " 88 90 "with primary module.\n"); 89 91 return;
+1 -2
security/selinux/include/av_perm_to_string.h
··· 238 238 S_(SECCLASS_NSCD, NSCD__SHMEMHOST, "shmemhost") 239 239 S_(SECCLASS_ASSOCIATION, ASSOCIATION__SENDTO, "sendto") 240 240 S_(SECCLASS_ASSOCIATION, ASSOCIATION__RECVFROM, "recvfrom") 241 - S_(SECCLASS_ASSOCIATION, ASSOCIATION__RELABELFROM, "relabelfrom") 242 - S_(SECCLASS_ASSOCIATION, ASSOCIATION__RELABELTO, "relabelto") 241 + S_(SECCLASS_ASSOCIATION, ASSOCIATION__SETCONTEXT, "setcontext")
+1 -2
security/selinux/include/av_permissions.h
··· 908 908 909 909 #define ASSOCIATION__SENDTO 0x00000001UL 910 910 #define ASSOCIATION__RECVFROM 0x00000002UL 911 - #define ASSOCIATION__RELABELFROM 0x00000004UL 912 - #define ASSOCIATION__RELABELTO 0x00000008UL 911 + #define ASSOCIATION__SETCONTEXT 0x00000004UL 913 912 914 913 #define NETLINK_KOBJECT_UEVENT_SOCKET__IOCTL 0x00000001UL 915 914 #define NETLINK_KOBJECT_UEVENT_SOCKET__READ 0x00000002UL
+1 -7
security/selinux/xfrm.c
··· 137 137 * Must be permitted to relabel from default socket type (process type) 138 138 * to specified context 139 139 */ 140 - rc = avc_has_perm(tsec->sid, tsec->sid, 141 - SECCLASS_ASSOCIATION, 142 - ASSOCIATION__RELABELFROM, NULL); 143 - if (rc) 144 - goto out; 145 - 146 140 rc = avc_has_perm(tsec->sid, ctx->ctx_sid, 147 141 SECCLASS_ASSOCIATION, 148 - ASSOCIATION__RELABELTO, NULL); 142 + ASSOCIATION__SETCONTEXT, NULL); 149 143 if (rc) 150 144 goto out; 151 145
+3 -3
sound/oss/dmasound/dac3550a.c
··· 41 41 static int daca_detach_client(struct i2c_client *client); 42 42 43 43 struct i2c_driver daca_driver = { 44 - .owner = THIS_MODULE, 45 - .name = "DAC3550A driver V " DACA_VERSION, 44 + .driver = { 45 + .name = "DAC3550A driver V " DACA_VERSION, 46 + }, 46 47 .id = I2C_DRIVERID_DACA, 47 - .flags = I2C_DF_NOTIFY, 48 48 .attach_adapter = daca_attach_adapter, 49 49 .detach_client = daca_detach_client, 50 50 };
+3 -3
sound/oss/dmasound/tas_common.c
··· 47 47 static int tas_detach_client(struct i2c_client *); 48 48 49 49 struct i2c_driver tas_driver = { 50 - .owner = THIS_MODULE, 51 - .name = "tas", 52 - .flags = I2C_DF_NOTIFY, 50 + .driver = { 51 + .name = "tas", 52 + }, 53 53 .attach_adapter = tas_attach_adapter, 54 54 .detach_client = tas_detach_client, 55 55 };
+3 -2
sound/ppc/keywest.c
··· 41 41 static int keywest_detach_client(struct i2c_client *client); 42 42 43 43 struct i2c_driver keywest_driver = { 44 - .name = "PMac Keywest Audio", 44 + .driver = { 45 + .name = "PMac Keywest Audio", 46 + }, 45 47 .id = I2C_DRIVERID_KEYWEST, 46 - .flags = I2C_DF_NOTIFY, 47 48 .attach_adapter = &keywest_attach_adapter, 48 49 .detach_client = &keywest_detach_client, 49 50 };