Whamcloud - gitweb
LU-506 kernel: FC15 - small changes
[fs/lustre-release.git] / libsysio / src / symlink.c
index 1142432..2a31e37 100644 (file)
@@ -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 <errno.h>
 #include <assert.h>
 #include <sys/types.h>
+#include <sys/stat.h>
 #include <sys/queue.h>
 
 #include "sysio.h"
@@ -63,18 +64,27 @@ SYSIO_INTERFACE_NAME(symlink)(const char *oldpath, const char *newpath)
 
        SYSIO_INTERFACE_ENTER;
        INTENT_INIT(&intent, INT_CREAT, NULL, NULL);
-       err = _sysio_namei(_sysio_cwd, newpath, ND_NEGOK, &intent, &pno);
+       err =
+           _sysio_namei(_sysio_cwd,
+                        newpath,
+                        ND_NOFOLLOW|ND_NEGOK,
+                        &intent,
+                        &pno);
        if (err)
                goto out;
        if (pno->p_base->pb_ino) {
                err = -EEXIST;
                goto error;
        }
-
-       if (IS_RDONLY(pno, pno->p_base->pb_ino)) {
-               err = -EROFS;
+       err = _sysio_permitted(pno->p_parent, W_OK);
+       if (err)
                goto error;
-       }
+
+       /*
+        * 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_symlink)(pno, oldpath);
 error: