X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=libsysio%2Fsrc%2Funlink.c;h=8732efa4cf08c0b22df123516ffe1bbf035ee785;hb=b98c2e2a463f4a9a5d548a9f20c9027f067a9709;hp=c584fcccdd9b86283804d056f2b54d771cfa609b;hpb=b8292c00324fbe9a25910ce53d03569186ea3e2c;p=fs%2Flustre-release.git diff --git a/libsysio/src/unlink.c b/libsysio/src/unlink.c index c584fcc..8732efa4 100644 --- a/libsysio/src/unlink.c +++ b/libsysio/src/unlink.c @@ -9,7 +9,7 @@ * terms of the GNU Lesser General Public License * (see cit/LGPL or http://www.gnu.org/licenses/lgpl.html) * - * Cplant(TM) Copyright 1998-2003 Sandia Corporation. + * Cplant(TM) Copyright 1998-2006 Sandia Corporation. * Under the terms of Contract DE-AC04-94AL85000, there is a non-exclusive * license for use of this work by or on behalf of the US Government. * Export of this program may require a license from the United States @@ -45,6 +45,7 @@ #include #include #include +#include #include #include "sysio.h" @@ -67,12 +68,18 @@ SYSIO_INTERFACE_NAME(unlink)(const char *path) err = _sysio_namei(_sysio_cwd, path, ND_NOFOLLOW, &intent, &pno); if (err) goto out; - ino = pno->p_base->pb_ino; - if (IS_RDONLY(pno, ino)) { - err = -EROFS; + + err = _sysio_permitted(pno->p_parent, W_OK); + if (err) goto error; - } - err = (*ino->i_ops.inop_unlink)(pno); + + ino = pno->p_base->pb_ino; + /* + * Use the parent node operations to request the task in case the + * driver is implemented using differentiated inode operations based + * on file type, such as incore does. + */ + err = (*pno->p_parent->p_base->pb_ino->i_ops.inop_unlink)(pno); if (err) goto error; assert(pno->p_base->pb_ino);