X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=libsysio%2Fsrc%2Ftruncate.c;h=27ef6b663170cb353c2e3d547e6fb1167380e7c3;hb=051ca1bc6a561f8bac65e0cfa861ff48050e8bea;hp=718f0af8e72dfa80cbf1e5fd359018909de0a78d;hpb=b8292c00324fbe9a25910ce53d03569186ea3e2c;p=fs%2Flustre-release.git diff --git a/libsysio/src/truncate.c b/libsysio/src/truncate.c index 718f0af..27ef6b6 100644 --- a/libsysio/src/truncate.c +++ b/libsysio/src/truncate.c @@ -43,6 +43,7 @@ #include #include +#include #include #include #include @@ -52,6 +53,8 @@ #include "sysio.h" #include "inode.h" #include "file.h" +#include "fs.h" +#include "mount.h" #include "sysio-symbols.h" @@ -71,9 +74,9 @@ do_truncate(struct pnode *pno, struct inode *ino, _SYSIO_OFF_T length) ino = pno->p_base->pb_ino; if (!ino) return -EBADF; - if (S_ISDIR(ino->i_mode)) /* for others too? */ + if (S_ISDIR(ino->i_stbuf.st_mode)) /* for others too? */ return -EISDIR; - if (!S_ISREG(ino->i_mode)) + if (!S_ISREG(ino->i_stbuf.st_mode)) return -EINVAL; (void )memset(&stbuf, 0, sizeof(stbuf)); @@ -101,7 +104,7 @@ out: SYSIO_INTERFACE_RETURN(err ? -1 : 0, err); } -#if _LARGEFILE64_SOURCE +#ifdef _LARGEFILE64_SOURCE #undef truncate64 sysio_sym_weak_alias(PREPEND(_, SYSIO_INTERFACE_NAME(truncate)), SYSIO_INTERFACE_NAME(truncate64)) @@ -133,12 +136,16 @@ PREPEND(_, SYSIO_INTERFACE_NAME(ftruncate))(int fd, _SYSIO_OFF_T length) err = -EBADF; goto out; } + if (!F_CHKRW(fil, 'w')) { + err = -EBADF; + goto out; + } err = do_truncate(NULL, fil->f_ino, length); out: SYSIO_INTERFACE_RETURN(err ? -1 : 0, err); } -#if _LARGEFILE64_SOURCE +#ifdef _LARGEFILE64_SOURCE #undef ftruncate64 sysio_sym_weak_alias(PREPEND(_, SYSIO_INTERFACE_NAME(ftruncate)), SYSIO_INTERFACE_NAME(ftruncate64))