2010-12-03 02:04:53

by Stephen Rothwell

[permalink] [raw]
Subject: linux-next: Tree for December 3

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 [email protected]

$ 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


Attachments:
(No filename) (8.56 kB)
(No filename) (490.00 B)
Download all attachments

2010-12-03 17:50:47

by Randy Dunlap

[permalink] [raw]
Subject: Re: linux-next: Tree for December 3 (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 ***

2010-12-06 07:10:20

by Ingo Molnar

[permalink] [raw]
Subject: Re: linux-next: Tree for December 3 (cifs)


* Randy Dunlap <[email protected]> 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

2010-12-06 12:36:02

by Jeff Layton

[permalink] [raw]
Subject: Re: linux-next: Tree for December 3 (cifs)

On Mon, 6 Dec 2010 08:09:56 +0100
Ingo Molnar <[email protected]> wrote:

>
> * Randy Dunlap <[email protected]> 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 <[email protected]>

2010-12-06 15:40:37

by Shirish Pargaonkar

[permalink] [raw]
Subject: Re: linux-next: Tree for December 3 (cifs)

On Mon, Dec 6, 2010 at 6:35 AM, Jeff Layton <[email protected]> wrote:
> On Mon, 6 Dec 2010 08:09:56 +0100
> Ingo Molnar <[email protected]> wrote:
>
>>
>> * Randy Dunlap <[email protected]> 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 <[email protected]>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-cifs" in
> the body of a message to [email protected]
> More majordomo info at ?http://vger.kernel.org/majordomo-info.html
>

2010-12-06 15:51:24

by Jeff Layton

[permalink] [raw]
Subject: Re: linux-next: Tree for December 3 (cifs)

On Mon, 6 Dec 2010 09:40:33 -0600
Shirish Pargaonkar <[email protected]> wrote:

> On Mon, Dec 6, 2010 at 6:35 AM, Jeff Layton <[email protected]> wrote:
> > On Mon, 6 Dec 2010 08:09:56 +0100
> > Ingo Molnar <[email protected]> wrote:
> >
> >>
> >> * Randy Dunlap <[email protected]> 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 <[email protected]>
Signed-off-by: Jeff Layton <[email protected]>
---
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

2010-12-06 16:13:34

by Shirish Pargaonkar

[permalink] [raw]
Subject: Re: linux-next: Tree for December 3 (cifs)

On Mon, Dec 6, 2010 at 9:50 AM, Jeff Layton <[email protected]> wrote:
> On Mon, 6 Dec 2010 09:40:33 -0600
> Shirish Pargaonkar <[email protected]> wrote:
>
>> On Mon, Dec 6, 2010 at 6:35 AM, Jeff Layton <[email protected]> wrote:
>> > On Mon, 6 Dec 2010 08:09:56 +0100
>> > Ingo Molnar <[email protected]> wrote:
>> >
>> >>
>> >> * Randy Dunlap <[email protected]> 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 <[email protected]>
> Signed-off-by: Jeff Layton <[email protected]>
> ---
> ?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.

2010-12-06 16:45:26

by Randy Dunlap

[permalink] [raw]
Subject: Re: linux-next: Tree for December 3 (cifs)

On 12/06/10 07:50, Jeff Layton wrote:
> On Mon, 6 Dec 2010 09:40:33 -0600
> Shirish Pargaonkar <[email protected]> wrote:
>
>> On Mon, Dec 6, 2010 at 6:35 AM, Jeff Layton <[email protected]> wrote:
>>> On Mon, 6 Dec 2010 08:09:56 +0100
>>> Ingo Molnar <[email protected]> wrote:
>>>
>>>>
>>>> * Randy Dunlap <[email protected]> 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 <[email protected]>


> -------------------[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 <[email protected]>
> Signed-off-by: Jeff Layton <[email protected]>
> ---
> 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 ***