* linux-next: Tree for December 3 @ 2010-12-03 2:04 Stephen Rothwell 2010-12-03 17:48 ` linux-next: Tree for December 3 (cifs) Randy Dunlap 0 siblings, 1 reply; 8+ messages in thread From: Stephen Rothwell @ 2010-12-03 2:04 UTC (permalink / raw) To: linux-next; +Cc: LKML [-- Attachment #1: Type: text/plain, Size: 9036 bytes --] Hi all, Changes since 20101202: The v4l-dvb tree still has its build failure for which I applied a patch. The acpi tree still has its build failure so I used the version from next-20101201. The net tree gained a conflict against the wireless-current tree. The tip tree still has its build failures so I have reverted 3 commits. ---------------------------------------------------------------------------- I have created today's linux-next tree at git://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git (patches at http://www.kernel.org/pub/linux/kernel/v2.6/next/ ). If you are tracking the linux-next tree using git, you should not use "git pull" to do so as that will try to merge the new linux-next release with the old one. You should use "git fetch" as mentioned in the FAQ on the wiki (see below). You can see which trees have been included by looking in the Next/Trees file in the source. There are also quilt-import.log and merge.log files in the Next directory. Between each merge, the tree was built with a ppc64_defconfig for powerpc and an allmodconfig for x86_64. After the final fixups (if any), it is also built with powerpc allnoconfig (32 and 64 bit), ppc44x_defconfig and allyesconfig (minus CONFIG_PROFILE_ALL_BRANCHES - this fails its final link) and i386, sparc and sparc64 defconfig. These builds also have CONFIG_ENABLE_WARN_DEPRECATED, CONFIG_ENABLE_MUST_CHECK and CONFIG_DEBUG_INFO disabled when necessary. Below is a summary of the state of the merge. We are up to 181 trees (counting Linus' and 26 trees of patches pending for Linus' tree), more are welcome (even if they are currently empty). Thanks to those who have contributed, and to those who haven't, please do. Status of my local build tests will be at http://kisskb.ellerman.id.au/linux-next . If maintainers want to give advice about cross compilers/configs that work, we are always open to add more builds. Thanks to Randy Dunlap for doing many randconfig builds. There is a wiki covering stuff to do with linux-next at http://linux.f-seidel.de/linux-next/pmwiki/ . Thanks to Frank Seidel. -- Cheers, Stephen Rothwell sfr@canb.auug.org.au $ git checkout master $ git reset --hard stable Merging origin/master Merging fixes/fixes Merging arm-current/master Merging m68k-current/for-linus Merging powerpc-merge/merge Merging sparc-current/master Merging scsi-rc-fixes/master Merging net-current/master Merging sound-current/for-linus Merging pci-current/for-linus Merging wireless-current/master Merging kbuild-current/rc-fixes Merging driver-core.current/driver-core-linus Merging tty.current/tty-linus Merging usb.current/usb-linus Merging staging.current/staging-linus Merging cpufreq-current/fixes Merging input-current/for-linus Merging md-current/for-linus Merging audit-current/for-linus Merging crypto-current/master Merging ide-curent/master Merging dwmw2/master Merging sh-current/sh-fixes-for-linus Merging rmobile-current/rmobile-fixes-for-linus Merging fbdev-current/fbdev-fixes-for-linus Merging gcl-current/merge Merging arm/devel Merging davinci/davinci-next Merging i.MX/for-next Merging msm/for-next Merging omap/for-next Merging pxa/for-next Merging samsung/next-samsung Merging s5p/for-next Merging tegra/for-next Merging ux500-core/ux500-core Merging avr32/avr32-arch Merging blackfin/for-linus Merging cris/for-next Merging ia64/test Merging m68k/for-next Merging m68knommu/for-next Merging microblaze/next Merging mips/mips-for-linux-next Merging parisc/next Merging powerpc/next Merging 4xx/next Merging 52xx-and-virtex/next Merging galak/next Merging s390/features Merging sh/sh-latest Merging rmobile/rmobile-latest CONFLICT (content): Merge conflict in arch/arm/mach-shmobile/Kconfig Applying: rmobile: merge fixup for clkdev changes Merging sparc/master Merging tile/master Merging xtensa/master CONFLICT (content): Merge conflict in arch/xtensa/configs/iss_defconfig Merging ceph/for-next Merging cifs/master Merging configfs/linux-next Merging ecryptfs/next Merging ext3/for_next Merging ext4/next Merging fatfs/master Merging fuse/for-next Merging gfs2/master Merging hfsplus/for-next Merging jfs/next Merging logfs/master CONFLICT (content): Merge conflict in fs/logfs/logfs.h Merging nfs/linux-next Merging nfsd/nfsd-next Merging nilfs2/for-next Merging ocfs2/linux-next Merging omfs/for-next Merging squashfs/master Merging udf/for_next Merging v9fs/for-next Merging ubifs/linux-next Merging xfs/master Merging vfs/for-next Merging pci/linux-next CONFLICT (content): Merge conflict in drivers/pci/pci-sysfs.c Merging hid/for-next CONFLICT (content): Merge conflict in drivers/hid/hid-input.c Merging quilt/i2c Merging bjdooks-i2c/next-i2c Merging quilt/jdelvare-hwmon Merging hwmon-staging/hwmon-next Merging quilt/kernel-doc Merging v4l-dvb/master Applying: media: const and __devinitdata do not mix Merging kbuild/for-next Merging kconfig/for-next Merging ide/master Merging libata/NEXT Merging infiniband/for-next Merging acpi/test $ git reset --hard HEAD^ Merging refs/next/20101201/acpi Merging idle-test/idle-test Merging ieee1394/for-next Merging ubi/linux-next Merging kvm/linux-next Merging dlm/next Merging swiotlb/master Merging ibft/master Merging scsi/master Merging async_tx/next Merging net/master CONFLICT (content): Merge conflict in drivers/net/wireless/ath/ath9k/ar9003_eeprom.c Merging wireless/master CONFLICT (content): Merge conflict in drivers/net/wireless/ath/ath9k/ar9003_eeprom.c Merging bluetooth/master Merging mtd/master Merging crypto/master Merging sound/for-next Merging sound-asoc/for-next Merging cpufreq/next Merging quilt/rr Merging input/next Merging lsm/for-next Merging block/for-next Merging quilt/device-mapper Merging embedded/master Merging firmware/master Merging pcmcia/master Merging battery/master Merging leds/for-mm Merging backlight/for-mm Merging mmc/mmc-next Merging kgdb/kgdb-next Merging slab/for-next Merging uclinux/for-next Merging md/for-next Merging mfd/for-next CONFLICT (content): Merge conflict in drivers/mfd/wm8994-core.c Merging hdlc/hdlc-next Merging drm/drm-next Merging fbdev/master Merging viafb/viafb-next Merging omap_dss2/for-next Merging voltage/for-next CONFLICT (content): Merge conflict in drivers/regulator/core.c Merging security-testing/next Merging selinux/master Merging lblnet/master Merging agp/agp-next Merging watchdog/master Merging bdev/master Merging dwmw2-iommu/master Merging cputime/cputime Merging osd/linux-next Merging jc_docs/docs-next Merging nommu/master Merging trivial/for-next CONFLICT (content): Merge conflict in MAINTAINERS CONFLICT (content): Merge conflict in drivers/scsi/bfa/bfa_fcpim.c Merging audit/for-next Merging suspend/linux-next Merging fsnotify/for-next Merging irda/for-next Merging catalin/for-next Merging alacrity/linux-next CONFLICT (content): Merge conflict in drivers/Makefile CONFLICT (content): Merge conflict in include/linux/Kbuild CONFLICT (content): Merge conflict in lib/Kconfig Merging i7core_edac/linux_next Merging i7300_edac/linux_next Merging devicetree/next-devicetree Merging spi/next-spi Merging tip/auto-latest [master c0605ba] Revert "x86, nmi_watchdog: Remove all stub function calls from old nmi_watchdog" [master fcb8eb6] Revert "x86, nmi_watchdog: Remove the old nmi_watchdog" [master 637fc62] Revert "perf, arch: Cleanup perf-pmu init vs lockup-detector" Merging rcu/rcu/next Merging oprofile/for-next Merging xen/upstream/xen Merging swiotlb-xen/master Merging xen-pvhvm/linux-next Merging edac-amd/for-next Merging percpu/for-next Merging workqueues/for-next Merging sfi/sfi-test Merging asm-generic/next Merging drivers-x86/linux-next Merging hwpoison/hwpoison Merging sysctl/master Merging driver-core/driver-core-next Merging tty/tty-next Merging usb/usb-next Merging staging/staging-next CONFLICT (content): Merge conflict in drivers/staging/batman-adv/hard-interface.c CONFLICT (content): Merge conflict in drivers/staging/batman-adv/soft-interface.c CONFLICT (delete/modify): drivers/staging/winbond/sysdef.h deleted in staging/staging-next and modified in HEAD. Version HEAD of drivers/staging/winbond/sysdef.h left in tree. $ git rm -f drivers/staging/winbond/sysdef.h Merging slabh/slabh Merging bkl-trivial/trivial Merging bkl-llseek/llseek Merging bkl-vfs/vfs Merging bkl-config/config CONFLICT (content): Merge conflict in arch/powerpc/kernel/setup_64.c CONFLICT (content): Merge conflict in include/linux/hardirq.h CONFLICT (content): Merge conflict in include/linux/smp_lock.h Merging irqflags/master Merging cleancache/linux-next CONFLICT (content): Merge conflict in fs/ocfs2/super.c CONFLICT (content): Merge conflict in include/linux/fs.h CONFLICT (content): Merge conflict in mm/Kconfig Merging scsi-post-merge/merge-base:master [-- Attachment #2: Type: application/pgp-signature, Size: 490 bytes --] ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: linux-next: Tree for December 3 (cifs) 2010-12-03 2:04 linux-next: Tree for December 3 Stephen Rothwell @ 2010-12-03 17:48 ` Randy Dunlap 2010-12-06 7:09 ` Ingo Molnar 0 siblings, 1 reply; 8+ messages in thread From: Randy Dunlap @ 2010-12-03 17:48 UTC (permalink / raw) To: Stephen Rothwell, Steve French; +Cc: linux-next, LKML, linux-cifs On Fri, 3 Dec 2010 13:04:40 +1100 Stephen Rothwell wrote: > Hi all, > > Changes since 20101202: When CIFS_EXPERIMENTAL is not enabled: (.text+0xdf6c9): undefined reference to `get_cifs_acl' from fs/cifs/xattr.c:cifs_getxattr() CONFIG_CIFS=y # CONFIG_CIFS_STATS is not set CONFIG_CIFS_WEAK_PW_HASH=y # CONFIG_CIFS_UPCALL is not set CONFIG_CIFS_XATTR=y CONFIG_CIFS_POSIX=y # CONFIG_CIFS_DEBUG2 is not set # CONFIG_CIFS_DFS_UPCALL is not set CONFIG_CIFS_FSCACHE=y CONFIG_CIFS_ACL=y # CONFIG_CIFS_EXPERIMENTAL is not set --- ~Randy *** Remember to use Documentation/SubmitChecklist when testing your code *** ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: linux-next: Tree for December 3 (cifs) 2010-12-03 17:48 ` linux-next: Tree for December 3 (cifs) Randy Dunlap @ 2010-12-06 7:09 ` Ingo Molnar [not found] ` <20101206070956.GA5570-X9Un+BFzKDI@public.gmane.org> 0 siblings, 1 reply; 8+ messages in thread From: Ingo Molnar @ 2010-12-06 7:09 UTC (permalink / raw) To: Randy Dunlap Cc: Stephen Rothwell, Steve French, linux-next, LKML, linux-cifs, Linus Torvalds, Andrew Morton * Randy Dunlap <randy.dunlap@oracle.com> wrote: > On Fri, 3 Dec 2010 13:04:40 +1100 Stephen Rothwell wrote: > > > Hi all, > > > > Changes since 20101202: > > > When CIFS_EXPERIMENTAL is not enabled: > > (.text+0xdf6c9): undefined reference to `get_cifs_acl' > > from fs/cifs/xattr.c:cifs_getxattr() > > > CONFIG_CIFS=y > # CONFIG_CIFS_STATS is not set > CONFIG_CIFS_WEAK_PW_HASH=y > # CONFIG_CIFS_UPCALL is not set > CONFIG_CIFS_XATTR=y > CONFIG_CIFS_POSIX=y > # CONFIG_CIFS_DEBUG2 is not set > # CONFIG_CIFS_DFS_UPCALL is not set > CONFIG_CIFS_FSCACHE=y > CONFIG_CIFS_ACL=y > # CONFIG_CIFS_EXPERIMENTAL is not set And this build regression has been pushed upstream now, as of: 8520eeaa1235: Merge git://git.kernel.org/pub/scm/linux/kernel/git/sfrench/cifs-2.6 and it is triggering for me too: fs/built-in.o: In function `cifs_getxattr': (.text+0xc518e): undefined reference to `get_cifs_acl' The regression got introduced by: fbeba8bb16d7: cifs: Handle extended attribute name cifs_acl to generate cifs acl blob (try #4) Which introduced the new CIFS_ACL option. Thanks, Ingo ^ permalink raw reply [flat|nested] 8+ messages in thread
[parent not found: <20101206070956.GA5570-X9Un+BFzKDI@public.gmane.org>]
* Re: linux-next: Tree for December 3 (cifs) [not found] ` <20101206070956.GA5570-X9Un+BFzKDI@public.gmane.org> @ 2010-12-06 12:35 ` Jeff Layton 2010-12-06 15:40 ` Shirish Pargaonkar 0 siblings, 1 reply; 8+ messages in thread From: Jeff Layton @ 2010-12-06 12:35 UTC (permalink / raw) To: Ingo Molnar Cc: Randy Dunlap, Steve French, Stephen Rothwell, linux-next-u79uwXL29TY76Z2rM5mHXA, LKML, linux-cifs-u79uwXL29TY76Z2rM5mHXA, Linus Torvalds, Andrew Morton On Mon, 6 Dec 2010 08:09:56 +0100 Ingo Molnar <mingo-X9Un+BFzKDI@public.gmane.org> wrote: > > * Randy Dunlap <randy.dunlap-QHcLZuEGTsvQT0dZR+AlfA@public.gmane.org> wrote: > > > On Fri, 3 Dec 2010 13:04:40 +1100 Stephen Rothwell wrote: > > > > > Hi all, > > > > > > Changes since 20101202: > > > > > > When CIFS_EXPERIMENTAL is not enabled: > > > > (.text+0xdf6c9): undefined reference to `get_cifs_acl' > > > > from fs/cifs/xattr.c:cifs_getxattr() > > > > > > CONFIG_CIFS=y > > # CONFIG_CIFS_STATS is not set > > CONFIG_CIFS_WEAK_PW_HASH=y > > # CONFIG_CIFS_UPCALL is not set > > CONFIG_CIFS_XATTR=y > > CONFIG_CIFS_POSIX=y > > # CONFIG_CIFS_DEBUG2 is not set > > # CONFIG_CIFS_DFS_UPCALL is not set > > CONFIG_CIFS_FSCACHE=y > > CONFIG_CIFS_ACL=y > > # CONFIG_CIFS_EXPERIMENTAL is not set > > And this build regression has been pushed upstream now, as of: > > 8520eeaa1235: Merge git://git.kernel.org/pub/scm/linux/kernel/git/sfrench/cifs-2.6 > > and it is triggering for me too: > > fs/built-in.o: In function `cifs_getxattr': > (.text+0xc518e): undefined reference to `get_cifs_acl' > > The regression got introduced by: > > fbeba8bb16d7: cifs: Handle extended attribute name cifs_acl to generate cifs acl blob (try #4) > > Which introduced the new CIFS_ACL option. > > Thanks, > > Ingo Yeah, looks like this new Kconfig option depends on some code that's under the (much-overloaded) CIFS_EXPERIMENTAL Kconfig option. I think this patch needs some rework. The simple fix would be to make it dependent on CIFS_EXPERIMENTAL, but that's rather icky since CIFS_EXPERIMENTAL pulls in some rather broken stuff... -- Jeff Layton <jlayton-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org> ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: linux-next: Tree for December 3 (cifs) 2010-12-06 12:35 ` Jeff Layton @ 2010-12-06 15:40 ` Shirish Pargaonkar [not found] ` <AANLkTimTFi6jji5wmnBTT25XYAXAhJYNY+YmqhW5McEC-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org> 0 siblings, 1 reply; 8+ messages in thread From: Shirish Pargaonkar @ 2010-12-06 15:40 UTC (permalink / raw) To: Jeff Layton Cc: Ingo Molnar, Randy Dunlap, Steve French, Stephen Rothwell, linux-next, LKML, linux-cifs, Linus Torvalds, Andrew Morton On Mon, Dec 6, 2010 at 6:35 AM, Jeff Layton <jlayton@redhat.com> wrote: > On Mon, 6 Dec 2010 08:09:56 +0100 > Ingo Molnar <mingo@elte.hu> wrote: > >> >> * Randy Dunlap <randy.dunlap@oracle.com> wrote: >> >> > On Fri, 3 Dec 2010 13:04:40 +1100 Stephen Rothwell wrote: >> > >> > > Hi all, >> > > >> > > Changes since 20101202: >> > >> > >> > When CIFS_EXPERIMENTAL is not enabled: >> > >> > (.text+0xdf6c9): undefined reference to `get_cifs_acl' >> > >> > from fs/cifs/xattr.c:cifs_getxattr() >> > >> > >> > CONFIG_CIFS=y >> > # CONFIG_CIFS_STATS is not set >> > CONFIG_CIFS_WEAK_PW_HASH=y >> > # CONFIG_CIFS_UPCALL is not set >> > CONFIG_CIFS_XATTR=y >> > CONFIG_CIFS_POSIX=y >> > # CONFIG_CIFS_DEBUG2 is not set >> > # CONFIG_CIFS_DFS_UPCALL is not set >> > CONFIG_CIFS_FSCACHE=y >> > CONFIG_CIFS_ACL=y >> > # CONFIG_CIFS_EXPERIMENTAL is not set >> >> And this build regression has been pushed upstream now, as of: >> >> 8520eeaa1235: Merge git://git.kernel.org/pub/scm/linux/kernel/git/sfrench/cifs-2.6 >> >> and it is triggering for me too: >> >> fs/built-in.o: In function `cifs_getxattr': >> (.text+0xc518e): undefined reference to `get_cifs_acl' >> >> The regression got introduced by: >> >> fbeba8bb16d7: cifs: Handle extended attribute name cifs_acl to generate cifs acl blob (try #4) >> >> Which introduced the new CIFS_ACL option. >> >> Thanks, >> >> Ingo > > Yeah, looks like this new Kconfig option depends on some code that's > under the (much-overloaded) CIFS_EXPERIMENTAL Kconfig option. I think > this patch needs some rework. The simple fix would be to make it > dependent on CIFS_EXPERIMENTAL, but that's rather icky since Making CONFIG_CIFS_ACL dependent on CONFIG_CIFS_EXPERIMENTAL works config CIFS_ACL bool "Provide CIFS ACL support (EXPERIMENTAL)" - depends on EXPERIMENTAL && CIFS_XATTR + depends on CIFS_EXPERIMENTAL && CIFS_XATTR help Allows to fetch CIFS/NTFS ACL from the server. The DACL blob is handed over to the application/caller. At the minimum function find_readable_file() and three functions in cifssmb.c would not have to be in CIFS_EXPERIMENTAL. And we would need to move some other cifs acl related functions from under CIFS_ACL from CIFS_EXPERIMENTAL. > CIFS_EXPERIMENTAL pulls in some rather broken stuff... > > -- > Jeff Layton <jlayton@redhat.com> > -- > To unsubscribe from this list: send the line "unsubscribe linux-cifs" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html > ^ permalink raw reply [flat|nested] 8+ messages in thread
[parent not found: <AANLkTimTFi6jji5wmnBTT25XYAXAhJYNY+YmqhW5McEC-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>]
* Re: linux-next: Tree for December 3 (cifs) [not found] ` <AANLkTimTFi6jji5wmnBTT25XYAXAhJYNY+YmqhW5McEC-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org> @ 2010-12-06 15:50 ` Jeff Layton [not found] ` <20101206105021.2b6bfc96-9yPaYZwiELC+kQycOl6kW4xkIHaj4LzF@public.gmane.org> 0 siblings, 1 reply; 8+ messages in thread From: Jeff Layton @ 2010-12-06 15:50 UTC (permalink / raw) To: Shirish Pargaonkar Cc: Ingo Molnar, Randy Dunlap, Steve French, Stephen Rothwell, linux-next-u79uwXL29TY76Z2rM5mHXA, LKML, linux-cifs-u79uwXL29TY76Z2rM5mHXA, Linus Torvalds, Andrew Morton On Mon, 6 Dec 2010 09:40:33 -0600 Shirish Pargaonkar <shirishpargaonkar-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote: > On Mon, Dec 6, 2010 at 6:35 AM, Jeff Layton <jlayton-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org> wrote: > > On Mon, 6 Dec 2010 08:09:56 +0100 > > Ingo Molnar <mingo-X9Un+BFzKDI@public.gmane.org> wrote: > > > >> > >> * Randy Dunlap <randy.dunlap-QHcLZuEGTsvQT0dZR+AlfA@public.gmane.org> wrote: > >> > >> > On Fri, 3 Dec 2010 13:04:40 +1100 Stephen Rothwell wrote: > >> > > >> > > Hi all, > >> > > > >> > > Changes since 20101202: > >> > > >> > > >> > When CIFS_EXPERIMENTAL is not enabled: > >> > > >> > (.text+0xdf6c9): undefined reference to `get_cifs_acl' > >> > > >> > from fs/cifs/xattr.c:cifs_getxattr() > >> > > >> > > >> > CONFIG_CIFS=y > >> > # CONFIG_CIFS_STATS is not set > >> > CONFIG_CIFS_WEAK_PW_HASH=y > >> > # CONFIG_CIFS_UPCALL is not set > >> > CONFIG_CIFS_XATTR=y > >> > CONFIG_CIFS_POSIX=y > >> > # CONFIG_CIFS_DEBUG2 is not set > >> > # CONFIG_CIFS_DFS_UPCALL is not set > >> > CONFIG_CIFS_FSCACHE=y > >> > CONFIG_CIFS_ACL=y > >> > # CONFIG_CIFS_EXPERIMENTAL is not set > >> > >> And this build regression has been pushed upstream now, as of: > >> > >> 8520eeaa1235: Merge git://git.kernel.org/pub/scm/linux/kernel/git/sfrench/cifs-2.6 > >> > >> and it is triggering for me too: > >> > >> fs/built-in.o: In function `cifs_getxattr': > >> (.text+0xc518e): undefined reference to `get_cifs_acl' > >> > >> The regression got introduced by: > >> > >> fbeba8bb16d7: cifs: Handle extended attribute name cifs_acl to generate cifs acl blob (try #4) > >> > >> Which introduced the new CIFS_ACL option. > >> > >> Thanks, > >> > >> Ingo > > > > Yeah, looks like this new Kconfig option depends on some code that's > > under the (much-overloaded) CIFS_EXPERIMENTAL Kconfig option. I think > > this patch needs some rework. The simple fix would be to make it > > dependent on CIFS_EXPERIMENTAL, but that's rather icky since > > Making CONFIG_CIFS_ACL dependent on CONFIG_CIFS_EXPERIMENTAL > works > > config CIFS_ACL > bool "Provide CIFS ACL support (EXPERIMENTAL)" > - depends on EXPERIMENTAL && CIFS_XATTR > + depends on CIFS_EXPERIMENTAL && CIFS_XATTR > help > Allows to fetch CIFS/NTFS ACL from the server. The DACL blob > is handed over to the application/caller. > > At the minimum function find_readable_file() and three functions > in cifssmb.c would not have to be in CIFS_EXPERIMENTAL. > And we would need to move some other cifs acl related functions > from under CIFS_ACL from CIFS_EXPERIMENTAL. > Ugh, let's not do that. CONFIG_CIFS_EXPERIMENTAL is like a box of chocolates...when you enable it you just never know what you're going to get... I think the patch below is a better way to deal with this. It's larger than I would like to see at this point in the release cycle, but we might as well fix it the right way. I also have some other patches to clean up CONFIG_CIFS_EXPERIMENTAL, but I'll send those along separately for 2.6.38. Steve, if this looks good, I'll send it along to you as a "formal" patch for inclusion via your tree. -------------------[snip]--------------------- cifs: fix use of CONFIG_CIFS_ACL Some of the code under CONFIG_CIFS_ACL is dependent upon code under CONFIG_CIFS_EXPERIMENTAL, but the Kconfig options don't reflect that dependency. Move more of the ACL code out from under CONFIG_CIFS_EXPERIMENTAL and under CONFIG_CIFS_ACL. Also move find_readable_file out from other any sort of Kconfig option and make it a function normally compiled in. Reported-by: Randy Dunlap <randy.dunlap-QHcLZuEGTsvQT0dZR+AlfA@public.gmane.org> Signed-off-by: Jeff Layton <jlayton-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org> --- fs/cifs/Makefile | 4 +- fs/cifs/cifsacl.c | 3 - fs/cifs/cifsacl.h | 4 - fs/cifs/cifsproto.h | 2 - fs/cifs/cifssmb.c | 183 ++++++++++++++++++++++++++------------------------- fs/cifs/file.c | 2 - fs/cifs/inode.c | 8 +- 7 files changed, 99 insertions(+), 107 deletions(-) diff --git a/fs/cifs/Makefile b/fs/cifs/Makefile index adefa60..43b19dd 100644 --- a/fs/cifs/Makefile +++ b/fs/cifs/Makefile @@ -6,7 +6,9 @@ obj-$(CONFIG_CIFS) += cifs.o cifs-y := cifsfs.o cifssmb.o cifs_debug.o connect.o dir.o file.o inode.o \ link.o misc.o netmisc.o smbdes.o smbencrypt.o transport.o asn1.o \ md4.o md5.o cifs_unicode.o nterr.o xattr.o cifsencrypt.o \ - readdir.o ioctl.o sess.o export.o cifsacl.o + readdir.o ioctl.o sess.o export.o + +cifs-$(CONFIG_CIFS_ACL) += cifsacl.o cifs-$(CONFIG_CIFS_UPCALL) += cifs_spnego.o diff --git a/fs/cifs/cifsacl.c b/fs/cifs/cifsacl.c index c6ebea0..a437ec3 100644 --- a/fs/cifs/cifsacl.c +++ b/fs/cifs/cifsacl.c @@ -30,8 +30,6 @@ #include "cifs_debug.h" -#ifdef CONFIG_CIFS_EXPERIMENTAL - static struct cifs_wksid wksidarr[NUM_WK_SIDS] = { {{1, 0, {0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0} }, "null user"}, {{1, 1, {0, 0, 0, 0, 0, 1}, {0, 0, 0, 0, 0} }, "nobody"}, @@ -774,4 +772,3 @@ int mode_to_cifs_acl(struct inode *inode, const char *path, __u64 nmode) return rc; } -#endif /* CONFIG_CIFS_EXPERIMENTAL */ diff --git a/fs/cifs/cifsacl.h b/fs/cifs/cifsacl.h index 6c8096c..c4ae7d0 100644 --- a/fs/cifs/cifsacl.h +++ b/fs/cifs/cifsacl.h @@ -74,11 +74,7 @@ struct cifs_wksid { char sidname[SIDNAMELENGTH]; } __attribute__((packed)); -#ifdef CONFIG_CIFS_EXPERIMENTAL - extern int match_sid(struct cifs_sid *); extern int compare_sids(const struct cifs_sid *, const struct cifs_sid *); -#endif /* CONFIG_CIFS_EXPERIMENTAL */ - #endif /* _CIFSACL_H */ diff --git a/fs/cifs/cifsproto.h b/fs/cifs/cifsproto.h index 38cdec9..cb65499 100644 --- a/fs/cifs/cifsproto.h +++ b/fs/cifs/cifsproto.h @@ -80,9 +80,7 @@ extern bool is_valid_oplock_break(struct smb_hdr *smb, struct TCP_Server_Info *); extern bool is_size_safe_to_change(struct cifsInodeInfo *, __u64 eof); extern struct cifsFileInfo *find_writable_file(struct cifsInodeInfo *, bool); -#ifdef CONFIG_CIFS_EXPERIMENTAL extern struct cifsFileInfo *find_readable_file(struct cifsInodeInfo *, bool); -#endif extern unsigned int smbCalcSize(struct smb_hdr *ptr); extern unsigned int smbCalcSize_LE(struct smb_hdr *ptr); extern int decode_negTokenInit(unsigned char *security_blob, int length, diff --git a/fs/cifs/cifssmb.c b/fs/cifs/cifssmb.c index 0ef7c3a..d7957a3 100644 --- a/fs/cifs/cifssmb.c +++ b/fs/cifs/cifssmb.c @@ -2478,95 +2478,6 @@ querySymLinkRetry: } #ifdef CONFIG_CIFS_EXPERIMENTAL -/* Initialize NT TRANSACT SMB into small smb request buffer. - This assumes that all NT TRANSACTS that we init here have - total parm and data under about 400 bytes (to fit in small cifs - buffer size), which is the case so far, it easily fits. NB: - Setup words themselves and ByteCount - MaxSetupCount (size of returned setup area) and - MaxParameterCount (returned parms size) must be set by caller */ -static int -smb_init_nttransact(const __u16 sub_command, const int setup_count, - const int parm_len, struct cifsTconInfo *tcon, - void **ret_buf) -{ - int rc; - __u32 temp_offset; - struct smb_com_ntransact_req *pSMB; - - rc = small_smb_init(SMB_COM_NT_TRANSACT, 19 + setup_count, tcon, - (void **)&pSMB); - if (rc) - return rc; - *ret_buf = (void *)pSMB; - pSMB->Reserved = 0; - pSMB->TotalParameterCount = cpu_to_le32(parm_len); - pSMB->TotalDataCount = 0; - pSMB->MaxDataCount = cpu_to_le32((tcon->ses->server->maxBuf - - MAX_CIFS_HDR_SIZE) & 0xFFFFFF00); - pSMB->ParameterCount = pSMB->TotalParameterCount; - pSMB->DataCount = pSMB->TotalDataCount; - temp_offset = offsetof(struct smb_com_ntransact_req, Parms) + - (setup_count * 2) - 4 /* for rfc1001 length itself */; - pSMB->ParameterOffset = cpu_to_le32(temp_offset); - pSMB->DataOffset = cpu_to_le32(temp_offset + parm_len); - pSMB->SetupCount = setup_count; /* no need to le convert byte fields */ - pSMB->SubCommand = cpu_to_le16(sub_command); - return 0; -} - -static int -validate_ntransact(char *buf, char **ppparm, char **ppdata, - __u32 *pparmlen, __u32 *pdatalen) -{ - char *end_of_smb; - __u32 data_count, data_offset, parm_count, parm_offset; - struct smb_com_ntransact_rsp *pSMBr; - - *pdatalen = 0; - *pparmlen = 0; - - if (buf == NULL) - return -EINVAL; - - pSMBr = (struct smb_com_ntransact_rsp *)buf; - - /* ByteCount was converted from little endian in SendReceive */ - end_of_smb = 2 /* sizeof byte count */ + pSMBr->ByteCount + - (char *)&pSMBr->ByteCount; - - data_offset = le32_to_cpu(pSMBr->DataOffset); - data_count = le32_to_cpu(pSMBr->DataCount); - parm_offset = le32_to_cpu(pSMBr->ParameterOffset); - parm_count = le32_to_cpu(pSMBr->ParameterCount); - - *ppparm = (char *)&pSMBr->hdr.Protocol + parm_offset; - *ppdata = (char *)&pSMBr->hdr.Protocol + data_offset; - - /* should we also check that parm and data areas do not overlap? */ - if (*ppparm > end_of_smb) { - cFYI(1, "parms start after end of smb"); - return -EINVAL; - } else if (parm_count + *ppparm > end_of_smb) { - cFYI(1, "parm end after end of smb"); - return -EINVAL; - } else if (*ppdata > end_of_smb) { - cFYI(1, "data starts after end of smb"); - return -EINVAL; - } else if (data_count + *ppdata > end_of_smb) { - cFYI(1, "data %p + count %d (%p) past smb end %p start %p", - *ppdata, data_count, (data_count + *ppdata), - end_of_smb, pSMBr); - return -EINVAL; - } else if (parm_count + data_count > pSMBr->ByteCount) { - cFYI(1, "parm count and data count larger than SMB"); - return -EINVAL; - } - *pdatalen = data_count; - *pparmlen = parm_count; - return 0; -} - int CIFSSMBQueryReparseLinkInfo(const int xid, struct cifsTconInfo *tcon, const unsigned char *searchName, @@ -3056,7 +2967,97 @@ GetExtAttrOut: #endif /* CONFIG_POSIX */ -#ifdef CONFIG_CIFS_EXPERIMENTAL +#ifdef CONFIG_CIFS_ACL +/* + * Initialize NT TRANSACT SMB into small smb request buffer. This assumes that + * all NT TRANSACTS that we init here have total parm and data under about 400 + * bytes (to fit in small cifs buffer size), which is the case so far, it + * easily fits. NB: Setup words themselves and ByteCount MaxSetupCount (size of + * returned setup area) and MaxParameterCount (returned parms size) must be set + * by caller + */ +static int +smb_init_nttransact(const __u16 sub_command, const int setup_count, + const int parm_len, struct cifsTconInfo *tcon, + void **ret_buf) +{ + int rc; + __u32 temp_offset; + struct smb_com_ntransact_req *pSMB; + + rc = small_smb_init(SMB_COM_NT_TRANSACT, 19 + setup_count, tcon, + (void **)&pSMB); + if (rc) + return rc; + *ret_buf = (void *)pSMB; + pSMB->Reserved = 0; + pSMB->TotalParameterCount = cpu_to_le32(parm_len); + pSMB->TotalDataCount = 0; + pSMB->MaxDataCount = cpu_to_le32((tcon->ses->server->maxBuf - + MAX_CIFS_HDR_SIZE) & 0xFFFFFF00); + pSMB->ParameterCount = pSMB->TotalParameterCount; + pSMB->DataCount = pSMB->TotalDataCount; + temp_offset = offsetof(struct smb_com_ntransact_req, Parms) + + (setup_count * 2) - 4 /* for rfc1001 length itself */; + pSMB->ParameterOffset = cpu_to_le32(temp_offset); + pSMB->DataOffset = cpu_to_le32(temp_offset + parm_len); + pSMB->SetupCount = setup_count; /* no need to le convert byte fields */ + pSMB->SubCommand = cpu_to_le16(sub_command); + return 0; +} + +static int +validate_ntransact(char *buf, char **ppparm, char **ppdata, + __u32 *pparmlen, __u32 *pdatalen) +{ + char *end_of_smb; + __u32 data_count, data_offset, parm_count, parm_offset; + struct smb_com_ntransact_rsp *pSMBr; + + *pdatalen = 0; + *pparmlen = 0; + + if (buf == NULL) + return -EINVAL; + + pSMBr = (struct smb_com_ntransact_rsp *)buf; + + /* ByteCount was converted from little endian in SendReceive */ + end_of_smb = 2 /* sizeof byte count */ + pSMBr->ByteCount + + (char *)&pSMBr->ByteCount; + + data_offset = le32_to_cpu(pSMBr->DataOffset); + data_count = le32_to_cpu(pSMBr->DataCount); + parm_offset = le32_to_cpu(pSMBr->ParameterOffset); + parm_count = le32_to_cpu(pSMBr->ParameterCount); + + *ppparm = (char *)&pSMBr->hdr.Protocol + parm_offset; + *ppdata = (char *)&pSMBr->hdr.Protocol + data_offset; + + /* should we also check that parm and data areas do not overlap? */ + if (*ppparm > end_of_smb) { + cFYI(1, "parms start after end of smb"); + return -EINVAL; + } else if (parm_count + *ppparm > end_of_smb) { + cFYI(1, "parm end after end of smb"); + return -EINVAL; + } else if (*ppdata > end_of_smb) { + cFYI(1, "data starts after end of smb"); + return -EINVAL; + } else if (data_count + *ppdata > end_of_smb) { + cFYI(1, "data %p + count %d (%p) past smb end %p start %p", + *ppdata, data_count, (data_count + *ppdata), + end_of_smb, pSMBr); + return -EINVAL; + } else if (parm_count + data_count > pSMBr->ByteCount) { + cFYI(1, "parm count and data count larger than SMB"); + return -EINVAL; + } + *pdatalen = data_count; + *pparmlen = parm_count; + return 0; +} + /* Get Security Descriptor (by handle) from remote server for a file or dir */ int CIFSSMBGetCIFSACL(const int xid, struct cifsTconInfo *tcon, __u16 fid, @@ -3214,7 +3215,7 @@ setCifsAclRetry: return (rc); } -#endif /* CONFIG_CIFS_EXPERIMENTAL */ +#endif /* CONFIG_CIFS_ACL */ /* Legacy Query Path Information call for lookup to old servers such as Win9x/WinME */ diff --git a/fs/cifs/file.c b/fs/cifs/file.c index b857ce5..5a28660 100644 --- a/fs/cifs/file.c +++ b/fs/cifs/file.c @@ -1108,7 +1108,6 @@ static ssize_t cifs_write(struct cifsFileInfo *open_file, return total_written; } -#ifdef CONFIG_CIFS_EXPERIMENTAL struct cifsFileInfo *find_readable_file(struct cifsInodeInfo *cifs_inode, bool fsuid_only) { @@ -1142,7 +1141,6 @@ struct cifsFileInfo *find_readable_file(struct cifsInodeInfo *cifs_inode, spin_unlock(&cifs_file_list_lock); return NULL; } -#endif struct cifsFileInfo *find_writable_file(struct cifsInodeInfo *cifs_inode, bool fsuid_only) diff --git a/fs/cifs/inode.c b/fs/cifs/inode.c index 0023146..10d1cab 100644 --- a/fs/cifs/inode.c +++ b/fs/cifs/inode.c @@ -687,7 +687,7 @@ int cifs_get_inode_info(struct inode **pinode, cFYI(1, "cifs_sfu_type failed: %d", tmprc); } -#ifdef CONFIG_CIFS_EXPERIMENTAL +#ifdef CONFIG_CIFS_ACL /* fill in 0777 bits from ACL */ if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_CIFS_ACL) { rc = cifs_acl_to_fattr(cifs_sb, &fattr, *pinode, full_path, @@ -698,7 +698,7 @@ int cifs_get_inode_info(struct inode **pinode, goto cgii_exit; } } -#endif +#endif /* CONFIG_CIFS_ACL */ /* fill in remaining high mode bits e.g. SUID, VTX */ if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_UNX_EMUL) @@ -2128,7 +2128,7 @@ cifs_setattr_nounix(struct dentry *direntry, struct iattr *attrs) if (attrs->ia_valid & ATTR_MODE) { rc = 0; -#ifdef CONFIG_CIFS_EXPERIMENTAL +#ifdef CONFIG_CIFS_ACL if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_CIFS_ACL) { rc = mode_to_cifs_acl(inode, full_path, mode); if (rc) { @@ -2137,7 +2137,7 @@ cifs_setattr_nounix(struct dentry *direntry, struct iattr *attrs) goto cifs_setattr_exit; } } else -#endif +#endif /* CONFIG_CIFS_ACL */ if (((mode & S_IWUGO) == 0) && (cifsInode->cifsAttrs & ATTR_READONLY) == 0) { -- 1.7.3.2 ^ permalink raw reply related [flat|nested] 8+ messages in thread
[parent not found: <20101206105021.2b6bfc96-9yPaYZwiELC+kQycOl6kW4xkIHaj4LzF@public.gmane.org>]
* Re: linux-next: Tree for December 3 (cifs) [not found] ` <20101206105021.2b6bfc96-9yPaYZwiELC+kQycOl6kW4xkIHaj4LzF@public.gmane.org> @ 2010-12-06 16:13 ` Shirish Pargaonkar 2010-12-06 16:43 ` Randy Dunlap 1 sibling, 0 replies; 8+ messages in thread From: Shirish Pargaonkar @ 2010-12-06 16:13 UTC (permalink / raw) To: Jeff Layton Cc: Ingo Molnar, Randy Dunlap, Steve French, Stephen Rothwell, linux-next-u79uwXL29TY76Z2rM5mHXA, LKML, linux-cifs-u79uwXL29TY76Z2rM5mHXA, Linus Torvalds, Andrew Morton On Mon, Dec 6, 2010 at 9:50 AM, Jeff Layton <jlayton-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org> wrote: > On Mon, 6 Dec 2010 09:40:33 -0600 > Shirish Pargaonkar <shirishpargaonkar-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote: > >> On Mon, Dec 6, 2010 at 6:35 AM, Jeff Layton <jlayton-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org> wrote: >> > On Mon, 6 Dec 2010 08:09:56 +0100 >> > Ingo Molnar <mingo-X9Un+BFzKDI@public.gmane.org> wrote: >> > >> >> >> >> * Randy Dunlap <randy.dunlap-QHcLZuEGTsvQT0dZR+AlfA@public.gmane.org> wrote: >> >> >> >> > On Fri, 3 Dec 2010 13:04:40 +1100 Stephen Rothwell wrote: >> >> > >> >> > > Hi all, >> >> > > >> >> > > Changes since 20101202: >> >> > >> >> > >> >> > When CIFS_EXPERIMENTAL is not enabled: >> >> > >> >> > (.text+0xdf6c9): undefined reference to `get_cifs_acl' >> >> > >> >> > from fs/cifs/xattr.c:cifs_getxattr() >> >> > >> >> > >> >> > CONFIG_CIFS=y >> >> > # CONFIG_CIFS_STATS is not set >> >> > CONFIG_CIFS_WEAK_PW_HASH=y >> >> > # CONFIG_CIFS_UPCALL is not set >> >> > CONFIG_CIFS_XATTR=y >> >> > CONFIG_CIFS_POSIX=y >> >> > # CONFIG_CIFS_DEBUG2 is not set >> >> > # CONFIG_CIFS_DFS_UPCALL is not set >> >> > CONFIG_CIFS_FSCACHE=y >> >> > CONFIG_CIFS_ACL=y >> >> > # CONFIG_CIFS_EXPERIMENTAL is not set >> >> >> >> And this build regression has been pushed upstream now, as of: >> >> >> >> 8520eeaa1235: Merge git://git.kernel.org/pub/scm/linux/kernel/git/sfrench/cifs-2.6 >> >> >> >> and it is triggering for me too: >> >> >> >> fs/built-in.o: In function `cifs_getxattr': >> >> (.text+0xc518e): undefined reference to `get_cifs_acl' >> >> >> >> The regression got introduced by: >> >> >> >> fbeba8bb16d7: cifs: Handle extended attribute name cifs_acl to generate cifs acl blob (try #4) >> >> >> >> Which introduced the new CIFS_ACL option. >> >> >> >> Thanks, >> >> >> >> Ingo >> > >> > Yeah, looks like this new Kconfig option depends on some code that's >> > under the (much-overloaded) CIFS_EXPERIMENTAL Kconfig option. I think >> > this patch needs some rework. The simple fix would be to make it >> > dependent on CIFS_EXPERIMENTAL, but that's rather icky since >> >> Making CONFIG_CIFS_ACL dependent on CONFIG_CIFS_EXPERIMENTAL >> works >> >> config CIFS_ACL >> bool "Provide CIFS ACL support (EXPERIMENTAL)" >> - depends on EXPERIMENTAL && CIFS_XATTR >> + depends on CIFS_EXPERIMENTAL && CIFS_XATTR >> help >> Allows to fetch CIFS/NTFS ACL from the server. The DACL blob >> is handed over to the application/caller. >> >> At the minimum function find_readable_file() and three functions >> in cifssmb.c would not have to be in CIFS_EXPERIMENTAL. >> And we would need to move some other cifs acl related functions >> from under CIFS_ACL from CIFS_EXPERIMENTAL. >> > > Ugh, let's not do that. CONFIG_CIFS_EXPERIMENTAL is like a box of > chocolates...when you enable it you just never know what you're going > to get... > > I think the patch below is a better way to deal with this. It's larger > than I would like to see at this point in the release cycle, but we > might as well fix it the right way. > > I also have some other patches to clean up CONFIG_CIFS_EXPERIMENTAL, > but I'll send those along separately for 2.6.38. > > Steve, if this looks good, I'll send it along to you as a "formal" > patch for inclusion via your tree. > > -------------------[snip]--------------------- > > cifs: fix use of CONFIG_CIFS_ACL > > Some of the code under CONFIG_CIFS_ACL is dependent upon code under > CONFIG_CIFS_EXPERIMENTAL, but the Kconfig options don't reflect that > dependency. Move more of the ACL code out from under > CONFIG_CIFS_EXPERIMENTAL and under CONFIG_CIFS_ACL. > > Also move find_readable_file out from other any sort of Kconfig > option and make it a function normally compiled in. > > Reported-by: Randy Dunlap <randy.dunlap-QHcLZuEGTsvQT0dZR+AlfA@public.gmane.org> > Signed-off-by: Jeff Layton <jlayton-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org> > --- > fs/cifs/Makefile | 4 +- > fs/cifs/cifsacl.c | 3 - > fs/cifs/cifsacl.h | 4 - > fs/cifs/cifsproto.h | 2 - > fs/cifs/cifssmb.c | 183 ++++++++++++++++++++++++++------------------------- > fs/cifs/file.c | 2 - > fs/cifs/inode.c | 8 +- > 7 files changed, 99 insertions(+), 107 deletions(-) > > diff --git a/fs/cifs/Makefile b/fs/cifs/Makefile > index adefa60..43b19dd 100644 > --- a/fs/cifs/Makefile > +++ b/fs/cifs/Makefile > @@ -6,7 +6,9 @@ obj-$(CONFIG_CIFS) += cifs.o > cifs-y := cifsfs.o cifssmb.o cifs_debug.o connect.o dir.o file.o inode.o \ > link.o misc.o netmisc.o smbdes.o smbencrypt.o transport.o asn1.o \ > md4.o md5.o cifs_unicode.o nterr.o xattr.o cifsencrypt.o \ > - readdir.o ioctl.o sess.o export.o cifsacl.o > + readdir.o ioctl.o sess.o export.o > + > +cifs-$(CONFIG_CIFS_ACL) += cifsacl.o > > cifs-$(CONFIG_CIFS_UPCALL) += cifs_spnego.o > > diff --git a/fs/cifs/cifsacl.c b/fs/cifs/cifsacl.c > index c6ebea0..a437ec3 100644 > --- a/fs/cifs/cifsacl.c > +++ b/fs/cifs/cifsacl.c > @@ -30,8 +30,6 @@ > #include "cifs_debug.h" > > > -#ifdef CONFIG_CIFS_EXPERIMENTAL > - > static struct cifs_wksid wksidarr[NUM_WK_SIDS] = { > {{1, 0, {0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0} }, "null user"}, > {{1, 1, {0, 0, 0, 0, 0, 1}, {0, 0, 0, 0, 0} }, "nobody"}, > @@ -774,4 +772,3 @@ int mode_to_cifs_acl(struct inode *inode, const char *path, __u64 nmode) > > return rc; > } > -#endif /* CONFIG_CIFS_EXPERIMENTAL */ > diff --git a/fs/cifs/cifsacl.h b/fs/cifs/cifsacl.h > index 6c8096c..c4ae7d0 100644 > --- a/fs/cifs/cifsacl.h > +++ b/fs/cifs/cifsacl.h > @@ -74,11 +74,7 @@ struct cifs_wksid { > char sidname[SIDNAMELENGTH]; > } __attribute__((packed)); > > -#ifdef CONFIG_CIFS_EXPERIMENTAL > - > extern int match_sid(struct cifs_sid *); > extern int compare_sids(const struct cifs_sid *, const struct cifs_sid *); > > -#endif /* CONFIG_CIFS_EXPERIMENTAL */ > - > #endif /* _CIFSACL_H */ > diff --git a/fs/cifs/cifsproto.h b/fs/cifs/cifsproto.h > index 38cdec9..cb65499 100644 > --- a/fs/cifs/cifsproto.h > +++ b/fs/cifs/cifsproto.h > @@ -80,9 +80,7 @@ extern bool is_valid_oplock_break(struct smb_hdr *smb, > struct TCP_Server_Info *); > extern bool is_size_safe_to_change(struct cifsInodeInfo *, __u64 eof); > extern struct cifsFileInfo *find_writable_file(struct cifsInodeInfo *, bool); > -#ifdef CONFIG_CIFS_EXPERIMENTAL > extern struct cifsFileInfo *find_readable_file(struct cifsInodeInfo *, bool); > -#endif > extern unsigned int smbCalcSize(struct smb_hdr *ptr); > extern unsigned int smbCalcSize_LE(struct smb_hdr *ptr); > extern int decode_negTokenInit(unsigned char *security_blob, int length, > diff --git a/fs/cifs/cifssmb.c b/fs/cifs/cifssmb.c > index 0ef7c3a..d7957a3 100644 > --- a/fs/cifs/cifssmb.c > +++ b/fs/cifs/cifssmb.c > @@ -2478,95 +2478,6 @@ querySymLinkRetry: > } > > #ifdef CONFIG_CIFS_EXPERIMENTAL > -/* Initialize NT TRANSACT SMB into small smb request buffer. > - This assumes that all NT TRANSACTS that we init here have > - total parm and data under about 400 bytes (to fit in small cifs > - buffer size), which is the case so far, it easily fits. NB: > - Setup words themselves and ByteCount > - MaxSetupCount (size of returned setup area) and > - MaxParameterCount (returned parms size) must be set by caller */ > -static int > -smb_init_nttransact(const __u16 sub_command, const int setup_count, > - const int parm_len, struct cifsTconInfo *tcon, > - void **ret_buf) > -{ > - int rc; > - __u32 temp_offset; > - struct smb_com_ntransact_req *pSMB; > - > - rc = small_smb_init(SMB_COM_NT_TRANSACT, 19 + setup_count, tcon, > - (void **)&pSMB); > - if (rc) > - return rc; > - *ret_buf = (void *)pSMB; > - pSMB->Reserved = 0; > - pSMB->TotalParameterCount = cpu_to_le32(parm_len); > - pSMB->TotalDataCount = 0; > - pSMB->MaxDataCount = cpu_to_le32((tcon->ses->server->maxBuf - > - MAX_CIFS_HDR_SIZE) & 0xFFFFFF00); > - pSMB->ParameterCount = pSMB->TotalParameterCount; > - pSMB->DataCount = pSMB->TotalDataCount; > - temp_offset = offsetof(struct smb_com_ntransact_req, Parms) + > - (setup_count * 2) - 4 /* for rfc1001 length itself */; > - pSMB->ParameterOffset = cpu_to_le32(temp_offset); > - pSMB->DataOffset = cpu_to_le32(temp_offset + parm_len); > - pSMB->SetupCount = setup_count; /* no need to le convert byte fields */ > - pSMB->SubCommand = cpu_to_le16(sub_command); > - return 0; > -} > - > -static int > -validate_ntransact(char *buf, char **ppparm, char **ppdata, > - __u32 *pparmlen, __u32 *pdatalen) > -{ > - char *end_of_smb; > - __u32 data_count, data_offset, parm_count, parm_offset; > - struct smb_com_ntransact_rsp *pSMBr; > - > - *pdatalen = 0; > - *pparmlen = 0; > - > - if (buf == NULL) > - return -EINVAL; > - > - pSMBr = (struct smb_com_ntransact_rsp *)buf; > - > - /* ByteCount was converted from little endian in SendReceive */ > - end_of_smb = 2 /* sizeof byte count */ + pSMBr->ByteCount + > - (char *)&pSMBr->ByteCount; > - > - data_offset = le32_to_cpu(pSMBr->DataOffset); > - data_count = le32_to_cpu(pSMBr->DataCount); > - parm_offset = le32_to_cpu(pSMBr->ParameterOffset); > - parm_count = le32_to_cpu(pSMBr->ParameterCount); > - > - *ppparm = (char *)&pSMBr->hdr.Protocol + parm_offset; > - *ppdata = (char *)&pSMBr->hdr.Protocol + data_offset; > - > - /* should we also check that parm and data areas do not overlap? */ > - if (*ppparm > end_of_smb) { > - cFYI(1, "parms start after end of smb"); > - return -EINVAL; > - } else if (parm_count + *ppparm > end_of_smb) { > - cFYI(1, "parm end after end of smb"); > - return -EINVAL; > - } else if (*ppdata > end_of_smb) { > - cFYI(1, "data starts after end of smb"); > - return -EINVAL; > - } else if (data_count + *ppdata > end_of_smb) { > - cFYI(1, "data %p + count %d (%p) past smb end %p start %p", > - *ppdata, data_count, (data_count + *ppdata), > - end_of_smb, pSMBr); > - return -EINVAL; > - } else if (parm_count + data_count > pSMBr->ByteCount) { > - cFYI(1, "parm count and data count larger than SMB"); > - return -EINVAL; > - } > - *pdatalen = data_count; > - *pparmlen = parm_count; > - return 0; > -} > - > int > CIFSSMBQueryReparseLinkInfo(const int xid, struct cifsTconInfo *tcon, > const unsigned char *searchName, > @@ -3056,7 +2967,97 @@ GetExtAttrOut: > > #endif /* CONFIG_POSIX */ > > -#ifdef CONFIG_CIFS_EXPERIMENTAL > +#ifdef CONFIG_CIFS_ACL > +/* > + * Initialize NT TRANSACT SMB into small smb request buffer. This assumes that > + * all NT TRANSACTS that we init here have total parm and data under about 400 > + * bytes (to fit in small cifs buffer size), which is the case so far, it > + * easily fits. NB: Setup words themselves and ByteCount MaxSetupCount (size of > + * returned setup area) and MaxParameterCount (returned parms size) must be set > + * by caller > + */ > +static int > +smb_init_nttransact(const __u16 sub_command, const int setup_count, > + const int parm_len, struct cifsTconInfo *tcon, > + void **ret_buf) > +{ > + int rc; > + __u32 temp_offset; > + struct smb_com_ntransact_req *pSMB; > + > + rc = small_smb_init(SMB_COM_NT_TRANSACT, 19 + setup_count, tcon, > + (void **)&pSMB); > + if (rc) > + return rc; > + *ret_buf = (void *)pSMB; > + pSMB->Reserved = 0; > + pSMB->TotalParameterCount = cpu_to_le32(parm_len); > + pSMB->TotalDataCount = 0; > + pSMB->MaxDataCount = cpu_to_le32((tcon->ses->server->maxBuf - > + MAX_CIFS_HDR_SIZE) & 0xFFFFFF00); > + pSMB->ParameterCount = pSMB->TotalParameterCount; > + pSMB->DataCount = pSMB->TotalDataCount; > + temp_offset = offsetof(struct smb_com_ntransact_req, Parms) + > + (setup_count * 2) - 4 /* for rfc1001 length itself */; > + pSMB->ParameterOffset = cpu_to_le32(temp_offset); > + pSMB->DataOffset = cpu_to_le32(temp_offset + parm_len); > + pSMB->SetupCount = setup_count; /* no need to le convert byte fields */ > + pSMB->SubCommand = cpu_to_le16(sub_command); > + return 0; > +} > + > +static int > +validate_ntransact(char *buf, char **ppparm, char **ppdata, > + __u32 *pparmlen, __u32 *pdatalen) > +{ > + char *end_of_smb; > + __u32 data_count, data_offset, parm_count, parm_offset; > + struct smb_com_ntransact_rsp *pSMBr; > + > + *pdatalen = 0; > + *pparmlen = 0; > + > + if (buf == NULL) > + return -EINVAL; > + > + pSMBr = (struct smb_com_ntransact_rsp *)buf; > + > + /* ByteCount was converted from little endian in SendReceive */ > + end_of_smb = 2 /* sizeof byte count */ + pSMBr->ByteCount + > + (char *)&pSMBr->ByteCount; > + > + data_offset = le32_to_cpu(pSMBr->DataOffset); > + data_count = le32_to_cpu(pSMBr->DataCount); > + parm_offset = le32_to_cpu(pSMBr->ParameterOffset); > + parm_count = le32_to_cpu(pSMBr->ParameterCount); > + > + *ppparm = (char *)&pSMBr->hdr.Protocol + parm_offset; > + *ppdata = (char *)&pSMBr->hdr.Protocol + data_offset; > + > + /* should we also check that parm and data areas do not overlap? */ > + if (*ppparm > end_of_smb) { > + cFYI(1, "parms start after end of smb"); > + return -EINVAL; > + } else if (parm_count + *ppparm > end_of_smb) { > + cFYI(1, "parm end after end of smb"); > + return -EINVAL; > + } else if (*ppdata > end_of_smb) { > + cFYI(1, "data starts after end of smb"); > + return -EINVAL; > + } else if (data_count + *ppdata > end_of_smb) { > + cFYI(1, "data %p + count %d (%p) past smb end %p start %p", > + *ppdata, data_count, (data_count + *ppdata), > + end_of_smb, pSMBr); > + return -EINVAL; > + } else if (parm_count + data_count > pSMBr->ByteCount) { > + cFYI(1, "parm count and data count larger than SMB"); > + return -EINVAL; > + } > + *pdatalen = data_count; > + *pparmlen = parm_count; > + return 0; > +} > + > /* Get Security Descriptor (by handle) from remote server for a file or dir */ > int > CIFSSMBGetCIFSACL(const int xid, struct cifsTconInfo *tcon, __u16 fid, > @@ -3214,7 +3215,7 @@ setCifsAclRetry: > return (rc); > } > > -#endif /* CONFIG_CIFS_EXPERIMENTAL */ > +#endif /* CONFIG_CIFS_ACL */ > > /* Legacy Query Path Information call for lookup to old servers such > as Win9x/WinME */ > diff --git a/fs/cifs/file.c b/fs/cifs/file.c > index b857ce5..5a28660 100644 > --- a/fs/cifs/file.c > +++ b/fs/cifs/file.c > @@ -1108,7 +1108,6 @@ static ssize_t cifs_write(struct cifsFileInfo *open_file, > return total_written; > } > > -#ifdef CONFIG_CIFS_EXPERIMENTAL > struct cifsFileInfo *find_readable_file(struct cifsInodeInfo *cifs_inode, > bool fsuid_only) > { > @@ -1142,7 +1141,6 @@ struct cifsFileInfo *find_readable_file(struct cifsInodeInfo *cifs_inode, > spin_unlock(&cifs_file_list_lock); > return NULL; > } > -#endif > > struct cifsFileInfo *find_writable_file(struct cifsInodeInfo *cifs_inode, > bool fsuid_only) > diff --git a/fs/cifs/inode.c b/fs/cifs/inode.c > index 0023146..10d1cab 100644 > --- a/fs/cifs/inode.c > +++ b/fs/cifs/inode.c > @@ -687,7 +687,7 @@ int cifs_get_inode_info(struct inode **pinode, > cFYI(1, "cifs_sfu_type failed: %d", tmprc); > } > > -#ifdef CONFIG_CIFS_EXPERIMENTAL > +#ifdef CONFIG_CIFS_ACL > /* fill in 0777 bits from ACL */ > if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_CIFS_ACL) { > rc = cifs_acl_to_fattr(cifs_sb, &fattr, *pinode, full_path, > @@ -698,7 +698,7 @@ int cifs_get_inode_info(struct inode **pinode, > goto cgii_exit; > } > } > -#endif > +#endif /* CONFIG_CIFS_ACL */ > > /* fill in remaining high mode bits e.g. SUID, VTX */ > if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_UNX_EMUL) > @@ -2128,7 +2128,7 @@ cifs_setattr_nounix(struct dentry *direntry, struct iattr *attrs) > > if (attrs->ia_valid & ATTR_MODE) { > rc = 0; > -#ifdef CONFIG_CIFS_EXPERIMENTAL > +#ifdef CONFIG_CIFS_ACL > if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_CIFS_ACL) { > rc = mode_to_cifs_acl(inode, full_path, mode); > if (rc) { > @@ -2137,7 +2137,7 @@ cifs_setattr_nounix(struct dentry *direntry, struct iattr *attrs) > goto cifs_setattr_exit; > } > } else > -#endif > +#endif /* CONFIG_CIFS_ACL */ > if (((mode & S_IWUGO) == 0) && > (cifsInode->cifsAttrs & ATTR_READONLY) == 0) { > > -- > 1.7.3.2 > > Jeff, patch looks good except I have one comment, I will state it that when the patch is posted on cifs mailing list. ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: linux-next: Tree for December 3 (cifs) [not found] ` <20101206105021.2b6bfc96-9yPaYZwiELC+kQycOl6kW4xkIHaj4LzF@public.gmane.org> 2010-12-06 16:13 ` Shirish Pargaonkar @ 2010-12-06 16:43 ` Randy Dunlap 1 sibling, 0 replies; 8+ messages in thread From: Randy Dunlap @ 2010-12-06 16:43 UTC (permalink / raw) To: Jeff Layton Cc: Shirish Pargaonkar, Ingo Molnar, Steve French, Stephen Rothwell, linux-next-u79uwXL29TY76Z2rM5mHXA, LKML, linux-cifs-u79uwXL29TY76Z2rM5mHXA, Linus Torvalds, Andrew Morton On 12/06/10 07:50, Jeff Layton wrote: > On Mon, 6 Dec 2010 09:40:33 -0600 > Shirish Pargaonkar <shirishpargaonkar-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote: > >> On Mon, Dec 6, 2010 at 6:35 AM, Jeff Layton <jlayton-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org> wrote: >>> On Mon, 6 Dec 2010 08:09:56 +0100 >>> Ingo Molnar <mingo-X9Un+BFzKDI@public.gmane.org> wrote: >>> >>>> >>>> * Randy Dunlap <randy.dunlap-QHcLZuEGTsvQT0dZR+AlfA@public.gmane.org> wrote: >>>> >>>>> On Fri, 3 Dec 2010 13:04:40 +1100 Stephen Rothwell wrote: >>>>> >>>>>> Hi all, >>>>>> >>>>>> Changes since 20101202: >>>>> >>>>> >>>>> When CIFS_EXPERIMENTAL is not enabled: >>>>> >>>>> (.text+0xdf6c9): undefined reference to `get_cifs_acl' >>>>> >>>>> from fs/cifs/xattr.c:cifs_getxattr() >>>>> >>>>> >>>>> CONFIG_CIFS=y >>>>> # CONFIG_CIFS_STATS is not set >>>>> CONFIG_CIFS_WEAK_PW_HASH=y >>>>> # CONFIG_CIFS_UPCALL is not set >>>>> CONFIG_CIFS_XATTR=y >>>>> CONFIG_CIFS_POSIX=y >>>>> # CONFIG_CIFS_DEBUG2 is not set >>>>> # CONFIG_CIFS_DFS_UPCALL is not set >>>>> CONFIG_CIFS_FSCACHE=y >>>>> CONFIG_CIFS_ACL=y >>>>> # CONFIG_CIFS_EXPERIMENTAL is not set >>>> >>>> And this build regression has been pushed upstream now, as of: >>>> >>>> 8520eeaa1235: Merge git://git.kernel.org/pub/scm/linux/kernel/git/sfrench/cifs-2.6 >>>> >>>> and it is triggering for me too: >>>> >>>> fs/built-in.o: In function `cifs_getxattr': >>>> (.text+0xc518e): undefined reference to `get_cifs_acl' >>>> >>>> The regression got introduced by: >>>> >>>> fbeba8bb16d7: cifs: Handle extended attribute name cifs_acl to generate cifs acl blob (try #4) >>>> >>>> Which introduced the new CIFS_ACL option. >>>> >>>> Thanks, >>>> >>>> Ingo >>> >>> Yeah, looks like this new Kconfig option depends on some code that's >>> under the (much-overloaded) CIFS_EXPERIMENTAL Kconfig option. I think >>> this patch needs some rework. The simple fix would be to make it >>> dependent on CIFS_EXPERIMENTAL, but that's rather icky since >> >> Making CONFIG_CIFS_ACL dependent on CONFIG_CIFS_EXPERIMENTAL >> works >> >> config CIFS_ACL >> bool "Provide CIFS ACL support (EXPERIMENTAL)" >> - depends on EXPERIMENTAL && CIFS_XATTR >> + depends on CIFS_EXPERIMENTAL && CIFS_XATTR >> help >> Allows to fetch CIFS/NTFS ACL from the server. The DACL blob >> is handed over to the application/caller. >> >> At the minimum function find_readable_file() and three functions >> in cifssmb.c would not have to be in CIFS_EXPERIMENTAL. >> And we would need to move some other cifs acl related functions >> from under CIFS_ACL from CIFS_EXPERIMENTAL. >> > > Ugh, let's not do that. CONFIG_CIFS_EXPERIMENTAL is like a box of > chocolates...when you enable it you just never know what you're going > to get... > > I think the patch below is a better way to deal with this. It's larger > than I would like to see at this point in the release cycle, but we > might as well fix it the right way. > > I also have some other patches to clean up CONFIG_CIFS_EXPERIMENTAL, > but I'll send those along separately for 2.6.38. > > Steve, if this looks good, I'll send it along to you as a "formal" > patch for inclusion via your tree. Thanks, that works. Acked-by: Randy Dunlap <randy.dunlap-QHcLZuEGTsvQT0dZR+AlfA@public.gmane.org> > -------------------[snip]--------------------- > > cifs: fix use of CONFIG_CIFS_ACL > > Some of the code under CONFIG_CIFS_ACL is dependent upon code under > CONFIG_CIFS_EXPERIMENTAL, but the Kconfig options don't reflect that > dependency. Move more of the ACL code out from under > CONFIG_CIFS_EXPERIMENTAL and under CONFIG_CIFS_ACL. > > Also move find_readable_file out from other any sort of Kconfig > option and make it a function normally compiled in. > > Reported-by: Randy Dunlap <randy.dunlap-QHcLZuEGTsvQT0dZR+AlfA@public.gmane.org> > Signed-off-by: Jeff Layton <jlayton-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org> > --- > fs/cifs/Makefile | 4 +- > fs/cifs/cifsacl.c | 3 - > fs/cifs/cifsacl.h | 4 - > fs/cifs/cifsproto.h | 2 - > fs/cifs/cifssmb.c | 183 ++++++++++++++++++++++++++------------------------- > fs/cifs/file.c | 2 - > fs/cifs/inode.c | 8 +- > 7 files changed, 99 insertions(+), 107 deletions(-) > > diff --git a/fs/cifs/Makefile b/fs/cifs/Makefile > index adefa60..43b19dd 100644 > --- a/fs/cifs/Makefile > +++ b/fs/cifs/Makefile > @@ -6,7 +6,9 @@ obj-$(CONFIG_CIFS) += cifs.o > cifs-y := cifsfs.o cifssmb.o cifs_debug.o connect.o dir.o file.o inode.o \ > link.o misc.o netmisc.o smbdes.o smbencrypt.o transport.o asn1.o \ > md4.o md5.o cifs_unicode.o nterr.o xattr.o cifsencrypt.o \ > - readdir.o ioctl.o sess.o export.o cifsacl.o > + readdir.o ioctl.o sess.o export.o > + > +cifs-$(CONFIG_CIFS_ACL) += cifsacl.o > > cifs-$(CONFIG_CIFS_UPCALL) += cifs_spnego.o > > diff --git a/fs/cifs/cifsacl.c b/fs/cifs/cifsacl.c > index c6ebea0..a437ec3 100644 > --- a/fs/cifs/cifsacl.c > +++ b/fs/cifs/cifsacl.c > @@ -30,8 +30,6 @@ > #include "cifs_debug.h" > > > -#ifdef CONFIG_CIFS_EXPERIMENTAL > - > static struct cifs_wksid wksidarr[NUM_WK_SIDS] = { > {{1, 0, {0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0} }, "null user"}, > {{1, 1, {0, 0, 0, 0, 0, 1}, {0, 0, 0, 0, 0} }, "nobody"}, > @@ -774,4 +772,3 @@ int mode_to_cifs_acl(struct inode *inode, const char *path, __u64 nmode) > > return rc; > } > -#endif /* CONFIG_CIFS_EXPERIMENTAL */ > diff --git a/fs/cifs/cifsacl.h b/fs/cifs/cifsacl.h > index 6c8096c..c4ae7d0 100644 > --- a/fs/cifs/cifsacl.h > +++ b/fs/cifs/cifsacl.h > @@ -74,11 +74,7 @@ struct cifs_wksid { > char sidname[SIDNAMELENGTH]; > } __attribute__((packed)); > > -#ifdef CONFIG_CIFS_EXPERIMENTAL > - > extern int match_sid(struct cifs_sid *); > extern int compare_sids(const struct cifs_sid *, const struct cifs_sid *); > > -#endif /* CONFIG_CIFS_EXPERIMENTAL */ > - > #endif /* _CIFSACL_H */ > diff --git a/fs/cifs/cifsproto.h b/fs/cifs/cifsproto.h > index 38cdec9..cb65499 100644 > --- a/fs/cifs/cifsproto.h > +++ b/fs/cifs/cifsproto.h > @@ -80,9 +80,7 @@ extern bool is_valid_oplock_break(struct smb_hdr *smb, > struct TCP_Server_Info *); > extern bool is_size_safe_to_change(struct cifsInodeInfo *, __u64 eof); > extern struct cifsFileInfo *find_writable_file(struct cifsInodeInfo *, bool); > -#ifdef CONFIG_CIFS_EXPERIMENTAL > extern struct cifsFileInfo *find_readable_file(struct cifsInodeInfo *, bool); > -#endif > extern unsigned int smbCalcSize(struct smb_hdr *ptr); > extern unsigned int smbCalcSize_LE(struct smb_hdr *ptr); > extern int decode_negTokenInit(unsigned char *security_blob, int length, > diff --git a/fs/cifs/cifssmb.c b/fs/cifs/cifssmb.c > index 0ef7c3a..d7957a3 100644 > --- a/fs/cifs/cifssmb.c > +++ b/fs/cifs/cifssmb.c > @@ -2478,95 +2478,6 @@ querySymLinkRetry: > } > > #ifdef CONFIG_CIFS_EXPERIMENTAL > -/* Initialize NT TRANSACT SMB into small smb request buffer. > - This assumes that all NT TRANSACTS that we init here have > - total parm and data under about 400 bytes (to fit in small cifs > - buffer size), which is the case so far, it easily fits. NB: > - Setup words themselves and ByteCount > - MaxSetupCount (size of returned setup area) and > - MaxParameterCount (returned parms size) must be set by caller */ > -static int > -smb_init_nttransact(const __u16 sub_command, const int setup_count, > - const int parm_len, struct cifsTconInfo *tcon, > - void **ret_buf) > -{ > - int rc; > - __u32 temp_offset; > - struct smb_com_ntransact_req *pSMB; > - > - rc = small_smb_init(SMB_COM_NT_TRANSACT, 19 + setup_count, tcon, > - (void **)&pSMB); > - if (rc) > - return rc; > - *ret_buf = (void *)pSMB; > - pSMB->Reserved = 0; > - pSMB->TotalParameterCount = cpu_to_le32(parm_len); > - pSMB->TotalDataCount = 0; > - pSMB->MaxDataCount = cpu_to_le32((tcon->ses->server->maxBuf - > - MAX_CIFS_HDR_SIZE) & 0xFFFFFF00); > - pSMB->ParameterCount = pSMB->TotalParameterCount; > - pSMB->DataCount = pSMB->TotalDataCount; > - temp_offset = offsetof(struct smb_com_ntransact_req, Parms) + > - (setup_count * 2) - 4 /* for rfc1001 length itself */; > - pSMB->ParameterOffset = cpu_to_le32(temp_offset); > - pSMB->DataOffset = cpu_to_le32(temp_offset + parm_len); > - pSMB->SetupCount = setup_count; /* no need to le convert byte fields */ > - pSMB->SubCommand = cpu_to_le16(sub_command); > - return 0; > -} > - > -static int > -validate_ntransact(char *buf, char **ppparm, char **ppdata, > - __u32 *pparmlen, __u32 *pdatalen) > -{ > - char *end_of_smb; > - __u32 data_count, data_offset, parm_count, parm_offset; > - struct smb_com_ntransact_rsp *pSMBr; > - > - *pdatalen = 0; > - *pparmlen = 0; > - > - if (buf == NULL) > - return -EINVAL; > - > - pSMBr = (struct smb_com_ntransact_rsp *)buf; > - > - /* ByteCount was converted from little endian in SendReceive */ > - end_of_smb = 2 /* sizeof byte count */ + pSMBr->ByteCount + > - (char *)&pSMBr->ByteCount; > - > - data_offset = le32_to_cpu(pSMBr->DataOffset); > - data_count = le32_to_cpu(pSMBr->DataCount); > - parm_offset = le32_to_cpu(pSMBr->ParameterOffset); > - parm_count = le32_to_cpu(pSMBr->ParameterCount); > - > - *ppparm = (char *)&pSMBr->hdr.Protocol + parm_offset; > - *ppdata = (char *)&pSMBr->hdr.Protocol + data_offset; > - > - /* should we also check that parm and data areas do not overlap? */ > - if (*ppparm > end_of_smb) { > - cFYI(1, "parms start after end of smb"); > - return -EINVAL; > - } else if (parm_count + *ppparm > end_of_smb) { > - cFYI(1, "parm end after end of smb"); > - return -EINVAL; > - } else if (*ppdata > end_of_smb) { > - cFYI(1, "data starts after end of smb"); > - return -EINVAL; > - } else if (data_count + *ppdata > end_of_smb) { > - cFYI(1, "data %p + count %d (%p) past smb end %p start %p", > - *ppdata, data_count, (data_count + *ppdata), > - end_of_smb, pSMBr); > - return -EINVAL; > - } else if (parm_count + data_count > pSMBr->ByteCount) { > - cFYI(1, "parm count and data count larger than SMB"); > - return -EINVAL; > - } > - *pdatalen = data_count; > - *pparmlen = parm_count; > - return 0; > -} > - > int > CIFSSMBQueryReparseLinkInfo(const int xid, struct cifsTconInfo *tcon, > const unsigned char *searchName, > @@ -3056,7 +2967,97 @@ GetExtAttrOut: > > #endif /* CONFIG_POSIX */ > > -#ifdef CONFIG_CIFS_EXPERIMENTAL > +#ifdef CONFIG_CIFS_ACL > +/* > + * Initialize NT TRANSACT SMB into small smb request buffer. This assumes that > + * all NT TRANSACTS that we init here have total parm and data under about 400 > + * bytes (to fit in small cifs buffer size), which is the case so far, it > + * easily fits. NB: Setup words themselves and ByteCount MaxSetupCount (size of > + * returned setup area) and MaxParameterCount (returned parms size) must be set > + * by caller > + */ > +static int > +smb_init_nttransact(const __u16 sub_command, const int setup_count, > + const int parm_len, struct cifsTconInfo *tcon, > + void **ret_buf) > +{ > + int rc; > + __u32 temp_offset; > + struct smb_com_ntransact_req *pSMB; > + > + rc = small_smb_init(SMB_COM_NT_TRANSACT, 19 + setup_count, tcon, > + (void **)&pSMB); > + if (rc) > + return rc; > + *ret_buf = (void *)pSMB; > + pSMB->Reserved = 0; > + pSMB->TotalParameterCount = cpu_to_le32(parm_len); > + pSMB->TotalDataCount = 0; > + pSMB->MaxDataCount = cpu_to_le32((tcon->ses->server->maxBuf - > + MAX_CIFS_HDR_SIZE) & 0xFFFFFF00); > + pSMB->ParameterCount = pSMB->TotalParameterCount; > + pSMB->DataCount = pSMB->TotalDataCount; > + temp_offset = offsetof(struct smb_com_ntransact_req, Parms) + > + (setup_count * 2) - 4 /* for rfc1001 length itself */; > + pSMB->ParameterOffset = cpu_to_le32(temp_offset); > + pSMB->DataOffset = cpu_to_le32(temp_offset + parm_len); > + pSMB->SetupCount = setup_count; /* no need to le convert byte fields */ > + pSMB->SubCommand = cpu_to_le16(sub_command); > + return 0; > +} > + > +static int > +validate_ntransact(char *buf, char **ppparm, char **ppdata, > + __u32 *pparmlen, __u32 *pdatalen) > +{ > + char *end_of_smb; > + __u32 data_count, data_offset, parm_count, parm_offset; > + struct smb_com_ntransact_rsp *pSMBr; > + > + *pdatalen = 0; > + *pparmlen = 0; > + > + if (buf == NULL) > + return -EINVAL; > + > + pSMBr = (struct smb_com_ntransact_rsp *)buf; > + > + /* ByteCount was converted from little endian in SendReceive */ > + end_of_smb = 2 /* sizeof byte count */ + pSMBr->ByteCount + > + (char *)&pSMBr->ByteCount; > + > + data_offset = le32_to_cpu(pSMBr->DataOffset); > + data_count = le32_to_cpu(pSMBr->DataCount); > + parm_offset = le32_to_cpu(pSMBr->ParameterOffset); > + parm_count = le32_to_cpu(pSMBr->ParameterCount); > + > + *ppparm = (char *)&pSMBr->hdr.Protocol + parm_offset; > + *ppdata = (char *)&pSMBr->hdr.Protocol + data_offset; > + > + /* should we also check that parm and data areas do not overlap? */ > + if (*ppparm > end_of_smb) { > + cFYI(1, "parms start after end of smb"); > + return -EINVAL; > + } else if (parm_count + *ppparm > end_of_smb) { > + cFYI(1, "parm end after end of smb"); > + return -EINVAL; > + } else if (*ppdata > end_of_smb) { > + cFYI(1, "data starts after end of smb"); > + return -EINVAL; > + } else if (data_count + *ppdata > end_of_smb) { > + cFYI(1, "data %p + count %d (%p) past smb end %p start %p", > + *ppdata, data_count, (data_count + *ppdata), > + end_of_smb, pSMBr); > + return -EINVAL; > + } else if (parm_count + data_count > pSMBr->ByteCount) { > + cFYI(1, "parm count and data count larger than SMB"); > + return -EINVAL; > + } > + *pdatalen = data_count; > + *pparmlen = parm_count; > + return 0; > +} > + > /* Get Security Descriptor (by handle) from remote server for a file or dir */ > int > CIFSSMBGetCIFSACL(const int xid, struct cifsTconInfo *tcon, __u16 fid, > @@ -3214,7 +3215,7 @@ setCifsAclRetry: > return (rc); > } > > -#endif /* CONFIG_CIFS_EXPERIMENTAL */ > +#endif /* CONFIG_CIFS_ACL */ > > /* Legacy Query Path Information call for lookup to old servers such > as Win9x/WinME */ > diff --git a/fs/cifs/file.c b/fs/cifs/file.c > index b857ce5..5a28660 100644 > --- a/fs/cifs/file.c > +++ b/fs/cifs/file.c > @@ -1108,7 +1108,6 @@ static ssize_t cifs_write(struct cifsFileInfo *open_file, > return total_written; > } > > -#ifdef CONFIG_CIFS_EXPERIMENTAL > struct cifsFileInfo *find_readable_file(struct cifsInodeInfo *cifs_inode, > bool fsuid_only) > { > @@ -1142,7 +1141,6 @@ struct cifsFileInfo *find_readable_file(struct cifsInodeInfo *cifs_inode, > spin_unlock(&cifs_file_list_lock); > return NULL; > } > -#endif > > struct cifsFileInfo *find_writable_file(struct cifsInodeInfo *cifs_inode, > bool fsuid_only) > diff --git a/fs/cifs/inode.c b/fs/cifs/inode.c > index 0023146..10d1cab 100644 > --- a/fs/cifs/inode.c > +++ b/fs/cifs/inode.c > @@ -687,7 +687,7 @@ int cifs_get_inode_info(struct inode **pinode, > cFYI(1, "cifs_sfu_type failed: %d", tmprc); > } > > -#ifdef CONFIG_CIFS_EXPERIMENTAL > +#ifdef CONFIG_CIFS_ACL > /* fill in 0777 bits from ACL */ > if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_CIFS_ACL) { > rc = cifs_acl_to_fattr(cifs_sb, &fattr, *pinode, full_path, > @@ -698,7 +698,7 @@ int cifs_get_inode_info(struct inode **pinode, > goto cgii_exit; > } > } > -#endif > +#endif /* CONFIG_CIFS_ACL */ > > /* fill in remaining high mode bits e.g. SUID, VTX */ > if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_UNX_EMUL) > @@ -2128,7 +2128,7 @@ cifs_setattr_nounix(struct dentry *direntry, struct iattr *attrs) > > if (attrs->ia_valid & ATTR_MODE) { > rc = 0; > -#ifdef CONFIG_CIFS_EXPERIMENTAL > +#ifdef CONFIG_CIFS_ACL > if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_CIFS_ACL) { > rc = mode_to_cifs_acl(inode, full_path, mode); > if (rc) { > @@ -2137,7 +2137,7 @@ cifs_setattr_nounix(struct dentry *direntry, struct iattr *attrs) > goto cifs_setattr_exit; > } > } else > -#endif > +#endif /* CONFIG_CIFS_ACL */ > if (((mode & S_IWUGO) == 0) && > (cifsInode->cifsAttrs & ATTR_READONLY) == 0) { > -- ~Randy *** Remember to use Documentation/SubmitChecklist when testing your code *** ^ permalink raw reply [flat|nested] 8+ messages in thread
end of thread, other threads:[~2010-12-06 16:43 UTC | newest]
Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2010-12-03 2:04 linux-next: Tree for December 3 Stephen Rothwell
2010-12-03 17:48 ` linux-next: Tree for December 3 (cifs) Randy Dunlap
2010-12-06 7:09 ` Ingo Molnar
[not found] ` <20101206070956.GA5570-X9Un+BFzKDI@public.gmane.org>
2010-12-06 12:35 ` Jeff Layton
2010-12-06 15:40 ` Shirish Pargaonkar
[not found] ` <AANLkTimTFi6jji5wmnBTT25XYAXAhJYNY+YmqhW5McEC-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2010-12-06 15:50 ` Jeff Layton
[not found] ` <20101206105021.2b6bfc96-9yPaYZwiELC+kQycOl6kW4xkIHaj4LzF@public.gmane.org>
2010-12-06 16:13 ` Shirish Pargaonkar
2010-12-06 16:43 ` Randy Dunlap
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).