X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=libsysio%2Fsrc%2Frmdir.c;h=bf13fa29c955dac7ef8e70be2c64ba81ea0dba32;hb=86706b9eb884a9371306ae418a73b5810b119af7;hp=b26b16bc3ace287eb5e92c081ea0d7559f5c8a0b;hpb=567285197e592000b7a713d65b66e27314a11c2f;p=fs%2Flustre-release.git diff --git a/libsysio/src/rmdir.c b/libsysio/src/rmdir.c index b26b16b..bf13fa2 100644 --- a/libsysio/src/rmdir.c +++ b/libsysio/src/rmdir.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 @@ -68,15 +68,23 @@ SYSIO_INTERFACE_NAME(rmdir)(const char *path) err = _sysio_namei(_sysio_cwd, path, 0, &intent, &pno); if (err) goto out; - if (IS_RDONLY(pno, pno->p_base->pb_ino)) { - err = -EROFS; + if (!S_ISDIR(pno->p_base->pb_ino->i_stbuf.st_mode)) { + err = -ENOTDIR; goto error; } + err = _sysio_permitted(pno->p_parent, W_OK); + if (err) + goto error; if (pno->p_ref > 1) { err = -EBUSY; goto error; } - err = pno->p_base->pb_ino->i_ops.inop_rmdir(pno); + /* + * 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_rmdir)(pno); if (err) goto error; /*